[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\r\n# Set default behavior to automatically normalize line endings.\r\n###############################################################################\r\n* binary\r\n\r\n###############################################################################\r\n# Set default behavior for command prompt diff.\r\n#\r\n# This is need for earlier builds of msysgit that does not have it on by\r\n# default for csharp files.\r\n# Note: This is only used by command line\r\n###############################################################################\r\n#*.cs     diff=csharp\r\n\r\n###############################################################################\r\n# Set the merge driver for project and solution files\r\n#\r\n# Merging from the command prompt will add diff markers to the files if there\r\n# are conflicts (Merging from VS is not affected by the settings below, in VS\r\n# the diff markers are never inserted). Diff markers may cause the following \r\n# file extensions to fail to load in VS. An alternative would be to treat\r\n# these files as binary and thus will always conflict and require user\r\n# intervention with every merge. To do so, just uncomment the entries below\r\n###############################################################################\r\n#*.sln       merge=binary\r\n#*.csproj    merge=binary\r\n#*.vbproj    merge=binary\r\n#*.vcxproj   merge=binary\r\n#*.vcproj    merge=binary\r\n#*.dbproj    merge=binary\r\n#*.fsproj    merge=binary\r\n#*.lsproj    merge=binary\r\n#*.wixproj   merge=binary\r\n#*.modelproj merge=binary\r\n#*.sqlproj   merge=binary\r\n#*.wwaproj   merge=binary\r\n\r\n###############################################################################\r\n# behavior for image files\r\n#\r\n# image files are treated as binary by default.\r\n###############################################################################\r\n#*.jpg   binary\r\n#*.png   binary\r\n#*.gif   binary\r\n\r\n###############################################################################\r\n# diff behavior for common document formats\r\n# \r\n# Convert binary document formats to text before diffing them. This feature\r\n# is only available from the command line. Turn it on by uncommenting the \r\n# entries below.\r\n###############################################################################\r\n#*.doc   diff=astextplain\r\n#*.DOC   diff=astextplain\r\n#*.docx  diff=astextplain\r\n#*.DOCX  diff=astextplain\r\n#*.dot   diff=astextplain\r\n#*.DOT   diff=astextplain\r\n#*.pdf   diff=astextplain\r\n#*.PDF   diff=astextplain\r\n#*.rtf   diff=astextplain\r\n#*.RTF   diff=astextplain\r\n"
  },
  {
    "path": ".gitignore",
    "content": "._*\n.DS_Store\n\n## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- Backup*.rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Exclude data folder\n!data/*\n!data/debug/*\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"source-code/dependencies/MemoryModule\"]\n\tpath = source-code/dependencies/MemoryModule\n\turl = https://github.com/fancycode/MemoryModule\n"
  },
  {
    "path": "READ ME.txt.rtf",
    "content": "{\\rtf1\\ansi\\deff3\\adeflang1025\n{\\fonttbl{\\f0\\froman\\fprq2\\fcharset0 Times New Roman;}{\\f1\\froman\\fprq2\\fcharset2 Symbol;}{\\f2\\fswiss\\fprq2\\fcharset0 Arial;}{\\f3\\froman\\fprq2\\fcharset0 Liberation Serif{\\*\\falt Times New Roman};}{\\f4\\froman\\fprq2\\fcharset0 Liberation Sans{\\*\\falt Arial};}{\\f5\\froman\\fprq2\\fcharset0 Calibri;}{\\f6\\fnil\\fprq2\\fcharset0 Arial;}{\\f7\\fnil\\fprq2\\fcharset0 Liberation Serif{\\*\\falt Times New Roman};}{\\f8\\fnil\\fprq2\\fcharset0 Calibri;}}\n{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;}\n{\\stylesheet{\\s0\\snext0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1 Normal;}\n{\\*\\cs15\\snext15\\langfe255\\cf9\\lang255\\ul\\ulc0 Collegamento Internet;}\n{\\s17\\sbasedon0\\snext18\\dbch\\af6\\langfe1081\\dbch\\af7\\afs28\\ql\\nowidctlpar\\hyphpar0\\sb240\\sa120\\keepn\\ltrpar\\cf0\\loch\\f4\\fs28\\lang1040\\kerning1 Titolo;}\n{\\s18\\sbasedon0\\snext18\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\ql\\sl276\\slmult1\\nowidctlpar\\hyphpar0\\sb0\\sa140\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1 Corpo del testo;}\n{\\s19\\sbasedon18\\snext19\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\ql\\sl276\\slmult1\\nowidctlpar\\hyphpar0\\sb0\\sa140\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1 Elenco;}\n{\\s20\\sbasedon0\\snext20\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\ai\\ql\\nowidctlpar\\hyphpar0\\sb120\\sa120\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1 Didascalia;}\n{\\s21\\sbasedon0\\snext21\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1 Indice;}\n}{\\*\\generator LibreOffice/6.3.0.4$Windows_X86_64 LibreOffice_project/057fc023c990d676a43019934386b85b21a9ee99}{\\info{\\creatim\\yr0\\mo0\\dy0\\hr0\\min0}{\\revtim\\yr2020\\mo6\\dy2\\hr22\\min29}{\\printim\\yr0\\mo0\\dy0\\hr0\\min0}}{\\*\\userprops}\\deftab720\n\\hyphauto0\\viewscale100\n{\\*\\pgdsctbl\n{\\pgdsc0\\pgdscuse451\\pgwsxn12240\\pghsxn15840\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\pgdscnxt0 Stile predefinito;}}\n\\formshade{\\*\\pgdscno0}\\paperh15840\\paperw12240\\margl1800\\margr1800\\margt1440\\margb1440\\sectd\\sbknone\\sectunlocked1\\pgndec\\pgwsxn12240\\pghsxn15840\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\ftnbj\\ftnstart1\\ftnrstcont\\ftnnar\\aenddoc\\aftnrstcont\\aftnstart1\\aftnnrlc\n{\\*\\ftnsep\\chftnsep}\\pgndec\\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl240\\slmult1\\ql\\sb0\\sa200{\n{\\pict{\\*\\picprop{\\sp{\\sn wzDescription}{\\sv }}{\\sp{\\sn wzName}{\\sv }}}\\picscalex1125\\picscaley1130\\piccropl0\\piccropr0\\piccropt0\\piccropb0\\picw73\\pich23\\picwgoal735\\pichgoal225\\wmetafile8\n010009000003f44e07000000cb4e070000000400000003010800050000000b0200000000050000000c023901fc03030000001e00040000000701040004000000\n07010400cb4e0700410b2000cc003901fc03000000003901fc030000000028000000fc030000390100000100180000000000549d0e0000000000000000000000\n000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff00\n00ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff6363ff1010ff0000ff0000ff0000ff5252ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff0000ffc6c6ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffff8484ff1818ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffd6d6ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdff0000ffc6c6ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff1818\nff0000ff0000ff0000ff0000ff0000ff0000ff3939ff0000ff0000ff9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7373ff0000ff0000ff0000ff0000ff0000ff4a4a\nffa5a5ffefefffffffff5252ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffc6c6ff0000ff9494ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7ff0000ffa5a5ffffffffffffffffffffffffff0808ff0000ff0000ff0000ff6363ffe7e7ffffffffffffffffffffffffffcece\nff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nceceff0000ff7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84\n84ff0000ff5a5afff7f7ffffffffffffffc6c6ff0000ff0000ff4a4affe7e7ffffffffffffffffffffffffffffffffffffffffffff0000ff6363ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeff0000ff5a5affffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeff0000ff0000ff0000ffbdbdffff\nffffffffffa5a5ff0000ff3939ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0808ff4a4affffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff3939ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff0000ff0000ffc6c6ffffffffffffff8484ff0000ffa5\na5ffffffffffffffffffffffffffffffffffffffffffffffffffffffff2121ff2121ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2121ff2121ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff0808ff0000ffc6c6ffffffffffffff8484ff0000ffd6d6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff2929ff0000ffdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff4242ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7ff0000ff0000ff9494ff0000ffc6c6ffffffffffffff8484ff0000ffd6d6ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff5252ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff6363ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9cff\n0000ff0000ff8c8cff0000ffbdbdffffffffffffff8484ff0000ff2929ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffff7373ff0000ffc6\nc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000\nffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff0000ff0000ff4a4affdedeff0000ff\nc6c6ffffffffffffffa5a5ff0000ff0000ff0000ff2121ff9c9cffffffffa5a5ff4a4aff1818ff0000ff0000ff0000ff0000ffc6c6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ffe7e7ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1818ff0000ff0000ffa5a5ffdedeff0000ffc6c6ffffffffffffffdedeff\n0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5ff0000ffd6d6ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffceceff2929ff0000ff0000ff4a4affe7e7ffc6c6ff0000ffc6c6ffffffffffffffffffffc6c6ff4242ff0000ff0000ff\n0000ff0000ff0000ff0000ff0000ff0000ff0000ff3939ff4242ffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffadadff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nff9494ff0808ff0000ff0000ff1010fff7f7ffffffffc6c6ff0000ff5a5afff7f7ffffffffffffffffffffffffffceceff6363ff4242ff4242ff4242ff5a5aff\nadadffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffc6c6ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b6bff0000ff0000ff0000ff0000\nff9c9cffffffffffffffc6c6ff0000ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6\nc6ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffefefff3939ff0000ff0000ff0000ff1818ffb5b5ffffffffffffffffffffc6c6\nff0000ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceceff0000ffc6c6ffffffffff\nffffffffffffffffffffffffffffffffffceceff1010ff0000ff0000ff0000ff3939ffefefffffffffffffffffffffffffffffffff6b6bff0000ffc6c6ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffff\nffffadadff0808ff0000ff0000ff0000ff5a5afff7f7ffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffff8484ff0000ff0000ff0000ff08\n08ff9494ffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffff6b6bff0000ff0000ff0000ff1010ffc6c6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffe7e7ff0000ffc6c6ffffffffffffffffffff5a5aff0000ff0000ff0000ff2121ffdedeffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ff\nf7f7ffa5a5ff1818ff0000ff0000ff0000ff3131fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6\nc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffbdbdff2929ff0000ff0000ff0000ff\n0000ff5252ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff3939ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff6b6bffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff0000ff4242fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7ff0000ff0000ff0000ff0000ff0000ff5252ffceceffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7ff0000ff0000ff0000ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7e7ff3939ff0000ff3131ff4242ff9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffff7b7bff0000ff0000ff2121fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff4242\nffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff\n0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff00\n00ff3939ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ffc6c6ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff0808ff0000ff0000ff4a4affffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff0000ffc6c6ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff4242ffd6d6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9cff0000ff0000ff0000ff3131fff7f7ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ffc6c6ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ff0000ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff8484ff0000ff0000ff7373ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff0808ff0000ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffff9494ff0000ff0808ffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff7373ff0000ff1818ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff\n0000ff0000ff2121ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5ff0000ff0000ff5a5a\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3131ff0000ff0000ffd6d6ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff0000ff0000ffa5a5ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff1010ff0000ff0000ff3131fff7f7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff5a5aff0000ff0000ff0000ff3939ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff0000ff0000ff3131fff7f7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff4a4aff0000ff0000ff0000ff2929ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffefffef7bce635ace394abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294a\nbd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6\n2142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd215ac63984ce63efffe7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefe7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffd6d6ff4242ff0000ff0000ff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff00\n00ff0000ff4242fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffefffe74abd294abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd214abd29eff7e7ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffff7f7f7efe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffa5a5ff0000ff0000ff0000ffadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0808ff0000ff0000ff7373ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bce634ac6294abd21\n4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142\nbd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6\n294abd214ac62142bd214ac6294abd214ac62142bd214ac6297bce63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffff7f7f7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff8484ff0000ff0000ff1818ffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffc6c6ffa5a5ff\n8484ff8484ff8484ff8484ff8484ff8484ff8484ffc6c6ffc6c6fff7f7ff5252ff0000ff0000ff7b7bffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ac63942bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd215ac639ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7e7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff0000\nff0000ff4a4affffffffffffffffffffffffffffffffffffffffffffffffffefefff9494ff4a4aff0808ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff\n0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff2929ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21\n4ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294a\nbd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6\n2142bd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e7b573d68c31d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d69431dea55afff7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff1818ff0000ff0000ff9494ffffff\nffffffffffffffffffffffffffadadff5252ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff\n0000ff0000ff0000ff0000ff2929fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efd68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68c29f7efd6fffffffffffffffffffffffffffffffffffffff7f7e7b57bd68c\n31d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421e7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7\ndededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7\ne7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7\ndededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7\ne7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7\ndededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7\ne7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedeffffffdededee7e7e7e7dedee7e7e7\ndededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7\ne7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e79494ef0000ff0000ff0808ffadade7e7e7e7cecee77373f71010\nff0000ff0000ff0000ff0000ff0000ff0000ff0000ff3939ff5a5aff6b6bef7373f77373f77373f76b6bef7373f77373f74242ff0000ff0000ff0000ff0000ff\n0000ff5252ffefe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff42bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21\n4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142\nbd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7b573d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21dead63fffffffffffffffffffffffffffffffffff7d68c21efd6adffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c21e7\ne7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffff6363ff0000ff0000ff1818ff5a5aff0808ff0000ff0000ff0000ff0000ff0000ff1010\nff6b6bffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff2929ff0000ff0000ff0808ff0000ff0000ff0000ffdedeffe7e7e7\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffd69439d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421de9431ffffffffffffffffffffffffffffffe7b57befd6adffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7e7dedeffffffffffffffffff1818ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff4a4affadadfff7f7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff8c8cff0808ff0000ff0000ff0000ff7b7bff9c9cff0000ff0000ff8c8cfff7f7f7efefefffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd214ac62142bd214ac6294abd214ac6\n2142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21\n4ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294a\nbd214ac62142bd214ac6294abd214ac62142bd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21ffffffffffffffffffffffffffffffde9439ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c29e7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ff\nffffbdbdff5252ff0000ff0000ff0000ff0000ff0000ff0000ff6363ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff5a5aff0000ff0000ff0000ff0000ff8484ffffffffffffff5252ff0000ff6363ffffffffefe7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffff\nffffffffffd68c21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7dededee7e7ff0000ff0000ff0000ff00\n00ff0000ff0000ff0000ff0808ffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5252ff0000ff0000ff0000\nff1010ffadadffffffffffffffffffffbdbdff0000ff1010ffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff42bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6\n294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21a5c62184efb54ac6314abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21\n4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffb529ffffefd68c9cd68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffffffffffffffffffffffffffffffd68c21ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffd68c21e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff9cdeff7b2952ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121212121292929de9c4affffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff217bc62121212929\n294a2121ffe79cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214a7b2121ffffbdffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7e7e7ff0000ff0000ff0000ff3131ffbdbdff6b6bff0000ff00\n00ff1010ff8c8cfff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6363ff0000ff0000ff0000ff4a4affefefffffffffffffffffff\nffffffffffffff0808ff0000ffd6d6ffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd21adbd21ffffde84efe74abd2942bd214abd21dee752ffffefeffff773e7de42bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffceefff7b84a5737373cea584ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21f7ad21ffffefd6849cd68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nd68421e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff9cdeff73214affffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cde9c4affffffff\nffffffffff73bdff732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff9c4a73ffffdeffffffbdffff212173de9c4affffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdffde9c4affffffffffff73bdff4a2121ffde9c9cde\nff4a214affde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde9c4a21ffffdeffffffffffffffffffffffffffffffffffffff\nffffffffff2173bdbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffff\nffffffffffffffe7ffff6b7bb56b6b6b6363636b6b6b6363636b6b6b6363636b6b6b6363636b6b6b636363c68c6bffffe7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedededeff0000ff3939ff9c9cffffffffffffffffffff4a4aff0000ff0000ff0000ff5252ffff\nffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ff0000ff0000ff6363ffffffffffffffffffffffffffffffffffffffffffff4242ff0000\nff8c8cffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a\nbd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac62963bd21f7f7\n94fffff7ffffffffffffffffff84efe74ac6319cbd21deffd642c694adc629d6ffd64ac68c42bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21\n4ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff84addeffd6a5ffffff7ba5d6ffdeadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff6ba5d66b6b6b6b6b6b6b6b6b846b6bffefbdffffffffffff84bdefd6a56bffffffffffffffffff8cbdef6b6b6b6b6b6bbda56b6b8cbde7bd84ffffff84\nbdefd6a56bffffffffffffefffff6b8cbdffd6a5ffffffffffffa5d6ff6b6b6b6b6b6ba56b6bffffd6e7ffff6b8cbdffd6a5ffffffffffffbdefffa56b84ffff\nd6bde7ff6b6b8cffd6a5ffffffffffffffffffffffffd6ffff6b6ba5a56b6bffffd6ffffff84bde76b6b6befbd84ffffffbde7ff6b6b8ca56b6bffffd6a5d6ff\n6b6b6b6b6b6bbd8c6b6ba5bd6b6b6bffd6a5bdefff6b6b846b6b6b6b6b6b6b6b6bffd6a5ffffffffffffa5d6ff6b6b6b6b6b6bbd846bffffefd6ffff6b6ba56b\n6b6b6b6b6b6b6b6befbd8cffffff8cbdef6b6b6befbd8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21f7b521ffffefd68c9cd68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21ffffffffffffffffffffffffffffffd68421ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c29e7e7e7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff7b2152ffffbd\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff529ce79c4a21ffffe7ffffffffffffbdffff29297bff\nbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff9c5229ffffdeffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff297bc6de9c4ae7ffff214a9ce79c52ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffc6ffff212173ffc67bffffffffffffffffffffffffffffffffffffffffffffffff73bdff7b2929ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa56b\na5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa56ba5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7e7e7e7e7c6c6ff0000ffc6c6ffffffffffffffffffffffffffbdbdff0000ff0000ff0000ff0000ffceceffffffffffffffffffffff\nffffffffffffffff5a5aff0000ff0000ff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff5a5affe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd214abd21f7f77bffffffffffffffffffffffffffff\nff8cf7ef42bd319cbd21d6ffce4ac68494bd21deffce42bd8c4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7\ne7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84a5d6ffdeb5ffff\nff84b5e7ffd6a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6d69c63ffffff\nffffffa5d6ff846363ffefbdffffff84bdefd69c63ffffffffffffbdefff846384ffefbdffffffa5d6ff636363efbd84ffffff84bdefd69c63ffffffffffffef\nffff6384bdffd6a5ffffffa5d6ff846363ffefbdffffffd6ffffe7bdbdefffff6384bdffd6a5ffffffffffffbde7ffa56b84ffffd6bdefff636384ffd6a5ffff\nffffffffffffffffffffd6ffff6b6ba59c6363ffffd6ffffff84bdef636363efbd84ffffffbdefff636384a56b6be7ffd66b84bd6363636b6b6b6363636b6b6b\n636363ffd6a5bde7ff6b6b846363636b6b6b636363846b6bffe7bdefffff6384bd6b6b6b636363bd846bd6ffe76b6ba56363636b6b6b6363636b6b6be7bd84ff\nffff84bde76b6b6be7bd84ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffce949ce7b55aff\nffffffffffffffffffffffffffffffffffd6c6ffc68442ce8442c68442ce8c42ce8442ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffceb5d6ce8442c68442ce8c42c68442ce8442ffde9cffffffcec6ffce8442c68442ce8c42dea542ffffffffffffffffffceb5d6ce8442c68442de9442\nceb5b5de9442ffffd6ffffffdeffffce847bc68442ce8c42e7b55acea5b5dea542ffffffffffffdeffffc6847bce8c42c68442de9442ffffd6ffffffdeffffce\n847bffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ef8421ffffded6adbdd68c21d68421d68c21f7c621ffffffd6c6d6d68c21\nd68421ffef9cffffffffffffefefffd68c21d68421e78c21fff7bdefefffd68421d68c21ffde63ffffffd6849cd68c21d68421d68c21d68421d68c21f7ad21f7\nf7efd68463d68c21ffde63efefffd68421f7b521f7ffefd68c9cd68421f7b521ffffefffffffffffffd6b5c6d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21e78421ffffc6ffffffffffffffffffd6cede\nd68421d68c21f7ad21ffffefffdebdffffffffffffefefffd68421d68c21ffde63efefffd68421d68c21ffde63ffffffffffffffffffd6c6d6d68c21d68421ff\nef9cfffffffffffff7deefffffded6adbdd68c21ffde63fffffffffffff7ffffffefbde7deefd68421d68c21d68421d68c21d68421ffce21efefffd68c21d684\n21ffef9cdedeefd68c21ffde63efefffd68421d68c21ffde63fffffffffffff7f7ffd68463d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffdec6ffde8c21ffffb5ffffffffffffffffffe7ffffd68c73ffc66bff\nffffffffffffffffdec6ffe79421ffffd6fffffffffffffffffffffffff7ffffd6948cffc66bffffffffffffffffffdec6ffde8421ffffb5ffffffffffffffff\nffffffffffffffe7ffffd6846bd68c21d68421de8c21ffffb5ffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffffffff84bdef\n6363636b6b6b636363efbd84ffffffffffffd6ffff6b6ba56363636b6b6b9c6363ffffd6ffffffd6ffff63639cffd6a5ffffffffffffffffffffffff639cd6d6\na56bffffffffffffffffffffffffffffffe7e7e7dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cffbd73ffff\nffffffff9cdeff73214affffbdffffffbdffff212173212121de9c4affffff9cdeff21214a212121ffbd739cdeff73214a73bdbd2121212121219c4a21ffffde\nffffffdeffff214a9c212121212121bd7321ffffff9cdeff21214affbd73bdffff4a2173ffde9cffffffffffffffffff4a9cdebd7321ffffffffffffffffffff\nffff2173bdde9c4affffffffffffbdffff4a2173ffde9cffffffffffff2173bd2121212121214a2121ffde9cffffffffffffffffff4a9cde212121732121ffff\nbd73bdff2121212121219c4a2121739cbd7321ffffff73bdff9c4a214a9cbd2121212121219c4a21ffffdeffffffffffff73bdff2121212121217321214a9c9c\n9c4a21ffffdeffffff73bdff2121212121217321219cdebd73214affffbdbdffff212173de9c4affffffffffff4a9cde212121212121212121ffbd73ffffffff\nffff73bdff9c4a21ffffdeffffffffffffffffff2173bd212121212121bd73214a9cdebd7321ffffff73bdff9c4a21ffffdeffffffffffffffffff4a9cdebd73\n21ffffffffffffdeffff214a9cffbd73ffffff73bdff2121212121219c4a2121739cbd7321ffffff9cdeff21214a212121212121ffbd73ffffffffffff73bdff\n2121214a2121ffde9cffffffdeffff214a9cbd7321ffffffffffffffffff4a9cde212121212121732121ffffbddeffff214a9cffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffd6ffff9c639cd6ffd663639c6b6b6b6363\n63a56b6bffffd6ffffffbdbde7ffffded6ffffa56ba5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7\ndededec6c6ff0000ffc6c6ffffffffffffffffffffffffffffffffe7e7ff7373ff0000ff0000ff1010f76b6b847b7b7b7373737b7b7b7373841818e70000ff00\n00ff0000ff2121ded6ad84ffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff0000ff3939ffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff42bd214ac6294abd214ac62142bd214ac6294abd214ac62142\nbd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21a5c621ffffcef7ffff52d6c6adc621ffffd68cf7ef4abd294ac62142bd21dee7\n4af7fff7f7ffff63ded64ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21\n4ac62142bd214ac6294abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdef7ff7384a57b84849c7373fff7ceffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6d6a56bffffffffffffe7ffff6b8cbdefbd84\nffffff84bde7d6a56bffffffffffffbde7ff8c6b8cffefbdffffffe7ffff6b8cbdefbd84ffffff84bde7d6a56bffffffffffffe7ffff6b8cbdffd6a5efffff6b\n84bdefbd8cffffffffffffffffffffffffefffff6b8cbdffd6a5ffffffffffffbdefffa56b84ffffd6ffffffffffffffffffffffffffffffffffffffffffd6ff\nff6b6ba5a56b6bffffd6ffffff84bdef6b6b6be7bd84ffffffbdefff6b6b8ca56b6befffd66b84bda56b6bffffd6ffffff6ba5d66b6b6bffd6a5ffffffffffff\nd6ffff6b6ba56b6b6b846b6bffefbde7ffff6b8cbd846b6bffefbdffffffa5d6ff6b6b6bbd8c6bffffe7ffffffffffffffffffffffff8cbdef6b6b6befbd8cff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdd6efffe7ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc6949cefb563ffffffffffffffffffffffffff\nffffffffffd6c6ffd68c42ffffb5ffffffffffffdedeffc68463e7a54affffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6d69442ffff\nd6ffffffffffffffffffffffffd6c6ffce8c42ffc67bffffffffffffcea5bdd69442ffffd6d6deffce8c63ffc67bffffffd6deffce8c63d69442ffffd6deffff\nce8c84dea542ffffffffffffcea5bdc68442e7a54affffffefffffc6949cde9c4affffd6ffffffd6deffe7a563ffffffe7ffffc6847bffc684ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421f78c29ffffd6d6b5c6d68421d68c29e78c21ffffc6ffffffd6ceded68c21ffe76bf7f7ffd68c6bd68c21\nffce21d6ced6d68c29f7ad21ffffeffff7efd68c9ce78c21ffffc6fff7efd6ceded68c21d68c21d68421d68c29d68c21f7b521f7f7efd68c6bd68c21ffe76bef\nefffd68c29f7ad21ffffefd6849cf78c29ffffd6d6ceded68421e78c29f7efbdd68c6bd68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffef9cf7f7ffd68c6bd68421ffb529ffffefd6b5c6d68421ffb529ffffef\ne7e7efd68421e78c29fff7bde7e7efd68421ffe76befefffd68c21ffce21ffffffd68c9cd68c21ef8421ffffded6ced6f7b521ffffefd6b5c6d68c21ffe76bff\nffffd6b5c6ffce21ffffffd6adbdd68c29f7ad21ffffefe7deefd68c29d68c21d68c21d68421d68c29ffce21efefffd68421d68c29ffef9ce7e7efd68421ffe7\n6befefffd68c21ffce21ffffffd68c9cd68c21f7ad21e7e7ded68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffffffffffff\nffffffffffffffffffd68c21ffffffffffffffffffffffffdec6ffde8421ffffb5ffffffffffffffffffefffffd68c6bffc673ffffffffffffffffffdec6ffde\n9421ffffdeffffffffffffffffffffffffefffffd69c94ffc66bffffffffffffffffffdec6ffde8c29ffffb5fffffffffffffffffffffffff7ffffde9494ffff\nb5ffffffffffffd6b5d6e79c29ffffd6ffffffffffffffffffffffffd68c21e7e7e7ffffffffffffffffffffffffa5d6ffefbd84ffffffffffffd6ffff6b6ba5\nffd6a5e7ffffa58cbdffffd6ffffffffffff8cbdefbd846bffffefd6ffff6b6ba5ffd6a5ffffffffffffffffffffffff6ba5d6d6a56bffffffffffffffffffff\nffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff21529cffbd73ffffffffffff9ce7ff73214affff\nc6ffffff529ce79c4a21ffffe7ffffffffffff2173bdc67b29ffffffffffff9cdeff292952bd7321ffffffffffff297bc69c4a21ffffe773bdffffc67bffffff\ne7ffff214a9cffc67b9cdeff212152ffbd73ffffff2173bde79c52ffffffffffffffffff9ce7ff73214affffc6ffffffffffffffffff297bc6de9c4affffffff\nffffc6ffff4a2173ffe79cffffff297bc69c4a21ffffe7ffffff9ce7ff4a214affe79cffffffc6ffff212173ffc67bffffffc6ffff212173ffc67bffffff9ce7\nff21214ac67b21ffffff7bc6ff212121e79c52ffffffe7ffff214a9cc67b21ffffffc6ffff212173e79c52ffffffc6ffff2121739c5221ffffde9ce7ff21214a\nffc67bffffffc6ffff2121737b2121ffffbdc6ffff212173e79c52ffffff529ce7732121ffffc6ffffffc6ffff212173ffc67bffffff7bc6ff9c4a21ffffe7ff\nffffffffff4a9cde7b2121ffffbdffffff73bdff212121bd7321ffffffbdffff52217bffde9cffffffffffffffffff4a9cdec67b29ffffffffffffdeffff2952\n9cffbd73c6ffff212173ffc67bffffff9ce7ff21214ac67b29ffffff7b7bc6ffffbdffffff9cdeff7b2152ffffbde7ffff214a9ce79c52ffffffffffffffffff\n9ce7ff4a4a4a7b2952ffffbdffffffbdffffc67b7bffffffffffff4a9cdec67b29ffffff529ce7ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa56ba5ffffd6ffffffffffffffffffffffffffffff84bde7a56b\n73ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7bdbdff0000ffc6c6ff\nffffffffffffffffffffffffffffffffffffffffff3942ff0000ff0000ff2121ef73737b7b7b7b73737b1818ef0000ff0000ff0000ff4231dea5cef7dead7bff\nffffffffffffffffffffffffffffffffffffffffffffffffffff1010ff2121ffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd21adbd21ffffdedeffff4abd9ca5bd218cefbd42bd294abd2142bd214abd21a5bd21ffffdedeffff4abd9c42bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d66363636b6b6b6363636b6b6b947b6bf7debdffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6d69c63ffffffffffffffffff639cd6efbd84ffffff84bdefd69c63ffffff\nffffffffffff84bde76b6b6b6363636b6b6b636363efbd84ffffff84bdefd69c63ffffffffffffefffff6384bdffd6a5e7ffff6b84bdffd69cffffffffffffff\nffffffffffefffff6384bdffd6a5ffffffffffffbde7ffa56b84ffffd6ffffffffffffffffffffffffffffffffffffffffffd6ffff6b6ba59c6363ffffd6ffff\nff84bdef636363efbd84ffffffbdefff636384a56b6bffffd6d6ffff63639c6b6b6b6363636b6b6b636363ffd6a5ffffff6ba5d66363636b6b6b636363ffd6a5\nffffffefffff6384bd846b6bffe7bdffffff84bde76b6b6b6363636b6b6b6363636b6b6b846363ffefbd84bde76b6b6be7bd84ffffffffffffffffffffffffff\nffffffffffffffffffffffffffff9cc6ef8c8c8c9c8c84ffe7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffce949cefb55affffffffffffffffffffffffffffffffffffd6c6ffce8442ff\nffb5ffffffffffffffffffe7ffffc6847bffc67bffffffffffffffffffffffffffffffffffffffffffffffffceb5d6de9442ffffd6ffffffffffffffffffe7ff\nffce949cefb55affffffffffffffffffdeffffce8c7bffc67bdedeffce845affde9cffffffffffffceb5d6de9442ffffd6d6c6ffce8442ffffb5ffffffffffff\ndeffffce8c7bdea542ffffffcec6ffce8c42ffd694ffffffffffffffffffffffffffffffdeffffce8c7bffc67bffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21ef8421ffffded6adbdd68c21d68421ffde6bf7ffffffefded6c6d6e78c21fff7bdd6ceded68421d68c21d68421d68c21d68421ffce21\nefefffffde6bd6c6d6f7ad21f7f7efffce6bdedeefd68c21d68421d68c21d68421d68c21f7ad21f7ffefd68463d68c21ffde63efefffd68421f7ad21f7ffefd6\n8c9cf7c621f7f7ffd68463d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421ef8c21ffffd6d6adbdd68421d68c21d68421ffde6befefffd68c21f7ad21ffffefd6849cd68c21d68421ffce21\nf7f7ffd68c6bffde63efefffd68421ffef9cdedeefd68c21d68421d68c21ffde63efefffef8421ffffdeefefffd68c21ef8421ffffded6adbdffde6befefffd6\n8c21d68421d68c21ffef9ce7deefd68421d68c21d68421d68c21d68421ffce21efefffd68c21d68421ffef9ce7deefd68c21ffde63efefffd68421ffef9cdede\nefd68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffffffffffffffd68c21\nffffffffffffffffffffffffdec6ffde8c21ffffb5ffffffffffffffffffe7ffffd68c6bffc66bffffffffffffffffffdec6ffe79c21ffffd6ffffffffffffff\nffffffffffefffffd69494ffc673ffffffffffffffffffdec6ffde8421ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7deffde84\n42ffffb5ffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6e7bd84ffffffffffffffffff\nffffffffffffbde7ffa56b84ffffd6d6ffff63639cffd6a5ffffffffffffffffffffffff639cd6d6a56bffffffffffffffffffffffffffffffe7e7e7e7dedeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cffbd73ffffffffffff9cdeff73214affffbdffffff4a9cde9c4a21ffff\ndeffffffffffff2173bdbd7321ffffffffffff9cdeff73214affffbdffffffffffffbdffff4a2173ffde9cffffffffffffffffff9cdeff21214affbd73ffffff\nffffffffffffffffff73bdff732121ffffbdffffffffffffdeffff214a9cde9c4affffffffffffffffff2173bdde9c4affffffffffffbdffff4a2173ffde9c9c\ndeff4a214affde9cffffffffffffffffff4a9cdebd7321ffffffbdffff212173ffbd73ffffffbdffff212173ffbd73ffffffffffff2173bdbd7321ffffff73bd\nff9c4a21ffffdeffffffffffff9cdeff73214affffbd9cdeff4a214affde9cffffffffffff4a9cde9c4a21ffffde4a9cde9c4a21ffffdeffffffffffff73bdff\n732121ffffbdffffffffffffffffffbdffff212173ffbd73ffffffffffffffffff73bdff9c4a21ffffde73bdff9c4a21ffffdeffffffdeffff214a9cde9c4aff\nffffffffffffffff2173bdbd7321ffffffffffff2173bdbd7321ffffffffffffffffff4a9cdebd7321ffffffffffffdeffff214a9cffbd73bdffff212173ffbd\n73ffffffffffff2173bdbd7321ffffffffffffffffffffffff4a9cde732121ffffbddeffff214a9cde9c4affffffffffffffffff2173bdde9c4a2173bdde9c4a\nffffffffffffffffffffffffdeffff214a9cbd7321ffffff9cdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeff\nffffffffffffffffffffffffffffffffffffffffffffffd6ffff9c639cd6ffd663639c6b6b6be7bd84ffffff84b5e76b6b6b6363636b6b6b6363636b6b6b6363\n63a56b6bffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedea5a5ff0000ffc6c6ffffffffffffffffffffffffff\nffffffffffffffffff8cb5ff0000ff0000ff0000ff2929d673737b3131e70000ff0000ff0000ff3131ce7373737b7b7bd6ad73ffffffffffffffffffffffffff\nffffffffffffffffffffffffffff3939ff2121ffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff4abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294a\nbd214ac62142bd21adc629ffffd6e7ffff42bd9c4ac6294abd214ac62142bd214ac6294abd21adc621ffffd6e7ffff4abd9c4ac62142bd214ac6294abd214ac6\n2142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff6ba5d66b6b6b8c847b6b737b6b6b6b6b6b6b736b6bffd6a5ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff6ba5d6d6a56bffffffffffffa5d6ff8c6b6bffe7bdffffff84bdefbd8c6bffffe7ffffffffffffffffffffffff\nffffffefffff6b8cbdffd6a5ffffff84bdefbd8c6bffffe7ffffffefffff6b8cbdffd6a5ffffff6ba5d6efbd8cffffffffffffffffffffffffe7ffff6b8cbdef\nbd84ffffffffffffbdefffa56b84ffffd6ffffffffffffffffffffffffffffffffffffffffffd6ffff6b6ba56b6b6bffd6a5efffff6b84bd6b6b6bd6a56bffff\nffa5d6ff6b6b6ba56b6bffffd6ffffffffffffffffffffffff6ba5d66b6b6bffd6a5d6ffff6b6ba5a56b6bffffd6ffffffffffffffffffefffff6b8cbd846b6b\nffefbdffffffa5d6ff6b6b6bbd8c6bffffefefffff6b84bd8c6b6bffefbd8cbdef6b6b6bbd8c6bffffefffffffffffffffffffffffffffffffffffffffffffa5\nceef8c8c8c8484848c8c8c9c8c8cffe7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffefffffc6949cefb563ffffffffffffffffffffffffffffffffffffd6c6ffd68c4affffb5ffffffffffffffffffff\nffffceb5d6d69442ffffd6ffffffffffffffffffffffffffffffffffffffffffd6b5d6d69442ffffd6ffffffffffffffffffe7ffffc6847bffc684ffffffffff\nffffffffefffffc6949cefb563efffffce9c9cdea542ffffffffffffd6b5d6d69442ffffd6ceb5d6de9c4affffd6ffffffffffffffffffc6a5b5e7a542ffffff\nd6b5d6d69442ffffd6ffffffffffffffffffffffffffffffe7ffffc6847bffc684ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21ef8c\n21ffffd6d6b5c6d68c21f7b521ffffefd6cedeffef9cd6cedee78421ffffc6fffffffffffffffffffffffff7f7ffd68c6bffef9cd6cedef7ad21efefefffde6b\ne7e7f7f7ad21f7ffefd6846bd68c29d68c21d68c21d68421ffb529f7f7efd68c6bd68421ffe76befefffd68c21f7ad21fffff7d68c9cffce21ffffffffffffff\nffffffffffffffffd6ceded68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29f7ad21ffffefd6849cd68c29d68c21d68c21ffde6bf7efffd68c21f7b521ffffefd68c9cd68c21d68c21f7ad21fffff7d68c6bffe76befefff\nd68c29ffef9ce7e7efd68421d68c29d68c21ffe76befefffd68c29d68c21ffce21ffffffffffffffffffd6b5c6ffde6bf7efffd68c21d68c21d68421ffef9ce7\ndeefd68c21d68421d68c29d68c21d68c21ffce21f7efffd68c21d68c21ffef9ce7e7f7d68c21ffe76befefffd68c29ffef9cffffffffffffffffffffffffffff\nffd6849cd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21ffffffffffffffffffffffffffffffd68421ffffffffffffffffffffffff\ndeceffde8c21ffffb5ffffffffffffffffffefffffd6846bffce73ffffffffffffffffffdeceffde9421ffffd6ffffffffffffffffffffffffefffffd69c94ff\nc66bffffffffffffffffffdec6ffde8c21ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffefffffd68c6be79c21ffffd6ffffffffffffffff\nffffffffd68c29e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff8cbdef6b6b6bffd6a5ffffffffffffffffffffffffd6ffff6b6ba5bd846b\nffffefd6ffff6b6ba5ffd6a5ffffffffffffffffffffffff6ba5d6d6a56bffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffdeffff29529cffbd73ffffffffffff9ce7ff73214affffc6ffffff529ce79c4a21ffffe7ffffffffffff2173bdc67b\n21ffffffffffff9cdeff7b2152ffffbdffffffffffffe7ffff214a9cffc67bffffff7bc6ff212121292929de9c4affffffffffffffffffffffffffffffdeffff\n29529cffbd73ffffffffffffffffff73bdff9c5221ffffdeffffffffffff217bc6de9c4affffffffffffc6ffff4a2173ffe79c9cdeff7b2152ffffbdffffffff\nffffffffff4a9cde9c5229ffffdec6ffff212173ffc67bffffffffffff73bdff292929212121212121212121c67b29ffffff7bc6ff9c4a21ffffe7ffffffffff\nffbdffff52297bffde9c9ce7ff4a214affe79cffffffffffff4a9cde9c5229ffffde529ce7bd7321ffffffffffffffffff9cdeff7b2952ffffbdffffffffffff\nffffffbdffff52217bffde9cffffffffffffffffff73bdff7b2929ffffbd7bc6ff9c4a21ffffe7ffffffe7ffff214a9cffc67bffffffffffffffffff529ce7bd\n7321ffffffffffff9ce7ff73214affffc6ffffffffffff4a9cdec67b21ffffffffffffdeffff21529cffbd73ffffff73bdff212121212121292929212121c67b\n21ffffffffffff2173bd2121214a2121ffe79cffffffe7ffff214a9ce79c52ffffffffffffbdffff52297bffde9c7bc6ff9c4a21ffffe7ffffffc6ffff212173\n2929299c4a21ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffd6ffffa56ba5ffffd6ffffffffffffffffffffffff8cbdef6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6ba56b6bffffd6ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7a5a5ff0000ffceceffffffffffffffffffffffffffffffffffffffffffffb5e7ff\n5252b50000ff0000ff0000ff2921f70000ff0000ff0000ff4242d67b7b7b7b7b7b7b7b7be7bd8cffffffffffffffffffffffffffffffffffffffffffffffffff\nffff5a5aff1010ffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21a5bd21ff\nffdedeffff4abd9c42bd214abd2142bd214abd2142bd214abd21adbd21ffffdedeffff4abd9c42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffff6ba5d6636363ffd6a5ffffffffffff9cc6ef6b6b7bb57b63ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff6ba5d66363636b6b6b636363a56b6bffffd6ffffffffffff84bdef636363ffd6a5ffffffffffff9cbde7ffefbdffffffbdefff636384ffd6a5\nffffff84bdef636363efbd84ffffffa5d6ff846363ffefbdffffffa5d6ff636363ffd6a5ffffffd6ffffe7bdbdefffff6384bd846b6bffe7bdffffff639cd6bd\n846bffffe7bdefff636384ffd6a5ffffffffffffffffffffffffd6ffff6b6ba58463636b84846363636b6b6b84636384a5a56363636b6b6b636363bd846bffff\ne7bdefff6363846b6b6b6363636b6b6b846363ffefbdd6ffff6b6ba56363636b6b6b636363bd846bd6ffe76b6ba56363636b6b6b636363bd846bd6ffe76b6ba5\n6363636b6b6b6363636b6b6bbd8463ffffef84bde76b6b6b8484846b6b6b9c6363ffffd6ffffffffffffffffffffffff9cc6ef8c8c8c8484848c8c8c8484848c\n8c8c9c8c84ffe7c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffefffffce949cc68442ce8442c68442d68c42ffffb5ffffffffffffd6c6ffce8442ffffb5ffffffffffffffffffffffffd6deffce8c63ffd694de\nffffc6847bce8c42c68442ce8442ffde9cffffffceb5d6de9442ffffd6ffffffffffffffffffdeffffce8c7bffc67bffffffffffffffffffe7ffffce949cefb5\n5affffffffffffcea5b5c68442ce8c42c68442de9442ffffd6ceb5d6d69442ffffd6ffffffffffffffffffcea5b5dea542ffffffceb5d6ce8442c68442ce8c42\nc68442ce8442ce8442ffde9cdeffffce847bffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ef8421ffffded6adbde78c21fff7\nbdefefffd68421ffef9cd6c6d6d68c21ffde63e7deefd68421d68c21ffde63efefffef8421ffffded68494e78c21fff7bdffffefd6adbde78c21fff7bdd6b5c6\nd68421d68c21d68421d68c21f7ad21f7f7efd68463d68c21ffde63efefffd68421f7b521f7ffefd68c9cef8421ffffded68494d68c21ef8421ffffded6adbdd6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421f7ad21f7ff\nefd68c9cd68421d68c21d68421ffde6befefffd68c21f7ad21ffffefefefffd68c21d68421ffef9cefefffd68c21ffde63efefffd68421ffce21f7ffffd68c9c\nd68421ef8c21ffffd6d6ceded68421ffde6bd6adbdd68c21f7ad21ffffefd6849cf7b521ffffefd6adbdd68421ef8c21ffffd6e7deefd68421d68c21d68421d6\n8c21d68421ffce21efefffd68c21d68421ffef9cdedeefd68c21ffde63efefffd68421ffce21efefffd68c21d68421ffce21f7f7ffd68c6bd68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffdec6ffde8c21ffffb5ffffff\nffffffffffffe7ffffd68c73ffc66bffffffffffffffffffdec6ffe79421ffffd6fffffffffffffffffffffffff7ffffd6948cffc66bffffffffffffffffffde\nc6ffd68421d68c21d68421d68c21ffc66bffffffffffffffffffe7ffffd68c73d68421e7a521ffffffffffffffffffffffffffffffffffffd68421e7e7e7ffff\nffffffffffffffffffffffffffffffff84bde76b6b6b846363ffefbdffffffffffffffffffd6ffff63639c6b6b6bd69c63ffffffffffffd6ffff63639cffd6a5\nffffffffffffffffffffffff639cd6d6a56bffffffffffffffffffffffffffffffe7e7e7dededeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffdeffff214a9cde9c4affffffffffff9cdeff73214affffbdffffff4a9cde9c4a21ffffdeffffffffffff2173bdbd7321ffffffffffff9cdeff4a21\n4affde9cffffffffffffbdffff212173ffbd739cdeff21214affbd73ffffffffffffffffffffffffffffffffffffffffffffffff4a9cdebd7321ffffffffffff\nffffffbdffff4a2173ffde9cffffffffffff2173bdbd7321ffffffffffffbdffff4a2173ffde9c9cdeff4a214affde9cffffffffffffffffff4a9cdebd7321ff\nffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffff2173bdde9c4affffff73bdff732121ffffbdffffffffffff9cdeff4a214affde9c9cde\nff4a214affde9cffffffffffff4a9cde9c4a21ffffde73bdff9c4a21ffffdeffffffffffff73bdff732121ffffbdffffffffffffffffffbdffff212173ffbd73\nffffffffffffffffff73bdff9c4a21ffffde73bdff732121ffffbdffffffffffff2173bdde9c4affffffffffffffffff2173bdbd7321ffffffffffffdeffff21\n4a9cffbd73ffffffffffff4a9cde9c4a21ffffdeffffffdeffff214a9cffbd73ffffffffffffffffffffffffffffff2173bdde9c4affffff4a9cde732121ffff\nbdffffffffffffffffffdeffff214a9cde9c4affffffffffff4a9cde9c4a21ffffdedeffff214a9cffbd73deffff214a9cbd7321ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffd6\nffff9c639cd6ffd663639c6b6b6be7bd84ffffffffffff8cbde79c636bffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7dededea5a5ff0000ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ff0000ff\n0000ff0000ff0000ff7b6bdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff42bd214ac6294abd21\n4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21adc621ffffd6e7ffff4abd9c4ac62142\nbd214ac6294abd214ac62142bd21adc629ffffd6e7ffff42bd9c4ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6\n294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b\na5d66b6b6bffd6a5ffffffffffffffffff6b9cce7b6b6bffdeb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6d6a5\n6bffffffffffff6ba5d6d6a56bffffffffffff84bde7d6a56b6ba5d66b6b6bffd6a5efffff6b84bd6b6b6b6b6b6bd6a56bffffffffffff84bde7d6a56b84bdef\n6b6b6b6b6b6befbd8cffffffffffffffffffbdefff6b6b846b6b6ba56b6bffffd6efffff6b8cbde7d6a56b8cbd6b6b6b6b6b6bffd6a5ffffffbdefff6b6b8cff\nd6a5ffffffffffffffffffffffffd6ffff6b6ba5a56b6bbde7d66b6b8c6b6b6befbd8ce7ffff6b8cbd6b6b6b8c6b6bffe7bdffffffbdefff6b6b8c6b6b6b6b6b\n6b6b6b6bffd6a5ffffffffffffbdefff6b6b8c6b6b6b6b6b6bbd846bd6ffef6b6ba56b6b6b6b6b6b6b6b6bbd846bffffefefffff6b8cbd6b6b6b6b6b6ba56b6b\nffffd6ffffff8cbdef6b6b6bd6bd8c6b84bda56b6bffffd6ffffffffffffffffffffffffc6def7b5b5b5bdbdbdbdbdbdbdbdbdb5b5b5c6bdbdf7e7ceffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc6949c\nefb563ffffffffffffceb5d6d68c42ffffb5ffffffd6c6ffd68c42ffffb5ffffffffffffffffffffffffdedeffce8463ffde9cffffffffffffffffffffffffff\nffffffffffffffffceb5d6d69442ffffd6ffffffffffffffffffefffffc6949ce7a542ffffffffffffffffffe7ffffc6847bffc684ffffffffffffffffffffff\nffffffffceb5d6d69442ffffd6d6deffce8c63ffde9cffffffffffffefffffc6949ce7a54affffffd6c6ffd68442ffffbdffffffffffffd6deffd68c63ffffb5\ne7ffffc6847befb563ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421f78c29ffffd6d6b5c6ffce21ffffffd68c9cd68c21ffef9cd6ce\nded68c21d68c21ffef9cfffffffffffff7ffffd6846bffce29f7f7ffd68c6bd68421ffe76bf7f7ffd68c6bd68421ffe76be7deefd68c21d68421d68c29ffce21\nffffffffffffffffffd6ced6ffe76befefffd68c29f7ad21ffffefd6849cd68c29f7ad21ffffefffffffffffffd6ced6d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21f7ad21fffff7d68c9cd68c21d68421d68c\n29ffde6befefffd68421ffb529ffffefffce9cfffffffffffff7f7ffd68c6bd68421ffe76befefffd68c21d68421ffce29ffffffffffffffffffe7e7f7d68c21\nd68c21e78421ffffc6ffffffffffffe7deefd68c29d68c21ffce21ffffffffffffffffffffffffe7deefd68c29d68c21d68c21d68421ffe76bffffffffffffff\nffffd6b5c6ffef9ce7e7efd68421ffe76befefffd68c21d68421ffe76bffffffffffffffffffd68c9cd68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffdec6ffd68421d68c29d68c21d68c21d68421d68c29d68c21\nffc673ffffffffffffffffffdec6ffde9421ffffdeffffffffffffffffffffffffefffffd69c94ffc66bffffffffffffffffffdec6ffde8c29ffffb5ffffffde\ndeffd68c4affc66bffffffdedeffd68c4ade9421ffffd6ffffffffffffffffffffffffffffffffffffffffffd68c21e7e7e7ffffffffffffffffffffffffffff\nff6ba5d66b6b6bffd6a5ffffffffffffffffffffffffbdefff6b6b84bd8c6bffffe7ffffffffffffffffffd6ffff6b6ba56b6b6b6b6b6b6b6b6b6b6b6b6b6b6b\n6b6b6bd6a56bffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff21529c4a\n2121ffe79cffffff217bc69c4a21ffffe7ffffff529ce79c4a21ffffe7ffffffffffff2173bdc67b29ffffffffffff9cdeff2929529c4a21ffffe7ffffff529c\ne7732121ffffc69cdeff522952ffde9cffffff9cbdffffe79c9cdeff212152ffbd73ffffffffffff9ce7ff4a214affe79cffffffffffffffffff297bc6bd7321\nffffffffffff297bc6212121ffc67bffffff529ce7732121ffffc6ffffff297bc69c4a21ffffe7ffffff9ce7ff21214affc67bffffffc6ffff212173ffc67bff\nffffffffff73bdffffc67bffffffc6ffff212173e79c52ffffff7bc6ff212121c67b21ffffffffffff2173bd9c5221ffffde9ce7ff4a214affe79cffffffffff\nff4a9cde9c5221ffffdec6ffff212173e79c52ffffffe7ffff214a9c7b2121ffffbdffffffffffffffffffffffff529ce7732121ffffc6ffffffc6ffff212173\ne79c52ffffff7bc6ff212121e79c52ffffffffffff73bdff522121ffde9cffffff9cdeff212152bd7321ffffffffffffffffff4a9cde9c5229ffffdeffffff4a\n9cde292929de9c4affffff73bdff522929ffde9cffffff73bdffffc67bffffffc6ffff212173e79c52ffffff529ce79c4a21ffffe7ffffff9c9cc6ffffdee7ff\nff214a9ce79c52ffffffe7ffff214a9ce79c52ffffffffffff4a9cdec67b21deffff29529cde9c4affffffbdffffe79c9cffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa56ba5ffffd6ffffffff\nffffffffffffffffffffffffffffc6bdefffffd6d6ffffa56ba5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7e7e7e78484ff0000ffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3939ff0000ff0000ff0000ff1010ff7b7384\nf7deadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21adbd21ffffdedeffff4abd9c42bd214abd2142bd214abd2142bd214a\nbd21a5bd21ffffdedeffff4abd9c42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6636363ffd6a5ffffffff\nffffd6f7ff7384ad737b7bdead84fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6d69c63ffffffffffffbdefff9c63\n84ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffefffff6384bdffd6a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffefffff6384bd846b6bffe7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffce949cefb55affffffffffffefffff\nc6949cefb563ffffffd6c6ffce8442ffffb5ffffffffffffffffffffffffd6d6ffce8463ffde9cffffffffffffffffffffffffffffffffffffffffffceb5d6de\n9442ffffd6ffffffffffffffffffffffffd6c6ffc68442ffc67bffffffffffffc6a5b5de9442ffffd6ffffffceb5d6ffde9cffffffefffffc6949ce7a542ffff\nffefffffc6949cde9442ffffd6ffffffceb5d6ce8c42dea542ffffffefffffce949cdea542ffffffffffffcea5b5dea542ffffffdeffffce8c7bce8442ffffb5\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ef8421ffffdeefadbdffffded6c6d6d68c21d68421ffef9cd6c6d6d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21f7ad21f7ffefd68463d68c21\nd68421d68c21d68421f7ad21f7ffefd68c9cd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421f7b521f7ffefd68c9cd68421d68c21d68421ffde6befefffd68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21ffde63efefffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21ffef9ce7deefd68421d68c21d68421d68c21d68421ffce21efefffd68c21d68421d68c21d68421d6\n8c21ffde63efefffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffff\nffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffdec6ffde8c21ffffb5ffffffffffffffffffe7ffffd68c6bffc66bffffffffffffffffff\ndec6ffe79c21ffffd6ffffffffffffffffffffffffefffffd69494ffc673ffffffffffffffffffdec6ffde8421ffffb5ffffffffffffd6b5d6e79421efffd6d6\n9c94e7a521ffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffff9cd6ff846b6bffe7bdffffffffff\nffffffffffffffefffff6384bdd6a56bffffffffffffffffffffffffffffffd6ffff63639cffd6a5ffffffffffffffffffffffff639cd6d6a56bffffffffffff\nffffffffffffffffffe7e7e7e7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cdebd73214a9c212121212121ff\nbd73ffffff2173bd212121212121212121bd9c4a214a9c212121212121212121ffbd739cdeff73214a9cdebd21214a2121214a2121ffde9cffffffffffff73bd\nff212121212121bd7321ffffff9cdeff21214affbd73ffffffffffffffffff2173bdde9c4affffffffffffffffff9cdeff73214affffbdffffff2173bdde9c4a\n2173bd212121212121ffbd73ffffffffffffffffff2173bd212121212121212121ffbd73ffffff9cdeff21214a212121212121732121ffffbdffffff2173bd21\n21212121219c4a21ffffdeffffff73bdff9c4a2173bdde212121212121732121ffffbdffffff9cdeff4a214affde9cffffffffffff4a9cde9c4a21ffffdeffff\nff9cdeff21214a2121214a21219cbd9c73214affffbdffffffffffffffffffffffffffffff4a9cde212121212121212121de9c4affffffffffff73bdff9c4a21\n4a9cbd212121de9c4affffff4a9cde2121212121219c4a214a9cbdbd7321ffffffffffffffffffbdffff4a2173ffde9cffffff4a9cdebd73214a9cde21212121\n2121de9c4affffffffffffffffff2173bd2121212121219c4a21ffffdeffffffffffff2173bd212121212121ffbd73bdffff2121732121212121214a2121739c\n9c4a2121ffde9cffffffffffff9cdeff4a214affde9cbdffff212173212121732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffd6ffff9c639cd6ffd663639c6b6b6b6363636b6b6b9c6363ff\nffd6ffffffffffffd6ffffa56ba5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dede8484ff0000\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2129ff0000ff0000ff0000ff0000ff1818ef7b737bf7d6adffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21\n4ac6294abd214ac62142bd214ac6294abd214ac62142bd21adc629ffffd6e7ffff42bd9c4ac6294abd214ac6214abd21cef7734abd94adc621ffffd6e7ffff4a\nbd9c4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6\n2142bd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d66b6b6bffd6a5ffffffffffff8caddeffdeadffffff84\naddeffdeadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5d6d6a56bffffffffffff84bdefa56b6bffffd6ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7ffff6b8cbdffd6a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffff6ba5d6846b6bffefbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc6949cefb563ffffffffffffffffffcea5bddea542ffffffd6c6ff\nd68c4affffb5ffffffffffffffffffffffffd6c6ffd68442ffffbdffffffffffffffffffffffffffffffffffffffffffd6b5d6d69442ffffd6ffffffffffffff\nffffffffffffffffdedeffc68463ce8c42c68442de9c4affffd6ffffffffffffefffffc6949cce8c42c68442de9c4affffd6ffffffffffffefffffc6949cce8c\n42c68442efb563c6a5b5e7a542ffffffffffffffffffcea5bdc68442ce8c4ad69442ffffd6ffffffe7ffffc6847be7c684c6847bd68c4affde9cffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21ef8c21ffffd6fffff7efefffd68c21d68421d68c29ffef9cd6ceded68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffb529f7f7efd68c6bd68421d68c29d68c21d68c21f7ad21\nfffff7d68c9cd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29f7ad21ffffefd6849cd68c29d68c21d68c21ffde6bf7efffd68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21ffe76befefffd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421ffef9ce7deefd68c21d68421d68c29d68c21d68c21ffce21f7efffd68c21d68c21d68421d68c29d68c21ffe76befefffd68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21ffffffffffffffffffffffffffff\nffd68421ffffffffffffffffffffffffdeceffde8c21ffffb5ffffffffffffffffffefffffd6846bffce73ffffffffffffffffffdeceffde9421ffffd6ffffff\nffffffffffffffffffefffffd69c94ffc66bffffffffffffffffffdec6ffde8c21ffffb5ffffffffffffdeb5d6de9421f7ffded69494ffc673ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffd68c29e7e7e7ffffffffffffffffffffffffa5d6ffbd846bffffefffffffffffffffffffffffffefffff6b8c\nbdffd6a5ffffffffffffffffffffffffffffffd6ffff6b6ba5ffd6a5ffffffffffffffffffffffff6ba5d6d6a56bffffffffffffffffffffffffffffffe7e7e7\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff29529cffbd73ffffffffffffffffffffffffffffffffffff529ce79c\n4a21ffffe7ffffffffffff2173bdc67b21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff73bdff9c5221ffffdeffffffffffffe7ffff214a9cffc67bffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffff212173ffc67bffffffffffffffffffffffffffffffffffffffffffffffffff\nffff7bc6ff9c4a21ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff217bc6de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff214a9ce79c52ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa56ba5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa5\n6ba5ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e78484ff0000ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff8c94ff0000ff0000ff0808ff0000ff0000ff0000ff3131d69c7b7bfff7ceffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff8484ff0000ffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd21d6de42fffff7f7fff763e7d642bd214abd214abd21f7ef73deffff4abd9cced631ffffefd6ffff4abd8c42bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffd6f7ff7384ad737b7bdead84fffff7ffffff7baddeffdeadffffff7baddeffdeadffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff6ba5d66363636b6b6b636363846b6bffe7bdffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff\n6384bdffd6a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffefffffce949ce7b55affffffffffffffffffc6a5b5dea542ffffffd6c6ffce8442ffffb5ffffffffffff\nffffffefffffc6949cefb563ffffffffffffffffffffffffffffffffffffffffffffffffceb5d6de9442ffffd6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcea5b5dea5\n42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21ef8421ffffdef7ffffd68c9cd68421d68c21d68421ffef9cd6c6d6d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ef8421ffffded6adbdd68c21ffde63efefffd68421f7b521f7ffefd68c9cd68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421f7ad21f7ffefd68c9cd68421d68c21d68421ffde6befefffd68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffde\n63efefffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nffef94e7deefd68421d68c21d68421d68c21d68421f7b521f7ffefd68c9cd68421ffef9cdedeefd68c21ffde63efefffd68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffffffffffffffd68c21ffffffffffffffff\nffffffffdec6ffde8c21ffffb5ffffffffffffffffffe7ffffd68c73ffc66bffffffffffffffffffdec6ffe79421ffffd6fffffffffffffffffffffffff7ffff\nd6948cffc66bffffffffffffffffffdec6ffde8421ffffb5ffffffe7ffffd6846bf7b54affffffdeb5d6de9421ffffd6ffffffe7ffffe7a56bffffffffffffff\nffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffd6ffff6b6ba5ffd69cffffffffffffa5bdefffe7bdffffff84bde7bd846bffffe7ffffffd6ff\nffd6a5a5ffffffd6ffff63639cffd6a5ffffffffffffffffffffffff639cd6d6a56bffffffffffffffffffffffffffffffe7e7e7dededeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffdeffff214a9cffbd73ffffffffffffffffffffffffffffffffffff4a9cde9c4a21ffffdeffffffffffff21\n73bdbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffbdffff212173ffbd73ffffffffffffffffff4a9cde9c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff9c4a21ffffdeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff73bdff732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cde9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffff\nffffffffffffffffffffffffffffffd6ffff63639c6b6b6b6363636b6b6b6363636b6b6b6363636b6b6b6363636b6b6b636363a56b6bffffd6ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7dedede8484ff0000ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdedeff1818ff0000ff0808ff9cc6ff3939bd0000ff0000ff0000ff7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffff6363ff0000ffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff42bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6299cbd21\nd6ffd642bd849cc629d6ffce4ac68c52bd21f7f77bffffffffffffffffffffffffffffff94f7f742bd294ac6294abd214ac62142bd214ac6294abd214ac62142\nbd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff8caddeffdeb5ffffff84b5e7ffdeadffffffceefff737b9c737373c69c7bffffefffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffefffffc6949cefb563ffffffffffffd6c6ffce8c42ffc67bffffffd6c6ffd68c42ffffb5ffffffffffffdedeffc68463e7a54affffff\nffffffffffffffffffffffffffffffffffffffffffffffffceb5d6d69442ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a5b5e7a54affffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21ffde6bffffffefefffffe76befefffd68c29f7ad21ffffefd6849cd68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffe76befefffd68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21ffef9ce7deefd68c29d68c21\nd68c21d68421d68c29d68c21ffef9cffffffe7e7f7ffef9ce7e7efd68421ffe76befefffd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffdec6ffde8421ffff\nb5ffffffffffffffffffefffffd68c6bffc673dedeffd68c4ad68c21d68c21d68421d68c29d68c21e79c21d6a594d68c29d68c21d68c21d68421d68c29d68c21\nffc673dec6ffd68c29d68c21d68c21d68421efad29ffffffffffffffffffdebdded68c21d68c21de8421ffffb5ffffffffffffffffffffffffffffffd68c21e7\ne7e7ffffffffffffffffffffffffffffffd6ffff6b6ba56b6b6b6b6b6befbd84ffffffffffffffffff84bdef6b6b6b6b6b6ba56b6bffffd6ffffffd6ffff6b6b\na5ffd6a5ffffffffffffffffffffffff6ba5d6d6a56bffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffdeffff21529cffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff297b\nc6bd7321ffffffffffffffffff9cdeff522152ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6ff9c4a21ffffe7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffc6ffff212173ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffd6ffff6b6ba58c6b6bffefc6ffffffffffffffffffffffffffffffffffffbdefff6b6b8ca56b6bffffd6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7e7e7e78484ff0808fffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff2929ff0000ff0000\nff8484ffaddeff7b7b7b3939c60000ff0000ff0000ff5252fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5a5aff0808ff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd219cbd21d6ffce4ac6949cbd21deffd6\n42bd8c52bd21efef6bfffffffffffffffffff7ffffa5f7ef42bd424abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n7baddeffdeadffffff7baddeffdeadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ff\nffce949cc68442ce8c42c68442ce8442ffc67bffffffffffffd6c6ffc68442ce8c42c68442ce8442ce8442ffde9cffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffceb5d6de9442ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcea5b5dea542ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffe7ffff6b7bb56b6b6b\n6363636b6b6bb57b6bffffe7e7ffff6b84bd6363636b6b6b636363bd846bffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7e7dede8484ff0000fffffffffffffffffffffffffffffffffffffffffffff7f7ff4242ff0000ff0000ff1818ffffffffadd6ff7b7b7b7373\n734239de0000ff0000ff0000ff1818ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff2121ffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd214ac62142bd214ac6294abd214ac6\n2142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6214abd21efef73fffff7f7ffff84efde4ac6314abd2152c621efef6b\ne7ffff4abd9c4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294a\nbd214ac62142bd214ac6294abd214ac62142bd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff7394b57b7373deb594\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21ffffffffffffffffffffffffffffffd68421ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c29e7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff8c73a5ffefbd\nc6efffa56b8cffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e784\n84ff0000ffffffffffffffffffffffffffffffffffffffffffff4a4aff0000ff0000ff0000ffb5b5ffffffffb5deff7b7b7b7b7b7bd6ad844a4aff0000ff0000\nff0000ff0000ff6b6bffffffffffffffffffffffffffffffffffffffffffffffffff1818ff2121ffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd2152bd21bde76b4abd8c42bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffff\nffffffffffd68c21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94c6e76b6b7b736b63e7c694ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7dedede8484ff0000ffffffffffffffff\nfffffffffffffffff7f7ff4a4aff0000ff0000ff0000ff9c9cffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff0000ff0000ff0000ff3939\nfff7f7fffffffffffffffffffffffffffffffff7f7ff0000ff3939ffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff42bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6\n294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21\n4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421ffffffffffffffffffffffffffffffd68c21ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffd68c21e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e78484ff0000ffe7e7ffffffffffffffffffffffffff4a4aff00\n00ff0000ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffceceff2929ff0000ff0000ff0000ff3131fff7f7ffffffffffff\nffffffffffffffceceff0000ff5a5affe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21ffffffffffffffffffffffffffffffd68c21ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nd68421e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dede8484ff0000ffc6c6fffffffffffffff7f7ff4a4aff0000ff0000ff0000ff8484ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b6bff0000ff0000ff0000ff3131fff7f7ffffffffffffffffffff8484ff0000\nff7b7bffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a\nbd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6\n2142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21\n4ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffde9c42d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c31ffffffffffffffffffffffffffffffd68421ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c29e7e7e7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7e7e7e7e7a5a5ff0000ff9494ffffffffefefff3939ff0000ff0000ff0000ff6363ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff9c9cff0000ff0000ff0000ff3131fff7f7ffffffffffffff1818ff0000ffadadffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7\ne7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdead73d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421deb573ffffffffffffffffffffffffffffffde9c42fff7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7\ndededebdbdff0000ff5a5affceceff1818ff0000ff0000ff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffa5a5ff0000ff0000ff0000ff0808ff5a5aff4a4aff0000ff0000ffd6d6ffe7e7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff42bd214ac6294abd214ac62142bd214ac6294abd214ac62142\nbd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6\n294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd21\n4ac62142bd214ac6294abd21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d68c31d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21\nd68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c\n29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d69431ffefe7ffffffffffff\nffffffffffffffffffe7b573efce94ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c21e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7dedeff0000ff1818ff\n1010ff0000ff0000ff0000ff6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff9c9cff0000ff0000ff0000ff0000ff0000ff0000ff2121fff7f7f7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff4abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd21\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7deb57bde9c4ad68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d69439e7b573f7efe7fffffffffffffffffffffffffffffffffffffffff7\nd69439efcea5fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffd68421e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7dedeffffff0000ff0000ff0000ff0000ff0000ff9c9cff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff00\n00ff0000ff0000ff0000ff0000ff2929ffd6d6e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff5ac6394ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294a\nbd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6\n2142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac6215ac639ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefbd84dea552d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c\n21d68421d68c29e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7dedee70808ff0000ff0000ff1010ffadadefe7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7d6d6e73939ff0000ff0000ff00\n00ff0000ff3131ffbdbdfff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff84ce6342bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd2184ce6bffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffefefeff7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff7b7bff0000ff0000ff0808ffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff94\n94ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff7e752c6294abd21\n4ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142\nbd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6294abd214ac62142bd214ac6\n294abd214ac62142bd214ac6294abd214ac62142bd2152c629eff7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffefefeff7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffc6c6ff0000ff0000ff0000ff0808ff7b7bfff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff0808ff0000ff0000ff7373ff7373ff0000ff0000ff0000ff3131fff7f7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f7e784ce6b5ac6394abd2142bd214abd21\n42bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214a\nbd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd214abd2142bd\n214abd215ac63984ce6be7f7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7\ne7e7e7e7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7\ne7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dede\ndee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7\ne7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7\ne7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dede\ndee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7\ne7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7\ne7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedeefe7e7efef\nefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1818ff0000ff0000\nff0000ff0000ff0000ff1010ff6363ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff7b7bff0000ff0000ff4a4affffffffffffffa5a5ff4242ff0000ff0000ff9494ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff0000ff0000ff3939ff2121ff0000ff0000ff0000\nff0000ff0000ff0000ff2929ff4242ff4242ff6363ff8484ffa5a5fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff4242ff\n0000ff0000ff2121ffffffffffffffffffffffffffffffff0808ff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3131ff0000ff1010ffe7e7ffe7e7ff7373ff0808ff0000ff0000ff0000ff0000ff0000\nff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff3131ff4242ff4242ff0000ff0000ff0000ff0000ff0000ff9c9cffffffff\nffffffffffffffffffffffff9494ff0000ff0808ffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffff7f7ff0000ff0000ff9494ffffffffffffffffffffefefff9c9cff5252ff1010ff0000ff0000ff0000ff0000ff0000ff0000\nff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff4a4affffffffffffffffffffffffffffffffffffff\nffffff0000ff0000ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffdedeff0000ff2121ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdffc6c6ffc6c6ff8c8cff6363ff0808ff0000ff0000ff0000\nff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0808ff5252ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffff3939ff0000ff0000ff\nc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff6363ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff9494ff4a4aff4242ff1010ffadadffffffffc6c6\nffc6c6ffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdff4242ff4242ffd6d6ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff4242ffadadffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffffc6ffffc6ffffc6ffffb5ffff84ff\nff84ffff84ffff84ffff84ffff84ffff84ffff84ffffb5ffffc6ffffc6ffffc6ffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffc6ffff8cffff4affff10ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff\nff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff29ffff42ffff73ffff8cffffc6ffffefffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefe7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e794efef6bf7f739ffff39ffff31\nffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ff\nff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff08ffff39ffff39ffff39ffff39ffff63ffff73f7f773f7f773f7f7\na5efefb5efefe7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7dedef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffff7ffffc6ffffc6ffffc6ffffbdffffc6ffff94ffff5affff10ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00\nffff00ffff00ffff00ffff10ffff42ffff42ffff73ffff84ffff84ffff84ffff7bffff84ffff84ffff84ffff7bffff84ffff84ffff7bffff42ffff42ffff39ff\nff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff18ffff\n42ffff73ffff8cffffc6ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffff7f7f7efe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceffff84ffff42ffff10ffff\n00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff31ffff42ffff84ffffbdffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffffb5ff\nff84ffff4affff29ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff\n00ffff52ffffadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7\nefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7e7ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffff8cffff42ffff08ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff\n00ffff00ffff00ffff00ffff00ffff00ffff4affff9cffffc6ffffc6ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffd6ffffc6ffffbdffffc6ffffc6ffffc6ffff7bffff6bffff42ffff10ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff18ffff\n8cfffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffadffff73ffff42ffff18ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff18ffff42ffff42ffff42ffff42ffff73ffff84ffff\nadfffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffc6ffffa5ffff84ffff52ffff10ffff00ffff00ffff00ffff00ffff00ffff10ffff84fffff7ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff7bffff42ffff08ffff00ffff00ffff00ffff00ff\nff00ffff00ffff00ffff00ffff00ffff00ffff39ffff84ffffc6ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5ffff4affff00ffff00ffff00ffff00ffff00ffff10ffff7bfffff7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffb5ffff63ffff10ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff42ffff84ff\nffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffdeffff63ffff00ffff00ffff00ffff00ffff00ffff10ffff84ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffff9cffff21ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff5affffa5ffffbdffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7ffff6bffff08ffff00ffff00ffff00ffff00ffff31fffff7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7\ne7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffff29ffff00ffff00ffff00ffff00\nffff00ffff00ffff42ffff8cffffc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffefffff63ffff00ffff00ffff00ffff00ffff42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff63ffff00ffff00ffff00ffff00ffff00ffff4affffa5ffffefffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdeffff5affff00ffff00ffff00ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffff7ffff31ffff00ffff00ffff00ffff00ffff4affffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84ff\nff00ffff00ffff4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff39ffff00ffff00ffff00ffff21ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6bffff00ffff00fffff7ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94ffff00ffff00ffff00ffff\n73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff08ffff00ffffceffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff39ffff00ffff00ffff9cffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5affff00ffff9cffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffff7ffff00ffff00ffff73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffa5ffff00ffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffeff7ffe7e7e7dededef7efe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffbdffff00ffff18fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffd6ffff00ffff5affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdde\nff5a73944a4a524242424a4a4a424242735a52d6b58cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffc6efff5a739c5252529c735affefc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nff94ffff00ffff6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7effffff7efffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\nffff42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5ef424a528c6352cec6a5dededed6de\ndeced6de6b8ca54a4a5ab58452ffffe7ffffffffffffffffffffffffffffffffffffffffffffffff9cd6ff4a4a634242424a4a4a4242429c634affffd6ffffff\nffffffffffffd6ffff4a639c4242424a4a4a424242ffb584ffffffffffffffffffffffffffffff9cd6ff424263634a4affd69cffffffffffffffffffffffffff\nffffffffffffffffffffffffffff7bb5ff4a4a4a4242424a4a4a7b4242ffffb5ffffffffffffb5ffff4a4a844242424a4a4a7b4242ffffb5ffffffffffff7bb5\nff844a4affffb5ffffffffffff639cd69c6342ffffd6ffffffd6ffff42639cd69c63ffffff9cd6ff634263ffd69cffffffffffff7bb5ff844a4affffb5ffffff\nffffff4a84b5b57b42ffffffb5ffff4a4a84ffb57bffffffffffff84b5ff4242424a4a4affb57bb5ffff42427b4a4a4a424242d69c63ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff6ba5e7d69c6bffffff639cd6e7a56bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff427bb54a4a4a\n4242424a4a4a4242424a4a4a4242429c634affffd6ffffffffffffffffffffffffffffff427bb54a4a4a4242424a4a4a424242d69c63ffffffffffff9cd6ff63\n4a63ffd69cffffffffffffffffff427bb54a4a4a424242b5844a427bb5b5844affffffb5ffff42427bffb584ffffffffffffb5ffff4a4a84ffb57bffffffffff\nff9cd6ff4242634a4a4a424242ffb584ffffff84b5ff7b4242ffffb5ffffffffffff7bb5ff844a4affffb5ffffffd6ffff4a639c4242424a4a4a7b4242ffffb5\nffffffffffff427bb54a4a4a4242429c634affffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84ffff00ffffadffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffff94c6ef424a6394634affe7c6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff639cd64a4a4a9c6342ffffd6ffffffffffffffffffffffffffffffffffffd6ffff4a639cd69c63ffffffffffffffffff9cd6ff4a\n4a63b57b42ffffffd6ffff4a639c4242424a4a4a7b4242ffffb5ffffffd6ffff42639cd69c63ffffffffffff9cd6ff4a4a634242424a4a4ab57b42ffffffffff\nffb5ffff42427b4a4a4a424242b5b58442427bffb584ffffff84b5ff4242424a4a4a634242ffd69cffffffffffffb5ffff4a4a844242424a4a4a9c6342ffffd6\nffffffd6ffff42639c4a4a4a424242b5844affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18ffff21ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84bdf74a4252d69c6bfffff7d6ffff42639c634a4affd69cffffffa5cef74a52\n73b57b52ffffefffffffffffffffffffffffffffffffffffffffffff639cd64242424a4a4a4242424a4a4a424242844a4affffb5ffffffd6ffff4a639c424242\n4a4a4a4242424a4a4a424242ffbd84ffffffffffffffffffffffff9cd6ff4a4a63634242ffd69cffffffffffffffffffffffffffffffffffffffffffffffff42\n7bb5634a4affd69cffffffffffffbdffff7b427bffffbdb5ffff4a4a84b57b42ffffffffffff84bdff634242ffd69cffffff84bdff7b4242ffffbdffffffffff\nff639cd69c634affffd6ffffffd6ffff4a639cd69c63ffffff9cd6ff634a63ffd69cffffffffffff84bdff7b4242ffffbdffffffffffff427bb5bd844affffff\nbdffff42427bffbd84ffffffd6ffff42639cbd844affffffffffff7b9cd6ffd69cffffffbdffff42427bffbd84ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ba5e7efad\n73ffffff73adefe7a56bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a84bd4242424a4a4a4242424a4a4a424242\n4a4a4a9c6342ffffd6ffffffffffffffffffffffffffffff4a84bdb57b42ffffffffffffbdffff42427bd69c63ffffff9cd6ff634263ffd69cffffffffffff7b\nb5ff634a4affd69cffffff7bb5ff4a4a4ab57b42ffffffb5ffff4a4a84ffb57bffffffffffffbdffff42427bffbd84ffffff9cd6ff424263d69c63ffffffffff\nff7b7bb5ffffbd7bb5ff844a4affffb5ffffffffffff84bdff7b4242ffffbdffffff4a84bd7b4242ffffbdffffffbdffff9c637bffffd69cd6ffd69c84ffffff\nffffff427bb5bd844affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffff00ffffdeffffffffffffffffffffffffffffffff\nffffffffffffffffffff94ceef6b5263ffd6a5639cce946b52ffefc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n639cd64242429c634affffd6ffffffffffffffffffffffffffffffffffffd6ffff42639cd69c63ffffffffffffffffff4a84bd7b4242ffffbdffffff4a84bd7b\n4242ffffbdffffffbdffff9c637bffffd6d6ffff4a639cd69c63ffffffb5ffff4a4a84b57b42ffffffffffff84bdffd69c63ffffff427bb59c634affffd6ffff\nff427bb54a4a4affb57bd6ffff9c7b9cffffd6ffffff84bdff7b4242ffffbdd6ffff4a639c9c6342ffffd6ffffff9cd6ffb57b63ffffff7bb5ffffbd84ffffff\nd6ffff42639cd69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff39ffff00ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffc6ffff425284ce945affffffffffffd6ffff4a639c634242ffd69cffffffffffff8cc6ff524a5affbd84ffffffffff\nffffffffffffffffffffffffffffffff7b9cd6ffd69cffffffffffff9cd6ff4a4a63424242d69c63ffffff84b5ff4242424a4a4affb57bffffff427bb54a4a4a\n9c6342ffffd6ffffffffffffffffff9cd6ff424263634a4affd69cffffffffffffffffffffffffffffffffffffffffff7bb5ff634a4affd69cffffffffffffff\nffffffffffffffffffffff639cd69c6342ffffd6ffffffffffffffffff4a84b5b57b42ffffff7bb5ff844a4affffb5ffffffffffff639cd69c6342ffffd6ffff\nffd6ffff42639cd69c63ffffff9cd6ff634263ffd69cffffffffffff7bb5ff844a4affffb5ffffffffffff4a84b5b57b42ffffffb5ffff4a4a84ffb57bffffff\nd6ffff4a639cd69c63ffffffffffffffffffffffffffffffd6ffff4a639cd69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff5a6b9c5a5a5a5a4a4affce94ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bb5ff4a4a4a424242ffb584ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff427bb5b5844affffffffffffffffff639cd69c6342ffffd69cd6ff634a63ffd69cffffffffffff84b5ff7b4242ffffb5ffffffff\nffff427bb5b5844affffffb5ffff42427bffb584ffffffffffffb5ffff4a4a84ffb57bffffff427bb5b5844affffffffffffffffffffffffffffff84b5ff7b42\n42ffffb5ffffffffffff7bb5ff844a4affffb59cd6ff424263ffb584ffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd69c6342ffffd6\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff94c6ef6b52\n63ffd6a5ffffffffffff639cce94634affe7c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd64a4a4a9c6342ffffd6\nffffffffffffffffffffffffffffffffffffd6ffff4a639cd69c63ffffffffffff9cd6ff424263ffb584ffffff9cd6ff424263ffb584ffffffffffffffffffff\nffffffffffd6ffff42639cd69c63ffffff639cd67b4242ffffb5ffffffffffffffffffffffffffffff4a84b5b57b42ffffffffffffb5ffff42427bffb584ffff\nffffffffffffffffffff9cd6ff634a63ffd69c84b5ff634242ffd69cffffffffffffffffffffffffffffffffffffffffffffffffffffff4a84b5b57b42ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff5affff00fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff73adef84524affefb5ffffffffffffd6ffff42639c634a4affd69cffffffffffffffffff5284bdad734affffe7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff427bb54a4a4ab57b42ffffff427bb54a4a4a9c6342ffffd6ffffff9cd6ff424263634a4affd69cffffffffffff\nffffff9cd6ff4a4a63634242ffd69cffffffffffffffffffffffffffffffffffffd6ffff4a639cb57b42ffffffffffffffffffffffffffffffffffffffffff42\n7bb5bd844affffffffffffffffffffffff639cd69c634affffd684bdff7b4242ffffbdffffffffffff639cd69c634affffd6ffffffd6ffff4a639cd69c63ffff\nff9cd6ff634a63ffd69cffffffffffff84bdff7b4242ffffbdffffffffffff427bb5bd844affffffbdffff42427bffbd84ffffffd6ffff42639cd69c63ffffff\nffffffffffffffffff639cd64a4a4a634242ffd69cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd64242424a4a4a4242424a4a4a6b524adeb58cffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffff427bb54a4a4a424242d69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffff\n4a84bdb57b42ffffffffffffffffff7bb5ff9c634affffd69cd6ff634263ffd69cffffffffffffb5ffff4a4a84d69c63ffffffffffff4a84bdb57b42ffffffb5\nffff4a4a84ffb57bffffffffffffbdffff42427bffbd84d6ffff4a639cd69c63ffffffffffffffffffffffffffffff7bb5ff844a4affffb5ffffffffffff84bd\nff7b4242ffffbd7bb5ff844a4affffb5ffffffffffffffffffffffffffffffffffffffffff9cd6ff4a4a63424242d69c63ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff63ffff10ffffffffffffffffffffffffffffffffffffffffffffff94ceef735263ffdeadffffffffffffffffffffff\nff639cce946b52ffefc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd64242429c634affffd6ffffffffffffffffffffffff\nffffffffffffd6ffff42639cd69c63ffffffffffff427bb59c634affffd6ffffff7bb5ff844a4affffb5ffffffffffffffffffffffffffffffd6ffff4a639cd6\n9c63ffffff427bb5bd844affffffffffffffffffffffffffffffffffff7bb5ff634a4affd69cffffffb5ffff4a4a84ffb57bffffffffffffd6ffff42639c4a4a\n4a9c6342ffffd6639cd69c634affffd6ffffffffffffffffffffffffffffffffffffffffff7bb5ff4a4a4a424242ffbd84ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff7bffff00ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a7bb5b57b4aff\nffffffffffffffffd6ffff4a639c634242ffd69cffffffffffffffffff84b5ff7b424affffb5ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff9cd6ff4a4a63424242d69c63ffffff4a84b5424242b5844affffffffffffb5ffff4a4a84424242ffb584ffffffffffffffffff9cd6ff424263634a4a\nffd69cffffffffffffffffffffffffffffffffffffb5ffff42427bffb584ffffffffffffffffffffffffffffffffffffffffff4a84b5b57b42ffffffffffffff\nffffffffff639cd69c6342ffffd67bb5ff844a4affffb5ffffffffffff639cd69c6342ffffd6ffffffd6ffff42639cd69c63ffffff9cd6ff634263ffd69cffff\nffffffff7bb5ff844a4affffb5ffffffffffff4a84b5b57b42ffffffb5ffff4a4a84ffb57bffffffd6ffff4a639cd69c63ffffffffffff9cd6ff4242634a4a4a\nffb57bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffff639cd64a4a4a635a4a4a525a4242424a4a4a4a4242d69c63ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff639cd64a4a4a424242844a4affffb5ffffffffffffffffffffffffffffffffffffffffff427bb5b5844affffffffffff\nb5ffff4a4a84d69c63ffffff9cd6ff634a63ffd69cffffffffffffffffffd6ffff4a639c4242424a4a4a424242b5844affffffb5ffff42427bffb584ffffffff\nffffb5ffff4a4a84ffb57bd6ffff42639cd69c63ffffffffffffffffffffffffffffff84b5ff7b4242ffffb5ffffffffffff7bb5ff844a4affffb584b5ff4242\n424a4a4a4242424a4a4a4242424a4a4affb57bd6ffff42639c4a4a4ab57b42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff63ffff21ffffffffffffffffffffffffffffffffffffffff94c6ef7b5263ffe7b5ffffffffffffffffffffffffffffffffffff639cce94634affe7\nc6ffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd64a4a4a9c6342ffffd6ffffffffffffffffffffffffffffffffffffd6ffff4a639c\nd69c63ffffff7bb5ff634a4affd69cffffffffffff84b5ff4242424a4a4a4242424a4a4a4242424a4a4affb57bd6ffff42639cd69c63ffffff4a84b54242424a\n4a4a4242424a4a4a424242844a4affffb5ffffff9cd6ff4a4a634242424a4a4a424242ffb584ffffff639cd6424242844a4affffb5ffffffffffff639cd64242\n424a4a4a4242424a4a4a424242634a4affd69cb5ffff42427b4a4a4ad69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff8cffff00ffffc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff42639cd69c63ffffffffffffffffffd6ffff42\n639c634a4affd69cffffffffffffffffff9cd6ff634a63ffd69cffffffffffffffffffffffffffffffffffffffffff7bb5ff4a4a4a4242424a4a4a424242bd84\n4affffffd6ffff42639c4a4a4ab57b42ffffffffffffbdffff42427b4a4a4affb57bffffffffffffffffff9cd6ff4a4a63634242ffd69cffffffffffffffffff\nffffffffffffffffffb5ffff4a4a84ffb57bffffffffffffffffffffffffffffffffffffffffff639cd6844a4affffb5ffffffffffffffffff427bb5bd844aff\nffff84bdff634242ffd69cffffffffffff639cd6844a4affffb5ffffffd6ffff4a639cd69c63ffffff9cd6ff4a4a63ffb57bffffffffffff84bdff634242ffd6\n9cffffffffffff427bb5bd844affffffbdffff42427bffbd84ffffffd6ffff42639cd69c63ffffffffffff639cd69c634affffd6ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffff639cd6424242d69c63ffffffffffff94c6e74a4a6b734a42fff7b5ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff9cd6ff4a4a63424242844a4affffb5ffffffffffffffffffffffffffffffffffff4a84bd4242424a4a4a4242424a4a4affb57bffffffffffff\n9cd6ff424263ffbd84ffffffffffffffffffffffffffffffffffffffffff4a84bdb57b42ffffffb5ffff4a4a84d69c63ffffffffffffbdffff42427bffbd84ff\nffff639cd69c6342ffffd6ffffffffffffffffffffffff7bb5ff634a4affd69cffffffffffff84bdff7b4242ffffbd9cd6ff634a63ffd69cffffffffffffbdff\nff63427bffd69c9cd6ff634a63ffd69cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffff21ffffff\nffffffffffffffffffffffffffff94ceef7b5263ffefbdffffffffffffffffffffffffffffffffffffffffffffffff4a7bb5dea56bffffffffffffffffffffff\nffffffffffffffffffffffffffffffff639cd64242429c634affffd6ffffffffffffffffffffffffffffffffffffd6ffff42639c4a4a4a4242424a4a4ab57b42\nffffffffffffffffff9cd6ff634a63ffd69cffffffffffffbdffff63427bffd69cd6ffff4a639cd69c63ffffff639cd69c634affffd6ffffffffffff84bdff9c\n6342ffffd6ffffffffffffffffffffffffb5ffff4a4a84ffb57bd6ffff42639cd69c63ffffffffffffffffffffffff7bb5ff844a4affffb5ffffffffffff9cd6\nff7b4263ffffbd7bb5ff844a4affffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadffff00ffffa5ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff4a639cd69c63ffffffffffffffffffd6ffff4a639c4242424a4a4a42424263\n4a4affd69c9cd6ff634263ffd69cffffffffffffffffffffffffffffffffffffffffff84b5ff4242424a4a4a424242634a4affd69cffffffffffff4a84b54242\n42b5844affffffffffffb5ffff4a4a84424242ffb584ffffffffffffffffff9cd6ff424263634a4affd69cffffffffffffffffffffffffffffffffffffd6ffff\n42639cd69c63ffffffffffffffffffffffffffffffffffffffffffb5ffff42427bb5844affffffffffff7bb5ff634a4affd69cffffff7bb5ff4a4a4ab57b42ff\nffffb5ffff4a4a84424242d69c63ffffff9cd6ff424263ffb584ffffff9cd6ff4242639c634affffd6d6ffff42639c4a4a4ab57b42ffffffb5ffff4a4a84d69c\n63ffffffb5ffff4a4a84ffb57bffffffd6ffff4a639cd69c63ffffffffffff84b5ff7b4242ffffb5ffffff9cb5ffffd69cffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffff639cd64a4a4ad69c63ffffffffffffffffff528cc64a4a4aefad73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cd6\nff4a4a63424242d69c63ffffffffffffffffffffffffffffffffffff427bb5b5844affffffffffff639cd69c634affffd6ffffff9cd6ff4a4a639c6342ffffd6\nffffffffffff7b7bb5ffffb5ffffffb5ffff42427bd69c63ffffffb5ffff42427b634a4affd69cffffff639cd6634a4affd69cffffffb5ffff4a4a84d69c63ff\nffffffffff9c9cd6ffffb584b5ff4242429c634affffd6d6ffff42639c9c634affffd6ffffff427bb59c634affffd6ffffff639cd69c634affffd6b5ffff4242\n7bffb584ffffffb5ffffd69c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffff21ffffffffffffffffffffffffffff9c\nd6ff7b5a63ffefb5ffffffffffffffffffffffffffffffffffffffffffffffff639ccea5735affffceffffffffffffffffffffffffffffffffffffffffffffff\nffffffff639cd64a4a4a9c6342ffffd6ffffffffffffffffffffffffffffffffffffd6ffff4a639cd69c63ffffffffffff84b5ff7b4242ffffb5ffffffffffff\n427bb59c634affffd6ffffff639cd69c634affffd6d6ffff42639cd69c63ffffffb5ffff42427bd69c63ffffffd6ffff42639cd69c63ffffffb5ffffb57b7bff\nffffffffff84b5ff634242ffd69cffffff4a84b5b57b42ffffffffffff9c9cb5ffffd6d6ffff42639cb5844affffffffffff427bb5b5844affffff9cd6ff6342\n63ffd69cffffff9cd6ffffb59cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffff00ffffa5ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7\ne7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff42639c4a4a4a4242424a4a4a634242ffd69c73adef844a4aff\nffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84bdff424242844a4affffb5ffffff639cd64a4a4a9c6342ffffd6ffffff9cd6\nff424263634a4affd69cd6ffff42639c9c634a9cd6d64a4a63634242ffd69cffffffffffffffffffffffffffffffffffffffffff4a84bdb57b42ffffffffffff\nffffffffffffffffffffffffffffffffffffd6ffff42639c4a4a4a424242634a4affd69cffffffffffff84bdff7b424284bdbd4242424a4a4a9c6342ffffd642\n7bb54a4a4a424242bd844affffffffffff9cd6ff634a639cb59c4a4a63424242844a4affffb5639cd64242424a4a4a9c6342ffffd6ffffffbdffff42427bffbd\n849cd6ff4a4a634242424a4a4a424242ffbd84ffffff639cd64242424a4a4ab57b42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd6424242d69c63ff\nffffffffffceffff5a73a5525a52a5735affffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff42639c4a4a4a9c6342ffff\nd6ffffffffffffffffffffffffffffff4a84bdb57b42ffffffffffffbdffff42427bffbd84ffffff9cd6ff6342639cbd9c424263844a4affffb5bdffff42427b\n4a4a4a424242bd844affffffffffffb5ffff4a4a84d6b57b4a639c4242424a4a4ad69c63ffffffffffffffffffb5ffff4a4a844242424a4a4ad69c63ffffff7b\nb5ff844a4a9cd6b54a4a63424242634a4affd69cffffffffffffffffff639cd64a4a4a424242844a4affffb5ffffffffffff9cd6ff4242634a4a4a7b4242ffff\nbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffff08ffffffffffffffffffffffffffff5a84bdffce94ffffffffffffff\nffffffffffffffffffffffffffffffffff6b9ccead735affffd6ffffffffffffffffffffffffffffffffffffffffff9cd6ff4a4a63d69c63639cd64242429c63\n4affffd6ffffffffffffffffffffffffffffffffffffd6ffff42639cd69c63ffffffffffffd6ffff4a639cd69c63ffffffffffffffffff639cd64a4a4a424242\n844a4affffb5ffffffd6ffff4a639cd69c63ffffffffffffd6ffff42639c4a4a4a424242bd844affffffffffffffffff84bdff4242424a4a4a424242ffbd84ff\nffffffffffd6ffff4a639c4242424a4a4affb57bffffffffffffffffff427bb54a4a4a4242429c634affffd6ffffffffffff84bdff4242424a4a4a9c6342ffff\nd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff00ffffa5ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffd6ffff4a639c4242424a4a4ab57b52ffffe7ffffffffffffffffffffffffffffffffffffe7ffff4a7badad734afffff7ffffffffffffffffffff\nffffffffffffffffb5ffffb58484ffffffffffff9cd6ff4a4a63424242ffb584ffffff84b5ff4242424a4a4affb57bffffff427bb54a4a4a7b4242ffffb5d6ff\nff4a639c4242424a4a4a424242634a4affd69cffffffffffffffffffffffffffffffffffffffffff9cd6ff4a4a63ffb57bffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff4a639cd69c\n63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cd64a4a4ad69c63ffffffffffff73a5e7e7a56bff\nffff73a5e7e7a573ffffffffffffffffffffffffffffffffffff9cd6ffb58463ffffffffffffb5ffff4a4a844242429c634affffd6ffffffffffffffffffffff\nffffffff427bb5b5844affffffffffffd6ffff4a639cd69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5ff7b4242ffffb5ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffff63ffff00ffffefffffffffffffffffffffff6384b5ffd69cffffffffffffffffffffffffffffffffffffff\nffff6b9ccea5735affffceffffffffffffffffffffffffffffffffffffffffffffffff9cd6ff4242634a4a4a4242424a4a4a9c6342ffffd6ffffffffffffffff\nffffffffffffffffffffd6ffff4a639cd69c63ffffffffffffd6ffff42639cd69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff\n42639cd69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffadffff00ffffa5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff42639c\n4a4a4a9c6342ffffd6ffffffffffffffffffffffffffffffffffffffffff84bdef634252ffd69cffffffffffffffffffffffffffffffffffffffffffbdffff42\n427b4a4a4a4242424a4a4a424242844a4affffb5ffffffffffff4a84bd4242424a4a4a4242424a4a4a424242d69c63ffffffffffffffffff4a84bd4242424a4a\n4a634242ffd69cffffffffffffffffffffffffffffffffffffffffffffffff7bb5ff4a4a4affb57bffffffffffffbdffff7b427bffffbdffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff42427bd69c63ffffffd6ffff42639cd69c63ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffceffff5a73a5525a52a5735affffceffffff6ba5e7e7a56bffffff6ba5e7e7a56bffffffff\nffffffffffffffffffffffffffff9cd6ff4242634a4a4a4242424a4a4a4242424a4a4affb57bffffffffffffffffffffffffffffffffffff4a84bdb57b42ffff\nffffffff84bdff634242ffd69cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bb5ff844a4affffb5ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffff7bffff00ffffceffffffffffffffffffffff637bb5ffd69c427bb54a4a4affb57bffffffffffffffffff73a5cead7363ffffd6ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff42427b4a4a4a4242429c634affffd6ffffffffffffffffffffffffffffffffffffd6ff\nff42639cd69c63ffffffffffff7bb5ff4a4a4affb57bffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff4a639cd69c63ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff31ffff00ffffa5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff4a639c8473524a527bbd8c63ffffe7\nffffffffffffffffffffffffffffff7badde4a4a52d69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffff4a84b54242424a4a4a42424284\n4a4affffb5ffffffffffffffffffffffff4a84b54242424a4a4a424242d69c63ffffffffffffffffffffffffffffffd6ffff42639c634a4affd69cffffffffff\nffffffffffffffffffffffffffffffffffffffffffffb5ffff4a4a844242424a4a4a634242ffd69cffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffb5ffff4a4a84d69c63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff73a5e7efad73ffffff73adefe7a573ffffffc6f7ff52638c524a528c6352fff7c6ffffffffffffffffffffffffffffffff\nffffffffff84b5ff4242424a4a4a4242424a4a4affb57bffffffffffffffffffffffffffffffffffffffffff427bb54a4a4a4242424a4a4a424242ffb584ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5ff7b4242ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8cffff\n00ffff84ffffffffffffffffffffff6384b5ffd69c4a84b5424242ffb584ffffffffffff6ba5cea57363ffffceffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff9cd6ff4a4a639c6342ffffd6ffffffffffffffffffffffffffffffffffffd6ffff4a639c4242424a4a4a4242\n424a4a4affb57bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff42639cd69c63ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4affff00ffff00ff\nffadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffffad94a5ffffdea5d6ff4a52736b524ab5a594e7cebdd6e7e79cadbd\n526b8452424acea573fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff6ba5e7e7a56bffffff6ba5e7e7a56bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff00ffff08ffffe7ffffffffff\nffffff7badefd69c6bffffffffffffffffffffffff73addead7363ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4affff00ffff00ffff08ffffefffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6f7ff738cb54a4a5a4a4a4a424242524a4a8c6b5af7d6b5ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff5a7bad525252\nad7b5affffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff00ffff00ffff29fffff7ffffffffffefffff739cc64a525a\n4242424a4a4a524a42b58c6bffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffff42ffff00ffff00ffff00ffff84ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff29ffff00ffff00ffff42ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffff4affff00ffff00ffff00ffff63ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffc6ffff00ffff00ffff00ffff9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff73ffff18ffff00\nffff00ffff00ffff6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff9cffff00ffff00ffff10ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff29ffff00ffff00ffff00ffff00ffff00ffff7bffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ff\nff00ffff00ffff42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffff9cffff10ffff00ffff00ffff00ffff00ffff00ffff6bffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18ffff00ffff00ffffadff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffc6ffffc6ffffc6ffffc6ffffc6ffffc6ffffc6ffffc6ffffc6ffff\nc6ffffc6ffffc6ffffc6fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffff8cffff84ffff84ffff\n42ffff39ffff00ffff00ffff00ffff00ffff00ffff39ffff94ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff00ffff00ffff18ffffefffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff\n00ffff00ffff29ffff42ffff42ffff42ffff6bffff84ffff8cffffc6ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffa5ffff5affff08ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff\n00ffff08ffffadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffff00ffff00ffff18ffffa5fffff7ffffffffffffffffffffffffffffffff\nffffffffe7ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff\n00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff42ffff8cffffc6fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffadffff5affff08ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff52ffffd6ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7ffff10ffff00ffff00ffff00ffff00ffff21ffff42ffff42ffff42ffff42ffff42ffff39ffff00ffff00ff\nff00ffff00ffff00ffff31ffff42ffff73ffff84ffff84ffff84ffff7bffff42ffff42ffff42ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff\n00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff42ffff42ffff73ffff7bffff9cffffc6ffffc6fffff7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffffa5ffff63ffff10ffff00ff\nff00ffff00ffff00ffff00ffff00ffff08ffff4affff84ffffa5ffffbdffffc6ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffadffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffffc6ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffffc6ffffbdffff84ffff84ffff7bffff42ffff08ffff00ffff\n00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff39ffff42ffff42ffff73ffff84ffff84ffff84\nffff84ffff84ffff84ffff84ffff84ffff84ffff84ffff42ffff42ffff42ffff21ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff08ffff5aff\nffadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffc6ffff5affff18ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff18ffff42ffff42ffffceffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffff7bffff42ffff31ffff00ffff\n00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00\nffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff5affffadffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7\ne7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffdeffffc6ffffc6ffffc6ffffc6ffffc6ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ffffb5ffff84ffff\n84ffff52ffff42ffff42ffff08ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00ffff00\nffff00ffff00ffff00ffff00ffff08ffff42ffff73ffffadffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffceffffbdffffc6ffffc6ffffbdffff7bffff84ffff84ffff84ffff7bffff84ffff84ffff84ffff9cffffc6ffffc6ffffc6ffffdeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeff7f7f7ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffff7f7f7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffefefefefefefe7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd9c4a21ffffdeffffffffffffffffffffffffffffff9cdeff21214affbd73ffffff\nffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffdeffff29529c212121212121212121292929212121e79c52ffffffffffffffffffffffffffffffffffffffffffffffff4a9cde292929212121\n2121212121219c5229ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff292929ffbd73ffffffffffffffffffffffffffffff9c\ndeff2929524a2121ffe79cffffffffffffffffffffffff9cdeff292952212121212121212121522929ffde9cffffffffffffffffffffffffffffffffffffffff\nff2173bd7b2121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff29297b212121212121212121522929ffde9c\nffffffffffff9ce7ff21214a212121212121292929212121212121bd7321ffffff2173bd7b2121ffffbdffffffffffffffffffffffff9ce7ff21214a21212121\n2121292929732121ffffc6ffffffffffff4a9cde522121ffde9cffffffffffffffffffbdffff29297b212121e79c52ffffffffffffffffffffffffffffffffff\nffffffffffffff4a9cde522929ffde9cffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffc6ffff212173c67b29ffffff\nffffff9cdeff2929522121212121212121212929292121219c5221ffffdeffffffffffffffffffffffffffffffbdffff21217b21212129292921212121212121\n2121ffc67bffffffffffffffffffffffffffffffffffffffffffffffff2173bd212121212121292929212121c67b21ffffffffffffffffffffffffffffffffff\nffffffff7bc6ff2121219c5229ffffdeffffffffffffffffffffffff217bc6212121e79c52ffffffffffffffffffffffff73bdff212121ffbd73ffffffffffff\nffffffffffffffffff9cdeff2121524a2121ffe79cffffffffffff2173bd2929292121212121212121212929294a2121ffe79cffffffffffffffffff217bc621\n2121292929212121212121bd7321ffffffffffffffffffdeffff29529c732121ffffc6ffffffffffffffffffffffffffffffffffff73bdff212121de9c4affff\nff2173bd212121212121292929212121212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff214a9c292929212121\n212121212121522929ffde9cffffffffffffffffffffffffffffff9cdeff2929522121212121212121219c5229ffffdeffffffffffffffffffffffffffffffff\nffff529ce74a2121ffe79cffffffffffffffffffffffffffffffffffffdeffff21529c9c4a21ffffe7ffffffffffffffffffffffffffffffffffffbdffff2929\n7b212121212121212121292929ffbd73ffffffffffffffffffffffffe7ffff214a9c9c5229ffffdeffffffffffffffffffffffffffffff2173bd292929bd7321\nffffffffffff9ce7ff21214ac67b21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121212121292929212121c67b21ff\nffffffffffdeffff21529cbd7321ffffffffffff7bc6ff4a2121ffe79cffffffffffffffffff529ce7212121212121212121c67b29ffffffffffff4a9cde7b29\n29ffffbdffffffffffff529ce7212121522121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7ffff214a9c292929ffbd73ffffffffffffffffffffffff9ce7ff21214a7b2929ffffbdffffffffffffffffffbdffff21217bde9c4affffffffffff529ce773\n2121ffffc6ffffffffffff4a9cde2929294a2121ffe79c73bdff522929ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff217bc69c4a21ffffe7ffffffffffffffffffffffffffffff9ce7ff21214affc67bffffffffffffffffffffffffffffff\ne7ffff214a9cc67b29ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a\n9c9c4a21ffffdeffffffffffffdeffff214a9c4a2121ffde9cffffffffffffffffffffffffbdffff2121734a2121ffde9cffffffffffffffffff2173bd212121\nffbd73ffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffffffffdeffff214a9c2121214a2121ffde9cff\nffffffffffffffff2173bd212121de9c4affffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffffffffff2173bd732121ffffbdffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121bd7321ffffffffffffffffffdeffff214a9cffbd73ffffff9cdeff21214a\nde9c4affffffffffffffffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffff2173bd212121de9c4affffffffffffffffffbdffff4a2173ff\nde9cffffff4a9cde4a2121ffde9cffffffffffffdeffff214a9c212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde4a21\n21ffde9cffffffffffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffff9cdeff21214ade9c4a\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffffffffffbdffff212173732121ffffbdff\nffffffffffffffffffffff9cdeff21214a732121ffffbdffffffffffffdeffff214a9c4a2121ffde9cffffffffffffffffffffffffffffff2173bd2121214a21\n21ffde9cffffffffffffffffffbdffff2121732121219c4a21ffffdeffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffffffffdeffff214a9c\n2121214a2121ffde9cffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffffffffff9cdeff21214a732121ffffbdffffffffffffdeffff21\n4a9c4a2121ffde9cffffffffffff73bdff212121ffbd73ffffffffffffffffffffffffffffffffffff2173bd732121ffffbdffffff2173bd732121ffffbdffff\nffffffffffffff2173bd212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffff73bdff212121\nde9c4affffffffffffffffff4a9cde212121de9c4affffffffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffff4a9cde4a2121ffde9cff\nffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffff4a9cde212121bd7321ffffffffffffffffff9cde\nff21214a9c4a21ffffdeffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffff73bdff212121212121bd7321ffffffffffff9cdeff21214a\nbd7321ffffffffffffffffffffffffffffffffffffffffffffffffbdffff2121734a2121ffde9cffffffffffffffffff73bdff9c4a21ffffdedeffff214a9cbd\n7321ffffffffffff73bdff4a2121ffde9cffffffffffff2173bd212121ffbd73ffffffffffff73bdffffbd73ffffff4a9cde732121ffffbdffffff73bdff2121\n219c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214a212121bd7321\nffffffffffffffffffffffff4a9cde212121212121ffbd73ffffffffffffffffffbdffff212173de9c4affffffffffff4a9cde732121ffffbdffffff73bdff21\n21219c4a21ffffdeffffff73bdff4a2121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff2173bd9c4a21ffffdeffffffffffffffffffffffffffffff9cdeff21214affbd73ffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff21529c9c4a21ffffe7ffffffffff\nffffffffffffff4a9cde522121ffde9cffffffffffffe7ffff214a9c7b2929ffffbdffffffffffffffffffffffffffffff4a9cde522929ffde9cffffffffffff\nffffffffffffffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffffffff7bc6ff2121215252524a2121ffe79cffffffffffff4a9cde292929ff\nbd73ffffffffffffffffffffffffffffff9cdeff292952de9c4affffffffffffffffffffffffffffff2173bd7b2929ffffbdffffffffffffffffffffffffffff\nffffffffffffffffffffffffff73bdff292929de9c4affffffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffff\nffffffffffffffffff2173bd7b2929ffffbdffffffffffff529ce7212121ffc67bffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522929ff\nde9cffffffffffff297bc6212121e79c52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522121ffde9cffffffffffffffff\nffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffc6ffff212173c67b21ffffffffffff9cdeff212152de9c4affffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffbdffff29297bbd7321ffffffffffffffffffffffffffffff2173bd7b2929ffffbdffffffffffffc6ffff21\n21739c5221ffffdeffffffffffffffffffffffffffffff2173bd7b2121ffffbdffffffffffffffffffdeffff29529c4a4a21212152de9c4affffffffffffffff\nff73bdff2929294a4a4a7b2121ffffbdffffffffffffffffff73bdff292929ffbd73ffffffffffffffffffffffff7bc6ff2121215252524a2121ffe79cffffff\nffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffffbdffff21217b9c4a21ffffe7ffffffffffffffffffffffffffffff217bc6732121ffffc6ff\nffffc6ffff212173c67b29ffffffffffffffffffffffffffffffc6ffff212173c67b29ffffffffffff2173bd7b2929ffffbdffffffffffffffffffffffff7bc6\nff212121ffc67bffffffffffffffffffffffffffffffffffffffffffe7ffff214a9c9c5221ffffdeffffffffffffffffff2173bd7b2929ffffbdffffffbdffff\n29297bbd7321ffffffffffffffffffffffffe7ffff214a9cc67b29ffffffffffffffffffffffffffffff529ce74a2121ffe79cffffffffffffffffffffffffff\nffffffffffdeffff29529c9c4a21ffffe7ffffffffffffffffffffffff73bdff292929de9c4affffffffffffffffffffffffffffffbdffff29297bbd7321ffff\nffffffffe7ffff214a9c9c5221ffffdeffffffffffffffffffdeffff29529c4a4a21212152bd7321ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffe7ffff214a9c7b2121ffffbdffffffffffffffffffffffffffffffffffffffffffdeffff29529cbd7321ffffffffffff7bc6ff4a\n2121ffe79cffffff7bc6ff212121ffc67bffffffffffffffffffffffffffffffffffff4a9cde7b2121ffffbd9ce7ff21214a9c5221ffffdeffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6ff4a2121215252732121ffffc6ffffffffffffdeffff\n29529c4a4a21212152de9c4affffffffffffffffffbdffff29297bde9c4affffffffffff529ce7732121ffffc69cdeff2929529c4a21ffffe7ffffffffffff73\nbdff522121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff297bc69c4a21ffff\ne7ffffffffffffffffffffffffffffff9ce7ff21214affc67bffffffffffffffffffffffffffffffe7ffff214a9cc67b21ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffdeffff214a\n9c9c4a21ffffdeffffff73bdff212121ffbd73ffffffffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffffffffffff\nffffff73bdff212121ffbd73ffffffffffffffffffbdffff212173bd73214a9cde4a2121ffde9cffffffbdffff212173bd7321ffffffffffffffffffffffffff\nffffffffffffffff4a9cde732121ffffbdffffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffdeff\nff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffff2173bd\n732121ffffbdffffffbdffff212173bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffff4a9cde212121bd\n7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffff9cdeff21214ade9c\n4affffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffbdffff212173bd7321ffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffff4a9cde4a2121ffde9cffffffffffffff\nffffffffffffffffffffffbdffff212173de9c4affffffffffffffffff9cdeff21214abd9c4a214a9cbd7321ffffffffffffffffff4a9cde73212173bdbd2121\n21ffbd73ffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffbdffff212173bd73214a9cde4a2121ffde9cffffffffffff2173bd732121ffffbd\nffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffbdffff212173de9c4affffffffffff2173bd732121ff\nffbdffffffffffffffffffffffff73bdff212121ffbd73ffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffff2173bd732121ffffbdffff\nffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffff4a9cde4a2121ffde9cffffff73bdff212121ffbd73ffffffffffff\nffffffffffffffffff4a9cde732121ffffbdffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffdeffff214a9c9c\n4a21ffffdeffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffff73bdff4a2121ffde9cffffffdeffff214a9c9c4a\n21ffffdeffffffffffffffffff4a9cde4a2121bdde9c212173bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n73bdff212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffff73bdff4a2121ffde9cffffff4a9cde73\n2121ffffbdffffffffffffffffffffffffffffffffffff4a9cde7321219cdebd21214a9c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd73212173bdbd4a2121ffde9cffffffffffffbdffff212173bd9c4a214a9c9c4a21\nffffdeffffffffffffbdffff212173de9c4affffffffffff4a9cde7321219cdebd21214a9c4a21ffffdeffffffffffffffffff73bdff4a2121ffde9cffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd9c4a21ffffdeffffffffffffffffffffff\nffffffff9cdeff21214affbd73ffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffdeffff29529c9c4a21ffffe7ffffffffffffffffffffffffffffff7bc6ff4a2121ffe79cffffff297b\nc6732121ffffc6ffffffffffffffffffffffffffffffffffffffffff529ce7732121ffffc6ffffffffffffffffffffffffffffffffffff73bdff292929ffbd73\nffffffffffffffffff2173bd7b2121ffffbd529ce74a2121ffe79cffffff7bc6ff212121ffc67bffffffffffffffffffffffffffffffffffffffffff9ce7ff21\n214affc67bffffffffffffffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffff\nffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffffff2173bd7b2121ffffbdffffff73bdff\n212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522121ffde9c7bc6ff2121219c5221ffffdeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff4a9cde522929ffde9cffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffff\nffffffffc6ffff212173c67b29ffffffffffff9cdeff292952de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff\n21217bbd7321ffffffffffffffffffffffffffffffffffff529ce7732121ffffc6deffff21529c9c4a21ffffe7ffffffffffffffffffffffffffffffffffffff\nffff297bc69c4a21ffffe7ffffffffffff4a9cde522121ffde9c529ce7732121ffffc6ffffffe7ffff214a9c9c5221bdffde29297bbd7321ffffffffffffffff\nff73bdff212121ffbd73ffffffffffffffffff2173bd7b2929ffffbd529ce74a2121ffe79cffffffffffff2173bd7b2929ffffbdffffffffffffffffffffffff\ne7ffff214a9c9c5229ffffdeffffffffffffffffffffffffffffffffffffffffff2173bd9c5221ffffdeffffff73bdff21212121212129292921212121212121\n21212929299c4a21ffffe7ffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffff9cdeff212152ffbd73ffffffffffffffffffffffffffff\nffffffffe7ffff214a9c9c5229ffffdeffffffffffffffffff2173bd7b2121ffffbdffffff4a9cde522121ffde9cffffffffffffffffffffffffffffff4a9cde\n522121ffde9cffffffffffffffffffffffff529ce74a2121ffe79cffffffffffffffffffffffffffffffffffffdeffff21529c9c4a21ffffe7ffffffffffffff\nffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffffffffffffc6ffff212173e79c52ffffffe7ffff214a9c9c5229ffffdeffffffffffff9ce7\nff21214ae79c52bdffff29297bbd7321ffffffffffffe7ffff214a9ce79c52ffffffffffffffffffffffffffffffffffffffffff217bc6732121ffffc6ffffff\nffffffffffffffffffffffffffffffffffffffffffdeffff21529cbd7321ffffffffffff7bc6ff4a2121ffe79cffffff217bc6732121ffffc6ffffffffffffff\nffffffffffffffffffffff4a9cde2929292121217b2121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffbdffff21217bbd7321c6ffff212173e79c52ffffffffffff73bdff212121ffbd73529ce74a2121ffe79cffffffffffffbdffff\n21217bde9c4affffffffffff529ce7212121292929732121ffffc6ffffffffffffffffffffffff73bdff522929ffde9cffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff217bc69c4a21ffffe7ffffffffffffffffffffffffffffff9ce7ff21214affc6\n7bffffffffffffffffffffffffffffffe7ffff214a9cc67b29ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffff9cdeff21214ade9c4adeffff214a9c9c4a21ffffdeffffffffff\nffffffffffffffffffffffffffffffff73bdff4a2121ffde9cffffffffffffffffffffffffffffffffffff73bdff212121ffbd73ffffffffffff73bdff212121\nde9c4affffff4a9cde4a2121ffde9cffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffffffffbdffff212173de9c4affffffffffffff\nffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffffffffffffffffff\nffffffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffff2173bd732121ffffbdffffff4a9cde4a2121ffde9cffffffffffff\nffffffffffffffffffffffffffffffffffffffffff4a9cde4a21219cbd9c21214a732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffbdffff212173bd73\n21ffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffff\nffffffffffffffffffffffff73bdff212121ffbd73bdffff212173bd7321ffffffffffffffffffffffffffffffffffffffffffffffff4a9cde732121ffffbdff\nffffdeffff214a9c732121ffffbd73bdff4a2121ffde9cffffff9cdeff21214ade9c4adeffff214a9c9c4a21ffffdeffffffffffff73bdff212121ffbd73ffff\nffffffff73bdff212121de9c4affffff4a9cde4a2121ffde9cffffffffffff2173bd732121ffffbdffffffffffffffffffffffffbdffff212173bd7321ffffff\nffffffffffffffffffffffffffffffffffffffffff4a9cde732121ffffbdffffffdeffff214a9c9c4a21ffffdeffffffffffff73bdff212121de9c4affffffff\nffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a\n21ffffdeffffffffffff73bdff212121de9c4affffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffff\nffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffff73bdff212121ffbd73ff\nffffffffffffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffdeffff214a9c9c4a21ffffdeffffffdeffff214a9c732121ffffbdbdffff2121\n73bd7321ffffffffffffbdffff212173de9c4affffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffff\nffffffffffffffffffdeffff214a9cbd7321ffffffffffff73bdff4a2121ffde9cffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffff4a\n9cde73212173bdbd212121de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nff73bdff212121de9c4adeffff214a9cbd7321ffffffffffff2173bd732121ffffbd73bdff212121ffbd73ffffffffffffbdffff212173de9c4affffffffffff\n4a9cde73212173bdbd212121de9c4affffffffffffffffffffffff73bdff4a2121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff2173bd9c4a21ffffdeffffffffffffffffffffffffffffff9cdeff21214affbd73ffffffffffffffffffffff\nffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde\nffff21529c9c4a21ffffe7ffffffffffffffffffffffffffffff9ce7ff21214ae79c52deffff21529c9c4a21ffffe7ffffffffffffffffffffffffffffffffff\nffffffff7bc6ff212121ffc67bffffffffffffffffffffffffffffffffffff73bdff212121ffbd73ffffffbdffff21217b9c4a21ffffe7ffffff529ce74a2121\nffe79cffffff529ce74a2121ffe79cffffffffffffffffffffffffffffffffffffffffffc6ffff212173c67b21ffffffffffffffffffffffff2173bd7b2929ff\nffbdffffffffffffffffffffffffffffffffffffffffffffffff7bc6ff212121ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffff9ce7\nff21214ae79c52ffffffffffffffffffffffffffffffffffff2173bd7b2929ffffbdffffff4a9cde522929ffde9cffffffffffffffffffffffffffffffffffff\nffffffffffffffffff4a9cde292929212121522121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a\n9cde522121ffde9cffffffffffffffffffffffff9ce7ff21214a212121212121292929212121212121212121292929212121c67b21ffffffffffff9cdeff2121\n522121212929292121212121214a2121ffe79cffffffffffffffffffffffffffffffffffffbdffff29297bbd7321ffffffffffffffffffffffffffffffffffff\n7bc6ff212121ffc67bbdffff29297bbd7321ffffffffffffffffffffffffffffffffffffffffffffffff529ce74a2121ffe79cffffffc6ffff212173c67b29ff\nffffc6ffff212173e79c52ffffff7bc6ff4a2121ffe79cffffff529ce74a2121ffe79cffffffffffff73bdff292929ffbd73ffffffbdffff29297b9c4a21ffff\ne7ffffff529ce74a2121ffe79cffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffc6ffff212173c67b21ffffffffffffffffffffffffffffff\nffffffffffffffffff4a9cde522929ffde9cffffffffffff529ce74a2121ffe79cffffffffffff2173bd522121ffde9cffffffffffffffffff2173bd7b2929ff\nffbdffffffffffffffffffffffffffffffbdffff29297bbd7321ffffffffffffffffffffffffffffffffffffe7ffff214a9c2121212121212929292121217b21\n21ffffbdffffffffffffffffff4a9cde522929ffde9cffffffffffffffffffffffffffffff4a9cde522929ffde9cffffffffffffffffffffffff529ce74a2121\nffe79cffffffffffffffffffffffffffffffffffffdeffff29529c9c4a21ffffe7ffffffffffffffffff7bc6ff212121ffc67bffffffffffffffffffffffffff\nffffffffffffffffe7ffff214a9c9c5221ffffdee7ffff214a9c9c5221ffffdeffffff4a9cde212121ffbd73ffffffbdffff21217bbd7321ffffffffffffc6ff\nff212173e79c52ffffffffffffffffffffffffffffffffffffdeffff29529c9c4a21ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffdeffff\n29529cbd7321ffffffffffff7bc6ff4a2121ffe79cffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffffff4a9cde7b2121ffffbd529ce721\n2121e79c52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522929ffde9cffff\nff4a9cde7b2929ffffbde7ffff214a9cc67b29ffffffc6ffff212173c67b29ffffffffffffbdffff29297bde9c4affffffffffff529ce7732121ffffc64a9cde\n292929de9c4affffffffffffffffff73bdff522121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff297bc69c4a21ffffe7ffffffffffffffffffffffffffffff9ce7ff21214affc67bffffffffffffffffffffffffffffffe7ffff214a9cc67b\n21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeff\nffffffffffffffffffffffffffff9cdeff21214ade9c4adeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffffffffff73bdff4a2121ffde\n9cffffffffffffffffffffffffffffffffffff73bdff212121ffbd73ffffff4a9cde4a2121ffde9cffffffffffff4a9cde4a2121ffde9cffffff4a9cde4a2121\nffde9cffffffffffffffffffffffffffffffffffffffffffbdffff212173de9c4affffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffffff\nffffffffffffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214ade9c4affffffffff\nffffffffffffffffffffffffff2173bd732121ffffbdffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde\n4a2121739c9c212121de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffff\nffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffff9cdeff21214ade9c4affffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffffffffffffffffffffffffffff73bdff212121ffbd73bdffff\n212173bd7321ffffffffffffffffffffffffffffffffffffffffffffffff4a9cde732121ffffbdffffff73bdff212121ffbd73ffffffffffff2173bd9c4a21ff\nffde2173bd732121ffffbdffffff73bdff212121de9c4affffffffffff73bdff212121ffbd73ffffff4a9cde4a2121ffde9cffffffffffff4a9cde4a2121ffde\n9cffffffffffff2173bd732121ffffbdffffffffffffffffffffffffbdffff212173bd7321ffffffffffffffffffffffffffffffffffffffffffffffff4a9cde\n732121ffffbdffffffffffff9cdeff21214ade9c4affffffbdffff212173bd7321ffffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffffff\nffffffffffbdffff212173bd7321ffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffbdffff212173bd7321ffffffffffffffff\nff4a9cde4a2121ffde9cffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffff\nffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffff73bdff212121ffbd73ffffffffffffffffffffffffffffffffffffffffffdeffff21\n4a9cbd7321ffffffdeffff214a9c9c4a21ffffdebdffff212173bd7321ffffffffffffbdffff212173bd7321ffffffffffffbdffff212173de9c4affffffffff\nffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffff\n73bdff4a2121ffde9cffffffffffff4a9cde212121ffbd73ffffffffffff73bdffffbd73ffffff4a9cde732121ffffbdffffff4a9cde212121de9c4affffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffff9cdeff21214affbd739cde\nff21214ade9c4affffffdeffff214a9c732121ffffbdffffffbdffff212173de9c4affffffffffff4a9cde732121ffffbdffffff4a9cde212121de9c4affffff\nffffff73bdff4a2121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd9c\n4a21ffffdeffffffffffffffffffffffffffffff9cdeff21214affbd73ffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff29529c9c4a21ffffe7ffffffffffffffffffffffffff\nffff7bc6ff212121ffc67bffffff297bc6732121ffffc6ffffffffffffffffffffffffffffffffffffffffff529ce7732121ffffc6ffffffffffffffffffffff\nffffffffffffff73bdff292929ffbd739ce7ff21214ae79c52ffffffffffffffffff529ce74a2121ffe79cffffff7bc6ff212121ffc67bffffffffffffffffff\nffffffffffffffffffffffff9ce7ff21214affc67bffffffffffffffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffffffffffffffffff\nffffc6ffff212173e79c52ffffffffffffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffff\nff2173bd7b2121ffffbdffffff9cdeff212152ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522121ffde9c529ce7212121\nffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522929ffde9cffffffffffffffffffffffff9ce7ff21\n214ae79c52ffffffffffffffffffffffffffffffc6ffff212173c67b29ffffffffffff9cdeff292952de9c4affffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffbdffff21217bbd7321ffffffffffffffffffffffffffffffffffff529ce74a2121ffe79cdeffff21529c9c4a21ffffe7ffffff\nffffffffffffffffffffffffffffffffffff297bc69c4a21ffffe7ffffff297bc64a2121ffe79cffffffffffff4a9cde7b2121deffbd29529cbd7321ffffffff\nffffc6ffff212173c67b21ffffffffffff73bdff212121ffbd739ce7ff21214ae79c52ffffffffffffffffff529ce74a2121ffe79cffffffffffff2173bd7b29\n29ffffbdffffffffffffffffffffffffe7ffff214a9c9c5229ffffdeffffffffffffffffffffffffffffffffffffffffff2173bd9c5221ffffdeffffffffffff\ne7ffff214a9c9c5229ffffde7bc6ff212121ffc67bffffffffffffffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffff9cdeff212152de\n9c4affffffffffffffffffffffffffffffffffffe7ffff214a9c9c5229ffffdeffffffffffff7bc6ff212121ffc67bffffffffffff4a9cde522121ffde9cffff\nffffffffffffffffffffffffff4a9cde522121ffde9cffffffffffffffffffffffff529ce74a2121ffe79cffffffffffffffffffffffffffffffffffffdeffff\n21529c9c4a21ffffe7ffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffffffffffffc6ffff212173e79c52ffffffe7ffff21\n4a9c9c5229ffffde217bc6732121ffffc6ffffffffffffbdffff29297bbd7321ffffffffffffc6ffff212173e79c52ffffffffffffffffffffffffffffffffff\nffffffff529ce7732121ffffc6ffffffffffffffffffffffffffffffffffffffffffffffffdeffff21529cbd7321ffffffffffff7bc6ff4a2121ffe79cffffff\nffffffffffff9ce7ff21214a2121212121219c5229ffffdeffffff4a9cde7b2929ffffbdffffffffffff297bc62121219c5221ffffdeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214ac67b21ffffffffffffbdffff21217bde9c4a7bc6ff4a2121ffe79cffffffffff\nff4a9cde522121ffde9cffffffbdffff21217bde9c4affffffffffff529ce7732121ffffc6ffffffffffff2173bd2929299c4a21ffffe773bdff522929ffde9c\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff217bc69c4a21ffffe7ffffffffffffff\nffffffffffffffff9ce7ff21214affc67bffffffffffffffffffffffffffffffe7ffff214a9cc67b29ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffff2173bd732121ffffbdff\nffff73bdff212121ffbd73ffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffff73bdff2121\n21debd73214a9c732121ffffbdffffffffffffffffff4a9cde4a2121ffde9cffffffbdffff212173bd7321ffffffffffffffffffffffffffffffffffffffffff\n4a9cde4a2121ffde9cffffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd732121ff\nffbdffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffff2173bd732121ffffbdffff\nffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffff2173bd212121ffbd73ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffff9cdeff21214ade9c4affffffffffffff\nffffffffffffffffbdffff212173bd7321ffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffbdffff212173bd7321ffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffff\nffffffbdffff212173bd7321ffffffdeffff214a9c9c4a21ffffdeffffffffffff9cdeff21214a9c9c7321214affbd73ffffffffffffdeffff214a9c732121ff\nffbdffffff73bdff212121debd73214a9c732121ffffbdffffffffffffffffff4a9cde4a2121ffde9cffffffffffff2173bd732121ffffbdffffffffffffffff\nffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffffffffffffffff73bdff4a2121ffde9c\n2173bd732121ffffbdffffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffff\nffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffbdffff212173de9c4affffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffff\nff4a9cde4a2121ffde9cffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffff\nffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffffffffff73bdff212121ffbd73ffffffdeffff214a9c9c4a2173bdde212121de\n9c4affffffffffffffffffbdffff212173bd7321ffffffffffffbdffff212173de9c4affffffffffffffffffffffffffffffffffffffffff9cdeff21214ade9c\n4affffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff4a9cde732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cde\n9c4a4a9cdebd7321ffffffffffff73bdff212121ffbd73ffffffffffffffffff2173bd9c4a2121739c9c4a21ffffdeffffffffffff73bdff212121de9c4affff\nffffffffffffffffffffffffffffffff4a9cde732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff732121\nbdffbd4a2173ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd9c4a21ffffdeffffffffffffffffffffffffffffff9cdeff21\n214affbd73ffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffdeffff21529c9c4a21ffffe7ffffffffffffffffffffffff73bdff212121ffbd73ffffffffffffffffff2173bd7b2929ff\nffbdffffffffffffffffffffffffffffff4a9cde522929ffde9cffffffffffffffffffffffffffffffffffffffffff73bdff2121214a4a4a292929ffbd73ffff\nffffffffffffffffffff529ce74a2121ffe79cffffffffffff73bdff292929ffbd73ffffffffffffffffffffffffffffff9cdeff292952de9c4affffffffffff\nffffffffffffffffff2173bd7b2929ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff29297bbd7321ffffffffffffffffffff\nffffffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffffff2173bd7b2929ffffbdffffffffffff9ce7ff21214ae79c\n52ffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522929ffde9cffffffdeffff29529c4a2121ffe79cffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff4a9cde522121ffde9cffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffc6ffff21\n2173c67b21ffffffffffff9cdeff212152de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff29297bbd7321ffff\nffffffffffffffffffffffffff4a9cde522929ffde9cffffffffffffe7ffff214a9c9c5221ffffdeffffffffffffffffffffffffffffff2173bd7b2121ffffbd\nffffff9cdeff212152bd7321ffffffffffffffffffdeffff29529c4a4a4a522121ffde9cffffffffffffffffff4a9cde292929ffbd73ffffff73bdff2929294a\n4a4a212121ffbd73ffffffffffffffffffffffff529ce74a2121ffe79cffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffffdeffff2152\n9c9c4a21ffffe7ffffffffffffffffffffffffffffff217bc6732121ffffc6ffffffffffffffffffffffffbdffff21217b9c9c4a29297bde9c4affffffffffff\nffffffffffffffffff2173bd7b2929ffffbdffffffffffffffffffffffff9ce7ff21214ae79c52ffffffffffffffffffffffffffffffffffffffffffe7ffff21\n4a9c9c5221ffffdeffffffffffff9ce7ff21214ae79c52ffffffffffff4a9cde522929ffde9cffffffffffffffffffffffffffffff4a9cde522929ffde9cffff\nffffffffffffffffffff529ce74a2121ffe79cffffffffffffffffffffffffffffffffffffdeffff29529c9c4a21ffffe7ffffffffffffffffffffffff9cdeff\n292952de9c4affffffffffffffffffffffffffffffbdffff29297bbd7321ffffffffffffe7ffff214a9c52522121214a9c5229ffffdeffffffffffffffffffbd\nffff21217bbd7321ffffffffffffc6ffff212173e79c52ffffffffffffffffffffffffffffffffffffffffffffffff4a9cde522121ffde9cffffffffffffffff\nffffffffffffffffffffffffffdeffff29529cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff4a9cde7b2121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff29529cde9c4a217bc69c4a21ffffe7ff\nffff217bc64a2121ffe79cffffffffffffffffff7bc6ff4a2121215252bd7321ffffffffffffffffffbdffff29297b9c4a21ffffe7ffffffffffffffffffffff\nffffffff529ce7732121ffffc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6ff7321219ce7c621214affc67bffffff\nffffffffffffffffffffffffffffffbdffff9c527bffffde297bc69c4a21e7ffe7734a9cffffc6ffffff529ce7ffbd739ce7ff21214affc67b73bdffe79c52ff\nffff9ce7ffbd734ae7ffff214a9cc67b21bdffff9c527bffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdeffff214a9c9c4a21ffffdeffffffffffffdeffff214a9c212121ffbd73ffffffffffffffffffffffffdeffff214a9c4a2121ffde9cffffffffffffff\nffff2173bd212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121212121bd7321ffffffffffffffffffffffffffffff4a9c\nde4a2121ffde9cffffffffffffffffff4a9cde212121de9c4affffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffffffffff2173bd\n732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214a732121ffffbdffffffffffffdeffff214a9cffbd73ff\nffff9cdeff21214ade9c4affffffffffffffffffffffffffffffffffff2173bd732121ffffbdffffffffffffffffff73bdff2121219c4a21ffffdeffffffffff\nffbdffff4a2173ffde9cffffff4a9cde4a2121ffde9cffffffffffffbdffff212173732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffff\nffffff4a9cde4a2121ffde9cffffffffffffffffffffffff9cdeff21214ade9c4affffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffff9c\ndeff21214ade9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173bd7321ffffffffffffffffffbdffff2121\n734a2121ffde9cffffffffffffffffffffffffbdffff212173732121ffffbdffffffffffffdeffff214a9c4a2121ffde9cffffffffffff4a9cde212121ffbd73\nffffffffffffffffffffffff2173bd2121219c4a21ffffdeffffffffffffffffff9cdeff21214ade9c4affffff73bdff212121212121bd7321ffffffffffffff\nffffffffffffffff4a9cde4a2121ffde9cffffffffffff2173bd732121ffffbdffffffffffffffffffffffffffffffffffffbdffff212173732121ffffbdffff\nffffffffdeffff214a9c4a2121ffde9cffffffffffffffffffffffffffffffffffff2173bd2121214a2121ffde9cffffffffffffffffffffffffffffff2173bd\n732121ffffbdffffffffffffffffff2173bd212121de9c4affffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffff\nffff2173bd4a2121ffde9cffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffff4a9c\nde4a2121ffde9cffffffffffffffffffffffffffffffffffffdeffff214a9c9c4a21ffffdeffffffffffffffffffffffffffffff73bdff212121bd7321ffffff\nffffffffffff9cdeff21214a9c4a21ffffdeffffffffffffdeffff214a9c2121214a2121ffde9cffffffffffffffffffffffffbdffff212173bd7321ffffffff\nffffbdffff212173de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd212121de9c4affffffffffffffffff73bdff9c4a21ffff\ndedeffff214a9cbd7321ffffffffffff4a9cde212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde732121ffffbd\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173de9c4a2173bd9c4a21ffffdebdffff2121739c4a21ffffdeff\nffffffffffffffff9cdeff21214a212121ffbd73ffffffffffffffffffffffff2173bd732121ffffbd9cdeff21214abd7321ffffffffffff4a9cde732121ffff\nbdffffffffffffffffffffffffffffffffffff4a9cde212121ffbd73ffffffffffff4a9cde7321219cdebd21214affbd73ffffffffffffffffffffffffffffff\nffffffffffff73bdff7321212173734a4a2121214affbd73ffffffffffffdeffff214a9c73734a21214a4a4a4a9c4a21ffffdeffffffffffff4a9cde734a2121\n4a734a4a214a214affde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff29529c212121\n212121212121292929212121c67b21ffffffffffffffffffffffffffffffffffffffffffffffff73bdff2929292121212121212121219c5229ffffdeffffffff\nffffffffffffffffffffffffffffffffffffffffffffff73bdff2929294a2121ffe79cffffffffffffffffffffffffffffff529ce74a2121ffe79cffffffffff\nffffffffffffffbdffff29297b212121212121212121522929ffde9cffffffffffffffffff73bdff212121212121292929212121212121212121292929212121\n9c5221ffffdeffffffffffffffffffffffffffffffffffffffffffffffff529ce7212121212121212121292929ffbd73ffffffffffff9ce7ff21214ae79c52ff\nffffffffffffffffffffffffffffffffff2173bd7b2121ffffbdffffffffffffffffffffffffffffff2173bd2121212121212929294a2121ffe79cffffffffff\nff4a9cde522121ffde9cffffffffffffffffff9cdeff2929524a2121ffe79cffffffffffffffffffffffff9cdeff292952212121212121212121292929212121\n2121212121217b2929ffffbd9ce7ff21214ae79c52ffffffffffffffffffffffffffffffc6ffff212173c67b29ffffffffffff9cdeff29295221212121212121\n2121292929212121e79c52ffffffffffffffffffffffffffffffffffffbdffff21217b212121292929212121212121212121e79c52ffffffffffffffffffffff\nffffffffffffffffffffffffff4a9cde212121212121292929212121c67b21ffffffffffffffffffe7ffff214a9c7b2929ffffbdffffffffffffffffffffffff\n7bc6ff212121c67b29ffffffffffffffffffffffffbdffff21217b9c4a21ffffe773bdff2121214a2121ffe79cffffffffffffffffffffffffffffff529ce74a\n2121ffe79cffffffffffff2173bd7b2929ffffbdffffffffffffffffffffffffffffffffffffffffffffffff529ce7212121292929212121212121bd7321ffff\nffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214a9c5221ffffdeffffffffffffffffffffffffffffff2173bd212121212121292929212121\n2121219c4a21ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff214a9c2929292121212121212121217b2929ffffbdffffffff\nffffffffff4a9cde522121ffde9cffffffffffffffffffffffffffffff4a9cde522121ffde9c9ce7ff21214a2121212121212929292121212121212121212929\n29732121529ca5212121292929212121212121212121292929212121212121bd7321ffffffffffffffffffdeffff29529c212121212121212121292929ffbd73\nffffffffffffffffffffffffe7ffff214a9c292929bd7321ffffffffffffffffffffffffffffffbdffff29297bbd7321ffffffffffffc6ffff212173c67b21ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff21217b2121212929292121219c5221ffffdeffffffdeffff21529cbd7321ffff\nffffffff529ce7212121ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde7b2929ffffbdffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffbdffff21217b9c732129529c9c4a21ffffe773bdff292929de9c4affffffffffffffffffffffffe7ffff21\n4a9c522929ffde9cffffffffffffffffffffffff529ce7212121ffc67b9cdeff212152bd7321ffffffffffff529ce7732121ffffc6ffffffffffffffffffffff\nffffffffffffff4a9cde292929ffbd73ffffffffffff529ce74a21217b9c9c212121ffc67bffffffffffffffffffffffffffffffffffffffffffffffff73bdff\n212121212121ffc67bffffffffffffffffffffffffdeffff21529c2121219c5229ffffdeffffffffffffffffffffffff529ce7212121522929ffde9cffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cbd7321ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde732121ffffbdffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cdede9c4affffffffffff\nffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffffffffffffff2173bdffbd73ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff6b6bffdedeffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadff0000ff8484ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffadadff8484ffdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffa5a5ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffe7e7ff2929ff0000ff0000ff8c8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff9c9cff0000ff8c8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff3131ff0000\nff4a4affa5a5fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5252ff0000ffb5b5\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff1818ff0000ff4a4affffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff0808ff0808fff7f7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffa5a5ff2121ff0000ff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff0000ff4a4affffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffefefff7b7bff1818ff0000ff0000ff4242ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffadadff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff6363ff0808ff0000ff0000ff63\n63ffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffa5a5ff0000ff6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff1010ff0000ff1010ff7b7bffefefffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ff9c\n9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffd6d6ff3939ff0000ff0000ff7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3131ff0000ffdedeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n7b7bff0000ff0000ff3939ffdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff2929ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdff1818ff0000ff1010ff9494ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff9c9cff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff6363ff0000ff0000ff4a4affefefffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffff6363ff0000ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffff9c9cff1818ff0000ff1818ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2121ff0000ff\nf7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff4a4a\nff0000ff0000ff6363fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeff0000ff3131ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff7373ff0808ff0000ff1818ffbdbdffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ff7373ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff1010ff0000ff0808ff7b7bfff7f7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededededededededededededededededede\ndedededededededededededededededededededededededededededededededededededededededededededededededededededededeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffd6d6d6dedededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndedededededededededededededededededeff2121ff0000e7b5b5dedededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededeef9494ff2929ff0000ff0000f74a4ae7c6c6dedededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndedededededededededededededededededededededededededededededededededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdede\ndeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffbdbdff0000ff3131ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff8484ff2121ff0000ff00\n00ff4242ffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffbdbdffc6c6ff8484ff8484ff7b7bffb5b5ffbdbdffbdbdffbdbdffc6c6ffbdbdffcece\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6363ff0000ff9c9c\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff5a5aff0000ff0000ff0000ff4242ffbdbdffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffd6d6ff7b7bff4242ff0808ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff2929ff4242\nff6b6bff8484ffbdbdffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0808ff0808fff7f7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffb5b5ff2929ff0000ff0000ff1010ff6b6bffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9cff0000ff0000ff0000ff10\n10ff4242ff4a4aff8484ff7b7bff8484ff7b7bff8484ff7b7bff7373ff3939ff4242ff4242ff4242ff1818ff0000ff0000ff0000ff0000ff0000ff0000ff0000\nff0000ff2929ff4a4aff8484ff8c8cffbdbdffbdbdffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9cff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff\n4a4aff0000ff0000ff2929ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ffb5b5ff5252ff0000ff0000ff9494ffdedeffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdffc6c6ff8484ff8484ff4242ff3131ff0000ff0000ff0000\nff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff4242ff4242ff5252ff7b7bffb5b5ffe7e7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff6363ff0000ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0808ff0000ff2929ffadadffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffc6c6ff9494ff5a5aff0000ff0000ff0000ff1818ffadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ffb5b5ff7b7bff6363ff3939ff4242\nff4242ff2929ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff4242ffbdbdffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff1818ff0000ffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadff1818ff0000ff1010ff9c9cffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff5a5aff1010ff0000ff\n0000ff0000ff1818ff6363ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffefefffbdbdffc6c6ff8484ff6b6bff1818ff0000ff0000ff3939ff4242ff8484ffbdbdffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceceff0000ff3939ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffbdbdff4242ff0000ff0000ff4a4affefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0808ff0000ff0000ff4242ff8484ffbdbdffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffadadff1818ff0000ff0000ff0000ff0000ff0808ff5252ff7b7bffadadfff7f7ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff8484ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdff4242ff0000\nff0000ff2929ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffff7f7ff3939ff0000ff0000ff7b7bfff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffd6d6ffbdbdff8c8cff5252ff0808ff0000ff0000ff0000ff1818ffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1818ff0808ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdff4242ff0000ff0000ff2121ffa5a5ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffff7f7ff4242ff0000ff2929ffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffbdbdff8484ff5a5aff0000ff1010ffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff8c8cff0000ff6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffff7f7ffa5a5ff2929ff0000ff0000ff3131ffadadffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ff3131\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff8484ff0000ff1010ffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff3131ff0000ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef\nefff7b7bff1818ff0000ff0000ff3939ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff1818ff0000ffd6d6ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484\nff0000ff1010ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff0000ff4242ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff5a5aff0000ff0000ff0000ff5a5affc6\nc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5ff0000ff5252ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0808ff0000ffbdbd\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadff0000ff7373ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7ffa5a5ff6b6bff2121ff0000ff0000ff1010ff7373ffe7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff5252ff0000ffadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9494ff0000ff5a5affffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffe7e7ffa5a5ff\n7373ff3939ff1010ff0000ff0000ff0000ff0000ff4242ff9c9cffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde\nd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff1010ff0808ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff0808ff0808ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff9c9cff0000ff7b7bffffffffffffffffffffffffffceceff7373ff3131ff0000ff0000ff0000ff0000ff0000ff4242ff\n7373ffadadffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffff7ffffe7e7efe7e7e7e7e7e7fff7efffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceceff0000ff4242ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff5252ff0000ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffa5a5ff0000ff4242ffceceffb5b5ff5a5aff1818ff0000ff0000ff0000ff2121ff6363ffadadffdedeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffb5efff945a7bf7e7c6ffffffffffffffffffffffffffffffffffffffffffffffffffffff9cd6f72129527b3929ffefbdffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffbdffff212173212121212121732121ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63b5f71010181010101010100808081010101010101010100808081010\n10101010181010f7b563ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdede\ndeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffefffff73a5c6293152212121212121212121312921a5734affefceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffff7efe7e7b56bd69439d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d69439e7b56bffefe7ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff527bbd\n3939397b5239ffe7bdffffffffffffffffffe7ffff527bbd3939397b5239ffe7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7bdbdbda5a5a59c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c\n9c9c9ca5a5a5bdbdbdf7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9cff0000ff7b7bffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffadadff0000ff5a5affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9cff0000ff0000\nff1010ff0000ff0000ff0000ff4242ff8c8cffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff4a94de4a2921efc684ffffffffffffffffffffffffffffffffffffffffff9cd6f7213152212121212121de9c4affffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff4a4a94ffde9cffffff\nffffff4a94de522121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff3994ded68c39ffffffffffffffffffffffffffffffffffffffffffffffffffffff3994d6de9439ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6f7ff2952944a2921\nbd9473efe7d6fffff7e7eff794bdd6294a73522921f7d69cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nf7efe7d68c29d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c29f7efe7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6ffbd7b42fffff77bc6f7c67b39ffffff\nffffffffffff7bc6ffbd7b42fffff77bc6f7c67b39ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffefefefa5a5a59c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ca5a5a5\nefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ff9494ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffb5e7ff734a73ffe7b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7\nf7ff0808ff1010ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff0000ff0000ff0000ff6363ffa5a5ffefef\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceffff29428c944a21\nfff7d6ffffffffffffffffffffffffffffffaddef721316b212121212121312121ffc684ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2173b5de9c4a\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffff3994dede9442ffffffffffffffffffffffffffffffffffffffffffffffffffffff4294dede9439ffffffffffffffffffffffffffff\nffffffffffffffffffffffffff63b5ff1010106b1010ffffbdffffffffffffffffffffffff0863b5101010de9439ffffff3994de101010b56b10ffffffffffff\nbdffff10106b101010080808101010b56b10ffffff63b5ff101010101010101010390808ffde94ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff294a9c844a29f7e7bdffffffffffffffffffffffff\nffffffe7f7ff4a84c64a2929ffde9cffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffdeffff214a9c212121212121bd\n7321ffffffffffff73bdff2121212121214a2121ffde9cffffffffffff94deff212152212121212121bdbd73212173ffbd73ffffffffffff529cde2121212121\n21212121ffbd73ffffffffffff73bdff2121212121214a2121ffde94ffffffffffffffffffffffffffffffffffffffffffffffffe7b56bd68c21d68c21d68421\nd68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421e7b56bffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84ceffce8c4affffff8cceffce844affffffffffffffffff84ceffce8c4a\nffffff8cceffce844affffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffde\nffff214a9c212121212121bd73212173bdbd7321ffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffffffffff9cdeff4a21\n4affde94ffffffffffffffffff4a94de212121ffbd73ffffff73bdff212121212121212121de944affffffffffffffffff73bdff2121212121214a2121bdde94\n212173ffbd73ffffffffffff529cde21212121212173212173bdbd732121ffffbdffffffffffff2173bd212121212121522121ffde9cffffffffffff2173bd21\n2121212121944a21ffffdeffffffffffff73bdff212121212121ffbd73deffff21529c212121212121bd7321ffffffffffffffffffffffffffffffffffffffff\nffffffffbdbdbd9c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9cbdbdbdffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff6b6bff0000ff9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff294a9c2121212121\n21212121212121212121212121212121212121212121212121212121212121212121944a29ffffd6ffffffffffffffffffffffffffffffffffffdeffff214a94\n732121ffffbdffffffffffffffffff2173bd212121ffbd73ffffffffffffffffff4a94de9c5221ffffdedeffff214a94de9c52ffffffffffff2173bd212121de\n9c4a9cdeff4a214affde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff0000ffceceffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff0000ff0000ff5252ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff4a94d69c5231fff7d6ffffffffffff\nffffffb5e7f7213973212121212121312121efbd73fffff7ffffffffffffffffffffffffffffffffffffbdffff212173212121212121732121ffffbdffffffff\nffffffffff4a94de212121212121212121ffbd73ffffffffffffffffff4a94de2121214a2121ffde9cffffff73bdff212121212121ffbd739cdeff4a214affde\n9cffffff73bdff732121ffffbdffffffffffff73bdff732121ffffbdffffffdeffff214a9c212121212121bd73214a9cdebd7321ffffffffffff2173bd212121\n2121219c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff39\n94ded694393994de080808101010080808101010080808101010d69439ffffff398cd6de9439ffffffffffffffffffffffffffffffffffffffffffffffffffff\nff6bbdff0808086b1010ffffb5ffffffffffffffffffffffff106bbd080808de9439ffffff3994de080808bd6b10ffffff94deff080839101010080808101010\n080808943910ffffd66bbdff080808101010080808101010390808ffde94ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff5aa5de632929ffe7adffffffffffff73bdff212121bd7321ffffffffffffe7ffff296bb5\na55a21ffffe7ffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffff73bdffffb573ffffffd6ffff214a9cd6944adeffff947394ff\nffdeffffff73bdff732121ffffbdd6ffff214a9cb57321ffffffd6ffff214a9c212121ffbd73ffffff73bdff212121ffbd73ffffffffffff4a73b5ffde9cd6ff\nff9c739cffffd6ffffff73b5ff732121ffffb5ffffffffffffffffffffffffffffffffffffffffffd69431d68c21d68421d68c21d68421d68c21d68421d68c21\nd68421d68c21d68421d68c21d68421d68c21d68421d68c21d69431ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7ffff4a7bc63939317b4a31ffe7c6ffffffffffffffffffe7ffff4a7bc63939317b4a31ffe7c6ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffb5ffff212173ffb573ffffffffffffffffffffffffffffffffffff4a9cde732121ffffbdffffff4a\n9cde212121bd7321ffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffffffffff9cdeff4a214affde9cffffffffffffb5ff\nff212173b57321ffffff94d6ff21214ad6944affffffffffff4a9cdeffb573ffffff73b5ff212121ffb573ffffffd6ffff4a739c21214affbd73ffffff9cdeff\n21214affbd73ffffff9cdeff21214a732121ffffb5ffffff4a94d64a2121ffd694ffffffd6ffff734a9cffffb59cdeffd69473ffffffffffff2173bdb57321ff\nffffd6ffff214a9cb57321ffffffffffff73bdffffb573ffffffd6ffff214a9cd6944affffffffffffffffffffffffffffffffffffffffffa5a5a59c9c9c9c9c\n9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ca5a5a5ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffff5252ff0000ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffb5ff\nff732173ffffb5ffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffffffffffffff94d6ff21214a4a2121ffde9cffffffffffff\nd6ffff214a9c212121de9c4affffffffffffffffff4a9cde944a21ffffded6ffff214a9cd6944affffff4a94d6212121ffb573ffffff94d6ff4a214affd694ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff9494ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffff9494ff0000ff5252ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff4a94ce9c5231fff7d6ffffffd6ffff294a9c212121212121\n212121d69c52fffff7ffffffffffffffffffffffffffffffffffffbdffff732173ffffbdffffffffffff73b5ff4a2121ffd694ffffff73b5ff212121ffb573ff\nffffffffff4a73bdffd694ffffffb5ffff212173d6944affffffffffffdeffff214a94bd7321ffffffffffff94d6ff4a214affd694ffffff73b5ff732121ffff\nb5ffffffffffff73bdff732121ffffbdd6ffff214a9c944a21ffffdeffffff4a9cde2121219c4a21ffffd69cdeffd69473ffffffffffff2173bdb57321ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3994dede9442ffffffffffffff\nffffffffffffffffffffffffffffffffffffffff4294dede9439ffffffffffffffffffffffffffffffffffffffffffffffffffffff6bb5ff101010630808ffff\nbdffffffffffffffffffffffff106bb5101010de9439ffffff3994de101010b56308ffffff106bb5101010b56308ffffffffffffffffffffffffffffffffffff\nffffffffffffffffff106bb5101010de9439ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffc6ffff213184dea552ffffffffffffffffff73bdff212121bd7321ffffffffffffffffffa5e7ff31215affc67bffffffffffff\nffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffff2173bdbd7321ffffffffffffffffffffffff9cdeff4a214aff\nde94bdffff212173ffbd73ffffffffffff9cdeff21214affbd73deffff214a9cbd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffff9cde\nff4a214affde9cffffffffffffffffffffffffffffffffffffffffffd68c21d68421d68c29d68c21d68c21f7ad21fffff7fffffffffffff7f7ffd68c6bd68c21\nd68c21d68421d68c29d68c21d68c21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffff2173bdbd7321ffffffffffffdeffff21529cbd7321ffffffbd\nffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffffffffff94deff522152ffde9cffffffffffff529cde732121ffffbdffffff2173\nbd9c4a21ffffdeffffffffffffffffffffffffffffff2173bdbd7321ffffffffffffffffff9cdeff21214affbd73ffffff73bdff732121ffffbdffffffffffff\n4a9cde732121ffffbdbdffff212173de944affffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde9c4a21ffffdedeffff214a9cde9c4aff\nffffffffffffffffffffffffffffffffff2173bdbd7321ffffffffffffffffffffffffffffffffffffffffff9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ce7c6\na5fffffffffffff7ffffa5c6e79c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff0000ff\nbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffbdffff732173ffffbdffffffffff\nffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffffffffffffff529cde734a21214a73de944affffffffffff9cdeff4a214a5273739c4a21\nffffdeffffffffffff4a9cde9c4a21ffffdedeffff214a9cde9c4a73bdff212121ffbd73ffffffffffff9cdeff4a214affde9cffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdff0000ff3131ffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffff7f7ff0808ff0000ffc6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff4a8cceb56b39fff7deffffffbdefff29397b292121d69c52fffff7ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9cffbd73deffff21529cbd7321ffffffffffffffffffffffffffffffff\nffffbdffff212173ffbd73ffffffffffffdeffff214a9cde944affffffffffff9cdeff4a214affde9cffffff73bdff732121ffffbdffffffffffff73bdff7321\n21ffffbd9cdeff4a214affde9cffffffffffffdeffff21529c9c4a21ffffdeffffffffffffffffffffffff4a94de9c5221ffffdeffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3994ded68c393994de08080810101008080810101008080810\n1010d68c39ffffff3994d6de9439ffffffffffffffffffffffffffffffffffffffffffffffffffffff6bbdff0808086b1010ffffb5ffffffffffffffffffffff\nff106bbd080808de9439ffffff3994de080808bd6b10d6ffff103994080808101010080808101010080808101010d68c39ffffff94d6ff101039080808101010\n390808ffde94ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nff94d6ff4a2142ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a94de944affffffffffffffffffffffffffffffffffff\nffffffbdffff212173ffbd73ffffffffffffffffff73bdff212121212121ffb573ffffffffffffdeffff214a94212121944a21ffffde94d6ff4a214affd694ff\nffffffffffbdffff212173ffbd73b5ffff212173ffb573ffffffffffffffffffffffffffffffffffffffffffd6ffff214a9c2121219c4a21ffffd6ffffffffff\nffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421f7b521ffffefffffffffffffffffffefefffd68c21d68421d68c21d68421d68c21\nd68421ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nff73bdff212121bd7321ffffffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nb5ffff212173ffb573ffffffffffffffffffffffffffffffd6ffff214a9cd6944affffffffffffffffff2173b5bd7321ffffffbdffff212173ffbd73ffffff73\nbdff732121ffffbdffffffffffffffffffffffffffffff9cdeff4a214affde9cffffffbdffff212173de9c4affffffdeffff214a94de9c4affffffffffffffff\nffffffffffffffdeffff214a94de9c4affffffffffffffffffbdffff212173ffbd73ffffff4a9cde944a21ffffdeffffffffffff73b5ff732121ffffb59cdeff\n4a214affde9cffffffffffffffffffffffffffffffffffffffffff9cdeff21214a212121d6944affffffd6ffff214a9cd6944affffffffffffffffffffffff73\nbdff212121212121ffb573ffffffffffffffffffffffffffffffffffffffffff9c9c9c9c9c9c9c9c9c9c9c9c9c9c9cd69c9cffffefffffffffffffffffffefff\nff9c9cd69c9c9c9c9c9c9c9c9c9c9c9c9c9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff0000ffc6c6ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffbdffff732173bdffbd212173212121212121732121b5ffb5732173b5ffb5212173212121212121732121bdffbd7321\n73ffffbdffffffffffffffffffffffffffffffffffff2173b5bd73214a94d6bd7321ffffffffffff73b5ff9c4a2173b5d6732121ffffb5ffffffffffff4a9cde\n944a21ffffded6ffff214a9c4a4a2121214ad6944affffffffffffffffff94d6ff4a214affd694ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffff3131ff0000ff5a5affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffff9494ff0000ff1010ff4a4affdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffefffff427bbdb5733973b5d6bd734ab5e7e7bd8484ffffe7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff73b5ff212121ffb573bdffff212173ffbd73ffffffffffffffffffffffffffffffffffffb5ffff212173ffb573ff\nffffffffffdeffff214a94de9c4affffffffffff94d6ff4a214affd694ffffff73b5ff732121ffffb5ffffffffffff73bdff732121ffffbd73b5ff732121ffff\nb5ffffffffffffffffff4a94d69c4a21ffffd6ffffffffffff9cdeff21214a212121d6944affffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff3994dede9442ffffffffffffffffffffffffffffffffffffffffffffffffffffff4294dede\n9439ffffffffffffffffffffffffffffffffffffffffffffffffffffff63b5ff101010101010101010080808101010de9439ffffff0863b5101010de9439ffff\nff3994de101010b56b10ffffff0863b5101010101010101010080808101010101010ffbd6b94deff101042101010101010390808ffde94ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff732121ffffbdffff\nffffffffffffff73bdff212121bd7321ffffffffffffffffffffffff2173bdbd7321ffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73\nffffffbdffff212173212121de9c52ffffffffffffffffff529cde212121732121ffffbdffffffffffff9cdeff4a214affde9cffffffffffffbdffff212173ff\nbd73bdffff212173212121212121212121212121212121bd7321ffffff4a94de212121732121ffffbdffffffffffffffffffffffffffffffffffffffffffffff\nffffffffd68c29d68c21d68c21d68421d68c29e7ad21d68c6bd68421e78c29fff7bdffffffd6849cd68c29d68c21d68c21d68421d68c29ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121bd7321ffff\nffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173212121212121\n2121219c4a21ffffdeffffffdeffff214a9cde9c4affffffffffffffffff2173bdbd7321ffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffff\nffffffffffffffffffffff9cdeff4a214affde94ffffff2173bd9c4a21ffffdeffffffdeffff214a9c2121212121212121212121212121219c5221deffde214a\n9cde944affffffffffffffffffbdffff212173ffbd73ffffff4a94de9c5221ffffdeffffffffffff73bdff732121ffffbd94deff212152212121212121212121\n212121212121de9c4adeffff21529c212121bd7321ffffffffffffffffffdeffff214a94de9c52ffffffffffffbdffff212173212121de9c4affffffffffffff\nffffffffffffffffffffffffffffffffffffffffa5a5a59c9c9c9c9c9c9c9c9ca5a5a5efd69cffffffd6efffa5a5a5ffe7bdffffff9cd6efa5a5a59c9c9c9c9c\n9c9c9c9ca5a5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4242ff0000ffbdbdffffffffffffffffffffffffffffffffffffffffffff\nffffffffffbdffff732173ffffbdffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffff\nffffffffffffffbdffff212173ffbd739cdeff73214affffbdffffff2173bdbd7321bdffff212173ffbd73ffffffffffff4a94de9c5221ffffdedeffff214a94\n5252524a2121ffde9cffffffffffffffffff9cdeff4a214affde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7ff2121ff0000ffadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484ff0000ff00\n00ff5252ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffc6efffdec6b5296bb5212121292121bd7b39ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ndeffff214a9c212121bd7321ffffffbdffff212173212121212121212121212121212121bd7321ffffffbdffff212173ffbd73ffffffffffffdeffff21529cde\n9c4affffffffffff9cdeff4a214affde9cffffff73bdff732121ffffbdffffffffffff73bdff732121ffffbd73bdff732121ffffbdffffffffffffffffff4a9c\nde944a21ffffdedeffff214a9c212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff3994ded694393994de080808101010080808101010080808101010d69439ffffff398cd6de9439ffffffffffffffffffff\nffffffffffffffffffffffffffffffffff6bbdff080808101010080808101010080808de9439ffffff106bbd080808de9439ffffff3994de080808bd6b10ffff\nff3994de080808bd6b10ffffffdeffff08398c391010ffd6946bbdff080808943910ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff732121ffffbdffffffffffffffffff73bdff2121\n21bd7321ffffffffffffffffffffffff2173b5bd7321ffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffff73bdff732121ffffbd\nffffffffffffffffffdeffff214a94de9c4affffffffffffffffffffffff94d6ff4a214affd694ffffffffffffbdffff212173ffbd73d6ffff214a9cd6944aff\nffffffffffffffff2173b5de9c4ad6ffff214a9cd6944affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d684\n21d68c21d68421ef8c21ffffd6fffffffffffffffffff7f7ffd68c6bd68421d68c21d68421d68c21d68421ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffff\nff73bdff212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff212173ffb573ffffffffffff2173bd944a21ffffde\nd6ffff214a9cd6944affffffffffffffffff2173b5bd7321ffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffffffffff9c\ndeff21214a212121212121212121ffb573ffffffffffffffffff2173b5bd7321ffffffffffffffffff4a9cdeb57321ffffff2173b59c4a21ffffd6ffffffffff\nff9cdeff21214affbd73ffffff4a9cde944a21ffffdeffffffffffff73b5ff732121ffffb5bdffff212173ffbd73ffffffffffffd6ffff214a9cffb5739cdeff\n4a214affde9cffffffffffffffffffffffffd6ffff214a9cd6944affffffffffff73bdff732121ffffbdffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff9c9c9c9c9c9c9c9c9c9c9c9c9c9c9cefd69cffffff9cd6f79c9c9ce7bd9cfffff7bde7ff9c9c9c9c9c9c9c9c9c9c9c9c9c9c9cffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffff4242ff0000ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff732173bd\nffbd212173212121212121732121b5ffb5732173b5ffb5212173212121212121732121bdffbd732173ffffbdffffffffffffffffffffffffffffff73bdff4a21\n21ffde9cb5ffff212173ffb573deffff214a94ffbd73d6ffff214a9cb57321ffffffffffff4a9cde944a21ffffded6ffff214a9cd6944a4a9cde4a2121ffde9c\nffffffffffff94d6ff4a214affd694ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nadadff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff2121ff0000ffb5b5ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdd6ef7b849c94a58c4a316b8cb5\n9421214a212121212121212121ce8c52ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde2121214a2121ffd694ffffff\nffffffdeffff214a94de9c4affffffffffffffffff2173bdd6944affffffb5ffff212173ffb573ffffffffffffdeffff214a94de9c4affffffffffff94d6ff4a\n214affd694ffffff73b5ff4a2121ffd694ffffffffffff73bdff732121ffffbdb5ffff212173ffb573ffffffffffffffffff2173b59c4a21ffffd69cdeff4a21\n4affde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff3994dede9442ffffffffffffffffffffffffffffffffffffffffffffffffffffff4294dede9439ffffffffffffffffffffffffffffffffffffffffffff\nffffffffff6bb5ff101010630808ffffbdffffffffffffffffffffffff106bb5101010de9439ffffff3994de101010b56308ffffffb5ffff10106b0808081010\n10101010101010943908ffffde94deff1010420808081010101010106b1010ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff392152ffce8cffffffffffffffffff73bdff212121bd7321ffffffffffffffff\nffceffff21398cde9c4affffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffff94deff522152ffde9cffffff94deffffbd9cffffff\n2173bdbd7321ffffffffffff9c9cbdffffde9cdeff4a214affde9cffffffffffffbdffff212173ffbd73ffffff73bdff4a2121ffde94ffffff9cdeff4a214aff\nde94ffffff2173bdbd7321ffffffffffff9c9cbdffffdeffffffffffffffffffffffffffffffffffffffffffd68c21d68421d68c29d68c21d68c21ef8421ffff\ndeffffffffffffffffffd6b5c6d68c21d68c21d68421d68c29d68c21d68c21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffffffffffffffffffff73bdff212121bd7321ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffbdffff212173ffbd73deffff214a94de9c52ffffff\nffffffffffff2173bdbd7321ffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffffffffff94deff522152ffde9cffffffff\nffff2173bdbd7321ffffffffffff9cdeff21214affbd73ffffffbdffff212173ffbd73ffffff9cdeff21214affbd73ffffffdeffff214a9c212121ffbd73ffff\nff4a9cde9c4a21ffffdeffffffffffff73bdff732121ffffbdffffff4a9cde732121ffffbdffffff73bdff732121ffffbdbdffff212173ffbd73ffffffbdffff\nde9c9cffffffdeffff214a9cde9c4affffffffffff9cdeff4a214affde94ffffff9cdeffffbd9cffffffffffffffffffffffffffffffffffffffffff9c9c9c9c\n9c9ca5a5a59c9c9c9c9c9cefd69cffffff9cd6ef9c9c9ce7bd9cffffffbde7ff9c9c9c9c9c9ca5a5a59c9c9c9c9c9cffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffff5a5aff0000ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffff\nffffbdffff732173ffffbdffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffffffff4a94de9c5221ffffdeffffff2173bdde9c\n529cdeff4a214affde94ffffff4a9cde9c4a21ffffdeffffff4a9cde9c4a21ffffdedeffff214a9cde9c4affffff2173bd732121ffffbdffffff9cdeff4a214a\nffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff0000ff4242ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadff0000ff1010ffc6c6ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff529cd6212131212121212121292121de9c5273bde72121392121212121\n21292121de9c52fffff7ffffffffffffffffffffffffffffffffffffffffffffffff529cde212121de9c4affffffffffffffffffffffffffffff73bdff4a2121\nffde9cffffff9cdeff4a214affde9cffffffbdffff212173ffbd73ffffffffffffdeffff214a9cde944affffffffffff9cdeff4a214affde9cffffff73bdff21\n21219c5221ffffdedeffff214a949c5221ffffdeffffff2173bd732121ffffbdffffff73bdff2121219c4a21ffffdebdffff212173ffbd73ffffffbdffffde9c\n9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3994ded68c39ffffff\nffffffffffffffffffffffffffffffffffffffffffffffff3994d6de9439ffffffffffffffffffffffffffffffffffffffffffffffffffffff6bbdff0808086b\n1010ffffb5ffffffffffffffffffffffff106bbd080808de9439ffffff3994de080808bd6b10ffffffffffffd6ffff103994080808101010943908ffffdeffff\nffffffff94d6ff101039080808101010630808ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffd6ffff21398cce8c42fffff7ffffffffffff73bdff212121bd7321ffffffffffffffffff8cceff392139ffd694ffff\nffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffff73b5ff2121212121219c4a21ffffd6ffffffd6ffff214a9c212121212121\nffb573ffffff94d6ff4a214affd694ffffffffffffbdffff212173ffbd73ffffffffffff94d6ff21214a212121212121ffb573ffffffffffffdeffff214a9421\n2121212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffd68421d68c21d68421d68c21d68421ef8c21ffffd6efefffd68421d68c21d684\n21d68c21d68421d68c21d68421d68c21d68421ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff73bdff212121bd7321ffffffffffffd6f7ffc69c94ffffff73bdff212121bd7321ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffb5ffff212173ffb573ffffffffffffdeffff214a94de9c4ad6ffff214a9cd6944affffffffffffffffff2173b5bd7321\nffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffffffffff9cdeff4a214affde9cffffffffffff94d6ff4a214affd694ff\nffffffffffbdffff212173212121212121de9c4affffffffffffffffff9cdeff21214a2121212121219c9c4a212173ffbd73ffffff4a9cde944a21ffffdeffff\nffffffff73b5ff732121ffffb5ffffffffffff73bdff2121212121214a2121ffde9cffffffffffff94d6ff21214a212121732121ffffb59cdeff21214a212121\n212121212121ffb573ffffff73b5ff2121212121219c4a21ffffd6ffffffffffffffffffffffffffffffffffffffffff9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ce7\nbd9cfffff7d6efff9c9c9cffe7bdffffffbde7ff9c9c9c9c9c9c9c9c9c9c9c9c9c9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7b\nff0000ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff732173bdffbd212173212121212121732121b5ffb5732173b5ffb521\n2173212121212121732121bdffbd732173ffffbdffffffffffffffffffffffffd6ffff214a9cb57321ffffffffffff73bdff944a214a9cbd944a21ffffdeffff\nff73bdff4a2121ffde9cffffff4a9cde944a21ffffded6ffff214a9cd6944affffffd6ffff214a9c4a2121ffde9c94d6ff4a214affd694ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff2929ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ff0000ff7373ffefefffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff7bc6f7212131212121212121212121212121312121efc67b63adde212131212121212121212121de9c52ffff\nf7ffffffffffffffffffffffffffffffffffffbdffff212173de9c4affffffffffffffffffffffffffffffffffffffffff9cdeff21214a212121212121ffbd73\nffffff73bdff2121212121212121214a212194b59421214a212121212121212121ffbd7394d6ff4a214affd694ffffff73b5ff73212194d6b521214a2121214a\n2121ffd694ffffffffffffffffff2173b52121212121219c4a214a94b59c4a21ffffd6ffffff94d6ff21214a212121732121ffffb5ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3994dede94423994de101010101010101010de9439\nffffffffffffffffffb5efff18296be7a552ffffffffffffffffffffffffffffffffffffffffffffffffffffff63b5ff1010106b1010ffffbdffffffffffffff\nffffffffffffffffffffffffffffffffff3994de101010b56b10ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff73bdef4a2931ffde9cffffffffffff73bdff212121bd7321ffffffffffffdeffff294a94bd7331ffffefffffffffffffffffffffffffffff\nffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffd68c29d68c21d68c21d68421d68c29e78c21ffffc6ffffffffffffffffffefefffd68421d68c29d68c21d68c\n21d68421d68c29ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffefffff427bc63939317b4231ffefc6d6f7ff29529cbd7321f7ffff4a8cd6212121c68431ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffbdffff212173ffbd73ffffffffffffdeffff214a9cde944affffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73\nffffff73bdff732121ffffbdffffffffffffffffffffffffffffff9cdeff4a214affde94ffffffffffff9cdeff4a214affde9cffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a94de9c52ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a59c9c9c9c9c9c9c9c9ca5a5a5bd9c9cffffe7ffffffffffffff\nffffffffff9cbde7a5a5a59c9c9c9c9c9c9c9c9ca5a5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ff8c8cffffffffffff\nffffffffffffffffffffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffbd\nffff732173ffffbdffffffffffffffffffffffff9cdeff21214affbd73ffffffffffff9cdeff73214a217373bd7321ffffffffffffbdffff212173ffbd73ffff\nffffffffffffffffffffdeffff214a94de9c52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff0000ff4242ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffadadff1818ff0000ff2121ffe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff3184ce9c4a29f7f7dec6d6e7295a942121216b2121ffefadffffff529cd6212131212121212121312121dead63fffff7ffffffffffffffff\nffffffffffffffbdffff212173ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173\nffbd73ffffffffffffdeffff21529cde9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3994ded69439ffffffffffffffffffffffffffffffffffffffffffb5efff18216b\nd68c39ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6bbdff080808101010080808101010080808943910ffffd6106bbd080808de\n9439ffffff3994de080808bd6b10ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff31\n73bd522921efce94ffffffffffffffffffffffffffffffceefff29528c733121ffe7b5ffffffffffffffffffffffffffffffffffffffffffffffffbdffff2121\n73ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffd68421d68c21d68421d68c21d68421e78c21fff7bdffffffffffffffffffefefffd68c21d68421d68c21d68421d68c21d68421ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6ffce8c4afffff78c\nceff9c734a295294212121212121212121212121392121ffce8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff212173ffb5\n73ffffffffffff4a9cde4a2121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffff73bdff732121ffffbd\nffffffffffffffffffffffffffffff9cdeff4a214affde9cffffffffffff2173b5732121ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff214a9cd6944affffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9cd69c9cfffff7ffffffffffff9cd6ef9c9c9c9c9c9c9c\n9c9c9c9c9c9c9c9c9c9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff0000ff7373ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffbdffff732173ffffbdffffffffffffffffffffffffade7ff632163ffe7adffffffffffffffffffffffffbdffff732173ffffbdffffffff\nffffffffffffffff73b5ff732121ffffb5ffffffffffffdeffff214a94212121ffb573ffffffffffffdeffff214a94bd7321ffffff4a9cde732121ffffbdd6ff\nff214a9cd6944affffffffffffffffffffffffffffff94d6ff21214affb573ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffbdbdff0000ff6363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffefefff4a4aff0000ff2929ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b8cc6ff\nefbdffffffffffff63adef2121214a2121ffde9cffffffffffff4a94d6212129212121212121312121e7b56bfffff7ffffffffffffffffffffffffffffff4a94\nd6732121ffffb5ffffffd6ffff734a9cffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffb5ffff212173ffb573ffffffffffffdeffff\n214a94de9c4affffffffffff94d6ff21214affb573ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff3994dede9442ffffffffffffffffffffffffffffffffffffb5efff18296bd69442ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffff6bb5ff101010080808101010101010101010943908ffffde106bb5101010de9439ffffff3994de101010b5\n6308ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f7ff4a84c6292129845a42ce\nbda5efefdebdcede5a84a5212939844a29f7e7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd68c21d6\n8421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84ceffce844affffff84cef7a5845229529c21212121\n21212121214a3129efc684ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff2121732121212121212121214a2121ffde\n9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdffff212173ffbd73ffffff73bdff732121ffffbdffffffffffffffffffffffff\nffffff94deff212152212121212121212121732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9cff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdedeff0000ff3131ffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff\n294a94212121212121212121212121212121733921bddebd2139732121212121212121212121212121219c4a29ffffd6ffffffffffffffffffffffff2173bd94\n4a21ffffdeffffffffffffffffff529cde732121ffffbdffffffffffffffffff4a9cde732121ffffbd4a9cde732121ffffbddeffff214a9cde9c4affffffffff\nffffffffffffffffffff9cdeff21214affbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff9494ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffff3939ff0000ff7b7bffc6c6fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84ceff21\n2131944221ffffd6fffffffffffff7ffff4a94d62121292121212121214a2121ffde9cffffffffffffffffffffffffffffffffffff4a9cde2121212121212121\n21ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n9cdeff21214affbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff63b5f7080810101010080808101010080808101010080808181010d68c39ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffadd6e7425a84212931212121212121523129ce\na573fff7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd69439d68c21d68421d68c21d68421d6\n8c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d69439ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff426bad2121296b4231ffd6a5d6ffff29529cbd7321ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\na5a5a59c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ca5a5a5ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff2121ff0808fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7373ff0000ffb5b5\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff0000ff\n0000ff0000ff0000ff3131ffadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cd6ff21214a522921f7d694ffffffffffffff\nffffffffffefffff4a8cce212129312121efbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde\nd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7b56bd68c21d68c21d68421d68c29d68c21d68c21d68421d68c29d6\n8c21d68c21d68421d68c29d68c21d68c21d68421e7b56bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffffc6a5a5ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd9c9c9c9c9c9c9c9c9c\na5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9cbdbdbdffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff5252ff0000ffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a4aff0000ffd6d6ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff8484ff6363ff2121ff0000ff\n0000ff2121ff7373ff8484ff9494ffdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcef7ff7b7ba5ad947bf7e7d6ffffffffffffffffffffffffffffffffffffefffff4a\n7bbdefbd7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffff7efe7d68c29d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d68c21d68421d6\n8c21d68421d68c29f7efe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefa5a5a59c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c\n9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ca5a5a5efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bff0000ff8c\n8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1010ff1010ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadff3131ff0000ff0000ff0000ff\n0000ff0000ff2929ff6363ff8484ff7b7bff8484ffdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdede\ndeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffff7efe7e7b56bd69439d68c21d68421d68c29d68c21d68c21d68421d68c29d68c21d68c21d69439e7b56bffefe7ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7bdbdbda5a5a59c9c9c9c9c9ca5a5a59c9c9c9c9c9c9c9c9ca5a5a59c9c9c\n9c9c9ca5a5a5bdbdbdf7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff0000ff5252ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffd6d6ff0000ff4a4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefffbdbdffbdbdff7b7bff2929ff0000ff0000ff\n0000ff0000ff0000ff2929ff5a5aff4242ff4242ff4242ff4242ff4242ff4242ff4242ff4242ff5252ffd6d6ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ff1818ff0000ff9c9cffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffff8c8cff0000ff7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefffbdbdffc6c6ffbdbdff4a4aff0000ff\n0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff8484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffbdbdff0000ff0000ffb5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5252ff0000ffc6\nc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceceffbdbdffc6c6ffbdbdffc6c6ff\nbdbdffc6c6ffbdbdffc6c6ffbdbdffceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffff9494ff0000ff0808ffbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff0000ff2929ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffff8484ff0000ff2929ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadff0000ff7373ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a4aff\n0000ff7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffff8484ff0000ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefff0808ff0000ffb5b5ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffff7f7ff1818ff0000ffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff0000ff1010ffbdbdffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff1818ff0000ff5252ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8cff0000ff0000ff5252ffdedeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7ff8c8cff4a4aff0000ff0000ff6b6bffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffd6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffff9c9cff1818ff0000ff0000ff4a4aff9c9cffefefffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffb5b5ff5252ff0000ff0000ff0000ff1010ffa5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6d6ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff8c8cff2121ff0000ff0000ff0000ff3939ff5252ff9494ffc6c6ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdffc6c6ff9494ff8484ff7b7bff8484ff6363ff4242ff1818\nff0000ff0000ff1818ff7373ffc6c6fff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffb5b5ff5a5aff1010ff0000ff0000ff0000ff0000ff0000ff1010ff3939ff5252ffd6d6ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7e7ffbdbdffa5a5ff7b7bff6363ff3939ff1010ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff2929ff9c9cffefefffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffbdbdff8c8cff4a4aff2121ff0000ff0000ff0000ff4242ff8484ffa5a5fff7f7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5ff7373ff4242ff0808ff0000ff0000ff0000ff00\n00ff0000ff0000ff0000ff1818ff4242ff6363ff7b7bff8484ff8484ffc6c6ffbdbdffd6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffbdbdff0000ff0000ff0000ff0000ff0000ff2121ff9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffc6c6ff3131ff0000ff0000ff0000ff0000ff4242ff5252ff8484ff9494ffbdbdffd6d6ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7dedeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffff7f7f7dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffceceffbdbdffc6c6ffb5b5ff5a5aff0000ff0000ff1818ff5a5aff8484ffadadffbdbdffc6c6ffdedeffffffffffffffffffffffffffffffffffffffffffff\nbdbdffc6c6ff8c8cff4a4aff0000ff0000ff2121ff9c9cffdedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdededede\ndeded6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6\nd6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dedede\nd6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6de\ndeded6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6d6dededed6d6\nd6dededee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffbdbdff4a4aff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff0000ff\n2121ff9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffbdbdff7b7bff8484ff4242ff4242ff4242ff1818ff0000ff0000ff0000ff0000ff0000ff2929ff4242ff6b6bff8484ffc6c6ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndedededededededededededededededededededededededededededededededededededededededededededededededededee7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7\ndededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7e7e7ffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffefefefdededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7\ne7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dedede\ne7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7de\ndedee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7\ne7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dedede\ne7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdededee7e7e7dedede\ne7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7de\ndedee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7\ne7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dedede\ne7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7de\ndedee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7dededee7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7\ne7e7e7efefe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7f7f7f7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde\ndedeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7\nf7e7e7e7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeefefefffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffff7f7f7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeff7f7f7ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7efefefffffffffff\nffffffffffffffffffffffffffffffffffffffffffffefefeff7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7efefefffffffffffffffffffffffff\nffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffefe7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffff7ffffffefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ndededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdeffffce8c84c68442ce8c42e7b573ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7\ne7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffffc6847bce8c5a\nc68442ce8c42de9c4affffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffffefce\nd6fffff7ffffffffffffffffffbdbdd6ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6f7c68c63ce8c42f7c67b\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff314a94e7bd73fffff7ffffff4a94\nd69c4a29ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6c68442de9c42ffffd6ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffdeefffc6c6c6e7cebdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff21529c312121e7bd734a94d62121299c4a21ffffdeffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeefffce8c7bce8442ffd694ffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffb5c6decebdbdff\nf7deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffdeffff214a942121212121212121212121219c4a21ffffd6ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ffe7dedee7cebdf7e7defffff7ffffffff\nffffffffffffffffffffffffffffffffffffffffefe7efe7d6dee7c6adefe7defff7effffffffffffffffffffffffffffffffffffffffffff7ffffefe7efefde\ndef7e7deffffefffffffffffffffffffffffffffffffc6a5b5ce8442dea54affffffffffffffffffffffffffffffffffffffffffeff7ffefe7dedec6c6efdec6\nf7e7deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcee7f7b5b5b5f7dec6ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefeff7e7d6dee7ceb5efdedefff7efffffffffffffffffffffffffffffffffffffffff\nffffffffefeff7e7d6deefcebdffefe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffefe7e7dec6c6f7e7cefff7e7ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefeff7e7dedee7c6b5efe7d6f7efdeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdefff29\n427b212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121312921dea5\n5afffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5cece8c4ad69442ffffd6ffffff\nffffffffffffffffffe7ffffce9c9cc68442efb563ffffffffffffffffffd6bddec68c52ce8c4ac68442ce8c42d6944affdeb5c6a5b5ce8c42dea542ffffffff\nffffded6ffc68c63ce8c4ac68442ce8c42c68442ce8c4adead6bffffdeffffffffffffffffffffffffe7f7ffce9c9cc68442ce8c42c68442e7ad4affffffffff\nffffffffffffffffffffceadbdc68442d68c4affefadfffffffffffffffffffffffff7ffffcea5adce8c4ac68442ce8c42c68442ce8c4ad6944af7cea5ffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f7ffbdbdd6d6bdb5ffffefffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc68463ce8c42ffd694ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffc6a5b5ce8c4ac68442ce8c42c68442ce8c4ace8442ce9452d6a56bf7d6b5fffff7ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63c68442ce8c42c68442ce8c4ac68442ce8c42c68442ce8c4ae7\nb563ffffffffffffffffffd6cee7ce947bc68442ce8c4ac68442ce8c42ce8c42e7ad73fff7d6ffffffffffffffffffffffffefffffcea5adce8c4ac68442ce8c\n42c68442e7ad63def7d6ce8c7bc68442ffc684ffffffffffffffffffffffffd6bdd6ce8c63c68442ce8c4ac68442ce8c42e7b573e7fff7c6847bce8c42ffc67b\nffffffffffffffffffffffffe7e7ffce9c94ce8c4ac68442ce8c4ac68442ce8c42ce944af7ce9cfffff7ffffffffffffd6c6ffc68442d68c42ffffb5ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde21212139312942424239393939\n3939212129212121212121212121212121312921393939393939393939424242393939393939393939424242393939212931732121ffffc6ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6c68442d69442ffffceffffffffffffffffffffffffefffff\nc69494ce8442e7ad5affffffffffffd6cef7c6844ace8c42ce8c42d6a573cea57bce8c63ce8c42ce9c7bc68442dea542ffffffffffffcebdffce8c42ce8c4ad6\na573cea57bd6a584c68452ce8442d69c4affffdeffffffffffffffffffceb5cec68442ce8442ce9452d6a584dea55affffffffffffffffffffffffdeefffc684\n73ce8c42c68442f7bd73ffffffffffffffffffffffffe7ffffce949cc68442d69c5acea57bd6a584c69473ce844ace8442ffce8cffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffbdd6e7bdbdbdf7e7ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffd6d6ffce8463ce8442ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffcea5b5c68442ce8442c68442ce8c42c68442ce8442c68442ce8c42c68442d6944af7d6adffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8442c68442ce8c42c68442ce8442c68442ce8c42c68442efb563ffffffffffffcebde7ce\n8452c68442ce8c42ce9c63d6a584ce9c7bce8c4ac68442d6944afff7ceffffffffffffffffffc6a5bdce8c42c68442d6944acea57bce9c84c6844ad6a552c684\n6bce8c42ffbd7bffffffffffffffffffcebde7ce8452c68442ce8c42ce9c5ad6a584c68c6bce8c42d6ad63ce847bc68442ffc67bffffffffffffffffffdedeff\nc68c6bce8442c68442d69c52cea57bd6a584c68c6bce8c4ad69442ffffd6ffffffffffffcebdffce8442ce8442ffffb5ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffceb5cefff7e7ffffffffffffffffffffffffefff\nffbdcee7ffe7ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff94c6e77b7b7b9c8484f7debdffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121ffbd73ffffffffffffdeffff21529c21212121212121\n21212121219c4a21ffffdeffffffffffffffffffffffffffffffffffffffffffdeffff214a94732121ffffbdffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffceb5cece8c42d69442ffffd6ffffffffffffffffffffffffe7ffffce949cc68442efb563ffffff\nffffffc6a5b5ce8c4ad69442fff7c6ffffffffffffeff7ffcea5b5c68442ce8c4adea542ffffffffffffdeceffefce94ffffffffffffffffffffffffdedeffc6\n8463ce8c4affc684ffffffffffffefffffc6949cce8c42dea54affffffffffffffffffffffffffffffffffffffffffcebdefce8c4ace9c4ace8c63d69442ffff\ndeffffffffffffffffffefffffdeb5adfff7d6ffffffffffffffffffffffffcea5b5ce8c4ade9c42ffffe7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdef7ffb5b5c6e7cebdfffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffdedeffc6845ace8c4affd694ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a5b5ce8c42dea542ffff\nffffffffffffffefe7efe7d6d6cead9cce8c52c68442ce8c4af7c67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffd6d6ffce8c63ce8442ffde9cffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63c68442dea552fff7d6ffffffff\nffffffffffdee7f7ce8c7bc68442e7a552ffffe7ffffffdeffffce8c84c68442e7ad5afffff7ffffffffffffdee7ffc68c7bce8c4ac68442ffc67bffffffffff\nffdeefffce8c7bc68442de9c4affe7c6ffffffffffffffffffcebdd6ce8c52c68442ce8c4affc67bffffffffffffefffffce9ca5ce8c42ce8c42ffdeadffffff\nffffffffffffffffffe7e7f7dead9cffffd6ffffffffffffd6c6ffc68442d68c4affffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff7ffa5bdd6\n8c949c8484848c8c8c9c948cd6bdadffefe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cce6b6b6b63\n63636b6b6bce9c63ffffffffffffffffffceffff6b6ba5ffce9cffffffffffffd6ffff63639cffd6a5ffffffffffffb5e7ff6b6b84e7b584ffffffffffffa5d6\nff636363ffd6a5ffffffffffffb5e7ff6b6b84636363846b6bb5ceb5846b84ffe7b5ffffffffffff6ba5d6636363a56b6bffffceffffffb5e7ff6b6b84636363\n6b6b6bffce9cffffff9cceffa56b6bffffceffffffffffffa5d6ff9c6363ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffff297bc62121212121214a2121ffe79cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff8c9cc68c8484debda5fff7efffffffb5d6ef8c94a59c8484ffefc6ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639cce6b6b6b6363636b6b6bce9c63ffffffffffffffffffceffff6b6ba5ffce9c\nffffffffffffd6ffff63639cffd6a5ffffffbdefff6363846b6b6b636363ffd6a5ffffffffffffe7ffff6b84bd636363bd846bffffe784bdef6363636b6b6bb5\n846384bdd6b58463ffffe7e7ffff6b84bde7b584ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffff73bdff292929212121212121de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffffad7ba5ffffdebdefffd6a58cffffffffffffffffffffffffffffffffffffffffff\nffffffffffff84bdefb58463ffffe7ffffffffffffffffffffffffffffffbdefff6363846b6b6b636363bd846bffffe7ffffffffffffa5d6ff9c6363ffffd6ff\nffffffffffceffff6b6ba5ffce9cffffffe7ffff6b84bd636363ffd6a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffff7bc6ff2121217b2121ffffbdffffffffffffffffffffffffffffff2173bd212121bd7321ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffff4a94d6212121ffb573ffffffffffffdeffff214a942121212121212121212121219c4a21ffffd6ff\nffffffffffffffffffffffffffffffffffffffffd6ffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffceb5d6c68442de9442ffffceffffffffffffffffffffffffefffffc69494ce8c42e7ad5affffffffffffcea5b5c68442e7ad52\nffffffffffffffffffffffffdef7ffce8c84c68442dea542ffffffffffffffffffffffffffffffffffffffffffffffffdeffffce8c7bc68442ffc67bffffffff\nffffe7ffffce949cc68442f7bd73ffffffffffffffffffffffffffffffffffffefffffce9ca5c68442e7c684c68c8cce8c42ffce8cffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffceb5d6c68442d69442ffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nf7ffffbdcee7bdb5b5fff7deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce\n8c63ce8442ffd69cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcea5b5c68442dea542ffffffffffffffffffffffffffff\nffffffffdee7ffce9c9cc68442ce8442f7c67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ff\nc6845ace8c42ffd694fffffffffffffffffffffffffffffffffffffffffff7ffffcea5bdc68442d69442fff7c6ffffffffffffffffffffffffffffffd6cef7ce\n8c5ac68442ffd694ffffffdeffffc6847bce8442ffce8cffffffffffffffffffffffffd6ceffc6844ace8442ffbd7bffffffffffffcebddec68442ce8c42ffde\n9cffffffffffffffffffffffffffffffceadc6ce8c42c68442ffc67bffffffffffffd6ceffce845ac68442ffce84ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffcebdffce8c42ce8442ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffadcee79c848cdec6b5f7efe7fffffff7ffffe7f7f7\nadc6de8c8c9cdebd9cfffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff639ccebd846bffffe7ffffffffffff6b9cd6b58463ff\nffe7ffffffd6ffff63639cffd6a5ffffffffffffceffff6b6ba5ffce9cffffffffffff84bde77b7b63bd8484ffffe7ffffff639cce848484e7b584ffffffe7ff\nff6b84bdce9c63ffffffe7ffff6b84bd846363ffe7bdffffffbde7ff636384ffd6a5ffffffffffffb5e7ff6b6b84e7b57bffffffffffffa5a5d6ffffce9cd6ff\n9c6363ffffd6ffffffffffff9cceffa56b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2173bd2121\n212121212121212121214a2121ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff84add68484848484848c8c84848c8c848484848484b58484ffffd6ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff639ccebd846bffffe7ffffffffffff6ba5d6b57b63ffffe7ffffffd6ffff63639cffd69cffffffffffffceffff6b6b9c\nffce9cffffff9c9cceffffd6ffffffbde7ff7b637bffe7bdffffffa5d6ff7b6363ffe7bdffffffbde7ff63637bffd69cffffffbde7ff63637bbd846bffffe7e7\nffff637bb5e7bd84ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121212121212121\n212121212121de9c4affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffd6ffffad84adfff7d6b5deffd6a584ffffffffffffffffffffffffffffffffffffffffffffffffffffff7bb5e7bd846b\nffffe7ffffffffffffffffffffffffbde7ff63637be7bd84ffffffffffff7bb5e79c6b6bffffceffffff9cceff9c6b6bffffceffffffffffffd6ffff63639cff\nd6a5ffffff6b9cd6846363ffe7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121\n732121ffffbdffffffffffffffffffffffffffffff2173bd212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff529cde212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffdeffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffceb5cece8c4ad69442ffffd6ffffffffffffffffffffffffe7ffffce9c9cc68442efb563ffffffffffffcea5b5ce8c42de9c42ffffefffffffffffffffffff\nffffffc6a5b5ce8c42dea542fffffffffffffffffffffffffffffffffffffffffff7ffffd6b5cec6844ace8c42ffc684ffffffffffffefffffc69494ce8c4aff\nc67bffffffffffffffffffffffffffffffffffffded6ffc6845ad68c42fff7bdceb5d6c68442e7ad52fffff7ffffffffffffffffffffffffffffffffffffffff\nffffffffe7e7ffc68c7bce8c42d69c42ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcee7ffbdbdbdefd6bd\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc68463ce8c42ffd694ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a5b5ce8c4adea542ffffffffffffffffffffffffffffffffffffffffffe7f7ffce9c\n9cc68442d6944afff7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63ce8442ffde9cffffff\nffffffffffffffffffffffffffffffffffffe7ffffc68c84ce8c4aefb56bffffffffffffffffffffffffffffffffffffefffffc69494ce8c42e7b55affffffde\nffffce8c84c68442f7bd73ffffffffffffffffffffffffdeffffce8c7bc68442ffc684ffffffffffffc6a5b5ce8c4ade9c42ffffefffffffffffffffffffffff\nffffffffdedeffc68463ce8c42ffc67bffffffffffffceb5d6c68442de944affffc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nd6c6ffc68442d68c42ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffff7ffff94b5dec6a58cfff7e7e7f7ff9cadce848c8c8c8c8cc6ad94fff7e7e7ffff94adced6b58c\nfffff7ffffffffffffffffffffffffffffffffffffffffffffffffb5e7ff846b84ffe7b5ffffffffffffffffffceffff846ba5ffe7b5ffffffceffff6b6ba5ff\nce9cffffffffffffd6ffff63639cffd6a5ffffffffffff639cced6bd848484b5ffefbdceffff846ba5b5ceb5bd8484ffffe7e7ffff6384b5efbd84ffffffffff\nffb5e7ff846b84ffe7b5ffffffb5e7ff846b84ffe7b5ffffffffffff6ba5d6ce9c63ffffffffffffffffffffffffffffff9cceffa56b6bffffceffffffffffff\na5d6ff9c6363ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9ce7ff21214a7b2121ffffbdffffff2173bd2121\n21bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff9cceef8484848c8c8c8484848c8c8c8484848c8c8cc69c84ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffb5e7ff846b84ffe7b5ffffffffffffffffffceffff846ba5ffe7b5ffffffceffff6b6ba5ffce9cffffffffffffd6ffff63639cffd6a5ffffffffffffffffff\nffffffceffff6b6ba5ffce9cffffff9cceffa56b6bffffceffffffb5e7ff846b84ffe7b5ffffffffffff84bde7b58463ffffefe7ffff6b84bde7b584ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7\ne7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff29529c212121ffc67bffffff7bc6ff2121217b2121ffffbd\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffde\ndedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffaddef76b6b7bad7363ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffff84bde7b58463ffffefffffffffffffffffff\nffffff639cced6a56bffffffffffffffffffe7ffff6384b5efbd84ffffffa5d6ff9c6363ffffd6ffffffffffffceffff6b6ba5ffce9c84bde7846363ffefbdff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7\ne7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6ff2121217b2929ffffbdffffffffffff\nffffffffffffffffff2173bd292929bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n4a94d6212121ffb573ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff21\n4a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6c68442d69442ffff\nceffffffffffffffffffffffffefffffc69494ce8442e7ad5affffffffffffd6cef7c6844ace8c42dead6bfff7deffffffffffffffffffcea5b5c68442dea542\nffffffffffffffffffffffffffffffeff7ffd6b5c6ce946bc68442ce8442d69442ffffd6ffffffffffffe7ffffce949cc68442ffc67bffffffffffffffffffff\nffffffffffffffffc6adc6ce8442dea54affffffd6deffce846bd68c42ffffbdffffffffffffffffffffffffffffffffffffded6efcea59cc6844ace8442c684\n42f7c684ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffb5bdd6d6bdbdfff7e7ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8463ce8442ffde9cffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffcea5b5c68442dea542ffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63c68442efb56bffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8442ffd694ffffffffffffffffffffffffffffff\nffffffffffffd6deffce8c63c68442ffce8cffffffffffffffffffffffffffffffffffffffffffcea5b5c68442dea542ffffffffffffc6a5bdce8c42ce8c42ef\nce9cffffefffffffffffffdeffffc6847bce8c42ffbd7bffffffe7ffffce949cc68442e7ad52ffffffffffffffffffffffffffffffffffffdeffffce847bc684\n42ffc67bffffffffffffc6a5b5ce8c42d69442efe7d6efdedeefe7deefdedeefe7deefdedeefe7deefdedef7e7defffff7ffffffcebdffce8442ce8442ffffb5\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffa5ceefc69c84ffffefe7ffff8ca5ce848484848484848484848484c69c84ffffefe7ffff8ca5cee7c69cffffffffffffffffff\nffffffffffffffffffffffffffffff9cd6ff9c6363ffffd6ffffffffffffffffffe7ffff637bb5e7bd84ffffffd6ffff63639cffd69cffffffffffffceffff6b\n6b9cffce9cffffffceffff846b9cffe7b56ba5d6e7b57bbde7ffb58484d6ffe77b639cffe7bdffffff84bde79c6363ffffd6ffffffbde7ff7b637bffe7bdffff\nffbde7ff7b637bffe7bdffffffe7ffff637bb5e7bd84ffffffffffffffffffffffffffffffa5d6ff9c6363ffffd6ffffffffffff9cceff9c6b6bffffceffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121bd7321ffffffffffff73bdff2121219c4a21ffffdeffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadd6ff84\n8484848484848484848484848484848484deb584fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5d6ff9c6363ffffd6ffff\nffffffffffffffe7ffff6384b5e7bd84ffffffd6ffff63639cffd6a5ffffffffffffceffff6b6ba5ffce9cffffffffffffffffff639cce6b6b6b9c6363ffffd6\nffffff9cd6ff9c6363ffffd6ffffffe7ffff6384b5d6a56bffffffffffff84b5e7bd846bffffe7e7ffff6384b5e7bd84ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214a732121ffffbdffffffbdffff2121734a2121ffde9cffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbde7ff6363\n84bd846bffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff6b84bde7b584ffffff\nffffffffffffffffff6ba5d6ce9c63ffffff9cceffa56b6bffffceffffffffffffd6ffff63639c848484636363ffd6a5ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121732121ffffbdffffffffffffffffffffffffffffff2173bd\n212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121212121212121\n212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121732121ffffbdffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5cece8c42d69442ffffd6ffffffffffffffffffffff\nffe7ffffce949cc68442efb563ffffffffffffffffffd6bdd6c68452ce8c42c68442ce944ace9452d6ad7bc68c6bce8c4adea542ffffffffffffffffffeff7ff\nd6b5c6c68452ce8c4ac68442ce8c42dead63ffffdeffffffffffffffffffefffffc69494ce8c42ffc67bffffffffffffffffffffffffffffffdef7ffce8c84ce\n8442ffce8cfffffff7ffffc69ca5ce8c4af7bd73ffffffffffffffffffffffffdedef7c69484ce8c4ac68442ce8c42ce944af7cea5ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6def7b5b5b5f7e7ceffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8c4aefce8cf7e7deefe7def7e7e7fff7e7ffffffffffffffffffffffffffffffff\nffffffffffc6a5b5ce8c42dea542fffffffffffffffffffffffffffffffffffffffffffffffff7ffffc69cadce8c42d69c42ffffe7ffffffe7ffffd6a5a5d6ad\n84d6a584d6ad84d6a584d6ad84dead84ffffe7ffffffffffffd6d6ffce8c63ce8442ffde9cffffffffffffffffffffffffffffffffffffffffffdedeffc68463\nce8c42ffd694ffffffffffffffffffffffffffffffffffffffffffc6a5b5ce8c4adea542ffffffffffffefffffce9ca5ce8c42c68442ce8c4ace8c52d69c63ce\na584ce8c5ac68442ffc67bffffffefffffc69494ce8c42e7b55affffffffffffffffffffffffffffffffffffdeffffc6847bce8c4affc67bffffffffffffcea5\nb5c68442ce8c42c68442ce8c4ac68442ce8c42c68442ce8c4ac68442ce8c42d69442ffffd6ffffffd6c6ffc68442d68c4affffb5ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ff\nff9c8cb5ffefceffffffb5deff84848c8c8c8c8484848c8c8c8484848c8c8cffd6b5ffffffc6efffbd8ca5ffffdeffffffffffffffffffffffffffffffffffff\nffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff6b84bde7b584ffffffceffff6b6ba5ffce9cffffffffffffd6ffff63639cffd6a5ffffffa5d6ff9c\n6363ffffd69cceffd6a56b84b5e7d6a56bffffff6ba5d6e7b584ffffffffffffa5d6ff6363636b6b6b636363846b6bffe7b5ffffffb5e7ff846b84ffe7b5ffff\nffe7ffff6b84bde7b584ffffffffffffffffffffffffffffff9cceffa56b6bffffceffffffffffffa5d6ff9c6363ffffd6ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff529ce72121219c5229ffffdeffffff2173bd292929bd7321ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdef7ff8c94b58484848c8c8c8484848c8c8c84\n84848c8c8c8c8484f7deb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff6b84\nbde7b584ffffffceffff6b6ba5ffce9cffffffffffffd6ffff63639cffd6a5ffffffa5d6ff636363846b6bffe7b5ffffffffffffffffff9cceffa56b6bffffce\nffffffffffffffffff639cce6b6b6b6363636b6b6bb58463ffffe7e7ffff6b84bde7b584ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffff9cdeff2121524a2121ffe79cffffff7bc6ff2121217b2929ffffbdffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8cbde76b6b73846b63ffe7bdffffffffff\nffffffffffffffffffffffffffffffffffffffffffff84bdefb58463ffffe7ffffffffffffffffffe7ffff6384b5efbd84ffffffffffffffffffffffff639cce\nd6a56bffffffa5d6ff9c6363ffffd6ffffffffffffceffff6b6ba5848484a56b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffff7bc6ff2121217b2121ffffbdffffffffffffffffffffffffffffff2173bd212121bd7321ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a94d6212121212121212121393129424242393939393939\n393939424242393939393939393939424242393939393939393939424242393939393939393939212931732121ffffbdffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6c68442de9442ffffceffffffffffffffffffffffffefffffc69494ce8c42e7ad\n5affffffffffffffffffffffffe7e7f7d6adadce9c7bc68c52ce844ac68442ce8c42c68442dea542ffffffffffffefffffce9cadc68442ce8c42ce8c42e7bd8c\nfff7deffffffffffffffffffffffffffffffe7ffffce949cc68442ffc67bffffffffffffffffffffffffffffffd6bdefc68442d68c42ffffbdffffffffffffd6\nbdefc68442de9c42ffffd6ffffffffffffd6cef7c6845ace8c42c68442d6a563f7d6b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffdef7ffbdbdcedec6b5fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffd6d6ffce8c63c68442ce8442c68442ce8c42c68442ce8442d6944affdeadffffffffffffffffffffffffffffffcea5b5c68442de\na542ffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6c68442d68c42ffffb5ffffffdeffffce8c7bc68442ce8442c68442ce8c42c684\n42d69442ffffceffffffffffffd6d6ffc6845ace8c42ffd694ffffffffffffffffffffffffffffffffffffffffffd6efffce8473c68442ffce84ffffffffffff\nffffffffffffffffffffffffffffffcea5b5c68442dea542ffffffffffffffffffffffffdeceded6ad9cc6946bce8c5ac68442ce8c42c68442ce8442ffbd7bff\nfffff7ffffce9cadc68442dea54affffffffffffffffffffffffffffffffffffdeffffce8c7bc68442ffc67bffffffffffffc6a5bdce8442c68442ce945ac68c\n52ce945ace8c52ce945ac68c52ce8c52c68442de9442ffffd6ffffffcebdffce8c42ce8442ffefadffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff9cc6efcead8cffffef9cc6\ne7d6ad8484add6848484848484848484848484efce9ceff7ff94add6e7c69cffffffffffffffffffffffffffffffffffffffffffffffff84bde7b57b63ffffe7\nffffffffffffffffffe7ffff6384b5e7bd84ffffffd6ffff63639ce7bd84ffffffffffffceffff6b6ba5ffce9cffffff639cced6a56bffffffbde7ff8463846b\n8484ffce9cffffff84b5e7d6a56bffffffffffffffffffffffffffffffbde7ff846384ffe7bdffffffbde7ff846384ffe7bdffffffffffff84b5e7bd846bffff\ne7ffffffffffffffffffffffff9cd6ff846363ffe7bdffffffffffff9cceffa56b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff4a9cde212121212121212121212121212121212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6eff78494b58484848484848484848484848484848484848484848484848c8484f7\ndeb5fffff7ffffffffffffffffffffffffffffffffffffffffffffffff84bde7b58463ffffe7ffffffffffffffffffe7ffff637bb5e7bd84ffffffd6ffff6363\n9ce7bd84ffffffffffffceffff6b6b9cffce9cffffff639cced69c6bffffffffffffffffffffffffffffffa5d6ff9c6363ffffd6ffffffffffffffffffffffff\nffffffffffff7bb5e7bd846bffffe7e7ffff637bb5d69c6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nff9cdeff21214a212121212121212121212121212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7\nffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84bde76b6b73847b6b6b6b84846b63ffe7b5ffffffffffffffffffffffffffff\nffffffffffffffffffff7bb5e76b6b6b6363636b6b6b636363d69c6bffffff6ba5d6b57b63ffffe7ffffffffffffe7ffff6b84bde7b584ffffff9cceff846b6b\nffe7b5ffffffffffffd6ffff63639cffd6a5639cce9c6b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffff73bdff212121732121ffffbdffffffffffffffffffffffffffffff2173bd212121bd7321ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff529cde212121212121212121ffbd73ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffceb5cece8c4ad68c42ffffbdffffffffffffffffffffffffe7ffffce9c9cc68442efb563ffffffffffffffffffffff\nfffffffffffffffffffffffffffffffff7f7ffc69ca5ce8c42dea542ffffffffffffd6d6ffc6845ace8c4ae7b563fffff7ffffffffffffffffffffffffffffff\nffffffffffffefffffc69494ce8c4affc67bfffffffffffffffffffffffff7ffffc69ca5ce8c4ae7a54affffffffffffffffffdeefffce8c7bce8442ffde9cff\nfffff7ffffc69cadce8c4ad68c42ffe7b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffbdcee7c6bdbdffefdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ndedeffc68463ce8c42ce8c4ace945ace8c52ce8c52c68442ce8c4ace8442efbd73fffff7ffffffffffffffffffc6a5b5ce8c4adea542ffffffffffffffffffff\nffffffffffffffffffffffffffffffffffcec6ffce8c4ace8442ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffd6d6ffce8c63ce8442ffde9cffffffffffffffffffffffffffffffffffffffffffe7ffffc68c8cce8c4ae7b563ffffffffffffffffffffffffffffffffffff\nefffffc69494ce8c42e7ad52ffffffffffffffffffffffffffffffffffffffffffffffffffffffdee7efce8c7bc68442ffc684ffffffffffffceadc6ce8c4ad6\n9442ffffd6ffffffffffffffffffffffffffffffdef7ffc68473ce8c42ffc67bffffffffffffd6bdefc68442de944affffc6ffffffffffffffffffffffffffff\nffceadc6ce8c4adea542ffffffffffffd6c6ffc68442ce8c42ffc684ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff94b5decea58cb5dee7c69484bddee7848c948c8c\n8c8484848c8c8ce7d6b594adced6b58cfffff7ffffffffffffffffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff\n6b84bde7b584ffffffceffff6b6ba5846363ffe7bdffffff84bdef846363ffe7bde7ffff6b84bde7b584ffffffe7ffff6b84bd846363ffe7bdffffffbdefff9c\n6384ffffd6b5e7ffefbda5ffffffffffff84b5e7a56b6bffffceffffffb5e7ff846b84ffe7b5ffffffffffffd6ffff63639ce7bd84ffffffffffffb5b5e7ffff\nd69cceff6b6b6bb58463ffffe7e7ffff6b84bdb58463ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff529ce721\n2121c67b212173bd292929212121e79c52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffdef7ff8c94b58484848c8c8c8484848c8c8c8484848c8c8c8484848c8c8c8484848c8c8c8c8484f7deb5ffffffffffffff\nffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff6b84bde7b584ffffffceffff6b6ba5846363ffefbdffffff84bd\ne7846363ffefbdffffff84bde7b58463ffffefffffffbdbde7ffffceffffff9cceffa56b6bffffceffffffffffffa5bde7ffe7b5ffffffe7ffff6b84bdce9c63\nffffffe7ffff6b84bd846363ffefbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff2929527321217bc6\nc62121212929299c4a21ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff84b5e76b6b6bbd8c6bffffe7bde7ff6b7b94846b63f7deb5ffffffffffffffffffffffffffffffffffffffffff84bd\ne7b58463ffffefffffffffffffffffffffffffb5e7ff6b6b84e7b584ffffffffffff84bde79c6363ffffd6ffffffa5d6ff636363d6a56bffffffffffffceffff\n6b6ba5ffce9ce7ffff6384b5bd846bffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bc6\nff2121217b2929ffffbdffffffffffffffffffffffffffffff2173bd292929bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffff4a94d6212121212121212121ffb573deffff3963a5844242ffffbdffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffd6ffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffceb5d6c68442ce8442f7bd7bffffffffffffffffffffffffdeefffc68473ce8442f7bd73fffffffffffffffffff7f7f7ffffffffffffffffffffff\nfffffffff7ffffce9cadc68442e7ad52ffffffffffffcebdffce8c42ce8442fff7b5ffffffffffffffffffffffffffffffffffffffffffffffffe7ffffce949c\nc68442ffc67bffffffffffffffffffffffffd6deffce8c6bc68442ffce8cffffffffffffffffffffffffc6a5b5ce8c42e7ad52ffffffe7ffffce949cc68442e7\nb55affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffd6efffb5b5bdefd6bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8463ce8442ffde9c\nffffffffffffffffffe7e7f7c69c94ce8442c68442f7c684ffffffffffffffffffcea5b5c68442dea542ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffd6c6ffc68442ce8442ffd694ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8442ffd6\n94ffffffffffffffffffffffffffffffffffffffffffffffffceadc6c68442d68c42fff7bdffffffffffffffffffffffffffffffd6cef7ce845ac68442ffce84\nfffffffffffff7ffffffffffffffffffffffffffffffffffffffffdeefffc68473ce8c42ffc684ffffffffffffd6d6ffc68452ce8442f7ce8cffffffffffffff\nffffffffffffffffcebde7ce844ac68442ffc67bffffffffffffdeefffce8c73c68442ffc684ffffffffffffffffffffffffefffffce9ca5c68442efbd6bffff\nffffffffcebdffce8442c68442dea552ffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffa5c6e784848c8c848ccead8cefefe784a5c68484848484848c8c8cdebd\n9cfffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffff84bde7b58463ffffe7ffffffffffffffffffe7ffff637bb5e7bd84ffffffd6ffff\n63639ce7d69c6384b56b6b6b636363e7bd84ffffffbde7ff7b637bffe7bdffffffffffff639ccebd846bffffe7ffffffceffff6b6b9cffce9cffffff7bb5e76b\n6b6b636363846b6bffe7b5ffffff84b5e76b6b6b6363636b6b6b9c6363ffffd6ffffffd6ffff63639c6b6b6b636363e7bd84ffffffa5d6ff9c6363bde7d66363\n846b6b6b7b6363ffe7bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214a732121ffffbdffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffefffffd6d6deb5c6cea5adb594949c84848c848484848484848484948c8cb5a59cbdb5b5d6d6cef7efdeffffffffffffffffffffffffffffffffffffff\nffffffffff84bde7b57b63ffffe7ffffffffffffffffffe7ffff6384b5e7bd84ffffffd6ffff63639ce7d6a5637bb56b6b6b636363e7bd84ffffffffffffffff\nff6ba5d66363636b6b6be7b584ffffff639cce6b6b6b6363636b6b6bb57b63ffffe7e7ffff6b84bd6363636b6b6bb58463ffffe7ffffffe7ffff6384b5d6bd84\n637bb56b6b6bffce9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c212121ffbd73ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7ffff6b84bd946363ffffceffffffffffff94cef76b6b6bce9c63ffffffffffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffff\nffffffffffffffffffffceffff6b6ba56363636b6b6b9c6363ffffd6ffffffffffff9cceffa56b6b9ccece6b6b6bb58463d6ffe763639cffd69cffffffd6ffff\n63639c9c6b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73bdff212121732121ffffbdffff\nffffffffffffffffffffffffff2173bd212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ndededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffff4a9cde212121212121212121ffbd73deffff21529c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ndeffff214a94732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5cece8c42c6\n8442d6944affdeadfffffffffffff7ffffcea5b5ce8c42ce8442ffe7a5ffffffffffffffffffd6b5d6e7b573ffffe7ffffffffffffffffffded6ffc6845ace8c\n4af7bd73ffffffffffffdedeffc68463ce8c42f7c67bfffffffffffffffffff7ffffefdedeffffefffffffffffffefffffc69494ce8c42ffc67bffffffffffff\nffffffffffffceb5cec68442d69442ffffc6ffffffffffffffffffffffffd6ceffc6844ad68c42fff7bdffffffcea5b5ce8c42d69442ffffd6ffffffffffffff\nffffeff7ffffded6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffbdc6decebdb5ffff\nefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8c4affd694ffffffffffffffffffffffff\nefffffc69494ce8c4ad69442ffffdeffffffffffffc6a5b5ce8c42dea542ffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5dece8c42ce\n8442ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63ce8442ffde9cffffffffffffffffffffff\nffffffffffffffffffffffffffdee7ffce8c73c68442de9c52fff7ceffffffffffffffffffdedef7ce8c7bc68442de9c4affffceffffffffffffefffffce9c9c\nf7ce9cfffff7ffffffffffffffffffceadcece8c4ace8c42fff7adffffffffffffefffffce9ca5c68442d6944affdeadffffffffffffffffffd6cee7ce8c63c6\n8442ce8c4affc67bffffffffffffffffffceadc6ce8c42ce8c42ffdeadffffffffffffffffffd6bddec6844ad68c42ffdea5ffffffffffffd6c6ffc68442ce8c\n4ace945ae7bd73fff7effffffff7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffeff7ffa5bdd68c949c8484848c8c8c9c948cd6bdadffefe7ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff6b84bde7b584ffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffb5e7ff846b84ffe7b5ffffffffffffffffffffffffffffffffffffffffffffffffffffff9cceffa56b6bffffceffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff214a9c292929bd7321ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7\ne7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffff7ffff94b5de8484848c8c8cb58c84ffffdeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5e7bd846bff\nffe7ffffffffffffffffffe7ffff6b84bde7b584ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff9cceffa56b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff529ce72121217b2929ffffbdffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6f7ff637ba58c6b6bff\ne7bdffffffffffff94c6ef636363c6946bffffefffffffffffffffffffffffffffffffffffff84bdefb58463ffffe7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceffff6b6ba5ffce9cffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff217bc67321217bc6c62121217b2121ffffbdffffffffffffc6ffff212173c67b\n292173bd212121bd7321ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a94d62121212121\n21212121ffb573ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff214a9c732121ffffbd\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5d6c68442d69442c69c94ce8442ce9c52d6\na584c68c63ce8442c68442dea552ffffe7ffffffffffffffffffceadcece8442c68442d69c63cea57bce9c84c6844ace8c42ce8c42fff7bdfffffffffffff7ff\nffcea5b5c68442ce8c42ce9452d6a584ce9c7bce8c5ad69442ffffd6d6d6ffce8c63c68442ce8442c68442ce8c42c68442ce8442dea542e7ffffc68c84ce8442\ne7ad52ffffffffffffffffffffffffffffffdef7ffce8c84c68442f7bd73ffffffd6d6ffc68463ce8c42ce8c42d6a573cea57bce9c73c6844affc67bffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6def7bdbdbdf7dec6ffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63ce8442ffd69cffffffffffffffffffffffffffffffd6bdefc68442ce8442\nffde9cffffffffffffcea5b5c68442dea542ffffffffffffffffffffffffffffffffffffffffffffffffffffffceadbdc68442d69442ffffc6ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffc6845ace8c42ffd694ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffd6c6e7ce8c5ac68442ce8c42ce9c5ad6a584c69473ce844ac68442d68c42ffe7adffffffffffffffffffe7ffffce949cc68442ce8c4ace9c6bd6a584\nc69473ce8c4ac68442e7ad52fffff7ffffffffffffffffffdee7ffce8c7bc68442ce8442ce944ad6a584c68c6bce844ace9c42ce8c6bc68442ffc67bffffffff\nffffffffffe7f7ffc69c9cce8c42c68442d69c5acea57bce9473c68442ce8442e7ad63ffffffffffffffffffcebdffce8c42ce8442d6bda5c68442ce8c42c684\n42dea542ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffff84bde7b57b63ffffe7ffffffffffffffffffe7ffff6384b5e7bd84ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbde7ff846384ff\ne7bdffffffffffffffffffffffffffffffffffffffffffffffffffffff9cd6ff9c6363ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffff9cdeff21214a212121212121212121732121ffffbdffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6e7ff84849c\n848484efce9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84bde7b58463ffffe7ffffffffffffffffffe7\nffff637bb5e7bd84ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5d6ff9c63\n63ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffdeffff214a9c212121212121212121212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff948cc6ffefc6ceefffbd949cffffe7c6efffc6948cff\nffef94c6efefc694ffffffffffffffffffffffffffffffffffff7bb5e7bd846bffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff63639cffd6a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff2173bd212121212121212121732121ffffbdffffffffffffbdffff212173212121212121212121bd7321ffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff529cde212121212121212121ffbd73ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c732121ffffbdffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb5cece8c4ad69442f7ffd6ceb5c6ce8c5ac68442ce8c42c68442dea55aff\nf7ceffffffffffffffffffffffffeff7ffceadadce8c5ac68442ce8c42c68442ce8c4ad6944affe7bdfffffffffffffffffffffffff7ffffd6bdc6ce8c63ce8c\n42c68442ce8c4ace8442de9c52ffffd6dedeffc68463ce8c42c68442ce8c4ac68442ce8c42c68442e7a54ad6c6f7ce8c52ce8442ffd694ffffffffffffffffff\nffffffffffffffffffcea5bdce8c4ade9c42ffffefffffffe7deffce9c8cce8c4ac68442ce8c4ac68442ce8c42ffc684ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffb5bdcedec6bdffffefffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffdedeffc68463ce8c42ffd694ffffffffffffffffffffffffffffffd6c6ffce8c42ce8442ffde9cffffffffffffc6a5b5\nce8c4adea542ffffffffffffffffffffffffffffffffffffffffffffffffe7ffffc68c84ce8c4ae7a54affffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffd6d6ffce8c63ce8442ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedef7cea5\n94c6844ace8c4ac68442ce8c42c68442dea563ffe7c6ffffffffffffffffffffffffffffffdedef7ce9c8cc6844ace8c42c68442ce8c4ace8c42e7ad63fff7de\nffffffffffffffffffffffffffffffe7e7ffcea59cc6844ace8c4ac68442ce8c42d69c52e7f7cec6847bce8c42ffc67bfffffffffffffffffffffffff7ffffce\nb5bdce8c5ac68442ce8c4ac68442ce8c4aefbd84ffffffffffffffffffffffffd6c6ffc68442d68c42f7ffb5d6b5c6c6844ace8c42dea542ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5e7bd84\n6bffffe7ffffffffffffffffffe7ffff6b84bde7b584ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffff9cceffa56b6bffffceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffc6ffff2121732929292121217b2121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8cb5d6b58c8cfff7d6ffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b5e7bd846bffffe7ffffffffffffffffffe7ffff6b84bde7b584ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffff217bc6212121292929212121ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffff948cbdffefc6deffffb58ca5ffffe7bde7ffd6a58cffffffa5d6ffe7bd8cffffffff\nffffffffffffffffffffffffffff84bde76363636b6b6b6363636b6b6b9c6363ffffd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffceffff6b6ba5ffce9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffff529ce72121217b2929ffffbdffffffffffffffffffffffffe7ffff214a9c292929bd7321ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a94d6212121212121212121ffb573deffff3963a5844242ffffbdffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ffefe7e7efdedeffefe7ffffffffffffffffffffffffffffffff\nfffffffffffffffff7ffffefe7efefdedeefe7def7efdeffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7efefe7deefdedeffefe7ffff\nffffffffffffffffffffe7ffffce949cc68442ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffeff7ffefe7deefdedef7e7deffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffbdd6efbdb5b5ffefd6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffd6d6ffce8463ce8442ffde9cffffffffffffffffffffffffffffffd6c6f7c68442ce8c42ffd694ffffffffffffcea5b5c68442dea542ffffffffffff\nffffffffffffffffffffffffffffffffffffceadcece8c42ce8442ffd69cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffdedeffc6845ace8442ffd694fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffefdedeefe7deefde\ndeffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ffefdedeefe7deefdedefff7efffffffffffffffffffffffffffffffffffff\nfffffffffffffffffff7f7ffefdedeefe7def7efdeffffffdeffffce847bc68442ffc67bfffffffffffffffffffffffffffffffffffff7ffffefe7efefdedef7\ne7defffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ffefdedefff7efffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffceefffe7c6b5ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffadd6ef847b8c847b7bf7d6adfffffff7ffff84a5d684847bad847bfff7d6ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffff4a9cde212121212121212121ffbd73deffff21529c732121ffffbdffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffdeffff214a94732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefff\nffc69494ce8c42ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffd6efffbdbdc6e7cebdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8c\n4affd694fffffffffffffffffffffffff7ffffc69cadce8c4ad68c42ffffbdffffffffffffc6a5b5ce8c42dea542ffffffffffffffffffffffffffffffffffff\nf7ffffceadc6ce8c4ace8442efb563fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63ce\n8442ffde9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdeffffc6847bce8c4affc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffff4a94d6212121212121212121ffb573ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffd6ffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffce949cc68442ffc67bffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7\nffffb5bdd6cebdbdfff7deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63ce8442ffd69cffffffffffffffff\nffe7e7f7cea5a5ce8c4ac68442e7ad5affffffffffffffffffcea5b5c68442dea542ffffffffffffffffffffffffe7e7efd6bdc6c68c6bce8c42c68442dea552\nffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffc6845ace8c42ffd694ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ndeffffce8c7bc68442ffc67bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffff\nffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff529cde21\n2121212121212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a9c7321\n21ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7deefd6b5adffc694ffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeeff7d6d6d6ffefe7ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedeffc68463ce8c42c68442ce8c4ac68442ce8c42c68442ce8c4ac68442de9c\n4afff7ceffffffffffffffffffc6a5b5ce8c4ac68442ce8c42c68442ce8c4ac68442ce8c42c68442ce8c4ace8c42e7bd73fffff7ffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6ffce8c63ce8442ffde9cffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffc6847bce8c42ffc67b\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a94d6212121212121212121ffb573de\nffff214a94732121ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff214a9c732121ffffbdffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffd6d6ffce8463c68442ce8c42c68442ce8442c68442ce8c42ce8c4ae7bd8cfff7deffffffffffffffffffffff\nffcea5b5c68442ce8442c68442ce8c42c68442ce8442c68442d6944adead7bfff7d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffdedeffc6845ace8442ffd694ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffffce847bc68442ffc67bffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121212121212121ffbd73deffff4263ad843939ffffc6ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a94732121ffffbdffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffff7ffffefe7def7e7e7efe7def7e7deefe7def7e7e7fff7efffffffffffffffffffffffffffffffffffffffffffefeff7f7e7deefe7def7e7\ne7efe7def7e7def7e7deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffff7f7fff7e7e7efe7deffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffffc6847bce8c4affc67bffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\ne7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffff4a94d6212121212121212121ffb573ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffd6ffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffff7ffffefe7efefdedefff7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffff\nffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffff529cde212121212121212121ffbd73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffdeffff214a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffff\nffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7\ne7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffde\ndedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7\ne7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n4a94d6212121212121212121ffb573deffff214a94732121ffffb5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff21\n4a9c732121ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7dedeffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a9cde212121212121212121\nffbd73deffff4263ad843939ffffc6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeffff214a94732121ffffbdffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a94d6212121212121212121ffb573ffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6ffff214a9c732121ffffbdffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ef\nefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfff7f7f7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7efefef\nffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffdededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffff7f7f7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffff52a5e7212121212121212121423931393939424242393939424242393939424242393939\n4242423939394242423939394242423939394242423939393942422129317b2921ffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7f7f7f7ffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7e7e7e7ffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7e7e7e7ffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffe7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nfffffffffffff7f7f7e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffb5e7ff29427b212121212121212121212121212121212121212121212121212121212121212121212121212121212121\n212121212121212121212121212121312921d69c52ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefe7e7e7dededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7\ne7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffefefefe7e7e7dededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndedee7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7e7e7e7efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffefefefe7e7e7dedededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededede\ndedee7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7de\ndee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7e7dedee7e7e7dededee7e7e7efefefffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nffffffffffffffffffffffffffffffffffffffffffffffffffff040000002701ffff030000000000}\n}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\loch\\f5\\loch\nThis is the source code! It can NOT be used to play PDAFT!}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\loch\\f5\\loch\nIf you just wanted to play the game, }{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ul\\ulc0\\loch\\f5\\loch\nyou downloaded the wrong thing}{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\loch\\f5\\loch\n.}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b\\loch\\f5\\loch\nDo not click the download button next to the git URL}{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\n, that's for the }{{\\field{\\*\\fldinst HYPERLINK \"https://en.wikipedia.org/wiki/Source_code\" }{\\fldrslt {\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\nsource code}{}}}\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\n.}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\n\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\nFor information on getting and installing the latest release,}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\nplease read the wiki at }{{\\field{\\*\\fldinst HYPERLINK \"https://github.com/PDModdingCommunity/PD-Loader/wiki\" }{\\fldrslt {\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\langfe255\\cf9\\lang255\\ul\\ulc0\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\nhttps://github.com/PDModdingCommunity/PD-Loader/wiki}}}}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\nIf you've already read it, pay more attention and you'll find the right link.}\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\n\n\\par \\pard\\plain \\s0\\dbch\\af6\\langfe1081\\dbch\\af7\\afs24\\alang1081\\ql\\nowidctlpar\\hyphpar0\\ltrpar\\cf0\\loch\\f3\\fs24\\lang1040\\kerning1\\sl276\\slmult1\\ql\\sb0\\sa200{\\rtlch\\dbch\\af8\\hich\\af5 \\ltrch\\fs22\\lang16\\ulnone\\ulc0\\b0\\loch\\f5\\loch\nYou should also read the wiki if you have any issues, before asking questions. }\n\\par }"
  },
  {
    "path": "README.txt",
    "content": "This is the source code! It can NOT be used to play PDAFT!\nIf you just wanted to play the game, you downloaded the wrong thing.\nDo not click the download button next to the git URL, that's for the source code.\n\nFor information on getting and installing the latest release,\nplease read the wiki at https://github.com/nastys/PD-Loader/wiki\nIf you've already read it, pay more attention and you'll find the right link.\n\nYou should also read the wiki if you have any issues, before asking questions."
  },
  {
    "path": "appveyor.yml",
    "content": "version: '{build}'\nimage: Visual Studio 2019\nconfiguration:\n- Release\nplatform: x64\nbuild:\n  project: source-code/PD-Loader.sln\n  verbosity: minimal\nafter_build:\n- cmd: >-\n    md %TMP%\\full\\\n\n    md %TMP%\\full\\patches\\\n\n    md %TMP%\\full\\plugins\\\n\n    md \"%TMP%\\full\\plugins\\Novidia Shaders\"\n    \n    md %TMP%\\full\\ram\\\n\n    md %TMP%\\full\\ram\\databank_template_v2\\\n\n\n\n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\x64\\%CONFIGURATION%\\dnsapi.dll %TMP%\\full\\\n    \n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\x64\\%CONFIGURATION%\\*.dva %TMP%\\full\\plugins\\\n    \n    copy \"%APPVEYOR_BUILD_FOLDER%\\source-code\\data\\README - PD Loader.url\" %TMP%\\full\\\n\n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\data\\verify_base_game.sfv %TMP%\\full\\\n\n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\data\\verify_mount_data.sfv %TMP%\\full\\\n\n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\data\\plugins\\*.* %TMP%\\full\\plugins\\\n    \n    copy \"%APPVEYOR_BUILD_FOLDER%\\source-code\\data\\plugins\\Novidia Shaders\\*.*\" \"%TMP%\\full\\plugins\\Novidia Shaders\\\"\n    \n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\data\\ram\\databank_template_v2\\*.dat %TMP%\\full\\ram\\databank_template_v2\\\n\n    copy %APPVEYOR_BUILD_FOLDER%\\source-code\\data\\patches\\custom_freeplay_text_example.p %TMP%\\full\\patches\\\n\n    \n\n    cd %TMP%\\full\\\n\n    7z a %APPVEYOR_BUILD_FOLDER%\\PD-Loader-%CONFIGURATION%-AppVeyor.zip *\n\nartifacts:\n- path: PD-Loader-*.zip\n"
  },
  {
    "path": "source-code/LICENSE",
    "content": "PD Loader and the included plugins are distributed under MIT License:\n  \n  Copyright (c) Project DIVA Modding 2nd Community\n  Copyright (c) samyuu (nop) (original TLAC code)\n  Copyright (c) ThirteenAG (original Ultimate ASI Loader code)\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n\nMicrosoft Detours, utilized by many plugins, is licensed under MIT License:\n  \n  # Copyright (c) Microsoft Corporation\n  \n  All rights reserved.\n  \n  # MIT License\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy of\n  this software and associated documentation files (the \"Software\"), to deal in\n  the Software without restriction, including without limitation the rights to\n  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n  of the Software, and to permit persons to whom the Software is furnished to do\n  so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n\nLauncher, Patches, Render and TLAC plugins utilize files from FreeGLUT:\n  \n  Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\n  Permission is hereby granted, free of charge,  to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction,  including without limitation the rights\n  to use, copy,  modify, merge,  publish, distribute,  sublicense,  and/or sell\n  copies or substantial portions of the Software.\n  \n  The above  copyright notice  and this permission notice  shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE  IS PROVIDED \"AS IS\",  WITHOUT WARRANTY OF ANY KIND,  EXPRESS OR\n  IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO THE WARRANTIES  OF MERCHANTABILITY,\n  FITNESS  FOR  A PARTICULAR PURPOSE  AND NONINFRINGEMENT.  IN  NO EVENT  SHALL\n  PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM,  DAMAGES OR OTHER LIABILITY, WHETHER\n  IN  AN ACTION  OF CONTRACT,  TORT OR OTHERWISE,  ARISING FROM,  OUT OF  OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n  \n  Except as contained in this notice,  the name of Pawel W. Olszta shall not be\n  used  in advertising  or otherwise to promote the sale, use or other dealings\n  in this Software without prior written authorization from Pawel W. Olszta.\n\n\nLauncher uses SimpleIni, licensed under MIT License:\n  \n  The MIT License (MIT)\n  \n  Copyright (c) 2006-2013 Brodie Thiesfield\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy of\n  this software and associated documentation files (the \"Software\"), to deal in\n  the Software without restriction, including without limitation the rights to\n  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n  the Software, and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nDivaSound uses miniaudio (public domain or MIT-0) and BASSASIO (free for\nnon-commercial use only)\n\n\nAMD compatibilty pack dependencies have additional licenses, detailed in the AMD\nPack's readme file."
  },
  {
    "path": "source-code/PD-Loader.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 17\r\nVisualStudioVersion = 17.12.35527.113\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"PD-Loader\", \"source\\PD-Loader\\PD-Loader.vcxproj\", \"{CA479467-D518-46A2-AC86-3098ADA99FE5}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"TLAC\", \"source\\plugins\\TLAC\\TLAC.vcxproj\", \"{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Patches\", \"source\\plugins\\Patches\\Patches.vcxproj\", \"{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Launcher\", \"source\\plugins\\Launcher\\Launcher.vcxproj\", \"{60D5E9F4-335F-402B-9A07-D78674DFFC9B}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Render\", \"source\\plugins\\Render\\Render.vcxproj\", \"{89F87459-768F-4638-9267-0F90CD74452D}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"fakedll\", \"source\\fakedll\\fakedll.vcxproj\", \"{B49C6ABE-931C-4F91-9A94-21A41A305FEE}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"DivaSound\", \"source\\plugins\\DivaSound\\DivaSound.vcxproj\", \"{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"DivaMovie\", \"source\\plugins\\DivaMovie\\DivaMovie.vcxproj\", \"{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ShaderPatch\", \"source\\plugins\\ShaderPatch\\ShaderPatch.vcxproj\", \"{C07E495E-A16F-48FA-80E4-0296B5234F0B}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"DivaWig\", \"source\\plugins\\DivaWig\\DivaWig.vcxproj\", \"{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"DSCRemote\", \"source\\plugins\\DSCRemote\\DSCRemote.vcxproj\", \"{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Novidia\", \"source\\plugins\\Novidia\\Novidia.vcxproj\", \"{47181A1D-C22C-4C9C-B4E0-CB6CE886A1D8}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{CA479467-D518-46A2-AC86-3098ADA99FE5}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{CA479467-D518-46A2-AC86-3098ADA99FE5}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{CA479467-D518-46A2-AC86-3098ADA99FE5}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{CA479467-D518-46A2-AC86-3098ADA99FE5}.Release|x64.Build.0 = Release|x64\r\n\t\t{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Release|x64.Build.0 = Release|x64\r\n\t\t{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Release|x64.Build.0 = Release|x64\r\n\t\t{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Release|x64.Build.0 = Release|x64\r\n\t\t{89F87459-768F-4638-9267-0F90CD74452D}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{89F87459-768F-4638-9267-0F90CD74452D}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{89F87459-768F-4638-9267-0F90CD74452D}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{89F87459-768F-4638-9267-0F90CD74452D}.Release|x64.Build.0 = Release|x64\r\n\t\t{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Release|x64.Build.0 = Release|x64\r\n\t\t{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}.Release|x64.Build.0 = Release|x64\r\n\t\t{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.Build.0 = Release|x64\r\n\t\t{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Release|x64.Build.0 = Release|x64\r\n\t\t{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.Build.0 = Release|x64\r\n\t\t{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.Build.0 = Release|x64\r\n\t\t{47181A1D-C22C-4C9C-B4E0-CB6CE886A1D8}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{47181A1D-C22C-4C9C-B4E0-CB6CE886A1D8}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{47181A1D-C22C-4C9C-B4E0-CB6CE886A1D8}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{47181A1D-C22C-4C9C-B4E0-CB6CE886A1D8}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {F5AD7464-338F-4150-9DDC-85AD115BA616}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source-code/README.md",
    "content": "# PD Loader\n\n**PD Loader** lets you load plugins into **PDAFT** by placing them into a **\"plugins\"** folder, it includes useful ones such as input emulation and a graphical launcher.\n\n## License and Legal\n\nPD Loader is intended for educational purposes only; not for piracy. The code included is intended to be used sole for investigative purposes related to the **PDAFT** video game.\n**Users should possess a legally-obtained dump of the game to use this software.**\nPlease check your local laws/regulataions to verify the legality of tampering with and dumping data from protected arcade machine hardware.\nCode is licensed under the MIT License.\n\n## Installation\n\n* Have a **full clean** game version **\"7.10\"** decompressed without any modifications.\n* Download the latest release of **PD Loader**.\n* Decompress everything into the **root folder** of the game.\n\n* Install the official **\"mdata\"**.\n**M215** to **M270** are supported, custom ones are also supported.\n\nTo install them you have to drop each **\"mdata\"** update decompressed into the **\"mdata\\\"** folder in the root folder of the game (create it if it doesn't exists).\n\n**e.g.** For all the official **\"mdata\"** you should have the following folders inside:\n  * M215\n  * M220\n  * M230\n  * M240\n  * M250\n  * M260\n  * M270\n\nFiles required to make **\"mdata\"** available in the game are included (**\"ram\\databank\\PvList*\"** files).\n\n## Usage\n\n**IMPORTANT:** Do *not* edit any of the *.ini* configuration files with Notepad. Use [Notepad++](https://notepad-plus-plus.org/download) (or WordPad) with UTF-8 encoding instead, otherwise your game may crash.\n\nUse **\"plugins\\components.ini\"** to enable or disable TLAC components.\nUse **\"plugins\\config.ini\"** to enable or disable plugins loading along other useful settings.\nUse **\"plugins\\keyconfig.ini\"** to change your game keybinds.\nUse **\"plugins\\playerdata.ini\"** to change your playername and other player customization.\n\nPlace any **.dva** plugin you want to use inside the **\"plugins\"** folder.\n\nLaunch **\"diva.exe\"**.\nUse **\"--launch\"** argument to bypass the launcher and to be able to use other arguments.\n\n## Modules\n\nEdit **\"plugins\\playerdata.ini** with [Notepad++](https://notepad-plus-plus.org/download) (or WordPad) and set use_card to true.\n\n## Sound\n\nIf you do not hear any audio from the game, please install [DivaSound](https://github.com/somewhatlurker/DivaSound).\n\n## Screenshots\n\nYour **root** game folder should look like this:\n\n![root game folder](https://i.imgur.com/c57lQPH.png)\n\nYour **\"mdata\"** folder should look like this:\n\n![mdata folder](https://i.imgur.com/2jUjosM.png)\n\n## Contributing\n\nPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.\n\nPlease make sure to update tests as appropriate.\n\n## License\n\nMIT (see \"LICENSE\").\n\n## Third party plugins\n\n[DiscordDiva](https://github.com/bela333/DiscordDiva) - Discord integration by **bela333**.\n\n[DivaSound](https://github.com/somewhatlurker/DivaSound) - Replacement audio output by **somewhatlurker**, this plugin is a must if you have audio issues or no audio at all.\n\n## FAQ\n\nOnly **NVIDIA** videocards are supported for now, AMD and Intel GPU support is possible but further research needs to be done. On computers with multiple GPUs, such as most laptops, the game must be set to run on the NVIDIA GPU manually.\n\n**Linux** can run the game with **Wine**, for audio you must use [DivaSound](https://github.com/somewhatlurker/DivaSound).\nWMV movie videos are not supported and it is recommended to set **No_Movies** to **1** to prevent crashes when the game attempts to load a movie.\n\n**Windows 7** is supported except for WMV movie videos.\n\nPrevious versions used **dinput8.dll** in the game root folder, if you still have it you must delete it.\n\nAlways use the original game executable.\n\nSpecial thanks to **Brolijah**, **Skyth**, **korenkonder**, **Samyuu**, **somewhatlurker**, **SwigS-27**, **crash5band**, **ano**, **lybxlpsv** and everyone else who helped at the [Project DIVA Modding 2nd Community Discord](https://discord.gg/cvBVGDZ), come join us if you want to help us to improve this project.\n\n## Developer FAQ\n\nTo enable logs and dumps create a folder called \"logs\" in the root folder, each dump size is 200MB so watch your disk space.\n\nThis is a stripdown of [**ThirteenAG's** Ultimate ASI Loader v4.47](https://github.com/ThirteenAG/Ultimate-ASI-Loader/) for **\"dnsapi.dll\"** usage only.\n\nSolution for **Visual Studio 2019**.\nRequires platform toolset **v142**.\nRequires **Windows 10 SDK (10.0.17763.0)**.\n\nRequires **Desktop development with C++**.\nRequires **Windows Universal CRT SDK**.\n\nRequires **.NET desktop development** (Launcher plugin).\nRequires **.NET Framework 4 targeting pack** (Launcher plugin).\nRequires **C++/CLI support for v142 build tools (14.21)** (Launcher plugin)\n\nRequires [**Microsoft Research Detours Package**](https://github.com/microsoft/Detours) (included in the solution).\nRequires [**FreeGLUT 3.0.0 PD**](https://github.com/Rayduxz/FreeGLUT) (included in the solution).\n"
  },
  {
    "path": "source-code/data/Download .NET Framework Runtime.url",
    "content": "[InternetShortcut]\r\nURL=https://dotnet.microsoft.com/download/dotnet-framework/net48\r\n"
  },
  {
    "path": "source-code/data/Download QuickSFV.url",
    "content": "[InternetShortcut]\r\nURL=https://www.quicksfv.org/qsfv236x64.exe\r\n"
  },
  {
    "path": "source-code/data/Download Visual C++ Runtime.url",
    "content": "[InternetShortcut]\r\nURL=https://aka.ms/vs/16/release/vc_redist.x64.exe\r\n"
  },
  {
    "path": "source-code/data/README - PD Loader.url",
    "content": "[{000214A0-0000-0000-C000-000000000046}]\nProp3=19,11\n[InternetShortcut]\nIDList=\nURL=https://github.com/PDModdingCommunity/PD-Loader/wiki\nHotKey=0\n"
  },
  {
    "path": "source-code/data/patches/custom_freeplay_text_example.p",
    "content": "# Enable FREE PLAY\n// Just in case it's disabled...\n@1403BABEA:75 // ...enable it.\n\n# Custom FREE PLAY text\n1409F61F0:!Miku\\0\n\n# Custom text colour\n1401964A2:00 FF FF 7F\n\n// Syntax:\n// \"#\" console comment\n// \"//\" hidden comment\n// \"@\" omit patch console output\n// \":\" address:bytes (hex)\n// \" \" byte byte\n// \":!\" address:!string (escape characters require PD Loader 2.1+)\n// \"IGNORE\" skip patch file (deprecated)\n"
  },
  {
    "path": "source-code/data/plugins/ShaderPatch.ini",
    "content": "[Config]\n# As of 1 November 2019, this is just data about config, to be used for UI generation and default values.\n# User config data is stored in ShaderPatchConfig.ini\n\n# Patches to remove glitching with modern GPUs.\n# Appropriate patches will automatically be selected based on your GPU.\nCompat=1\n\n# Lyb's toon shader improvements (24 sept 2019)\n# Toon_Improve: Adjusts toon shader lighting\nToon_Improve=0\n# Specular Multiplier\nToon_Improve_Val1=0.9\n# Specular Offset\nToon_Improve_Val2=-0.5\n\n# Lyb's toon shader improvements (24 sept 2019)\n# Toon_Eyes_Improve: Adjusts toon shader eyes\nToon_Eyes_Improve=0\n\n# Lyb's toon shader improvements (24 sept 2019)\n# Toon_Hair_Improve: Adjusts toon shader hair\nToon_Hair_Improve=0\n# Diffuse Brightness\nToon_Hair_Improve_Val1=1.25\n\n# Lyb's toon shader improvements (24 sept 2019)\n# Fixes by korenkonder (11 jan 2025)\n# Toon_Lines_Improve: Adjusts toon shader outlines\nToon_Lines_Improve=0\n# Skin Shadow Strength\nToon_Lines_Improve_Val1=0.05\n# Skin Outline Strength\nToon_Lines_Improve_Val2=0.9\n# Outline Strength Multiplier\nToon_Lines_Improve_Val3=0.7\n# Outline Strength Offset\nToon_Lines_Improve_Val4=0.25\n\n[Patches]\n# Compatibility patches:\n# Star Story (and etc.) stage corruption (Maxwell+)\nblinn_per_vert\\.0010010[23]00[01]\\.fp=arch:GB,AD,GA,GV,TU,GP,GM||cfg:compat||from:TEX tex_col, a_tex_color0, texture\\[0\\], 2D; ALIAS||to:TEX tex_col, a_tex_color0, texture[0], 2D; MUL tex_col, 1, tex_col; ALIAS\n# Turing shading lines (new patch by samyuu, hopefully ported to here correctly)\n.*=arch:GB,AD,GA,GV,TU||cfg:compat||from:SHORT ||to:\n# Turing NPR cloth noise\ncloth_npr1.*=arch:GB,AD,GA,GV,TU||cfg:compat||from:SSG _tmp0.yw, ybr.xxzz;||to:TEMP _tmpForSSG; SGE _tmpForSSG.xz, ybr.xxzz, 0; SUB _tmpForSSG.xz, _tmpForSSG.xxzz, 1; SGT _tmpForSSG.yw, ybr.xxzz, 0; ADD _tmp0.yw, _tmpForSSG.xxzz, _tmpForSSG.yyww;\n# Turing auto-exposure fix by samyuu\nstage_blinn.*\\.fp=arch:GB,AD,GA,GV,TU||cfg:compat||from:NRMH normal, a_normal;||to:NRM normal, a_normal;\n\n# Lyb's toon shader improvements:\ncloth_npr1.*=cfg:toon_improve||from:MAD tmp.y, lc.z, 1.2, -0.5;||to:MAD tmp.y, lc.z, <val1>, <val2>;\nskin_default.*=cfg:toon_improve||from:MAD diff.xyz, spec, spec_ratio, diff;||to:\n.*eye.*=cfg:toon_eyes_improve||from:ADD o_color_f0.w, diff.x, diff.y;||to:\n.*eye.*=cfg:toon_eyes_improve||from:ADD result.color.w, diff.x, diff.y;||to:\nhair_npr1.*=cfg:toon_hair_improve||from:MUL spec.x, tmp.x, 0.7;||to:MUL spec.x, tmp.x, 0.7; MUL diff, diff, <val1>;\ntone_map_npr1.*=cfg:toon_lines_improve||from:MUL density.y, density.y, 0.05;||to:MUL density.y, density.y, <val1>;\ntone_map_npr1.*=cfg:toon_lines_improve||from:MUL density.y, density.y, 0.9;||to:MUL density.y, density.y, <val2>;\ntone_map_npr1.*=cfg:toon_lines_improve||from:MAD density.w, density.x, 0.7, 0.25;||to:MAD density.w, density.x, <val3>, <val4>;\n\n# Intel related patches\n(?:movie|sprite|imgfilter).*=cfg:intel||from:; ||to:;\\n\n(?:movie|sprite|imgfilter).*=cfg:intel||from:(?:RET|TXL|NRM|OPTION NV_fragment|PARAM p_charfragment.color|ATTRIB).*?||to:##\n(?:movie|sprite|imgfilter).*=cfg:intel||from:(?:SHORT |LONG ).*?||to:\n.*sprite.100.fp.*=cfg:intel||from:MUL result.color, col1, fragment.color;||to:##MUL result.color, col1, fragment.color;\n\n# Debug patches:\n# Nametags\n# Adds comments with the shader file name to the shader text. Useful for debugging issues\n# `nametags_val1` and `nametags_val2` are a dirty hack to hide this in launcher (options ending in _val. must belong to a parent to be displayed)\n# `nametags_val2` is a bit faster, but the tags are placed at the end of the file and you may not like that\n# Notes:\n# * `(\\r?\\n)` is used to capture the line ending type used and ensure we're at the start of a line\n# * `[^!]` ensures the comment is inserted after all start program lines (not sure if this even matters)\n# * `[\\s\\S]` matches all characters *including* new lines\n.*=cfg:nametags1||from:(\\r?\\n)([^!][\\s\\S]*)||to:$1#<fname>$1$2\n.*=cfg:nametags2||from:[\\s\\S]*?(\\r?\\n)[\\s\\S]*||to:$&$1#<fname>"
  },
  {
    "path": "source-code/data/verify_base_game.sfv",
    "content": "; Generated by QuickSFV 3.00 on 2020-01-04 at 14:24:56\n; http://www.QuickSFV.org\n;\n; 140616748778912  23:14.30 1988-08-09 CPUSBSG.dll\n; 140616748778912  17:05.50 1989-05-24 diva.exe\n; 140616748778912  17:05.50 1989-05-24 glut32.dll\n; 140616748778912  17:05.50 1989-05-24 MUsbPuIf.dll\n; 140616748778912  17:05.50 1989-05-24 rom/bone_data.bin\n; 140616748778912  17:05.50 1989-05-24 rom/chritm_prop.farc\n; 140616748778912  17:05.50 1989-05-24 rom/fontmap.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_btn_se_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_chainslide_se_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_collection_card_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_customize_item_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_module_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_plate_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_pv_list_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_slidertouch_se_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/gm_slide_se_tbl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/hand_item_data.txt\n; 140616748778912  17:05.50 1989-05-24 rom/iet.bin\n; 140616748778912  17:05.50 1989-05-24 rom/ng_server.conf\n; 140616748778912  17:05.50 1989-05-24 rom/pv_db.txt\n; 140616748778912  17:05.50 1989-05-24 rom/pv_field.txt\n; 140616748778912  17:05.50 1989-05-24 rom/rob_sleeve_data.txt\n; 140616748778912  17:05.50 1989-05-24 rom/shader.farc\n; 140616748778912  17:05.50 1989-05-24 rom/shader_cg.farc\n; 140616748778912  17:05.50 1989-05-24 rom/stage_data.bin\n; 140616748778912  17:05.50 1989-05-24 rom/star_catalog_megastar2.farc\n; 140616748778912  17:05.50 1989-05-24 rom/star_catalog_random.farc\n; 140616748778912  17:05.50 1989-05-24 rom/STGTST_COLI.000.bin\n; 140616748778912  17:05.50 1989-05-24 rom/movie/adv_cfm_cm.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/adv_sega_cm.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/diva_adv.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/diva_adv02.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_203.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_209.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_215.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_216.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_255.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_257.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_265.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_428.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_429.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_430.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_431.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_601.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_604.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_609.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_618.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_623.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_625.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_627.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_630.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_631.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_722.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_723.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_724.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_728.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_734.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/movie/pv_739_001.wmv\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_adv_cmn.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_adv_nobl.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_adv_rnk.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_adv_scrnk.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_cmn_all.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_db.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_ent_cmn.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_ent_name.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_ent_passintro.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_cmn.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_cont.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_ctstrslt.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_edttit.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff000.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff001.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff002.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff004.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff005.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff006.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff007.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff008.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff009.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff010.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff011.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff012.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff013.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff014.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff015.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff016.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff017.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff018.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff019.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff021.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff022.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff023.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff024.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff025.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff026.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff027.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff028.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff029.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff030.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff031.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff032.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff033.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff034.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff035.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff036.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff040.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff041.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff042.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff044.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff050.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff051.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff052.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff053.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff054.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff055.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff058.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff059.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff062.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff064.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff066.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff068.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff003.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff020.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff039.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff069.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv012.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv029.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv051.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv081.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv101.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv219.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv241.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv401.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv418.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv439.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv614.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff070.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_eff071.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_gover.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_loadsc.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_prize.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv001.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv002.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv003.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv004.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv005.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv006.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv007.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv008.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv009.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv010.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv011.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv013.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv014.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv015.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv016.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv017.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv018.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv019.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv020.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv021.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv022.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv023.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv024.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv025.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv026.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv027.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv028.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv030.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv031.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv032.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv037.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv038.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv039.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv040.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv041.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv042.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv043.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv044.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv045.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv046.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv047.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv049.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv050.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv052.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv053.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv054.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv055.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv056.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv057.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv058.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv059.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv060.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv061.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv062.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv063.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv064.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv065.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv066.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv079.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv082.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv083.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv084.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv085.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv086.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv087.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv088.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv089.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv090.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv091.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv092.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv093.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv094.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv095.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv096.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv097.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv102.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv103.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv104.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv201.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv202.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv203.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv204.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv205.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv206.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv207.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv208.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv210.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv211.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv212.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv214.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv218.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv220.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv221.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv222.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv223.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv224.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv225.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv227.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv231.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv232.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv233.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv234.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv235.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv236.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv238.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv239.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv240.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv242.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv243.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv244.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv246.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv247.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv248.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv249.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv250.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv251.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv253.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv255.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv257.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv259.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv260.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv261.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv262.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv402.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv403.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv404.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv405.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv406.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv407.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv408.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv409.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv410.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv411.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv412.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv413.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv414.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv415.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv416.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv417.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv419.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv420.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv421.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv422.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv423.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv424.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv425.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv426.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv427.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv432.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv433.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv434.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv435.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv436.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv437.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv438.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv440.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv441.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv442.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv443.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv600.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv601.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv602.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv603.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv604.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv605.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv607.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv609.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv610.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv611.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv612.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv613.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv615.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv616.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv617.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv618.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv619.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv620.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv621.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv622.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv623.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv624.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv625.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv626.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv627.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv628.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv629.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv630.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv637.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv638.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv639.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv640.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv641.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv642.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv710.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv722.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv723.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv724.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv725.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv726.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv727.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv728.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv729.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv730.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv732.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv733.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv734.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv736.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv737.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv738.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv739.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv740.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv832.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_qstrslt.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_result.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_sc.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin001.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin002.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin003.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin004.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin006.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin007.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin008.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin009.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin010.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin011.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin012.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin013.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin014.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin015.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin016.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin017.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin018.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin019.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin020.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin021.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin023.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin024.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin025.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin026.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin027.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin028.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin029.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin030.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin031.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin032.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin033.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin034.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin035.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin036.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin037.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin038.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin040.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin041.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin042.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin043.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin044.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin045.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin046.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin047.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin048.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin049.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin050.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin051.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin052.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin053.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin054.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin055.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin057.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin058.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin059.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin060.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin061.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin062.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin063.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin064.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin065.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin066.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin067.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin068.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin069.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin070.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin071.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin072.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin074.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin075.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin076.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin077.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin078.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin079.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin080.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin081.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin082.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin083.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin084.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin085.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin086.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin087.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin088.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin089.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin091.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin092.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin093.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin094.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin095.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin096.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin097.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin098.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin099.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin100.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin101.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin102.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin103.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin104.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin105.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin106.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin108.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin109.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin110.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin111.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin112.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin113.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin114.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin115.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin116.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin117.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin118.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin119.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin120.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin121.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin122.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin123.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin125.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin126.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin127.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin128.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin129.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin130.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin131.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin132.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin133.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin134.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin135.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin136.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin137.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin138.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin139.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin140.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin142.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin143.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin144.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin145.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin146.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin147.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin148.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin149.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin150.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin151.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin152.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin153.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin154.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin155.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin156.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin157.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin159.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin160.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin161.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin162.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin163.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin164.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin165.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin166.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin167.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin168.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin169.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin170.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin171.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin172.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin173.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin174.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin176.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin177.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin178.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin179.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin180.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin181.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin182.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin183.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin184.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin185.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin186.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin187.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin188.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin189.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin190.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin191.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin193.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin194.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin195.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin196.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin197.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin198.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin199.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin200.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin201.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin202.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin203.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin204.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin205.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin206.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin207.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin208.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin210.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin211.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin212.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin213.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin214.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin215.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin216.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin217.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin218.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin219.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin220.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin221.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin222.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin223.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin224.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin225.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin227.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin228.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin229.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin230.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin231.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin232.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin233.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin234.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin235.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin236.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin237.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin238.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin239.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin240.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin241.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin242.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin244.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin245.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin246.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin247.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin248.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin249.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin250.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin251.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin252.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin253.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin254.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin255.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin256.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin257.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin258.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin259.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv731.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin005.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin022.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin039.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin056.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin073.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin090.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin107.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin124.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin141.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin158.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin175.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin192.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin209.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin226.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin261.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin262.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin263.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin264.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin265.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin266.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin267.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin268.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin269.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin270.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin271.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin272.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin273.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin274.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin275.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin276.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin278.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin279.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin280.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin281.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin282.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin283.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin284.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin285.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin286.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin287.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin288.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin289.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin290.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin291.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin292.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin293.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin295.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin296.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin297.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin298.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin299.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin300.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin301.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin302.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin303.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin304.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin305.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin306.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin307.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin308.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin309.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin310.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin312.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin313.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin314.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin315.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin316.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin317.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin318.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin319.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin320.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin321.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin322.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin323.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin324.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin325.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin326.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin327.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin329.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin330.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin331.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin332.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin333.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin334.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin335.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin336.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin337.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin338.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin339.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin340.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin341.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin342.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin343.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin344.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin346.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin347.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin348.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin349.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin350.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin351.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin352.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin353.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin354.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin355.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin356.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin357.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin358.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin359.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin360.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin361.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin363.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin364.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin365.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin366.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin367.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin368.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin369.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin370.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin371.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin372.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin373.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin374.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin375.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin376.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin377.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin378.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin380.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin381.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin382.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin383.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin384.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin385.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin386.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin387.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin388.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin389.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin390.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin391.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin392.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin393.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin394.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin395.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin397.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin398.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin399.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin400.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin401.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin402.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin403.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin404.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin405.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin406.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin407.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin408.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin409.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin410.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin411.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin412.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin414.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin415.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin416.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin417.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin418.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin419.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin420.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin421.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin422.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin423.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin424.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin425.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin426.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin427.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin428.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin429.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin431.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin432.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin433.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin434.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin435.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin436.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin437.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin438.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin439.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin440.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin441.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin442.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin443.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin444.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin445.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin446.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin448.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin449.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin450.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin451.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin452.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin453.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin454.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin455.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin456.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin457.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin458.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin459.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin460.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin461.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin462.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin463.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin465.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin466.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin467.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin468.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin469.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin470.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin471.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin472.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin473.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin474.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin475.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin476.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin477.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin478.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin479.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin480.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin482.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin483.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin484.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin485.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin486.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin487.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin488.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin489.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin490.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin491.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin492.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin493.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin494.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin495.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin496.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin497.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin499.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin500.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin501.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin502.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin503.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin504.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin505.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin506.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin507.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin508.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin509.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin510.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin511.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin512.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin513.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin514.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin516.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin517.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin518.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin519.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin520.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin521.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin522.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin523.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin524.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin525.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin526.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin527.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin528.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin529.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin530.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin531.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin260.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin277.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin294.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin311.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin328.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin345.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin362.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin379.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin396.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin413.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin430.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin447.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin464.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin481.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin498.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin533.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin534.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin535.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin536.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin537.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin538.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin539.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin540.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin541.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin542.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin543.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin544.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin545.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin546.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin547.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin548.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin550.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin551.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin552.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin553.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin554.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin555.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin556.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin557.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin558.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin559.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin560.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin561.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin562.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin563.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin564.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin565.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin567.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin568.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin569.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin570.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin571.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin572.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin573.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin574.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin575.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin576.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin577.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin578.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin579.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin580.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin581.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin582.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin584.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin585.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin586.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin587.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin588.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin589.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin590.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin591.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin592.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin593.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin594.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin595.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin596.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin597.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin598.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin599.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin601.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin602.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin603.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin604.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin605.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin606.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin607.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin608.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin609.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin610.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin611.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin612.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin613.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin614.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin615.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin616.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin618.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin619.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin620.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin621.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin622.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin623.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin624.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin625.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin626.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin627.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin628.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin629.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin630.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin631.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin632.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin633.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin635.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin636.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin637.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin638.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin639.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin640.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin641.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin642.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin643.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin644.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin645.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin646.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin647.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin648.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin649.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin650.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin652.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin653.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin654.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin655.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin656.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin657.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin658.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin659.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin660.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin661.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin662.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin663.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin664.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin665.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin666.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin667.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin669.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin670.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin671.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin672.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin673.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin674.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin675.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin676.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin677.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin678.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin679.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin680.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin681.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin682.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin683.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin684.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin686.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin687.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin688.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin689.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin690.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin691.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin692.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin693.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin694.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin695.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin696.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin697.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin698.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin699.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin700.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin701.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin703.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin704.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin705.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin706.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin707.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin708.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin709.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin710.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin711.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin712.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin713.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin714.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin715.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin716.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin717.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin718.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin720.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin721.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin722.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin723.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin724.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin725.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin726.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin727.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin728.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin729.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin730.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin731.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin732.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin733.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin734.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin735.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin737.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin738.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_key_input.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_key_pass.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_key_svol.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_key_win.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_belt.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_camp.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_camp02.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_card.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_cardbg.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_cardinfo.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_chlle.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_cmn.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_credit.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_ctst.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_module.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_pleff.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_print.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_procedure.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_pv.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_qst.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_result.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_sc.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_stamp.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_ticket.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_vaccess.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_watch.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_adv_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_adv_nobl.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_adv_rnk.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_adv_scrnk.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin532.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin549.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin566.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin583.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin600.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin617.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin634.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin651.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin668.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin685.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin702.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin719.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin736.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_sel_ctstinfo.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_pv631.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin243.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/aet_gam_skin515.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0256.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0496.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin140.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin380.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md106cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md387cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0110.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0129.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0130.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0131.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0132.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0133.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0134.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0135.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0136.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0137.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0138.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0139.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0140.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0141.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0142.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0143.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0145.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0146.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0147.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0148.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0150.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0151.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0152.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0153.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0154.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0155.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0156.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0157.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0158.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0159.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0161.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0162.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0163.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0164.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0165.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0166.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0167.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0168.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0169.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0170.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0171.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0172.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0173.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0174.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0175.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0177.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0178.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0179.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0180.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0181.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0182.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0183.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0184.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0185.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0186.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0187.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0188.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0189.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0190.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0191.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0193.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0194.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0195.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0196.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0197.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0198.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0199.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0200.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0203.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0209.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0215.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0216.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0217.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0229.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0230.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0237.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0245.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0252.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0254.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0258.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0263.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0264.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0265.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0266.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0267.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0268.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0269.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0270.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0271.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0128.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0144.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0160.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0176.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0192.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0273.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0274.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0275.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0276.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0277.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0278.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0279.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0280.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0281.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0282.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0283.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0284.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0285.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0286.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0287.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0289.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0290.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0291.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0292.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0293.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0294.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0295.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0296.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0297.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0298.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0299.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0300.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0306.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0307.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0308.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0309.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0317.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0318.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0319.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0321.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0322.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0323.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0324.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0326.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0327.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0328.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0330.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0333.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0335.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0338.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0339.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0340.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0341.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0342.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0343.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0344.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0345.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0346.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0347.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0348.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0349.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0350.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0351.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0353.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0354.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0355.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0356.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0357.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0358.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0359.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0360.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0361.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0362.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0363.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0364.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0365.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0366.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0367.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0369.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0370.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0371.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0372.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0373.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0374.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0375.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0376.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0377.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0378.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0379.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0380.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0381.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0382.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0383.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0385.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0386.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0387.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0388.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0389.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0390.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0391.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0392.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0393.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0394.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0395.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0396.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0397.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0398.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0399.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0403.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0406.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0407.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0408.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0409.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0410.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0411.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0412.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0413.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0414.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0415.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0417.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0418.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0419.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0420.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0421.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0422.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0423.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0424.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0425.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0426.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0427.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0428.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0429.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0430.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0431.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0436.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0437.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0438.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0439.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0440.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0442.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0443.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0444.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0445.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0446.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0447.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0449.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0450.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0451.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0452.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0453.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0454.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0455.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0456.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0457.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0458.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0459.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0460.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0461.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0462.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0463.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0465.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0466.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0467.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0468.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0469.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0470.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0471.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0472.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0473.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0474.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0475.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0476.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0477.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0478.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0479.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0481.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0482.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0483.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0484.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0485.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0486.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0487.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0488.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0489.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0490.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0491.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0492.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0493.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0494.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0495.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0497.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0498.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0499.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0272.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0288.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0320.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0336.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0352.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0368.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0384.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0400.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0416.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0448.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0464.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0480.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0513.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0514.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0515.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0516.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0517.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0518.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0519.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0520.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0521.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0522.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0523.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0524.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0525.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0535.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0537.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0538.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0539.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0540.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0541.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0542.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0543.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0545.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0546.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0547.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0554.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0555.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0556.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0557.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0558.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0559.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0560.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0561.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0562.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0563.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0564.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0565.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0567.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0568.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0569.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0570.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0571.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0572.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0573.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0574.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0575.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0576.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0577.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0578.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0579.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0580.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0581.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0583.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0584.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0585.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0586.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0587.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0588.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0589.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0590.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0591.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0592.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0593.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0594.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0595.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0596.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0597.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0599.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0606.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0632.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0633.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb128.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb129.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb130.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb131.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb132.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb133.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb134.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb135.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb136.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb137.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb138.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb139.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb140.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb141.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0512.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0544.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0566.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0582.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0598.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_clt_crd0630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb143.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb144.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb145.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb146.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb147.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb148.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb150.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb151.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb152.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb153.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb154.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb155.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb156.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb157.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb159.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb160.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb161.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb162.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb163.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb164.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb165.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb166.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb167.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb168.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb169.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb170.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb171.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb172.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb173.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb175.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb176.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb177.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb178.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb179.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb180.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb181.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb182.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb183.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb184.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb185.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb186.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb187.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb188.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb189.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb191.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb192.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb193.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb194.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb195.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb196.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb197.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb198.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb199.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb200.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb209.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb215.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb216.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb217.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb229.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb230.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmbdummy.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmn_all.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_db.bin\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback110.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback128.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback129.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback130.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback131.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback132.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback133.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback134.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback135.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback136.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback137.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback138.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb142.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb158.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb174.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb190.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_cmnitm_thmb224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback140.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback141.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback142.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback143.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback144.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback145.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback146.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback147.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback148.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback150.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback151.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback152.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback153.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback155.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback156.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback157.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback158.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback159.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback160.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback161.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback162.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback163.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback164.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback165.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback166.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback167.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback168.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback170.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback171.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback172.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback173.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback174.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback175.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback176.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback177.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback178.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback179.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback180.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback181.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback182.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback183.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback185.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback186.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback187.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback188.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback189.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback190.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback191.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback192.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback193.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvbackblack.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvbackwhite.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvback112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvback5017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbackblack.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbackpgreen.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbackppink.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbackpsky.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbackpyellow.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbacksky.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvbackwhite.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback110.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback139.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback154.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback169.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_d2pvback184.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_expvback019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_fpvback5012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback128.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback129.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback130.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback131.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback132.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback133.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback134.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback135.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback137.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback138.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback139.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback140.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback141.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback142.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback143.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback144.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback145.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback146.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback147.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback148.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback150.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback151.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback153.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback154.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback155.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback156.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback157.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback158.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback159.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback160.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback161.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback162.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback163.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback164.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback165.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback166.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback167.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback169.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback170.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback171.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback172.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback173.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback174.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback175.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback176.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback177.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback178.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback179.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback180.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback181.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback182.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback183.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback185.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback186.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback187.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback188.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback189.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback190.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback191.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback192.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback193.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback194.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback195.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback196.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_ent_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_ent_name.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_ent_passintro.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_fnt_24.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_fnt_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_cont.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_ctstrslt.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_edttit.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_gover.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_loadsc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_prize.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv203.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback136.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback152.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback168.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_edit_pvback184.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_fnt_bold24.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_eff053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv403.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv406.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv407.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv408.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv410.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv411.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv412.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv413.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv414.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv415.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv416.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv417.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv418.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv419.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv420.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv421.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv422.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv423.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv424.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv425.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv427.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv436.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv437.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv438.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv439.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv440.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv442.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv443.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_qstrslt.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_result.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_sc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin110.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin128.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin129.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin130.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin131.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin132.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin133.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin134.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin135.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin136.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin137.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin138.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin139.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin141.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin142.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin143.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin144.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin145.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin146.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin147.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin148.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin150.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin151.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin152.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin153.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin154.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin155.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv409.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv426.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_pv740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin157.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin158.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin159.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin160.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin161.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin162.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin163.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin164.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin165.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin166.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin167.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin168.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin169.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin170.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin171.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin173.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin174.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin175.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin176.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin177.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin178.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin179.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin180.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin181.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin182.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin183.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin184.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin185.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin186.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin187.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin189.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin190.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin191.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin192.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin193.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin194.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin195.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin196.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin197.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin198.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin199.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin200.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin203.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin209.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin215.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin216.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin217.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin229.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin230.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin237.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin245.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin254.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin256.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin258.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin263.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin264.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin265.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin266.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin267.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin269.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin270.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin271.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin272.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin273.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin274.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin275.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin276.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin277.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin278.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin279.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin280.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin281.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin282.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin283.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin285.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin286.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin287.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin288.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin289.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin290.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin291.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin292.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin293.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin294.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin295.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin296.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin297.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin298.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin299.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin306.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin307.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin308.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin309.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin317.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin318.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin319.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin320.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin321.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin322.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin323.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin324.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin326.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin327.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin328.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin330.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin333.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin335.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin336.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin338.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin339.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin340.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin341.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin342.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin343.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin344.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin345.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin346.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin347.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin349.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin350.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin351.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin352.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin353.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin354.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin355.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin356.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin357.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin358.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin359.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin360.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin361.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin362.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin363.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin365.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin366.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin367.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin368.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin369.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin370.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin371.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin372.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin373.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin374.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin375.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin376.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin377.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin378.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin379.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin381.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin382.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin383.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin384.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin385.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin386.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin387.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin388.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin389.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin390.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin391.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin392.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin393.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin394.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin395.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin156.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin172.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin188.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin252.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin268.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin284.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin300.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin348.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin364.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin397.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin398.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin399.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin400.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin403.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin406.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin407.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin408.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin409.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin410.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin411.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin413.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin414.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin415.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin416.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin417.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin418.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin419.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin420.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin421.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin422.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin423.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin424.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin425.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin426.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin427.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin429.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin430.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin431.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin436.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin437.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin438.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin439.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin440.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin442.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin443.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin445.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin446.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin447.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin448.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin449.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin450.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin451.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin452.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin453.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin454.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin455.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin456.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin457.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin458.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin459.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin461.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin462.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin463.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin464.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin465.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin466.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin467.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin468.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin469.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin470.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin471.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin472.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin473.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin474.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin475.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin477.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin478.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin479.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin480.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin481.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin482.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin483.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin484.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin485.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin486.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin487.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin488.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin489.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin490.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin491.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin493.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin494.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin495.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin496.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin497.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin498.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin499.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin512.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin513.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin514.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin515.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin516.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin517.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin518.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin519.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin520.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin521.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin522.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin523.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin525.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin535.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin537.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin538.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin539.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin541.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin542.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin543.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin544.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin545.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin546.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin547.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin548.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin549.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin550.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin551.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin552.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin553.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin554.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin555.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin557.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin558.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin559.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin560.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin561.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin562.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin563.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin564.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin565.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin566.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin567.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin568.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin569.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin570.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin571.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin573.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin574.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin575.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin576.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin577.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin578.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin579.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin580.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin581.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin582.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin583.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin584.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin585.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin586.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin587.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin589.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin590.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin591.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin592.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin593.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin594.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin595.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin596.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin597.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin598.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin599.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin606.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin632.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin633.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin634.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin635.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin396.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin412.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin428.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin444.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin460.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin476.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin492.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin524.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin540.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin556.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin572.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin588.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin643.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin644.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin645.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin646.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin647.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin648.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin649.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin650.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin651.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin653.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin654.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin655.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin656.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin657.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin658.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin659.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin660.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin661.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin662.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin663.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin664.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin665.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin666.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin667.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin669.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin670.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin671.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin672.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin673.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin674.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin675.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin676.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin677.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin678.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin679.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin680.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin681.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin682.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin683.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin685.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin686.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin687.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin688.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin689.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin690.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin691.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin692.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin693.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin694.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin695.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin696.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin697.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin698.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin699.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin707.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin708.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin709.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin711.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin712.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin713.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin714.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin715.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin717.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin718.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin719.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin720.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin721.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin735.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_key_input.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_key_pass.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_key_svol.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_key_win.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_ps3_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_belt.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_camp.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_camp02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_card.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_cardbg.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_cardinfo.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_chlle.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_credit.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_ctst.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_ctstinfo.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md000cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md001cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md002cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md003cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md004cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md005cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md006cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md007cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md008cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md009cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md011cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md012cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md013cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md014cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md015cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md016cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md017cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md018cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md019cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md020cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md021cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md022cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md023cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md024cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md025cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md027cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md028cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md029cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md030cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md031cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md032cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md033cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md034cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md035cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md036cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md037cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md038cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md039cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md040cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md041cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md043cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md044cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md045cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md046cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md047cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md048cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md049cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md050cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md051cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md052cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md053cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md054cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md055cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md056cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md057cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md059cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md060cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md061cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md062cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md063cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md064cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md065cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md066cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md067cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md068cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md069cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md070cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md071cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md072cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md073cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md075cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md076cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md077cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md078cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md079cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md080cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md081cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md082cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md083cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md084cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md085cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md086cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md087cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md088cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md089cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md091cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md092cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md093cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md094cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md095cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md096cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md097cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md098cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md099cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md100cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md101cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md102cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md103cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md104cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md105cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md107cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md108cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md109cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md110cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md111cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md112cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md113cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md114cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md115cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md116cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md117cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md118cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md119cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md120cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md121cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin636.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin652.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin668.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin684.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin716.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_gam_skin733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_cardpt.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md010cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md026cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md042cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md058cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md074cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md090cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md124cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md125cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md126cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md127cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md128cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md129cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md130cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md131cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md132cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md133cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md134cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md135cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md136cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md137cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md138cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md141cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md142cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md143cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md144cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md145cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md146cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md147cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md148cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md149cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md150cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md151cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md153cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md154cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md155cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md156cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md158cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md159cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md160cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md161cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md162cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md163cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md164cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md165cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md166cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md167cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md168cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md169cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md170cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md171cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md172cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md189cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md190cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md191cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md192cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md193cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md194cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md195cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md196cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md197cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md198cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md199cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md200cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md201cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md202cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md203cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md205cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md206cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md207cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md208cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md209cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md210cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md211cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md212cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md213cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md214cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md215cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md216cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md217cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md218cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md219cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md221cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md222cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md223cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md224cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md225cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md226cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md227cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md228cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md229cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md230cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md231cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md232cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md233cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md234cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md235cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md237cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md238cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md239cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md240cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md241cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md242cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md243cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md244cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md245cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md246cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md247cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md248cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md249cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md250cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md251cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md253cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md254cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md255cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md256cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md257cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md258cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md259cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md260cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md261cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md262cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md263cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md264cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md265cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md266cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md267cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md269cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md270cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md271cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md272cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md273cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md274cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md275cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md276cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md277cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md278cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md279cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md280cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md281cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md282cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md283cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md285cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md286cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md287cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md288cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md289cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md290cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md291cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md292cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md293cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md294cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md295cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md296cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md297cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md298cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md299cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md301cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md302cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md303cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md304cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md305cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md306cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md308cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md309cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md310cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md311cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md313cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md314cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md315cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md316cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md317cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md319cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md320cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md321cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md322cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md323cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md324cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md325cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md326cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md327cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md328cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md329cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md330cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md331cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md332cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md334cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md336cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md338cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md339cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md340cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md341cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md343cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md344cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md345cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md346cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md347cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md348cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md349cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md350cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md351cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md352cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md354cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md355cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md356cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md358cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md359cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md360cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md361cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md362cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md363cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md364cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md365cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md366cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md367cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md368cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md369cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md371cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md372cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md373cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md374cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md375cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md376cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md377cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md378cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md379cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md380cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md381cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md382cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md383cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md385cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md386cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md122cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md139cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md157cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md188cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md204cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md220cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md236cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md252cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md268cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md284cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md300cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md318cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md335cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md353cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md370cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md389cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md390cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md391cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md392cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md393cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md394cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md395cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md398cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md402cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md403cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md404cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md405cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md406cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md407cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md408cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md410cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md411cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md412cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md420cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md421cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md422cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md423cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrallcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrhakcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrkaicmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrlencmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrlukcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrmeicmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrmikcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrnercmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrrincmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrtetcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_module.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_plate.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pleff.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_print.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_procedure.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv203.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv209.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv215.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv216.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv265.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv403.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv406.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv407.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv409.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv410.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv411.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv412.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv413.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv414.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv415.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv416.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv417.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv418.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv419.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv420.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv421.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv422.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv423.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv424.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv426.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv427.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv428.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv429.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv430.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv431.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv436.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv437.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv438.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv439.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv440.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv443.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_md409cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_mdrsakcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv408.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv425.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv442.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_pv832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_qst.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_result.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_sc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_skin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_song.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_songcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_stamp.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_ticket.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_vaccess.farc\n; 140616748778912  17:05.50 1989-05-24 rom/2d/spr_sel_watch.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/auth_3d_db.bin\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/auth_3d_setting.bin\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV0211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MIK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CAMPV740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/CHRPV605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV243TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV244KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV244KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV244LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV244LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262KAI100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262KAI101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MEI100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MEI101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262MIK101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262RIN100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262RIN101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV262TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV441TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV602TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV605TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV609LEN003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV609LUK004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV609MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV609RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV612TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614KAI009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614MEI009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614MIK009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614TET009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624EXT001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624EXT002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637KAI005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637LUK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637MEI004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637MIK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637MIK004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637MIK005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV637RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641HAK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641KAI003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641LUK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641MEI003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641MIK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641NER003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641RIN003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641SAK003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641TET003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722KAI100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722LEN100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722LUK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722MEI100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722MIK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722NER100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722RIN100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722SAK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722TET100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737HAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737HAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737KAI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737LEN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737LEN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737MEI001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737MEI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737MIK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737NER002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737RIN002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737SAK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737SAK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737TET001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739HAK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739KAI100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739LEN100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739LUK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739MIK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739NER100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739RIN100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739SAK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739TET100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV614LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV617LUK001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV624LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630KAI002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV630TET002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV641LEN003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV722HAK100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV725NER001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV726RIN001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV730MIK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV737LUK002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFCHRPV739MEI100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2NS080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGTST002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGD2PV214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS266.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS267.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGNS272.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV440.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGPV832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/EFFSTGTST003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/ITMPV737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/auth_3d/SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s20.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/aetback.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns035.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns036.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns037.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns038.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns039.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns040.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns041.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns042.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns043.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns044.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns045.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns046.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns047.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns048.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns049.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns050.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns051.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns052.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns054.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns055.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns056.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns057.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns058.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns059.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns060.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns062.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns063.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns064.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns065.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns066.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns067.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns068.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns069.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns070.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns071.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns072.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns074.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns075.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns076.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns077.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns078.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns079.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns080.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns081.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns082.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv037s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv037s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv037s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv038s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv039s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv039s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv039s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv040s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv041s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv042s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv042s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv042s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv043s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv044s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv044s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv044s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv046s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv046s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv046s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv046s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv046s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv047s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv047s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv047s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv047s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv047s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv048s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv050s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv051s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv051s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv051s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv051s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv051s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv053s15.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv055s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv055s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns053.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2ns073.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv042s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv047s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv057s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns008.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns030.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns099.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns119.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv005s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv008s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv013s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv020s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv058s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv058s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv060s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv061s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv061s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv062s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv063s13.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv064s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv064s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv065s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv066s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv208s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv212s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv213s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/d2pv214s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns001.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns002.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns003.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns004.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns005.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns006.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns007.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns009.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns010.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns011.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns012.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns013.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns014.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns015.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns016.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns017.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns018.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns019.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns020.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns021.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns022.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns023.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns024.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns025.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns026.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns029.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns031.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns032.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns033.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns034.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns083.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns084.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns085.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns087.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns088.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns089.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns090.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns091.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns092.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns093.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns094.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns095.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns096.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns097.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns098.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns100.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns101.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns102.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns103.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns104.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns105.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns106.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns107.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns108.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns109.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns110.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns111.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns112.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns113.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns114.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns115.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns116.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns117.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns118.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns120.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns121.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns122.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns123.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns124.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns125.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns126.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns221.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns249.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns257.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns263.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns266.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns267.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns272.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/ns292.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv001s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv003s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv004s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv004s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv004s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv004s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv004s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv005s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv005s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv006s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv007s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv008s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv008s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv008s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv008s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv008s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv009s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv009s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv009s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv009s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv009s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv009s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv011s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv011s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv011s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv011s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv011s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv013s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv013s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv013s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv014s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv015s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv015s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv015s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv015s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv018s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv018s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv018s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv018s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv018s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s13.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv019s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv020s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv020s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s13.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv024s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s13.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s15.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s16.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s17.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s18.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s19.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s21.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s22.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s23.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s24.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s25.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s26.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv025s27.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv028s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv079s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv082s61.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv082s62.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv082s63.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv082s64.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv082s65.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s18.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s25.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s26.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s27.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s28.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv084s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv085s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv086s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv086s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv087s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv087s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv087s16.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv087s17.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv088s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv088s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv088s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv088s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv088s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv089s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv089s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv089s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv090s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv090s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s13.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv091s15.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv094s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv094s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv094s16.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv094s17.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv094s18.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv096s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv097s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv103s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv104s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv104s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv104s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv104s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv218s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv218s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv218s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s12.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s13.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv219s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv220s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv220s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s11.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv221s14.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv222s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv222s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s10.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv224s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv224s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv224s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv225s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv225s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv225s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv226s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv227s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv228s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv228s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv228s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv228s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv232s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv232s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv232s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv233s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv234s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv235s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv236s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv238s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv240s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv240s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv240s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv241s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv241s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv243s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv244s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv244s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv246s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv248s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv248s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv250s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv253s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv255s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv257s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv262s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv432s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv432s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv432s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv433s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv433s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv433s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv433s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv433s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv434s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv435s08.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv441s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv600s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv600s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv600s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv601s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv601s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv601s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv601s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv602s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv602s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv602s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv602s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv603s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv604s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv605s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv605s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv605s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv607s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv608s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv609s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv609s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv610s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv611s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv612s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv612s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv612s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv612s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv613s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv613s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv613s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv614s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv614s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv615s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv616s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv616s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv616s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv617s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv617s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv619s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv619s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv619s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv620s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv621s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv622s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv623s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv623s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv625s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv625s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv626s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv628s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv629s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv630s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv630s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv630s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv630s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv631s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv637s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv637s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv638s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv638s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv639s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv639s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv639s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv639s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv640s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv640s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv641s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv642s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv722s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv722s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv723s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv725s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv725s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv727s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv728s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv729s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv729s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv732s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv734s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv736s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv737s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv737s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv738s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv739s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/selpvback.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst001.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst002.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst006.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst007.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst008.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst009.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/tst010.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv081s09.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv083s24.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv089s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv092s07.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv218s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv220s03.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv223s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv231s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv234s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv239s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv251s06.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv433s02.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv600s04.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv610s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv619s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv630s05.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/ibl/pv726s01.ibl\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns035.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns036.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns037.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns038.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns039.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns040.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns041.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns042.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns043.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns046.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns047.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns048.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns049.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns050.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns051.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns052.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns054.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns055.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns059.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns060.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns065.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns067.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns070.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns071.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns072.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns073.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns079.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns080.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns081.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns082.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv037s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv038s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv043s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv044s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv044s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv046s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv046s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv046s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv047s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv047s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv047s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv047s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv047s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv051s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv051s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv051s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv051s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv051s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv057s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv060s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv061s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv061s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv063s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv064s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv065s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv065s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv065s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv065s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv065s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv065s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv066s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns002.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns003.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns005.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns013.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2ns053.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv039s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_d2pv055s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns014.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns120.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv092s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns036.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns058.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns080.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv047s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv058s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns020.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns024.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns030.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns033.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns084.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns088.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns098.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns099.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns101.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns103.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns104.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns111.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns112.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns115.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns116.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns117.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns123.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns124.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns125.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns249.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_ns272.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv004s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv004s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv007s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv009s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv009s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv009s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv009s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv015s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv020s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv020s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv020s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv024s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s20.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s21.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s22.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s23.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv025s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv028s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv081s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv081s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv082s61.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv082s62.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv082s63.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv082s64.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv082s65.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s26.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s27.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv083s28.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv085s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv086s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv086s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv087s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv087s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv087s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv087s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv090s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv090s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv092s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv092s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv092s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv092s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv092s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv096s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv096s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_PV097s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv104s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv218s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv218s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv220s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv220s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv232s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv232s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv232s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv233s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv233s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv233s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv236s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv432s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv432s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv616s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv616s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv616s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv618s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv621s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv638s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_pv638s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_selpvback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_stgns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/face_tst.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns035.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns037.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns040.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns041.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns042.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns043.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns044.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns045.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns046.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns047.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns048.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns049.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns050.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns052.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns053.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns054.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns056.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns057.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns059.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns060.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns062.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns063.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns064.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns065.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns066.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns068.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns069.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns070.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns071.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns072.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns073.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns074.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns075.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns076.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns079.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns081.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2ns082.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv037s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv038s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv039s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv039s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv039s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv040s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv041s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv042s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv042s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv042s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv043s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv044s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv044s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv046s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv047s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv047s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv047s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv048s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv050s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv051s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv051s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv051s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv051s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv051s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv053s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv053s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv053s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv053s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv055s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv055s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv058s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv060s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv061s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv061s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv062s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv063s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv066s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv212s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv213s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv214s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns001.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns002.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns003.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns004.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns005.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns006.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns007.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns009.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns010.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns011.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns012.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns013.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns015.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns016.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns017.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns018.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns019.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns020.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns021.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns022.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns023.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns025.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns029.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns030.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns031.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns032.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns033.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns034.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns083.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns085.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns086.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns087.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns088.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns089.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns090.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns091.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns092.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns093.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns094.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns095.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns096.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns097.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns098.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns099.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns100.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns101.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns103.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns104.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns106.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns107.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns108.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns109.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns110.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns111.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns112.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns113.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns114.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns115.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns116.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns117.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns120.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns121.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns123.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns124.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns126.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns221.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns249.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns257.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns263.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns272.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns292.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv001s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv004s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv004s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv004s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv004s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv005s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv005s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv005s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv008s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv008s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv008s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv009s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv011s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv011s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv011s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv013s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv013s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv013s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv015s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv015s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv015s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv015s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv020s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv020s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv020s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv024s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv024s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv024s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv025s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv025s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv025s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv025s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv028s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv079s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv081s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv081s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv081s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv081s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv081s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv082s61.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv082s62.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv082s63.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv082s65.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s25.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s26.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s27.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv083s28.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv084s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv086s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv086s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv087s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv087s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv087s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv087s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv088s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv088s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv088s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv088s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv088s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv089s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv089s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv089s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv089s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv090s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv091s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv091s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv091s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv091s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv091s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv091s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv092s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv092s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv092s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv092s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv094s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv094s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv094s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv094s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv094s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv096s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv103s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv103s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv103s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv104s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv104s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv104s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv104s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv218s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv218s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv218s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv218s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv220s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv220s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv222s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv222s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv223s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv224s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv224s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv224s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv225s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv225s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv226s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv227s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv228s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv231s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv232s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv232s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv232s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv234s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv234s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv236s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv238s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv239s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv240s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv241s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv241s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv243s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv244s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv249s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv253s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv257s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns014.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns084.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns102.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_ns122.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv003s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv008s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv024s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv082s64.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv085s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv090s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv096s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv219s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv221s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv225s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv260s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv261s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv261s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv262s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv262s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv262s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv262s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv262s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv262s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv432s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv432s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv433s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv433s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv433s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv433s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv434s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv435s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv435s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv600s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv600s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv600s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv600s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv601s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv601s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv601s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv601s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv602s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv602s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv603s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv604s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv605s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv607s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv611s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv613s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv613s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv613s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv614s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv615s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv616s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv616s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv617s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv618s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv618s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv618s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv618s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv619s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv619s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv619s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv622s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv623s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv625s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv628s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv637s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv637s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv638s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv639s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv639s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv639s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv639s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv727s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv728s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv728s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv728s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv729s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv731s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv732s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv734s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv734s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv736s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv738s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv738s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv740s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv740s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv832s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_selpvback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_stgns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_tst.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_aetback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns035.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns036.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns039.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns040.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns041.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns042.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns043.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns044.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns045.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns046.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns047.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns048.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns049.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns051.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns052.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns053.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns054.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns055.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns057.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns058.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns059.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns060.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns062.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns063.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns064.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns065.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns066.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns067.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns068.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns069.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns070.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns071.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns072.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns073.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns075.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns076.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns077.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns078.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns079.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns081.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns082.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv037s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv037s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv037s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv038s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv039s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv039s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv039s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv040s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv041s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv043s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv044s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv044s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv044s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv046s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv046s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv047s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv047s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv047s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv047s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv047s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv048s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv050s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv051s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv051s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv051s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv051s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv053s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv055s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv055s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv057s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv058s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv058s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv060s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv061s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv062s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv063s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv064s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv064s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv066s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv208s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv212s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv213s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv214s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns001.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns002.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns003.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns004.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns005.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns006.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns007.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns008.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns009.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns010.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns012.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns013.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns014.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns015.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns016.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns017.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns018.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns019.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns020.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns021.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns022.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns023.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns024.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns025.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns026.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns029.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns030.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns032.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns033.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns034.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns083.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns084.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns085.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns086.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns087.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns088.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns089.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns090.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns091.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns093.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns095.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns096.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns097.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns098.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns101.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns102.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns103.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns104.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns106.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns107.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns108.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns109.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns111.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns112.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns113.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns114.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns115.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns116.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns117.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns118.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns121.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns122.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns123.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns124.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns125.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns126.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns221.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns223.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns249.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns257.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns263.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns266.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns272.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns292.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv259s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv435s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv608s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv621s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv729s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns037.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns056.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2ns074.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv042s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv051s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv061s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_d2pv065s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns011.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns031.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns099.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv003s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv005s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv005s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv005s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv007s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv008s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv008s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv008s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv008s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv009s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv011s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv011s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv011s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv011s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv011s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv013s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv013s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv013s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv015s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv015s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv019s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv020s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv020s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv020s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s19.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s20.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s22.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s23.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s27.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv028s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv079s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv081s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv082s61.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv082s62.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv082s64.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv082s65.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s26.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s27.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv083s28.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv084s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv085s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv086s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv087s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv087s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv087s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv087s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv088s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv088s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv088s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv088s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv088s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv089s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv089s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv090s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv090s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv092s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv094s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv094s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv094s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv094s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv096s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv096s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_PV097s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv103s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv103s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv103s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv104s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv104s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv104s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv104s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv218s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv218s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv218s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv219s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv220s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv220s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv220s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv222s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv222s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv224s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv224s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv224s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv225s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv225s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv225s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv226s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv227s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv228s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv228s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv228s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv228s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv232s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv232s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv232s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv233s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv233s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv233s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv234s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv234s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv236s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv238s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv239s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv001s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv004s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv008s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv013s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv024s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv025s21.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv082s63.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv086s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv091s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv094s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv218s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv221s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv223s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv231s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_d2pv065s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/fog_pv240s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_ns120.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv235s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns017.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv240s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv240s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv241s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv241s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv242s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv243s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv247s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv247s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv249s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv250s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv257s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv259s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv260s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv261s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv261s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv432s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv432s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv433s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv433s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv433s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv433s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv433s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv433s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv434s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv600s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv600s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv600s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv600s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv601s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv601s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv601s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv601s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv602s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv602s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv602s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv602s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv603s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv604s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv604s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv604s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv605s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv605s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv605s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv605s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv607s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv608s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv610s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv611s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv613s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv613s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv614s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv615s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv616s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv616s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv616s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv617s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv618s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv618s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv618s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv618s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv618s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv618s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv619s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv619s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv619s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv620s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv621s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv622s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv623s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv623s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv623s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv624s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv625s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv625s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv625s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv626s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv627s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv627s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv627s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv628s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv629s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv631s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv637s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv637s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv638s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv638s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv639s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv639s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv641s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv642s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv710s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv723s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv723s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv726s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv727s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv727s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv727s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv728s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv728s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv728s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv729s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv729s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv730s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv730s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv731s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv732s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv734s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv734s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv734s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv734s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv736s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv736s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv738s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv739s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv740s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv740s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv740s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv740s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv740s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv832s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_stgns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_tst.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_tst002.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_aetback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns035.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns036.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns037.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns039.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns040.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns042.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns043.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns044.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns045.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns046.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns047.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns048.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns053.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns054.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns055.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns056.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns057.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns058.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns059.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns060.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns062.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns063.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns066.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns067.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns068.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns069.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns071.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns073.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns075.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns076.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns077.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns078.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns079.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns081.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns082.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv037s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv039s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv039s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv039s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv040s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv041s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv042s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv042s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv043s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv044s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv044s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv044s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv047s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv047s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv047s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv047s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv047s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv048s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv050s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv051s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv051s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv051s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv051s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv053s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv058s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv058s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv060s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv061s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv062s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv063s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv063s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv063s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv063s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv064s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv065s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv065s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv065s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv208s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv212s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns001.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns002.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns005.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns006.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns007.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns008.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns009.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns010.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns011.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns012.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns013.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns024.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns025.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns031.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns032.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns083.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns084.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns087.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns088.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns089.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns090.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns093.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns095.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns096.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns097.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns098.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns099.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns100.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv240s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv253s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv262s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv435s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv604s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv617s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv625s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv639s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_pv731s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/glow_selpvback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns049.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2ns074.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv042s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv051s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_d2pv064s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns102.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns103.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns104.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns106.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns107.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns108.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns109.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns110.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns111.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns112.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns114.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns116.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns117.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns118.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns119.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns120.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns122.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns123.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns124.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns125.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns126.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns221.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns223.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns249.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns257.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns263.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns266.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns292.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv004s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv004s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv007s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv007s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv007s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv007s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv008s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv008s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv008s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv008s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv008s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv008s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv011s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv011s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv011s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv013s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv013s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv013s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv013s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv015s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv015s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv015s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv018s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv019s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv019s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv019s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv019s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv019s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s19.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s20.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s21.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s22.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s27.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv028s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv079s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv081s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv081s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv081s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv081s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv081s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv081s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv082s61.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv082s62.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv082s63.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv082s64.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv082s65.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s25.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s26.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s27.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s28.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv084s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv085s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv086s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv087s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv087s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv087s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv087s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv088s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv088s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv088s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv088s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv088s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv089s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv089s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv089s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv089s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv090s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv090s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv091s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv091s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv092s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv094s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv094s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv094s16.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv094s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv094s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv096s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_PV097s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv103s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv103s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv103s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv104s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv104s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv104s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv218s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv218s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv218s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv220s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv220s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv222s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv222s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv223s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv224s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv224s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv224s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv225s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv225s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv226s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv227s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv228s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv228s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv228s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv231s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv232s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv232s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv232s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv235s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv236s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv236s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv236s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns101.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_ns121.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv003s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv009s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv015s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv024s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv025s23.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv083s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv086s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv091s13.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv096s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv219s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv221s14.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv225s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv233s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv236s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv432s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv601s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv611s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv619s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv629s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv710s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv728s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv736s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_tst.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv236s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv236s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv238s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv240s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv240s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv240s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv241s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv241s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv242s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv243s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv246s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv247s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv247s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv249s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv250s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv253s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv257s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv259s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv259_old.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv260s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv261s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv261s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv262s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv432s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv433s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv433s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv433s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv433s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv433s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv433s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv434s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv435s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv441s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv600s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv600s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv600s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv600s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv601s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv601s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv601s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv602s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv602s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv602s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv602s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv603s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv604s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv604s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv604s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv604s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv604s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv605s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv605s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv605s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv607s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv610s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv612s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv613s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv613s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv613s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv614s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv615s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv616s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv616s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv616s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv617s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv617s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv618s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv618s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv618s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv618s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv618s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv619s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv619s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv619s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv620s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv621s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv622s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv623s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv623s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv624s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv625s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv625s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv626s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv627s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv627s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv627s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv628s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv630s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv630s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv631s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv637s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv637s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv638s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv638s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv639s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv639s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv639s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv639s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv639s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv642s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv710s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv710s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv710s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv723s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv723s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv724s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv724s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv724s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv726s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv727s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv727s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv728s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv728s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv729s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv729s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv730s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv730s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv731s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv732s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv734s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv734s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv734s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv734s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv736s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv738s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv739s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv740s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv740s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv740s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv740s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv740s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_pv832s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_selpvback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/light_stgns105.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_ns221.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv003s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv008s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv008s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv008s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv008s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv008s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv009s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv024s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv024s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv024s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv211_d2ns048.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv262s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv262s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv262s12.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv601s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv604s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv604s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv604s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv604s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv612s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv612s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv612s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv613s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv639s01_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv722s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv723s02_clone.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv732s02_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_pv732s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_selpvback.txt\n; 140616748778912  17:05.50 1989-05-24 rom/light_param/wind_tst.txt\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1203.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1209.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1215.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1216.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1254.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1272.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1415.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1514.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/dbg.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mik101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1217.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1229.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1230.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1237.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1245.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1252.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1256.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1258.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1263.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1264.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1265.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1266.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1267.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1268.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1269.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1270.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1271.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1273.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1274.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1275.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1276.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1277.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1278.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1279.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1306.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1307.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1308.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1309.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1317.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1318.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1403.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1406.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1411.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1412.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1413.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1414.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1416.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1417.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1418.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1419.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1512.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1513.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1515.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1516.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1606.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1707.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/cmnitm1708.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv243tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv244kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv244kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv244len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv244len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262kai100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262kai101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mei100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mei101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262mik100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262rin100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262rin101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv262tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv441tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv602tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609len003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609luk004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609mik003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609mik004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614len010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mik010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614sak010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv617tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624ext001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624ext002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637kai005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637luk003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637mei004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637mik003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637mik004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637mik005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv637rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641kai003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641len003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641luk003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641mei003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641mik003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641ner003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641rin003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641sak003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641tet003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722hak100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722kai100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722len100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722luk100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722mei100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722mik100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722ner100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722rin100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722sak100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv722tet100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv609mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv612mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614kai007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614luk003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614mei009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614rin005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv614tet009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv624tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv630rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641hak003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv641sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv725len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv726mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv730len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737hak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737kai002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737len001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737len002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737luk001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737luk002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737mei001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737mei002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737mik001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737mik002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737ner001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737ner002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737rin001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737rin002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737sak002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737tet001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737tet002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739hak100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739kai100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739len100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739luk100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739mei100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739mik100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739ner100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739rin100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739sak100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv739tet100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effmodulemik149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm300.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm400.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm403.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm406.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm320.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm322.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm323.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm324.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm327.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm328.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm330.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm341.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm342.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm520.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm522.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm523.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm524.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm541.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm542.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm707.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm750.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm751.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm775.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm809.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm810.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm815.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm820.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm822.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm824.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm827.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm828.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm829.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm831.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm834.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm837.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm842.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm309.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm321.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm322.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm324.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm326.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737sak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hakitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/hnditm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/itmpv616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/kaiitm841.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm328.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm336.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm339.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm340.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm519.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm521.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm522.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm523.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm524.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm525.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm535.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm537.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm538.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm540.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm542.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm770.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm771.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm775.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm807.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm808.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm810.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm811.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm812.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm814.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm815.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm819.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm822.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm824.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm825.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm826.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm828.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm831.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm833.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm834.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm836.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm837.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm839.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm842.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm997.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm317.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm320.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm324.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm326.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm328.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm330.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm335.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm336.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm339.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm341.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm342.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm512.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm513.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm514.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm515.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm516.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm517.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm535.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm537.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm538.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm539.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm540.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm542.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm810.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm815.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm817.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm825.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm829.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm830.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm833.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm836.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm837.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm840.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm841.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm309.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm320.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm321.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm322.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm323.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm324.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm327.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm330.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm333.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm512.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm513.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm514.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm515.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm521.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm522.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm524.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm525.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm707.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm775.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm809.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm816.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm820.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm821.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm823.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm827.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm828.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm831.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm833.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm809.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm838.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm525.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lukitm839.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm523.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/meiitm709.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv605kai001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/effchrpv737hak001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/lenitm327.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm540.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm331.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm110.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm128.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm129.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm130.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm131.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm132.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm133.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm134.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm135.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm136.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm138.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm139.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm140.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm141.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm142.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm143.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm144.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm145.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm146.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm147.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm148.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm149.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm151.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm152.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm153.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm155.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm156.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm160.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm162.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm163.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm164.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm165.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm166.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm167.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm169.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm170.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm173.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm306.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm308.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm317.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm318.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm319.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm321.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm322.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm323.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm325.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm326.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm327.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm332.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm335.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm336.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm338.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm339.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm340.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm341.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm342.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm343.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm345.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm349.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm350.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm353.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm357.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm360.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm361.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm364.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm365.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm366.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm368.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm369.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm370.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm371.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm372.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm373.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm374.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm375.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm376.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm377.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm379.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm380.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm381.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm382.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm384.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm387.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm388.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm389.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm392.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm393.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm394.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm395.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm396.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm397.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm398.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm399.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm400.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm401.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm402.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm404.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm405.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm410.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm411.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm412.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm413.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm414.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm415.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm416.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm418.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm419.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm420.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm423.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm424.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm427.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm428.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm429.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm431.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm436.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm437.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm438.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm439.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm443.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm444.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm445.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm446.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm447.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm448.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm449.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm450.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm451.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm455.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm460.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm462.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm463.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm464.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm466.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm467.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm469.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm470.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm473.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm520.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm522.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm524.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm525.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm537.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm538.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm539.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm541.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm542.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm543.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm544.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm545.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm546.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm547.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm548.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm549.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm550.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm551.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm552.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm553.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm554.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm555.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm556.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm557.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm137.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm158.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm310.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm333.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm363.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm383.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm409.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm458.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm559.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm560.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm593.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm594.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm595.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm596.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm597.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm598.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm599.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm606.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm632.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm633.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm634.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm635.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm636.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm643.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm644.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm645.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm647.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm648.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm649.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm651.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm652.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm653.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm655.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm656.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm658.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm660.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm662.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm663.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm664.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm665.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm667.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm669.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm670.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm707.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm708.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm709.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm711.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm712.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm713.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm714.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm715.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm716.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm718.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm719.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm720.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm721.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm741.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm742.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm743.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm745.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm746.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm747.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm748.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm749.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm750.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm751.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm752.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm770.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm771.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm772.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm773.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm775.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm776.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm777.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm778.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm779.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm781.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm782.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm783.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm784.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm790.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm791.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm804.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm833.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm834.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm835.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm836.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm837.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm838.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm839.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm840.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm841.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm842.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm851.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm852.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm856.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm857.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm863.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm865.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm866.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm868.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm869.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm873.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm874.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm876.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm878.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm879.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm880.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm882.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm884.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm893.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm894.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm895.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm896.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm897.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm899.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm900.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm901.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm902.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm904.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm905.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm910.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm913.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm914.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm915.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm916.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm917.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm924.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm926.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm927.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm928.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm931.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm932.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm933.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm934.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm935.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm936.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm937.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm938.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm939.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm940.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm941.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm942.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm943.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm945.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm946.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm947.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm948.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm949.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm951.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm956.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm958.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm962.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm963.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm965.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm966.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm967.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm970.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm973.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm997.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm998.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/neritm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/obj_db.bin\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm304.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm309.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm311.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm312.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm313.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm314.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm315.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm316.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm320.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm326.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm329.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm330.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm333.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm334.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm336.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm337.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm339.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm340.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm343.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm346.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm347.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm348.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm504.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm505.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm506.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm558.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm646.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm673.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm717.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm744.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm780.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm843.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm892.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm919.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm944.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/mikitm999.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm508.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm509.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm510.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm511.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm512.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm513.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm514.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm515.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm516.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm517.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm518.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm519.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm520.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm526.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm527.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm528.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm529.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm531.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm532.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm533.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm534.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm535.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm536.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm537.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm538.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm539.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm540.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm541.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm543.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm544.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm545.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm547.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm548.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm550.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm702.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm703.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm704.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm705.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm706.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm707.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm708.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm709.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm711.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm712.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm713.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm714.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm715.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm716.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm717.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm719.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm720.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm721.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm750.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm770.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm771.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm775.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm776.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm777.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm810.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm811.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm814.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm815.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm816.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm817.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm829.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm831.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm836.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm837.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm838.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm839.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm840.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm843.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm844.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm845.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm846.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm848.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm850.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm997.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm998.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm999.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm302.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm305.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm501.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm701.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm775.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/selcmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns035.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns036.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns068.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns069.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns070.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns071.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns072.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns073.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns074.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns076.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns077.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns078.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns080.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv037s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv037s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv037s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv038s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv039s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv039s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv039s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv040s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv041s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv042s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv043s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv044s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv044s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv044s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv045s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv046s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv048s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv048s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv048s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv050s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv051s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv051s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv051s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv051s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv051s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv052s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s15.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv055s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv055s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv056s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv057s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv058s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv058s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv060s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv061s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv061s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv062s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv064s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv064s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv066s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv208s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv212s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv213s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv214s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm507.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm530.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm718.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/rinitm826.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/sakitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2ns075.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv047s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv053s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv063s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgd2pv065s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns026.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns033.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns034.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns098.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns099.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns100.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns101.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns105.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns106.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns108.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns109.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns110.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns111.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns112.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns113.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns114.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns115.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns116.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns117.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns118.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns119.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns120.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns121.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns122.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns123.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns124.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns126.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns263.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns266.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns267.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns272.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns292.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv003s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv005s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv006s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv006s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv009s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv012s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv013s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv013s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv013s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv013s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv014s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv018s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv020s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv020s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv020s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv022s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s15.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s16.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s17.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s18.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s20.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s21.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s22.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s23.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s24.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s25.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s26.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s27.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv028s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv067.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv067s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv079s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s21.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s22.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s23.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s24.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s27.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s28.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s29.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s41.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s42.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s51.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s52.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s53.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns107.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgns125.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv001s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv004s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv007s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv008s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv011s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv015s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv019s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv025s19.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv081s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s55.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s61.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s15.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s16.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s17.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s18.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s19.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s20.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s21.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s22.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s23.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s24.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s25.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s26.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s27.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s28.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv084s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv085s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv086s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv086s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s15.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s16.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s17.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv089s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv089s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv089s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv089s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv089s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv090s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv090s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv093s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s15.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s16.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s17.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s18.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s19.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s20.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv095s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv097s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv103s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv103s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv103s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv104s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv104s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv104s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv218s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv218s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv218s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv218s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv220s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv220s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv220s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv222s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv222s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv224s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv224s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv224s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv224s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv225s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv225s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv225s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv226s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv227s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv228s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv228s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv228s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv231s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv232s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv232s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv232s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv234s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv234s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv235s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv235s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv235s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv235s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv235s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv236s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv238s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv239s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv240s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv240s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv240s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv241s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv241s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv241s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv082s54.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv083s14.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv087s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv088s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv091s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv092s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv094s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv096s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv104s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv219s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv221s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv223s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv228s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv233s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv242s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv243s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv244s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv244s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv246s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv247s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv248s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv248s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv248s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv248s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv249s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv250s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv253s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv255hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv255s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv257s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv259s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv260s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv261hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv261s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv261s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s09.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s10.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s11.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s12.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s13.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv432hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv432s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv432s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv432s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv434hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv434s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv435s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv441.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv441s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv600hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv600s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv600s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv600s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv600s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv601hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv601s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv601s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv601s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv601s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv602hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv602s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv602s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv602s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv603s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv604s07.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv605s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv605s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv605s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv605s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv605s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv607hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv608hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv608s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv609hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv609s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv609s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv609s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv610s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv610s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv610s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv611s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv612hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv612s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv612s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv612s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv613hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv613s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv613s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv613s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv614s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv615s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv616s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv616s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv616s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv617hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv617s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv617s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv617s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv617s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv619s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv619s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv619s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv619s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv620s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv621s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv622hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv622s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv623hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv623s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv623s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv623s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv624s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv624s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv625s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv626s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv626s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv627s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv627s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv627s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv628s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv628s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv629s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv630s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv631s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv631s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv637hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv637s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv638s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv638s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv639s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv640hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv640s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv640s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv641hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv642hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv642s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv642s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv642s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv642s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv710hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv710s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv710s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv710s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv710s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv722s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv723s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv723s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv241s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv248s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv251s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv262s08.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv433s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv602s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv607s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv612s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv615hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv618s06.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv628hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv637s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv641s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv727hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv731s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv740s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv724s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv725hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv725s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv725s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv725s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv725s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv726hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv726s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv727s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv728s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv728s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv728s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv729hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv729s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv729s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv730hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv730s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv730s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv731s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv731s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv732hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv732s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv732s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv732s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733s03.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv733s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv734s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv734s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv734s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv734s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv736hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv736s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv736s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv737hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv737s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv737s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv738hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv738s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv738s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv739hrc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv739s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv740s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv740s02.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv740s04.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv740s05.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgpv832s01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/stgtst010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm000.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm301.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm303.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm500.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm502.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm503.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tetitm700.farc\n; 140616748778912  17:05.50 1989-05-24 rom/objset/tex_db.bin\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm022_joha_outer_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm032_joha_outer_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm546_atam_atama_46__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/hakitm700_atam_zujo_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm008_joha_outer_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm009_joha_outer_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm010_joha_outer_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm011_joha_outer_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm012_joha_outer_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm015_joha_outer_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm016_joha_outer_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm018_joha_outer_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm019_joha_outer_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm020_joha_outer_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm022_joha_outer_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm024_joha_outer_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm027_joha_outer_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm028_joha_outer_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm029_joha_outer_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm030_joha_outer_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm031_joha_outer_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm032_joha_outer_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm033_joha_outer_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm034_joha_outer_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm036_joha_outer_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm041_joha_outer_41__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm042_joha_outer_42__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm503_atam_atama_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm504_atam_atama_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm505_atam_atama_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm506_atam_atama_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm507_atam_atama_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm508_atam_atama_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm509_atam_atama_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm510_atam_atama_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm520_atam_atama_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm522_atam_atama_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm523_atam_atama_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm527_atam_atama_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm528_atam_atama_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm529_atam_atama_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm531_atam_atama_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm532_atam_atama_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm533_atam_atama_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm534_atam_atama_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm536_atam_atama_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm541_atam_atama_41__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm542_atam_atama_42__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm701_atam_zujo_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm705_atam_zujo_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm750_joha_neck_50__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm751_joha_neck_51__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm775_joha_ushiro_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm005_joha_outer_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm007_joha_outer_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm008_joha_outer_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm009_joha_outer_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm010_joha_outer_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm006_joha_outer_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm025_joha_outer_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm524_atam_atama_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/kaiitm706_atam_zujo_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm011_joha_outer_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm025_joha_outer_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm040_joha_outer_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm522_atam_atama_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm536_atam_atama_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm008_joha_outer_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm012_joha_outer_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm013_joha_outer_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm014_joha_outer_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm015_joha_outer_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm016_joha_outer_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm017_joha_outer_17__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm018_joha_outer_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm019_joha_outer_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm021_joha_outer_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm022_joha_outer_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm023_joha_outer_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm024_joha_outer_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm026_joha_outer_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm027_joha_outer_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm028_joha_outer_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm029_joha_outer_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm030_joha_outer_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm031_joha_outer_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm032_joha_outer_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm033_joha_outer_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm034_joha_outer_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm035_joha_outer_35__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm036_joha_outer_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm038_joha_outer_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm503_atam_atama_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm504_atam_atama_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm505_atam_atama_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm506_atam_atama_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm508_atam_atama_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm509_atam_atama_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm511_atam_atama_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm519_atam_atama_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm521_atam_atama_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm523_atam_atama_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm524_atam_atama_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm525_atam_atama_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm526_atam_atama_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm528_atam_atama_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm529_atam_atama_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm530_atam_atama_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm531_atam_atama_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm532_atam_atama_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm533_atam_atama_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm534_atam_atama_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm535_atam_atama_35__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm537_atam_atama_37__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm538_atam_atama_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm540_atam_atama_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm700_atam_zujo_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lenitm775_joha_ushiro_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm001_joha_outer_01_zzc__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm005_joha_outer_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm006_joha_outer_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm007_joha_outer_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm009_joha_outer_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm010_joha_outer_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm011_joha_outer_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm012_joha_outer_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm013_joha_outer_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm014_joha_outer_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm015_joha_outer_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm017_joha_outer_17_zzc__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm018_joha_outer_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm019_joha_outer_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm020_joha_outer_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm021_joha_outer_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm023_joha_outer_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm024_joha_outer_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm025_joha_outer_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm026_joha_outer_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm027_joha_outer_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm028_joha_outer_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm029_joha_outer_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm030_joha_outer_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm031_joha_outer_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm032_joha_outer_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm033_joha_outer_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm034_joha_outer_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm036_joha_outer_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm037_joha_outer_37__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm038_joha_outer_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm039_joha_outer_39__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm040_joha_outer_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm042_joha_outer_42__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm311_ude_hand_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm503_atam_atama_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm504_atam_atama_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm506_atam_atama_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm507_atam_atama_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm508_atam_atama_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm509_atam_atama_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm510_atam_atama_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm511_atam_atama_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm512_atam_atama_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm513_atam_atama_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm514_atam_atama_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm515_atam_atama_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm516_atam_atama_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm517_atam_atama_17__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm526_atam_atama_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm527_atam_atama_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm528_atam_atama_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm529_atam_atama_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm530_atam_atama_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm531_atam_atama_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm532_atam_atama_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm533_atam_atama_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm534_atam_atama_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm535_atam_atama_35__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm536_atam_atama_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm537_atam_atama_37__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm539_atam_atama_39__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm540_atam_atama_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm542_atam_atama_42__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm700_atam_zujo_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm702_atam_zujo_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm703_atam_zujo_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm705_atam_zujo_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm005_joha_outer_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm008_joha_outer_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm009_joha_outer_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm010_joha_outer_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm011_joha_outer_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm012_joha_outer_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm013_joha_outer_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm014_joha_outer_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm015_joha_outer_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm016_joha_outer_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm017_joha_outer_17_zzc__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm018_joha_outer_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm019_joha_outer_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm021_joha_outer_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm022_joha_outer_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm023_joha_outer_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm024_joha_outer_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm025_joha_outer_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm026_joha_outer_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm027_joha_outer_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm028_joha_outer_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm029_joha_outer_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm030_joha_outer_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm032_joha_outer_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm033_joha_outer_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm503_atam_atama_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm504_atam_atama_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm505_atam_atama_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm506_atam_atama_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm507_atam_atama_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm508_atam_atama_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm509_atam_atama_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm510_atam_atama_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm511_atam_atama_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm512_atam_atama_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm514_atam_atama_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm515_atam_atama_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm521_atam_atama_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm522_atam_atama_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm523_atam_atama_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm524_atam_atama_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm525_atam_atama_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm526_atam_atama_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm527_atam_atama_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm528_atam_atama_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm529_atam_atama_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm530_atam_atama_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm533_atam_atama_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm700_atam_zujo_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm701_atam_zujo_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm702_atam_zujo_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm704_atam_zujo_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm705_atam_zujo_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm709_atam_zujo_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm775_joha_ushiro_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm006_joha_outer_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm007_joha_outer_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm008_joha_outer_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm009_joha_outer_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm010_joha_outer_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm011_joha_outer_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm012_joha_outer_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm013_joha_outer_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm014_joha_outer_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm015_joha_outer_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm016_joha_outer_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm017_joha_outer_17__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm019_joha_outer_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm020_joha_outer_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm021_joha_outer_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm022_joha_outer_22_zzc__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm023_joha_outer_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm024_joha_outer_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm025_joha_outer_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm026_joha_outer_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm027_joha_outer_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm029_joha_outer_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm030_joha_outer_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm031_joha_outer_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm038_joha_outer_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm040_joha_outer_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm041_joha_outer_41__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm042_joha_outer_42__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm043_joha_outer_43__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm044_joha_outer_44__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm045_joha_outer_45__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm046_joha_outer_46__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm047_joha_outer_47__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm048_joha_outer_48__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm049_joha_outer_49__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm050_joha_outer_50__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm035_joha_outer_35__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm505_atam_atama_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm525_atam_atama_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/lukitm538_atam_atama_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm006_joha_outer_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm020_joha_outer_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm513_atam_atama_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/meiitm532_atam_atama_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm005_joha_outer_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm018_joha_outer_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm052_joha_outer_52__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm053_joha_outer_53__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm054_joha_outer_54__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm055_joha_outer_55__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm056_joha_outer_56__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm057_joha_outer_57__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm058_joha_outer_58__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm059_joha_outer_59__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm060_joha_outer_60__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm061_joha_outer_61__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm063_joha_outer_63__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm064_joha_outer_64__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm066_joha_outer_66__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm067_joha_outer_67__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm068_joha_outer_68__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm069_joha_outer_69__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm070_joha_outer_70__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm071_joha_outer_71__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm072_joha_outer_72__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm073_joha_outer_73__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm074_joha_outer_74__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm075_joha_outer_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm076_joha_outer_76__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm077_joha_outer_77__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm079_joha_outer_79__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm080_joha_outer_80__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm081_joha_outer_81__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm082_joha_outer_82__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm083_joha_outer_83__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm084_joha_outer_84__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm085_joha_outer_85__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm087_joha_outer_87__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm088_joha_outer_88__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm089_joha_outer_89__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm090_joha_outer_90__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm091_joha_outer_91__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm093_joha_outer_93__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm094_joha_outer_94__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm095_joha_outer_95__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm096_joha_outer_96__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm097_joha_outer_97__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm098_joha_outer_98__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm099_joha_outer_99__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm100_joha_outer_100__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm101_joha_outer_101__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm102_joha_outer_102__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm103_joha_outer_103__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm104_joha_outer_104__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm106_joha_outer_106__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm107_joha_outer_107__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm108_joha_outer_108__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm109_joha_outer_109__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm110_joha_outer_110__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm111_joha_outer_111__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm112_joha_outer_112__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm113_joha_outer_113__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm114_joha_outer_114__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm115_joha_outer_115__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm116_joha_outer_116__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm118_joha_outer_118__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm120_joha_outer_120__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm123_joha_outer_123__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm124_joha_outer_124__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm125_joha_outer_125__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm126_joha_outer_126__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm127_joha_outer_127__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm128_joha_outer_128__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm129_joha_outer_129__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm130_joha_outer_130__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm131_joha_outer_131__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm132_joha_outer_132__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm133_joha_outer_133__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm135_joha_outer_135__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm136_joha_outer_136__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm137_joha_outer_137__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm138_joha_outer_138__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm139_joha_outer_139__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm140_joha_outer_140__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm141_joha_outer_141__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm142_joha_outer_142__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm143_joha_outer_143__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm144_joha_outer_144__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm145_joha_outer_145__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm146_joha_outer_146__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm148_joha_outer_148__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm149_joha_outer_149__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm151_joha_outer_151__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm152_joha_outer_152__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm153_joha_outer_153__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm155_joha_outer_155__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm156_joha_outer_156__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm158_joha_outer_158__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm160_joha_outer_160__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm162_joha_outer_162__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm163_joha_outer_163__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm164_joha_outer_164__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm167_joha_outer_167__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm169_joha_outer_169__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm170_joha_outer_170__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm173_joha_outer_173__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm431_ude_hand_131__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm438_ude_hand_138__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm467_ude_hand_167__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm504_atam_atama_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm505_atam_atama_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm507_atam_atama_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm508_atam_atama_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm509_atam_atama_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm520_atam_atama_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm522_atam_atama_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm524_atam_atama_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm525_atam_atama_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm526_atam_atama_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm527_atam_atama_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm528_atam_atama_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm530_atam_atama_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm531_atam_atama_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm533_atam_atama_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm534_atam_atama_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm536_atam_atama_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm537_atam_atama_37__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm538_atam_atama_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm539_atam_atama_39__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm540_atam_atama_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm541_atam_atama_41__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm542_atam_atama_42__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm543_atam_atama_43__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm544_atam_atama_44__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm545_atam_atama_45__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm547_atam_atama_47__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm548_atam_atama_48__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm549_atam_atama_49__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm550_atam_atama_50__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm551_atam_atama_51__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm552_atam_atama_52__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm553_atam_atama_53__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm554_atam_atama_54__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm555_atam_atama_55__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm556_atam_atama_56__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm557_atam_atama_57__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm558_atam_atama_58__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm051_joha_outer_51__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm065_joha_outer_65__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm078_joha_outer_78__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm092_joha_outer_92__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm105_joha_outer_105__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm119_joha_outer_119__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm134_joha_outer_134__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm147_joha_outer_147__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm165_joha_outer_165__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm506_atam_atama_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm532_atam_atama_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm560_atam_atama_60__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm593_atam_atama_93__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm594_atam_atama_94__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm595_atam_atama_95__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm596_atam_atama_96__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm597_atam_atama_97__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm598_atam_atama_98__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm599_atam_atama_99__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm600_atam_atama_100__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm601_atam_atama_101__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm602_atam_atama_102__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm603_atam_atama_103__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm605_atam_atama_105__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm606_atam_atama_106__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm607_atam_atama_107__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm608_atam_atama_108__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm609_atam_atama_109__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm610_atam_atama_110__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm611_atam_atama_111__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm612_atam_atama_112__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm613_atam_atama_113__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm614_atam_atama_114__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm615_atam_atama_115__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm616_atam_atama_116__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm619_atam_atama_119__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm620_atam_atama_120__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm621_atam_atama_121__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm623_atam_atama_123__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm624_atam_atama_124__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm625_atam_atama_125__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm626_atam_atama_126__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm627_atam_atama_127__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm628_atam_atama_128__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm630_atam_atama_130__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm631_atam_atama_131__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm632_atam_atama_132__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm634_atam_atama_134__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm635_atam_atama_135__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm636_atam_atama_136__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm637_atam_atama_137__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm638_atam_atama_138__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm639_atam_atama_139__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm640_atam_atama_140__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm641_atam_atama_141__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm642_atam_atama_142__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm643_atam_atama_143__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm644_atam_atama_144__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm645_atam_atama_145__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm647_atam_atama_147__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm648_atam_atama_148__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm649_atam_atama_149__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm651_atam_atama_151__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm652_atam_atama_152__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm653_atam_atama_153__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm655_atam_atama_155__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm656_atam_atama_156__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm658_atam_atama_158__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm660_atam_atama_160__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm662_atam_atama_162__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm663_atam_atama_163__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm665_atam_atama_165__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm667_atam_atama_167__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm669_atam_atama_169__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm670_atam_atama_170__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm673_atam_atama_173__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm700_atam_zujo_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm702_atam_zujo_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm709_atam_zujo_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm711_atam_zujo_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm715_atam_zujo_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm718_atam_zujo_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm721_atam_zujo_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm722_atam_zujo_22__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm746_atam_zujo_46__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm748_atam_zujo_48__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm749_atam_zujo_49__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm751_joha_neck_51__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm752_joha_neck_52__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm775_joha_ushiro_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm776_joha_ushiro_76__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm777_joha_ushiro_77__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm780_joha_ushiro_80__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm781_joha_ushiro_81__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm782_joha_ushiro_82__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm783_joha_ushiro_83__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm784_joha_ushiro_84__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/neritm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/neritm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/neritm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/neritm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/neritm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/neritm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/opd_db.txt\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm004_joha_outer_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm006_joha_outer_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm007_joha_outer_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm009_joha_outer_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm010_joha_outer_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm011_joha_outer_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm012_joha_outer_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm013_joha_outer_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm014_joha_outer_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm015_joha_outer_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm016_joha_outer_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm017_joha_outer_17__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm018_joha_outer_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm020_joha_outer_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm021_joha_outer_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm023_joha_outer_23__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm024_joha_outer_24__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm025_joha_outer_25__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm026_joha_outer_26_zzc__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm027_joha_outer_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm028_joha_outer_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm029_joha_outer_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm030_joha_outer_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm031_joha_outer_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm032_joha_outer_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm034_joha_outer_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm035_joha_outer_35__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm036_joha_outer_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm037_joha_outer_37__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm038_joha_outer_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm039_joha_outer_39__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm040_joha_outer_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm041_joha_outer_41__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm043_joha_outer_43__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm044_joha_outer_44__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm045_joha_outer_45__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm047_joha_outer_47__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm503_atam_atama_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm504_atam_atama_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm505_atam_atama_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm506_atam_atama_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm507_atam_atama_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm508_atam_atama_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm509_atam_atama_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm510_atam_atama_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm511_atam_atama_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm559_atam_atama_59__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm604_atam_atama_104__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm618_atam_atama_118__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm633_atam_atama_133__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm646_atam_atama_146__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm664_atam_atama_164__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm745_atam_zujo_45__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/mikitm790_atam_zujo_90__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm005_joha_outer_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm019_joha_outer_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm033_joha_outer_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm048_joha_outer_48__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm512_atam_atama_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm530_atam_atama_30__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm544_atam_atama_44__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm711_atam_zujo_11__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm999_atam_zujo_99__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm513_atam_atama_13__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm514_atam_atama_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm515_atam_atama_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm516_atam_atama_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm517_atam_atama_17__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm518_atam_atama_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm519_atam_atama_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm520_atam_atama_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm526_atam_atama_26__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm527_atam_atama_27__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm528_atam_atama_28__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm529_atam_atama_29__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm531_atam_atama_31__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm532_atam_atama_32__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm533_atam_atama_33__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm534_atam_atama_34__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm535_atam_atama_35__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm536_atam_atama_36__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm537_atam_atama_37__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm538_atam_atama_38__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm539_atam_atama_39__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm540_atam_atama_40__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm541_atam_atama_41__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm543_atam_atama_43__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm545_atam_atama_45__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm547_atam_atama_47__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm548_atam_atama_48__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm701_atam_zujo_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm702_atam_zujo_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm703_atam_zujo_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm704_atam_zujo_04__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm705_atam_zujo_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm706_atam_zujo_06__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm707_atam_zujo_07__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm708_atam_zujo_08__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm709_atam_zujo_09__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm710_atam_zujo_10__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm712_atam_zujo_12__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm714_atam_zujo_14__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm715_atam_zujo_15__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm716_atam_zujo_16__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm717_atam_zujo_17__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm718_atam_zujo_18__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm719_atam_zujo_19__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm720_atam_zujo_20__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm721_atam_zujo_21__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm775_joha_ushiro_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm776_joha_ushiro_76__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/rinitm777_joha_ushiro_77__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm005_joha_outer_05__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm501_atam_atama_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/sakitm775_joha_ushiro_75__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/tetitm001_joha_outer_01__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/tetitm002_joha_outer_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/tetitm003_joha_outer_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/tetitm500_atam_atama_00__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/tetitm502_atam_atama_02__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/osage_play_data/tetitm503_atam_atama_03__divskn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv247_cookie.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv247_offset_test.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv247_star.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv249_kirakira.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv250_burneer.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv250_taxi.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv250_yuge.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_hanabi.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_hanabi_test.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_konpei.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_light_glow.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_light_glow_test.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_moyasmoke.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_s05_coaster.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_smoke.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv255_onpu.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv262_light_glow.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv604_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv604_tail.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv710_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv710_success.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv717_rain.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV722_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv723_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv723_success.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV724_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV726_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv726_success.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV727_cut042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV727_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV728_cut050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV728_cut051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv728_cut127.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV728_lightbar.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV728_lightbar_climax.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV728_lightbar_nomalmax.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV728_smoke.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv729_gimmick.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv729_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv729_reef.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv729_steam_1f.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv729_steam_2f.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv729_steam_3f.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_ayasaki.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_katana_aura_p1.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_miku.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_miku_delete.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_reef.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_stop.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_sword_p1.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV732_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv733_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv733_rain.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV734_hibana.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV734_hibana_n.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV734_hibana_s.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV734_hibana_success.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_hinoko.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_hokori.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv253_smoke_cloud.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv728_cut011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv731_katana_aura_p2.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_lightchip.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_nor.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_nor_hinoko.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_spark.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_suc.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv734_suc_hinoko.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV734_thunder.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_barbroken.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_bubble.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_bubble01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_chip.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_crushball.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_crushball01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_cubebird.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_dustchip01.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_guitar.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV736_whitechip.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv737_breath.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv737_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV737_shitsunai.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv738_card_particle.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv738_success.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv738_success_start.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV739_daiza.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV739_fireworks.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV739_hover.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_kirakira.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_kirakira_hand.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_kirakira_line.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_kirakira_line_jikki.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_light.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_main_jikki.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_PV739_monitor.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_smoke.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_star.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_star_down.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv739_star_jikki.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv740_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv740_mik_foot.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv740_mik_room.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv740_mik_sky.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv740_skyonpu.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_pv740_success.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_stgpv832_cream_snow.farc\n; 140616748778912  17:05.50 1989-05-24 rom/particle/eff_stgpv832_main.farc\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/aime_frame.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/header01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/header02.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_img01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_img02.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_img03_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_img04_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_pity01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_pity02.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_pity03.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_pity04.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ic_pity05.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/img01_sample.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/img02_sample.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/img03_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/img04_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/pity01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/pity02.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/pity03.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/pity04.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/pity05.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights01.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights01_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights02_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights03.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights03_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights04_l.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights04_l_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights04_r.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights04_r_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ss_rights05.tga\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV206.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV219.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV238.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV239.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV240.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV241.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV242.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV243.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV244.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV246.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV247.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV248.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV249.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV250.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV251.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV253.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV255.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV259.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV260.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV261.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV262.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV432.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV433.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV434.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV435.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV600.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV601.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV602.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV603.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV604.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV605.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV607.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV608.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV609.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV611.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV612.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV613.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV614.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV615.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV616.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV617.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV618.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV619.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV620.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV621.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV622.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV623.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV624.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV625.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV626.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV627.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV629.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV630.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV631.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV637.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV638.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV639.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV640.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV641.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV642.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV710.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV722.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV723.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV724.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV725.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV726.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV727.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV728.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV729.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV730.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV731.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV732.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV733.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV734.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV736.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV737.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV738.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV739.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV740.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV832.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV257.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV610.bin\n; 140616748778912  17:05.50 1989-05-24 rom/pv_expression/exp_PV628.bin\n; 140616748778912  17:05.50 1989-05-24 rom/ranking/dummy_thumb.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_HAK.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_KAI.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_LEN.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_LUK.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_MEI.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_MIK.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_NER.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_RIN.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_AUTH_SAK.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_CMN.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_EDT.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_EDT2.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_EDTF1.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV001.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV002.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV003.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV005.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV006.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV007.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV008.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV009.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV010.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV011.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV012.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV013.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV014.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV015.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV016.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV017.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV018.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV019.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV020.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV022.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV023.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV024.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV025.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV027.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV028.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV029.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV030.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV031.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV032.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV037.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV038.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV039.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV040.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV041.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV042.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV044.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV045.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV046.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV047.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV048.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV049.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV050.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV051.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV052.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV053.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV054.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV055.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV056.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV057.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV058.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV059.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV004.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV021.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV043.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV060.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV090.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV208.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV231.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV250.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV604.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV622.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV722.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV740.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV012.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV061.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV062.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV063.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV064.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV065.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV066.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV079.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV081.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV082.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV083.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV084.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV085.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV086.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV087.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV088.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV089.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV091.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV092.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV093.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV094.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV095.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV096.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV097.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV102.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV103.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV104.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV201.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV202.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV204.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV205.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV206.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV207.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV210.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV211.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV212.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV213.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV214.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV218.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV219.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV220.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV221.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV222.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV223.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV224.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV225.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV226.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV227.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV228.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV232.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV233.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV234.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV235.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV236.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV238.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV239.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV240.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV241.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV242.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV243.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV244.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV246.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV247.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV248.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV249.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV251.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV253.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV255.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV257.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV259.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV260.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV261.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV262.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV432.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV433.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV434.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV435.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV600.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV601.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV602.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV603.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV605.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV607.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV608.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV609.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV610.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV611.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV612.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV613.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV614.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV615.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV616.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV617.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV618.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV619.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV620.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV621.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV623.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV624.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV625.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV626.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV627.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV628.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV629.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV630.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV631.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV637.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV638.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV639.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV640.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV641.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV642.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV710.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV723.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV724.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV725.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV726.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV727.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV728.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV729.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV730.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV731.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV732.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV733.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV734.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV736.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV737.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV738.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV739.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_PV832.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mothead_TEST_DESIGN.bin\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_ALL_SELECTOR_POSE.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_AUTH_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_CMN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_db.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_EDT.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_EDT2.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_EDTF1.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV001.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV002.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV003.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV004.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV005.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV006.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV007.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV008.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV009.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV010.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV011.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV013.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV014.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV015.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV016.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV017.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV018.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV019.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV020.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV021.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV022.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV023.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV024.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV025.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV027_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV028.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV029_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV030_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV037.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV038.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV039.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV040.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV041.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV042.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV043.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV044.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV045.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV046.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV047.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV048.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV049.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV050.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV052.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV053.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV054.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV055.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV056.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV057.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV058.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV059.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV060.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV061.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV062.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV063.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV064.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV065.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV066.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV079.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV081.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV083.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV084.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV085.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV086.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV087.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV088.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV089.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV090.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV091.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV092.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV093.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV094.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV095.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV096.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV097.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV104_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV205_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV208_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV212_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV213.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV219_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV031_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV032_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV051.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV082.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV102_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV103_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV201.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV202_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV204_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV206_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV207_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV210_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV211_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV214_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV218_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV255.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV609.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV627.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV220_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV221_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV222_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV223_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV224_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV225_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV226.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV227.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV228.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV231_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV232_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV233_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV234_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_NER.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV235_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_HAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_KAI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_LEN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_LUK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_MEI.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_MIK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV236_FACE_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV238.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV239.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV240.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV241.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV242.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV243.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV244.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV246.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV247.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV248.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV249.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV250.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV251.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV253.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV257.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV259.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV260.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV261.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV262.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV432.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV433.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV434.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV435.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV600.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV601.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV602.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV603.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV604.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV605.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV607.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV608.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV610.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV611.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV612.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV613.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV614.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV615.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV616.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV617.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV618.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV619.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV620.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV621.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV622.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV623.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV624.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV625.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV626.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV628.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV629.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV630.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV631.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV637.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV638.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV639.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV640.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV641.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV642.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV710.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV722.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV723.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV724.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV725.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV726.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV727.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV728.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV729.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV730.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV731.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV732.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV733.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV734.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV736.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV737.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV738.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV739.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV740.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_PV832.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_RIN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_SAK.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_TEST_DESIGN.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/mot_TET.farc\n; 140616748778912  17:05.50 1989-05-24 rom/rob/rob_mot_tbl.bin\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_079_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_260_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_001_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_001_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_001_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_001_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_001_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_002_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_002_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_002_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_002_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_002_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_003_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_003_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_003_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_003_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_003_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_004_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_004_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_005_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_005_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_005_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_005_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_005_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_006_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_006_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_006_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_006_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_007_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_007_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_007_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_007_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_008_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_008_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_008_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_008_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_009_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_009_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_009_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_010_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_010_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_010_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_010_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_011_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_011_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_011_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_011_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_011_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_012_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_012_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_012_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_013_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_013_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_013_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_014_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_014_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_014_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_014_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_015_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_015_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_015_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_015_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_016_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_016_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_016_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_017_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_017_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_017_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_017_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_004_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_008_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_013_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_018_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_023_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_027_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_031_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_039_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_043_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_046_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_050_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_054_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_058_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_061_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_065_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_018_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_018_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_019_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_019_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_019_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_019_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_020_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_020_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_020_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_020_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_021_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_021_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_021_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_022_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_022_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_022_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_022_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_023_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_023_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_023_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_023_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_024_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_024_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_024_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_024_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_024_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_025_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_025_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_025_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_025_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_027_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_027_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_027_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_027_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_028_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_028_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_028_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_028_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_028_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_029_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_029_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_029_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_029_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_030_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_030_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_030_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_030_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_030_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_031_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_031_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_031_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_032_encore.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_032_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_032_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_032_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_032_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_037_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_037_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_037_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_037_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_037_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_038_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_038_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_038_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_038_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_038_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_039_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_039_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_039_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_039_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_040_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_040_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_040_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_040_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_040_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_041_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_041_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_041_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_041_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_042_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_042_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_042_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_042_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_043_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_043_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_043_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_043_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_044_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_044_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_044_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_044_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_045_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_045_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_045_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_045_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_045_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_046_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_046_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_046_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_046_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_047_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_047_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_047_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_047_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_048_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_048_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_048_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_048_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_049_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_049_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_049_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_049_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_049_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_050_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_050_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_050_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_050_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_051_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_051_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_051_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_051_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_051_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_052_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_052_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_052_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_052_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_052_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_053_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_053_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_053_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_053_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_053_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_054_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_054_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_054_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_054_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_055_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_055_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_055_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_055_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_055_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_056_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_056_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_056_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_056_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_057_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_057_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_057_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_057_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_057_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_058_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_058_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_058_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_058_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_059_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_059_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_059_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_059_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_059_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_060_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_060_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_060_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_060_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_060_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_061_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_061_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_061_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_061_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_062_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_062_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_062_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_062_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_062_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_063_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_063_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_063_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_063_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_063_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_064_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_064_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_064_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_064_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_064_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_065_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_065_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_065_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_065_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_066_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_066_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_066_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_066_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_066_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_067_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_067_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_067_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_068_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_068_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_068_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_068_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_079_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_079_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_079_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_081_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_081_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_081_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_081_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_081_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_082_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_082_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_082_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_082_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_082_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_083_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_083_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_083_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_083_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_084_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_084_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_084_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_084_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_085_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_085_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_085_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_085_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_086_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_086_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_086_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_086_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_087_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_087_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_087_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_087_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_087_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_088_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_088_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_088_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_088_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_089_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_089_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_089_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_089_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_089_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_090_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_090_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_090_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_090_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_090_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_091_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_091_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_091_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_091_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_092_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_092_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_092_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_093_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_093_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_093_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_093_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_094_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_094_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_094_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_094_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_094_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_095_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_095_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_095_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_095_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_096_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_096_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_096_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_096_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_097_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_097_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_097_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_097_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_101_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_101_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_101_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_101_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_102_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_102_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_102_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_102_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_103_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_103_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_103_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_104_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_104_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_201_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_201_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_201_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_201_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_202_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_202_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_202_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_202_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_203_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_203_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_203_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_204_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_204_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_204_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_204_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_205_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_205_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_206_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_206_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_206_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_206_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_207_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_207_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_207_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_208_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_208_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_208_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_208_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_208_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_209_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_209_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_209_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_210_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_210_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_210_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_210_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_211_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_211_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_211_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_211_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_212_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_212_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_212_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_212_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_213_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_213_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_213_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_213_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_214_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_214_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_214_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_215_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_215_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_215_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_216_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_216_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_216_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_216_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_218_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_218_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_218_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_219_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_219_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_219_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_219_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_220_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_220_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_220_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_220_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_221_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_221_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_221_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_221_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_221_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_222_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_222_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_222_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_223_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_223_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_223_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_224_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_224_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_224_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_225_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_225_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_225_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_225_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_226_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_226_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_226_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_226_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_227_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_227_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_227_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_228_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_228_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_228_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_231_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_231_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_231_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_232_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_232_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_232_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_232_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_232_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_233_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_233_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_233_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_234_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_234_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_234_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_234_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_234_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_235_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_235_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_235_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_236_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_236_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_236_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_238_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_238_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_238_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_238_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_239_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_239_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_239_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_240_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_240_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_240_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_241_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_241_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_241_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_241_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_242_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_242_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_242_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_243_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_243_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_243_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_243_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_244_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_244_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_244_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_244_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_246_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_246_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_246_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_247_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_247_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_247_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_248_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_248_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_248_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_248_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_249_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_249_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_249_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_249_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_250_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_250_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_250_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_250_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_251_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_251_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_251_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_251_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_253_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_253_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_253_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_255_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_255_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_255_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_255_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_257_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_257_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_257_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_257_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_259_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_259_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_259_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_259_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_260_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_260_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_260_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_261_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_261_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_261_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_261_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_262_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_262_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_262_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_262_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_265_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_265_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_265_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_265_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_401_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_401_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_401_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_401_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_402_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_084_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_088_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_092_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_096_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_104_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_205_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_209_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_214_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_219_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_224_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_231_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_235_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_242_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_247_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_253_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_402_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_402_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_402_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_403_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_403_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_403_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_403_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_404_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_404_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_404_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_404_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_405_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_405_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_405_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_405_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_405_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_407_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_407_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_407_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_408_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_408_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_408_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_409_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_409_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_409_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_409_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_410_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_410_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_410_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_410_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_411_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_411_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_411_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_412_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_412_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_413_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_413_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_413_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_413_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_414_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_414_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_414_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_414_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_415_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_415_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_415_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_415_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_415_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_416_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_416_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_416_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_417_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_417_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_417_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_418_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_418_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_418_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_418_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_419_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_419_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_419_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_419_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_420_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_420_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_420_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_421_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_421_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_421_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_422_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_422_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_422_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_422_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_423_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_423_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_423_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_423_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_424_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_424_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_424_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_424_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_424_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_425_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_425_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_426_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_426_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_426_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_427_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_427_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_427_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_427_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_428_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_428_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_428_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_428_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_429_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_429_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_429_extreme_1.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_429_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_429_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_430_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_430_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_430_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_431_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_431_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_431_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_432_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_432_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_432_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_432_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_433_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_433_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_433_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_433_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_434_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_434_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_434_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_434_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_435_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_435_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_436_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_436_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_436_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_436_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_437_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_437_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_437_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_438_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_438_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_438_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_439_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_439_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_439_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_439_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_440_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_440_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_440_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_441_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_441_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_441_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_442_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_442_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_442_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_442_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_443_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_443_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_443_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_443_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_600_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_600_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_600_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_600_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_601_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_601_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_601_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_602_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_602_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_602_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_602_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_603_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_603_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_603_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_603_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_604_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_604_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_604_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_604_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_605_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_605_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_605_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_607_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_607_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_607_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_607_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_608_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_608_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_608_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_608_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_609_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_609_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_609_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_609_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_610_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_610_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_610_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_610_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_611_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_611_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_611_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_612_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_612_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_612_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_612_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_613_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_613_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_613_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_613_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_614_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_614_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_614_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_615_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_615_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_615_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_616_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_616_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_616_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_616_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_617_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_617_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_617_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_618_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_618_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_618_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_618_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_619_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_619_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_619_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_619_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_620_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_620_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_620_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_621_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_621_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_621_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_621_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_622_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_622_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_622_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_622_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_623_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_623_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_623_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_623_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_624_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_624_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_624_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_624_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_625_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_625_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_626_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_626_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_626_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_626_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_627_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_627_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_627_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_627_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_628_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_628_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_628_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_628_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_629_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_629_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_629_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_630_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_630_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_630_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_630_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_631_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_631_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_631_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_631_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_637_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_637_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_637_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_637_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_638_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_638_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_638_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_638_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_639_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_402_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_407_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_412_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_416_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_421_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_425_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_430_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_435_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_440_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_601_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_605_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_611_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_615_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_620_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_625_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_629_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_639_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_722_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_726_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_731_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_736_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_639_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_640_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_640_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_640_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_640_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_641_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_641_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_641_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_641_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_642_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_642_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_642_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_642_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_710_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_710_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_710_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_710_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_722_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_722_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_722_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_723_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_723_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_723_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_723_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_724_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_724_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_724_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_724_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_725_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_725_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_725_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_725_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_726_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_726_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_726_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_727_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_727_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_727_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_727_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_728_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_728_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_728_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_728_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_729_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_729_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_729_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_729_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_730_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_730_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_730_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_730_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_731_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_731_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_731_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_732_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_732_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_732_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_732_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_733_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_733_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_733_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_733_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_734_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_734_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_734_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_734_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_736_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_736_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_736_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_737_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_737_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_737_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_737_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_738_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_738_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_738_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_739_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_739_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_739_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_739_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_740_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_740_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_740_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_740_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_832_easy.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_832_extreme.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_832_hard.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_832_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/script/pv_999_normal.dsc\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hakitm700_atam_zujo_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm057_schoolbag_b_close_bone_l__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm057_schoolbag_b_close_bone_r__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_l_kai__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_l__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_r_kai__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_r_len__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_r__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm006_joha_outer_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm008_joha_outer_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm009_joha_outer_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm011_joha_outer_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm012_joha_outer_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm015_joha_outer_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm016_joha_outer_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm018_joha_outer_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm019_joha_outer_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm020_joha_outer_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm022_joha_outer_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm024_joha_outer_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm025_joha_outer_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm027_joha_outer_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_l_len__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm010_joha_outer_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm028_joha_outer_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm524_atam_atama_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm705_atam_zujo_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm009_joha_outer_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm022_joha_outer_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm034_joha_outer_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm507_atam_atama_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm528_atam_atama_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm029_joha_outer_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm030_joha_outer_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm031_joha_outer_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm032_joha_outer_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm033_joha_outer_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm034_joha_outer_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm036_joha_outer_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm041_joha_outer_41__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm042_joha_outer_42__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm503_atam_atama_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm504_atam_atama_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm505_atam_atama_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm506_atam_atama_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm507_atam_atama_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm508_atam_atama_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm509_atam_atama_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm510_atam_atama_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm520_atam_atama_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm522_atam_atama_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm523_atam_atama_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm527_atam_atama_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm528_atam_atama_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm529_atam_atama_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm531_atam_atama_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm532_atam_atama_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm533_atam_atama_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm534_atam_atama_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm536_atam_atama_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm541_atam_atama_41__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm542_atam_atama_42__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm701_atam_zujo_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm706_atam_zujo_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm750_joha_neck_50__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm751_joha_neck_51__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_kaiitm775_joha_ushiro_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm005_joha_outer_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm007_joha_outer_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm008_joha_outer_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm010_joha_outer_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm011_joha_outer_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm012_joha_outer_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm013_joha_outer_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm014_joha_outer_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm015_joha_outer_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm016_joha_outer_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm017_joha_outer_17__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm018_joha_outer_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm019_joha_outer_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm021_joha_outer_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm023_joha_outer_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm024_joha_outer_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm025_joha_outer_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm026_joha_outer_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm027_joha_outer_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm028_joha_outer_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm029_joha_outer_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm030_joha_outer_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm031_joha_outer_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm032_joha_outer_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm033_joha_outer_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm035_joha_outer_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm036_joha_outer_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm038_joha_outer_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm040_joha_outer_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm503_atam_atama_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm504_atam_atama_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm505_atam_atama_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm506_atam_atama_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm508_atam_atama_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm509_atam_atama_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm510_atam_atama_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm511_atam_atama_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm519_atam_atama_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm521_atam_atama_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm522_atam_atama_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm523_atam_atama_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm524_atam_atama_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm525_atam_atama_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm526_atam_atama_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm529_atam_atama_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm530_atam_atama_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm531_atam_atama_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm532_atam_atama_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm533_atam_atama_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm534_atam_atama_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm535_atam_atama_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm536_atam_atama_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm537_atam_atama_37__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm538_atam_atama_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm540_atam_atama_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm775_joha_ushiro_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm001_joha_outer_01_zzc__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm005_joha_outer_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm006_joha_outer_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm007_joha_outer_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm008_joha_outer_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm009_joha_outer_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm010_joha_outer_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm012_joha_outer_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm013_joha_outer_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm014_joha_outer_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm015_joha_outer_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm017_joha_outer_17_zzc__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm018_joha_outer_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm019_joha_outer_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm020_joha_outer_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm021_joha_outer_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm022_joha_outer_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm023_joha_outer_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm025_joha_outer_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm026_joha_outer_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm027_joha_outer_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm028_joha_outer_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm029_joha_outer_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm030_joha_outer_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm031_joha_outer_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm032_joha_outer_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm033_joha_outer_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm034_joha_outer_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm035_joha_outer_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm037_joha_outer_37__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm038_joha_outer_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm039_joha_outer_39__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm040_joha_outer_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm042_joha_outer_42__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm311_ude_hand_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm503_atam_atama_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm504_atam_atama_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm506_atam_atama_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm507_atam_atama_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm508_atam_atama_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm509_atam_atama_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm510_atam_atama_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm511_atam_atama_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm512_atam_atama_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm513_atam_atama_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm514_atam_atama_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm515_atam_atama_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm516_atam_atama_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm525_atam_atama_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm526_atam_atama_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm527_atam_atama_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm528_atam_atama_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm529_atam_atama_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm530_atam_atama_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm531_atam_atama_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm532_atam_atama_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm533_atam_atama_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm534_atam_atama_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm535_atam_atama_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm537_atam_atama_37__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm538_atam_atama_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm539_atam_atama_39__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm540_atam_atama_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm542_atam_atama_42__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm700_atam_zujo_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm702_atam_zujo_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm703_atam_zujo_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm705_atam_zujo_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm005_joha_outer_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm006_joha_outer_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm008_joha_outer_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm009_joha_outer_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm010_joha_outer_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm011_joha_outer_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm012_joha_outer_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm013_joha_outer_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm014_joha_outer_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm015_joha_outer_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm017_joha_outer_17_zzc__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm018_joha_outer_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm019_joha_outer_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm020_joha_outer_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm021_joha_outer_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm022_joha_outer_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm023_joha_outer_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm024_joha_outer_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm025_joha_outer_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm026_joha_outer_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm027_joha_outer_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm029_joha_outer_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm030_joha_outer_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm032_joha_outer_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm033_joha_outer_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm503_atam_atama_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm504_atam_atama_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm505_atam_atama_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm506_atam_atama_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm508_atam_atama_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm509_atam_atama_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm510_atam_atama_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm511_atam_atama_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm512_atam_atama_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm513_atam_atama_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm514_atam_atama_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm515_atam_atama_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm521_atam_atama_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm522_atam_atama_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm523_atam_atama_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm525_atam_atama_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm526_atam_atama_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm527_atam_atama_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm528_atam_atama_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm529_atam_atama_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm530_atam_atama_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm532_atam_atama_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm533_atam_atama_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm700_atam_zujo_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm701_atam_zujo_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm702_atam_zujo_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm011_joha_outer_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm024_joha_outer_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm036_joha_outer_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm505_atam_atama_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm517_atam_atama_17__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lukitm536_atam_atama_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm016_joha_outer_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm028_joha_outer_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm507_atam_atama_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm524_atam_atama_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm705_atam_zujo_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm709_atam_zujo_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm775_joha_ushiro_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm005_joha_outer_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm006_joha_outer_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm007_joha_outer_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm008_joha_outer_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm010_joha_outer_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm011_joha_outer_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm012_joha_outer_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm013_joha_outer_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm014_joha_outer_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm015_joha_outer_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm016_joha_outer_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm017_joha_outer_17__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm018_joha_outer_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm019_joha_outer_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm020_joha_outer_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm022_joha_outer_22_zzc__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm023_joha_outer_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm024_joha_outer_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm025_joha_outer_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm026_joha_outer_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm027_joha_outer_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm029_joha_outer_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm030_joha_outer_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm031_joha_outer_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm032_joha_outer_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm038_joha_outer_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm041_joha_outer_41__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm042_joha_outer_42__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm043_joha_outer_43__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm044_joha_outer_44__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm045_joha_outer_45__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm046_joha_outer_46__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm047_joha_outer_47__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm048_joha_outer_48__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm049_joha_outer_49__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm050_joha_outer_50__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm051_joha_outer_51__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm053_joha_outer_53__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm054_joha_outer_54__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm055_joha_outer_55__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm056_joha_outer_56__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm057_joha_outer_57__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm058_joha_outer_58__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm059_joha_outer_59__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm060_joha_outer_60__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm061_joha_outer_61__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm063_joha_outer_63__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm064_joha_outer_64__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm066_joha_outer_66__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm067_joha_outer_67__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm068_joha_outer_68__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm069_joha_outer_69__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm070_joha_outer_70__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm071_joha_outer_71__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm072_joha_outer_72__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm073_joha_outer_73__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm074_joha_outer_74__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm075_joha_outer_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm076_joha_outer_76__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm078_joha_outer_78__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm079_joha_outer_79__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm080_joha_outer_80__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm081_joha_outer_81__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm082_joha_outer_82__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm083_joha_outer_83__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm084_joha_outer_84__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm085_joha_outer_85__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm087_joha_outer_87__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm088_joha_outer_88__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm089_joha_outer_89__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm091_joha_outer_91__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm092_joha_outer_92__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm093_joha_outer_93__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm094_joha_outer_94__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm095_joha_outer_95__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm096_joha_outer_96__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm097_joha_outer_97__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm098_joha_outer_98__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm099_joha_outer_99__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm100_joha_outer_100__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm101_joha_outer_101__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm103_joha_outer_103__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm104_joha_outer_104__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm105_joha_outer_105__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm106_joha_outer_106__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm107_joha_outer_107__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm108_joha_outer_108__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm109_joha_outer_109__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm110_joha_outer_110__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm111_joha_outer_111__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm112_joha_outer_112__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm113_joha_outer_113__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm115_joha_outer_115__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm116_joha_outer_116__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm118_joha_outer_118__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm119_joha_outer_119__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm120_joha_outer_120__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm123_joha_outer_123__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm124_joha_outer_124__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm125_joha_outer_125__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm126_joha_outer_126__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm127_joha_outer_127__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm128_joha_outer_128__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm130_joha_outer_130__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm131_joha_outer_131__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm132_joha_outer_132__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm133_joha_outer_133__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm134_joha_outer_134__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm135_joha_outer_135__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm136_joha_outer_136__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm137_joha_outer_137__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm138_joha_outer_138__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm139_joha_outer_139__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm140_joha_outer_140__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm142_joha_outer_142__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm143_joha_outer_143__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm144_joha_outer_144__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm145_joha_outer_145__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm146_joha_outer_146__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm147_joha_outer_147__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm148_joha_outer_148__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm149_joha_outer_149__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm151_joha_outer_151__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm152_joha_outer_152__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm153_joha_outer_153__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm009_joha_outer_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm021_joha_outer_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm040_joha_outer_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm052_joha_outer_52__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm065_joha_outer_65__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm077_joha_outer_77__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm090_joha_outer_90__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm102_joha_outer_102__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm114_joha_outer_114__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm129_joha_outer_129__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm141_joha_outer_141__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_lenitm700_atam_zujo_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_meiitm704_atam_zujo_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm155_joha_outer_155__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm156_joha_outer_156__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm158_joha_outer_158__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm160_joha_outer_160__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm162_joha_outer_162__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm163_joha_outer_163__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm164_joha_outer_164__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm165_joha_outer_165__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm167_joha_outer_167__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm169_joha_outer_169__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm170_joha_outer_170__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm173_joha_outer_173__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm467_ude_hand_167__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm504_atam_atama_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm505_atam_atama_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm506_atam_atama_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm507_atam_atama_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm508_atam_atama_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm509_atam_atama_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm520_atam_atama_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm524_atam_atama_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm525_atam_atama_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm526_atam_atama_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm527_atam_atama_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm528_atam_atama_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm530_atam_atama_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm531_atam_atama_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm532_atam_atama_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm533_atam_atama_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm534_atam_atama_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm535_atam_atama_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm537_atam_atama_37__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm538_atam_atama_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm539_atam_atama_39__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm540_atam_atama_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm541_atam_atama_41__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm542_atam_atama_42__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm543_atam_atama_43__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm544_atam_atama_44__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm545_atam_atama_45__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm546_atam_atama_46__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm547_atam_atama_47__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm549_atam_atama_49__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm550_atam_atama_50__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm551_atam_atama_51__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm552_atam_atama_52__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm553_atam_atama_53__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm554_atam_atama_54__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm555_atam_atama_55__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm556_atam_atama_56__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm557_atam_atama_57__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm558_atam_atama_58__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm559_atam_atama_59__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm593_atam_atama_93__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm594_atam_atama_94__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm595_atam_atama_95__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm596_atam_atama_96__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm597_atam_atama_97__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm598_atam_atama_98__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm599_atam_atama_99__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm600_atam_atama_100__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm601_atam_atama_101__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm602_atam_atama_102__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm603_atam_atama_103__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm605_atam_atama_105__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm606_atam_atama_106__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm607_atam_atama_107__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm608_atam_atama_108__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm609_atam_atama_109__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm610_atam_atama_110__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm611_atam_atama_111__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm612_atam_atama_112__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm613_atam_atama_113__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm614_atam_atama_114__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm615_atam_atama_115__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm618_atam_atama_118__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm619_atam_atama_119__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm620_atam_atama_120__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm621_atam_atama_121__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm623_atam_atama_123__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm624_atam_atama_124__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm625_atam_atama_125__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm626_atam_atama_126__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm627_atam_atama_127__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm628_atam_atama_128__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm630_atam_atama_130__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm632_atam_atama_132__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm633_atam_atama_133__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm634_atam_atama_134__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm635_atam_atama_135__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm636_atam_atama_136__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm637_atam_atama_137__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm638_atam_atama_138__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm639_atam_atama_139__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm640_atam_atama_140__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm641_atam_atama_141__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm642_atam_atama_142__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm644_atam_atama_144__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm645_atam_atama_145__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm646_atam_atama_146__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm647_atam_atama_147__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm648_atam_atama_148__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm649_atam_atama_149__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm651_atam_atama_151__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm652_atam_atama_152__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm653_atam_atama_153__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm655_atam_atama_155__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm656_atam_atama_156__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm660_atam_atama_160__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm662_atam_atama_162__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm663_atam_atama_163__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm664_atam_atama_164__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm665_atam_atama_165__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm667_atam_atama_167__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm669_atam_atama_169__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm670_atam_atama_170__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm673_atam_atama_173__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm700_atam_zujo_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm701_face_hitai_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm709_atam_zujo_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm711_atam_zujo_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm715_atam_zujo_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm718_atam_zujo_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm721_atam_zujo_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm722_atam_zujo_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm745_atam_zujo_45__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm746_atam_zujo_46__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm748_atam_zujo_48__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm749_atam_zujo_49__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm751_joha_neck_51__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm438_ude_hand_138__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm522_atam_atama_22__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm536_atam_atama_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm548_atam_atama_48__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm560_atam_atama_60__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm604_atam_atama_104__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm616_atam_atama_116__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm631_atam_atama_131__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm643_atam_atama_143__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm658_atam_atama_158__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm702_atam_zujo_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm752_joha_neck_52__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_neritm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm010_joha_outer_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm023_joha_outer_23__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm035_joha_outer_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm512_atam_atama_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm529_atam_atama_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm541_atam_atama_41__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm706_atam_zujo_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm719_atam_zujo_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm775_joha_ushiro_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm776_joha_ushiro_76__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm777_joha_ushiro_77__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm780_joha_ushiro_80__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm781_joha_ushiro_81__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm782_joha_ushiro_82__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm783_joha_ushiro_83__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm784_joha_ushiro_84__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_mikitm790_atam_zujo_90__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_neritm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_neritm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_neritm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_neritm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_neritm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm004_joha_outer_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm005_joha_outer_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm006_joha_outer_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm007_joha_outer_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm009_joha_outer_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm011_joha_outer_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm012_joha_outer_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm013_joha_outer_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm014_joha_outer_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm015_joha_outer_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm016_joha_outer_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm017_joha_outer_17__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm018_joha_outer_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm019_joha_outer_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm020_joha_outer_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm021_joha_outer_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm024_joha_outer_24__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm025_joha_outer_25__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm026_joha_outer_26_zzc__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm027_joha_outer_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm028_joha_outer_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm029_joha_outer_29__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm030_joha_outer_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm031_joha_outer_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm032_joha_outer_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm033_joha_outer_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm034_joha_outer_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm036_joha_outer_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm037_joha_outer_37__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm038_joha_outer_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm039_joha_outer_39__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm040_joha_outer_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm041_joha_outer_41__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm043_joha_outer_43__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm044_joha_outer_44__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm045_joha_outer_45__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm047_joha_outer_47__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm048_joha_outer_48__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm503_atam_atama_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm504_atam_atama_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm505_atam_atama_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm506_atam_atama_06__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm507_atam_atama_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm508_atam_atama_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm509_atam_atama_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm510_atam_atama_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm511_atam_atama_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm513_atam_atama_13__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm514_atam_atama_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm515_atam_atama_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm516_atam_atama_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm517_atam_atama_17__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm518_atam_atama_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm519_atam_atama_19__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm520_atam_atama_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm526_atam_atama_26__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm527_atam_atama_27__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm528_atam_atama_28__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm530_atam_atama_30__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm531_atam_atama_31__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm532_atam_atama_32__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm533_atam_atama_33__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm534_atam_atama_34__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm535_atam_atama_35__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm536_atam_atama_36__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm537_atam_atama_37__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm538_atam_atama_38__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm539_atam_atama_39__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm540_atam_atama_40__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm543_atam_atama_43__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm544_atam_atama_44__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm545_atam_atama_45__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm547_atam_atama_47__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm548_atam_atama_48__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm600_atama_cat_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm701_atam_zujo_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm702_atam_zujo_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm703_atam_zujo_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm704_atam_zujo_04__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm705_atam_zujo_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm707_atam_zujo_07__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm708_atam_zujo_08__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm709_atam_zujo_09__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm710_atam_zujo_10__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm711_atam_zujo_11__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm712_atam_zujo_12__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm714_atam_zujo_14__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm715_atam_zujo_15__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm716_atam_zujo_16__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm717_atam_zujo_17__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm718_atam_zujo_18__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm720_atam_zujo_20__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm721_atam_zujo_21__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm775_joha_ushiro_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm776_joha_ushiro_76__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm777_joha_ushiro_77__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm997_atam_zujo_97__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_rinitm999_atam_zujo_99__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm005_joha_outer_05__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm501_atam_atama_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm600_atama_cat_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_sakitm775_joha_ushiro_75__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_tetitm001_joha_outer_01__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_tetitm002_joha_outer_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_tetitm003_joha_outer_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_tetitm500_atam_atama_00__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_tetitm502_atam_atama_02__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/ext_skp_tetitm503_atam_atama_03__divskn.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/osage_setting.txt\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/sp_skp.farc\n; 140616748778912  17:05.50 1989-05-24 rom/skin_param/sp_skp_db.txt\n; 140616748778912  17:05.50 1989-05-24 rom/sound/button.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv600_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv601_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv602_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv603_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv604_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv605_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv607_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv608_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv609_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv610_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv611_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv612_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv613_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv614_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv615_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv617_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv618_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv619_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv620_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv621_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv622_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv623_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv624_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv625_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv626_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv627_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv628_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv629_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv630_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv631_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv637_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv639_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv640_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv641_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv642_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv710_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv722_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv723_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv724_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv725_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv726_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv727_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv728_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv729_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv730_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv731_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv732_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv733_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv736_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv737_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv738_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv739_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv740_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pvchange.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/result_len.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/result_miku.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/result_rin.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se_adv.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se_aime.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se_cmn.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se_over.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se_result.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/se_sel.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_bell.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_bell2.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_harp.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_laser.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_long.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_piano.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_se.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/slide_windchime.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv616_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv638_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/sound/pv734_effect.farc\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_no_ring.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv083_stgns098.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv434_mhd3070.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv434_mhd6677.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv614_mhd0000.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv614_mhd7334.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p1_00000.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p1_03848.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p1_06720.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p1_07038.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p1_11992.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p2_00000.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p2_01568.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p2_07518.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv620_p2_11992.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv037s01_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv038s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv044s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv046s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv047s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv047s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv051s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv058s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgd2pv065s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv081s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv081s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv082s62.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv082s63.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv083s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv083s18.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv091s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv091s15.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv104s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv219s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv219s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv221s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv221s11.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv222s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv226s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv233s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv235s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv236s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv240s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv241s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv241_mhd481.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv601s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv602s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv602s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv605s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv622s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv625s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv625s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv740s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_d2ns058.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_d2ns082.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_d2pv050s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns004.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns021.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns022.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns023.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_pv625_mhd3860.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv083s18_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/coli_stgpv600s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns032.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_ns094.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv233s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv007s10.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_d2ns064.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns084.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns084_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns086.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_ns249.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv001s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv008s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv008s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv223s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv223s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/fog_ring_pv241s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_pv081s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_pv087s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_pv087s17.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_pv221s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_pv441s01_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/leaf_tst.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/litproj_d2pv208s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/litproj_pv255s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/litproj_pv257s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/litproj_pv627s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_ns005_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv011s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv011s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv083s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv083s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv089s03_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv432s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv432s02_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv609s01_rain.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv619s02_rain.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/rain_pv625s01_clone.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_d2ns064.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_ns123.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv083s24.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv089s03_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv219s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv219s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv220s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv233s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv236s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv432s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/ripple_pv432s02_clone1.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_d2pv037s01_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_d2pv051s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_ns005_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_ns014_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_ns015_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_ns033.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_ns084_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv007s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv007s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv007s07_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv007s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv007s11_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv020s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv020s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv020s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv086s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv218s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv218s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv224s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv224s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv224s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv244s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv247s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv609s01_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv622s01_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv737s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/snow_pv737s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_ns123.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_pv220s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_pv233s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_pv233s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_pv233s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_pv233s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/splash_pv236s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_ns266.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv242s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s02.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s03.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s05.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s06.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s07.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s08.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv253s09.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv621s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv622s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv622s01_snow.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv626s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv638s01.txt\n; 140616748778912  17:05.50 1989-05-24 rom/stage_param/star_pv642s04.txt\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0271_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0000_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0001_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0002_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0003_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0004_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0005_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0006_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0007_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0008_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0009_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0010_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0011_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0012_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0013_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0014_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0015_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0017_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0018_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0019_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0020_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0021_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0022_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0023_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0024_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0025_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0026_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0027_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0028_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0029_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0030_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0031_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0032_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0034_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0035_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0036_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0037_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0038_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0039_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0040_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0041_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0042_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0043_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0044_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0045_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0046_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0047_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0048_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0049_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0051_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0052_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0053_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0054_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0055_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0056_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0057_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0058_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0059_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0060_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0061_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0062_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0063_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0064_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0065_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0066_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0016_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0033_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0050_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0067_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0084_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0101_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0118_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0135_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0152_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0169_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0186_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0203_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0220_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0237_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0254_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0068_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0069_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0070_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0071_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0072_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0073_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0074_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0075_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0076_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0077_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0078_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0079_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0080_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0081_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0082_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0083_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0085_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0086_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0087_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0088_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0089_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0090_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0091_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0092_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0093_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0094_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0095_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0096_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0097_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0098_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0099_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0100_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0102_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0103_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0104_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0105_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0106_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0107_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0108_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0109_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0110_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0111_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0112_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0113_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0114_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0115_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0116_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0117_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0119_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0120_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0121_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0122_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0123_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0124_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0125_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0126_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0127_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0128_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0129_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0130_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0131_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0132_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0133_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0134_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0136_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0137_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0138_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0139_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0140_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0141_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0142_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0143_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0144_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0145_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0146_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0147_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0148_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0149_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0150_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0151_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0153_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0154_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0155_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0156_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0157_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0158_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0159_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0160_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0161_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0162_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0163_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0164_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0165_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0166_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0167_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0168_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0170_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0171_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0172_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0173_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0174_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0175_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0176_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0177_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0178_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0179_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0180_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0181_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0182_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0183_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0184_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0185_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0187_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0188_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0189_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0190_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0191_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0192_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0193_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0194_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0195_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0196_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0197_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0198_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0199_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0200_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0201_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0202_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0204_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0205_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0206_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0207_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0208_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0209_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0210_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0211_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0212_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0213_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0214_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0215_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0216_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0217_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0218_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0219_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0221_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0222_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0223_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0224_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0225_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0226_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0227_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0228_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0229_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0230_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0231_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0232_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0233_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0234_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0235_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0236_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0238_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0239_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0240_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0241_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0242_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0243_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0244_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0245_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0246_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0247_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0248_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0249_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0250_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0251_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0252_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0253_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0255_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0256_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0257_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0258_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0259_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0260_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0261_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0262_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0263_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0264_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0265_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0266_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0267_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0268_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0269_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0270_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0272_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0273_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0274_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0275_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0276_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0277_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0278_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0279_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0280_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0281_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0282_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0283_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0284_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0285_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0286_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0287_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0289_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0290_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0291_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0292_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0293_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0294_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0295_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0296_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0297_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0298_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0299_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0300_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0301_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0302_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0303_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0304_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0306_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0307_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0308_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0309_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0310_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0311_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0312_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0313_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0314_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0315_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0316_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0317_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0318_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0319_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0320_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0321_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0323_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0324_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0325_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0326_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0327_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0328_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0329_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0330_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0331_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0332_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0333_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0334_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0335_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0336_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0337_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0338_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0340_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0341_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0342_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0343_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0344_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0345_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0346_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0347_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0348_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0349_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0350_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0351_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0352_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0353_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0354_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0355_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0357_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0358_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0359_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0360_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0361_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0362_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0363_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0364_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0365_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0366_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0367_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0368_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0369_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0370_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0371_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0372_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0374_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0375_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0376_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0377_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0378_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0379_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0380_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0381_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0382_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0383_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0384_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0385_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0386_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0387_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0388_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0389_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0391_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0392_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0393_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0394_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0395_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0396_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0397_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0398_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0399_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0400_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0401_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0402_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0403_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0404_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0405_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0406_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0408_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0409_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0410_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0411_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0412_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0413_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0414_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0415_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0416_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0417_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0418_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0419_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0420_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0421_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0422_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0423_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0425_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0426_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0427_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0428_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0429_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0430_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0431_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0432_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0433_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0434_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0435_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0436_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0437_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0438_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0439_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0440_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0442_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0443_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0444_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0445_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0446_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0447_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0448_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0449_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0450_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0451_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0452_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0453_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0454_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0455_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0456_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0457_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0459_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0460_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0461_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0462_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0463_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0464_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0465_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0466_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0467_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0468_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0469_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0470_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0471_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0472_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0473_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0474_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0476_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0477_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0478_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0479_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0480_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0481_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0482_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0483_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0484_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0485_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0486_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0487_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0488_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0489_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0490_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0491_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0493_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0494_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0495_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0496_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0497_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0498_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0499_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0500_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0501_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0502_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0503_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0504_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0505_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0506_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0507_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0508_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0510_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0511_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0512_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0513_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0514_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0515_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0516_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0517_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0518_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0519_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0520_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0521_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0522_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0523_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0524_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0525_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0527_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0528_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0529_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0530_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0531_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0532_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0533_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0534_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0535_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0536_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0537_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0538_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0539_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0540_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0541_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0542_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0544_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0545_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0546_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0547_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0554_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0555_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0556_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0557_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0558_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0559_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0560_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0561_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0562_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0563_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0564_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0565_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0288_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0305_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0322_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0339_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0356_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0373_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0390_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0407_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0424_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0441_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0458_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0475_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0492_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0509_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0526_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0543_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0566_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0583_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0600_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0567_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0568_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0569_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0570_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0571_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0572_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0573_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0574_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0575_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0576_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0577_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0578_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0579_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0580_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0581_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0582_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0584_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0585_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0586_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0587_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0588_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0589_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0590_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0591_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0592_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0593_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0594_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0595_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0596_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0597_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0598_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0599_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0601_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0602_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0603_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0604_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0605_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0606_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0607_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0608_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0609_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0610_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0611_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0612_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0613_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0614_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0615_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0616_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0617_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0618_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0619_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0620_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0621_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0622_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0623_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0624_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0625_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0626_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0627_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0628_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0629_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0630_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0631_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0632_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/card/CLT_CRD0633_01.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ic_img01_00.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ic_img02_00.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ic_img03_00.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_img01_00.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_img02_00.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_img03_00.jpg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ss_rights01.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ss_rights01_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ss_rights02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ss_rights02_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ss_rights03.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/ext/ext_ss_rights03_ic.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp000_01.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp001_01.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp002_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp003_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp004_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp005_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp006_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp007_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp008_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp009_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp010_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp011_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp012_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp013_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp014_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp016_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp017_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp018_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp019_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp020_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp021_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp022_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp023_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp024_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp030_02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp031_02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp032_02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp033_02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp034_02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp035_02.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp040_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp041_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp043_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp044_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp045_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp046_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp047_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp048_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp049_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp050_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp051_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp052_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp053_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp054_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp055_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp056_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp057_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp058_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp059_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp061_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp062_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp063_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp064_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp065_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp066_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp067_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp068_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp069_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp070_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp071_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp072_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp073_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp074_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp075_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp076_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp077_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp078_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp079_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp080_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp081_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp082_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp083_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp084_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp085_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp086_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp087_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp015_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp042_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/stamp060_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/pv_param/pv710/bloom.txt\n; 140616748778912  17:05.50 1989-05-24 rom/pv_param/pv710/cc.txt\n; 140616748778912  17:05.50 1989-05-24 rom/pv_param/pv710/chara_light.txt\n; 140616748778912  17:05.50 1989-05-24 rom/pv_param/pv710/dof.txt\n; 140616748778912  17:05.50 1989-05-24 rom/pv_param/pv710/stage_light.txt\n; 140616748778912  17:05.50 1989-05-24 rom/pv_param/pv740/dof.txt\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/encore_jng_adx.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/random_select.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/result_ft_clear.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/result_lp.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/result_verB_clear.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/screenshot.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/selector_ft_lp.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/bgm/selector_verB_a_lp.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_001.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_002.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_003.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_004.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_005.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_006.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_007.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_008.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_009.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_010.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_011.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_012.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_013.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_014.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_015.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_016.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_017.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_018.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_019.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_021.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_022.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_023.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_024.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_025.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_026.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_027.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_028.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_029.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_030.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_031.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_032.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_033.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_034.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_035.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_036.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_037.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_038.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_039.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_041.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_042.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_043.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_044.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_045.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_046.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_047.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_048.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_049.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_050.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_051.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_052.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_053.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_054.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_055.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_056.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_057.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_058.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_059.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_061.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_062.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_063.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_064.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_065.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_066.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_079.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_081.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_082.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_083.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_084.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_085.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_086.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_087.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_088.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_089.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_090.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_091.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_092.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_094.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_095.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_096.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_097.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_101.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_102.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_103.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_104.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_201.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_202.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_203.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_204.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_205.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_206.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_207.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_208.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_209.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_210.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_211.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_020.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_040.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_060.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_093.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_212.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_233.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_244.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_265.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_421.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_441.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_618.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_641.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_213.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_214.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_215.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_216.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_218.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_219.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_220.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_221.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_222.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_223.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_224.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_225.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_226.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_227.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_227_rin.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_228.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_231.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_232.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_234.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_235.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_236.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_238.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_238_kaito.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_238_len.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_238_luka.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_238_meiko.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_238_rin.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_239.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_239_luka.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_239_meiko.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_239_rin.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_240.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_241.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_242.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_243.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_243_miku.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_244_len.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_246.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_246_kaito.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_247.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_248.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_249.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_250.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_251.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_253.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_254.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_255.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_257.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_259.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_260.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_261.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_262.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_262_kai.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_262_mik.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_262_rin.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_401.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_402.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_403.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_404.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_405.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_407.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_408.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_409.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_410.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_411.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_412.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_413.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_414.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_415.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_416.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_417.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_418.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_419.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_420.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_422.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_423.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_424.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_425.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_426.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_427.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_428.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_429.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_430.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_431.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_432.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_433.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_434.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_435.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_436.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_437.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_438.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_439.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_440.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_442.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_443.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_600.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_601.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_602.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_603.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_604.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_605.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_607.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_608.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_609.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_610.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_611.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_612.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_613.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_614.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_615.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_616.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_617.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_619.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_620.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_621.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_621_meiko.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_622.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_623.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_624.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_625.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_626.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_627.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_628.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_629.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_630.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_631.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_637.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_637_all.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_638.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_639.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_640.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_642.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_710.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_722.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_723.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_724.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_725.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_726.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_727.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_728.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_729.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_730.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_731.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_732.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_733.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_734.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_736.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_737.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_738.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_739.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_740.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/sound/song/pv_832.ogg\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/ext/ext_stamp001_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/ext/ext_stamp002_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/ext/ext_stamp003_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/ext/ext_stamp004_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_000_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_001_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_002_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_003_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_004_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_005_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_006_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_007_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_008_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_009_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_010_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_011_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_012_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_013_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_014_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_016_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_017_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_018_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_019_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_020_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_021_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_022_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_023_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_024_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_025_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_026_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_027_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_028_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_029_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_030_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_032_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_033_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_034_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_035_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_036_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_037_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_038_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_039_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_040_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_041_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_042_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_043_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_044_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_045_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_046_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_048_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_049_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_050_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_051_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_052_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_053_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_054_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_055_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_056_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_057_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_058_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_059_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_060_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_061_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_062_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_015_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_031_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_047_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_063_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_079_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_095_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_111_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_128_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_145_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_162_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_193_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_209_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_225_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_241_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_257_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_273_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_289_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_305_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_323_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_341_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_359_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_375_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_393_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_064_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_065_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_066_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_067_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_068_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_069_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_070_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_071_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_072_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_073_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_074_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_075_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_076_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_077_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_078_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_080_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_081_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_082_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_083_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_084_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_085_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_086_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_087_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_088_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_089_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_090_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_091_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_092_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_093_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_094_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_096_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_097_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_098_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_099_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_100_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_101_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_102_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_103_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_104_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_105_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_106_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_107_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_108_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_109_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_110_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_112_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_113_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_114_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_115_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_116_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_117_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_118_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_119_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_120_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_121_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_122_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_124_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_125_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_126_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_127_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_129_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_130_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_131_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_132_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_133_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_134_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_135_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_136_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_137_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_138_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_139_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_141_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_142_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_143_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_144_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_146_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_147_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_148_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_149_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_150_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_151_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_153_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_154_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_155_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_156_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_157_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_158_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_159_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_160_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_161_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_163_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_164_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_165_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_166_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_167_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_168_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_169_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_170_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_171_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_172_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_188_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_189_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_190_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_191_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_192_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_194_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_195_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_196_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_197_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_198_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_199_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_200_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_201_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_202_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_203_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_204_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_205_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_206_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_207_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_208_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_210_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_211_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_212_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_213_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_214_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_215_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_216_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_217_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_218_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_219_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_220_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_221_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_222_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_223_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_224_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_226_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_227_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_228_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_229_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_230_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_231_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_232_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_233_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_234_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_235_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_236_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_237_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_238_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_239_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_240_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_242_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_243_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_244_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_245_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_246_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_247_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_248_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_249_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_250_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_251_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_252_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_253_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_254_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_255_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_256_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_258_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_259_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_260_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_261_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_262_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_263_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_264_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_265_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_266_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_267_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_268_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_269_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_270_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_271_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_272_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_274_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_275_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_276_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_277_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_278_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_279_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_280_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_281_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_282_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_283_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_284_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_285_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_286_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_287_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_288_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_290_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_291_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_292_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_293_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_294_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_295_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_296_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_297_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_298_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_299_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_300_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_301_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_302_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_303_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_304_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_306_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_308_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_309_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_310_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_311_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_313_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_314_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_315_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_316_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_317_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_318_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_319_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_320_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_321_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_322_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_324_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_325_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_326_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_327_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_328_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_329_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_330_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_331_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_332_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_334_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_335_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_336_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_338_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_339_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_340_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_343_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_344_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_345_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_346_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_347_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_348_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_349_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_350_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_351_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_352_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_353_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_354_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_355_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_356_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_358_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_360_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_361_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_362_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_363_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_364_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_365_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_366_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_367_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_368_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_369_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_370_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_371_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_372_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_373_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_374_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_376_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_377_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_378_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_379_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_380_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_381_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_382_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_383_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_385_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_386_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_387_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_389_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_390_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_391_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_392_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_394_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_395_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_398_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_402_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_403_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_404_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_405_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_406_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_407_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_408_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_409_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_410_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_411_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_412_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_420_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_421_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_422_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_423_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext001_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext002_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext003_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext004_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext005_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext006_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext007_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext008_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext009_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext010_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext011_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/module/stamp_md_sub_ext012_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv001_logo001_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv002_logo002_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv003_logo003_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv004_logo004_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv005_logo005_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv006_logo006_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv007_logo007_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv008_logo008_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv009_logo009_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv010_logo010_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv011_logo011_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv012_logo012_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv013_logo013_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv014_logo014_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv016_logo016_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv017_logo017_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv018_logo018_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv019_logo019_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv020_logo020_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv021_logo021_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv022_logo022_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv023_logo023_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv024_logo024_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv025_logo025_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv027_logo027_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv028_logo028_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv029_logo029_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv030_logo030_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv032_logo032_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv037_logo037_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv038_logo038_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv039_logo039_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv040_logo040_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv041_logo041_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv042_logo042_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv043_logo043_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv044_logo044_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv045_logo045_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv046_logo046_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv047_logo047_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv048_logo048_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv049_logo049_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv051_logo051_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv052_logo052_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv053_logo053_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv054_logo054_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv055_logo055_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv056_logo056_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv057_logo057_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv058_logo058_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv059_logo059_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv060_logo060_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv061_logo061_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv062_logo062_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv063_logo063_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv064_logo064_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv015_logo015_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv031_logo031_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv050_logo050_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv065_logo065_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv093_logo093_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv207_logo207_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv223_logo223_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv241_logo241_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv261_logo261_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv413_logo413_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv428_logo428_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv443_logo443_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv615_logo615_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv630_logo630_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv066_logo066_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv079_logo079_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv081_logo081_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv082_logo082_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv083_logo083_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv084_logo084_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv085_logo085_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv086_logo086_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv087_logo087_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv088_logo088_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv089_logo089_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv090_logo090_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv091_logo091_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv092_logo092_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv094_logo094_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv095_logo095_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv096_logo096_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv097_logo097_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv101_logo101_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv102_logo102_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv103_logo103_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv104_logo104_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv201_logo201_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv202_logo202_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv203_logo203_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv204_logo204_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv205_logo205_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv206_logo206_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv208_logo208_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv209_logo209_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv210_logo210_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv211_logo211_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv212_logo212_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv213_logo213_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv214_logo214_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv215_logo215_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv216_logo216_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv218_logo218_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv219_logo219_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv220_logo220_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv221_logo221_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv222_logo222_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv224_logo224_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv225_logo225_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv226_logo226_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv227_logo227_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv228_logo228_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv231_logo231_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv232_logo232_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv233_logo233_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv234_logo234_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv235_logo235_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv236_logo236_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv238_logo238_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv239_logo239_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv240_logo240_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv242_logo242_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv243_logo243_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv244_logo244_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv246_logo246_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv247_logo247_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv248_logo248_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv249_logo249_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv250_logo250_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv251_logo251_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv253_logo253_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv255_logo255_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv257_logo257_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv259_logo259_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv260_logo260_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv262_logo262_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv265_logo265_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv401_logo401_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv402_logo402_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv403_logo403_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv403_logo403_ex_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv404_logo404_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv405_logo405_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv407_logo407_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv408_logo408_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv409_logo409_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv410_logo410_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv411_logo411_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv412_logo412_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv414_logo414_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv415_logo415_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv416_logo416_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv417_logo417_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv418_logo418_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv419_logo419_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv420_logo420_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv421_logo421_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv422_logo422_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv423_logo423_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv424_logo424_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv425_logo425_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv426_logo426_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv427_logo427_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv429_logo429_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv430_logo430_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv431_logo431_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv432_logo432_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv433_logo433_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv434_logo434_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv435_logo435_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv436_logo436_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv437_logo437_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv438_logo438_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv439_logo439_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv440_logo440_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv441_logo441_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv442_logo442_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv600_logo600_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv601_logo601_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv602_logo602_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv603_logo603_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv604_logo604_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv605_logo605_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv607_logo607_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv608_logo608_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv609_logo609_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv610_logo610_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv611_logo611_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv612_logo612_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv613_logo613_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv614_logo614_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv616_logo616_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv617_logo617_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv618_logo618_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv619_logo619_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv620_logo620_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv621_logo621_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv622_logo622_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv623_logo623_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv624_logo624_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv625_logo625_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv626_logo626_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv627_logo627_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv628_logo628_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv629_logo629_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv631_logo631_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv637_logo637_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv638_logo638_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv639_logo639_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv640_logo640_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv641_logo641_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv642_logo642_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv710_logo710_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv722_logo722_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv723_logo723_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv724_logo724_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv725_logo725_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv726_logo726_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv727_logo727_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv728_logo728_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv729_logo729_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv730_logo730_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv731_logo731_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv732_logo732_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv733_logo733_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv734_logo734_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv736_logo736_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv737_logo737_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv738_logo738_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv739_logo739_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv740_logo740_00.tga\n; 140616748778912  17:05.50 1989-05-24 rom/photo_print/stamp/pv/stamp_pv832_logo832_00.tga\nCPUSBSG.dll 27F4EB58\ndiva.exe 05D8544B\nglut32.dll C9F91206\nMUsbPuIf.dll 83AD0967\nrom/bone_data.bin D7806130\nrom/chritm_prop.farc 1B5F63EF\nrom/fontmap.farc 0CEFD7F2\nrom/gm_btn_se_tbl.farc 1B82C8A7\nrom/gm_chainslide_se_tbl.farc DA5FAAD8\nrom/gm_collection_card_tbl.farc 4D72B956\nrom/gm_customize_item_tbl.farc 6F123A85\nrom/gm_module_tbl.farc 536A066E\nrom/gm_plate_tbl.farc 3215EB74\nrom/gm_pv_list_tbl.farc F0AF5B09\nrom/gm_slidertouch_se_tbl.farc 1A37AAE4\nrom/gm_slide_se_tbl.farc 6B3A04F2\nrom/hand_item_data.txt 0D15A291\nrom/iet.bin CEE780CE\nrom/ng_server.conf 128C6D9E\nrom/pv_db.txt 3FF63795\nrom/pv_field.txt 81DE2009\nrom/rob_sleeve_data.txt A5E70EB8\nrom/shader.farc E6D9187B\nrom/shader_cg.farc E75FE112\nrom/stage_data.bin 7C7FA78C\nrom/star_catalog_megastar2.farc A67068E0\nrom/star_catalog_random.farc 7722B790\nrom/STGTST_COLI.000.bin E04A5A65\nrom/movie/adv_cfm_cm.wmv 5CDB6805\nrom/movie/adv_sega_cm.wmv 4A324B07\nrom/movie/diva_adv.wmv D90ED9DD\nrom/movie/diva_adv02.wmv 85227E86\nrom/movie/pv_203.wmv DD03764B\nrom/movie/pv_209.wmv 4E8DA2B4\nrom/movie/pv_215.wmv A24E5820\nrom/movie/pv_216.wmv 9CDD6F93\nrom/movie/pv_255.wmv C9262697\nrom/movie/pv_257.wmv 7225EE18\nrom/movie/pv_265.wmv 40CC004B\nrom/movie/pv_428.wmv EC492699\nrom/movie/pv_429.wmv 0D3A64D5\nrom/movie/pv_430.wmv 7CCC83F2\nrom/movie/pv_431.wmv 43DF3886\nrom/movie/pv_601.wmv 416BE1AF\nrom/movie/pv_604.wmv 66E7203A\nrom/movie/pv_609.wmv 68C33FE4\nrom/movie/pv_618.wmv 44B355D1\nrom/movie/pv_623.wmv BA662C0A\nrom/movie/pv_625.wmv 45D72066\nrom/movie/pv_627.wmv 0A98C665\nrom/movie/pv_630.wmv EFC062AC\nrom/movie/pv_631.wmv 1CDD9ABC\nrom/movie/pv_722.wmv 4B263C8A\nrom/movie/pv_723.wmv D4D22D7D\nrom/movie/pv_724.wmv BDD0CBE3\nrom/movie/pv_728.wmv 48B964A3\nrom/movie/pv_734.wmv C4C9B86A\nrom/movie/pv_739_001.wmv B338E9A4\nrom/2d/aet_adv_cmn.bin 8496B47B\nrom/2d/aet_adv_nobl.bin 9BA6BB51\nrom/2d/aet_adv_rnk.bin F328DC96\nrom/2d/aet_adv_scrnk.bin 7C033233\nrom/2d/aet_cmn_all.bin BD5BEB34\nrom/2d/aet_db.bin 9D90DB4E\nrom/2d/aet_ent_cmn.bin 738D06F7\nrom/2d/aet_ent_name.bin 06C35596\nrom/2d/aet_ent_passintro.bin ACC3B852\nrom/2d/aet_gam_cmn.bin 26621ACA\nrom/2d/aet_gam_cont.bin C504754B\nrom/2d/aet_gam_ctstrslt.bin 84BDFCAF\nrom/2d/aet_gam_edttit.bin B79B955F\nrom/2d/aet_gam_eff000.bin F2318B7C\nrom/2d/aet_gam_eff001.bin 21B2E956\nrom/2d/aet_gam_eff002.bin B86DDA6C\nrom/2d/aet_gam_eff004.bin 602BBE34\nrom/2d/aet_gam_eff005.bin 59CDB042\nrom/2d/aet_gam_eff006.bin BC1048F1\nrom/2d/aet_gam_eff007.bin F5FC2D26\nrom/2d/aet_gam_eff008.bin 7F73EBC5\nrom/2d/aet_gam_eff009.bin 7C1A9850\nrom/2d/aet_gam_eff010.bin ABA5A88C\nrom/2d/aet_gam_eff011.bin 1B57E97D\nrom/2d/aet_gam_eff012.bin C0B5E93A\nrom/2d/aet_gam_eff013.bin B4B8A5F6\nrom/2d/aet_gam_eff014.bin 83520690\nrom/2d/aet_gam_eff015.bin 288168FB\nrom/2d/aet_gam_eff016.bin 62DA2C92\nrom/2d/aet_gam_eff017.bin 2818F2DB\nrom/2d/aet_gam_eff018.bin 8D9FE4AC\nrom/2d/aet_gam_eff019.bin 91089C14\nrom/2d/aet_gam_eff021.bin 39005777\nrom/2d/aet_gam_eff022.bin 92D67D2F\nrom/2d/aet_gam_eff023.bin 5F39E2E9\nrom/2d/aet_gam_eff024.bin 52FB75F4\nrom/2d/aet_gam_eff025.bin EAF9907B\nrom/2d/aet_gam_eff026.bin 284D5C81\nrom/2d/aet_gam_eff027.bin 3487BFC1\nrom/2d/aet_gam_eff028.bin 10817327\nrom/2d/aet_gam_eff029.bin 71E16F04\nrom/2d/aet_gam_eff030.bin 1A379F98\nrom/2d/aet_gam_eff031.bin 644C44E8\nrom/2d/aet_gam_eff032.bin 04F84018\nrom/2d/aet_gam_eff033.bin 3782E428\nrom/2d/aet_gam_eff034.bin FE8D6892\nrom/2d/aet_gam_eff035.bin 3612AD72\nrom/2d/aet_gam_eff036.bin EC0D19CA\nrom/2d/aet_gam_eff040.bin 7F1AF739\nrom/2d/aet_gam_eff041.bin 6F000779\nrom/2d/aet_gam_eff042.bin A160E9BE\nrom/2d/aet_gam_eff044.bin F1563F3B\nrom/2d/aet_gam_eff050.bin BAF8A0C2\nrom/2d/aet_gam_eff051.bin 6ED914D5\nrom/2d/aet_gam_eff052.bin 20D69954\nrom/2d/aet_gam_eff053.bin 74FB229D\nrom/2d/aet_gam_eff054.bin 0ABFE77E\nrom/2d/aet_gam_eff055.bin C2C0B4AF\nrom/2d/aet_gam_eff058.bin 0BF1E920\nrom/2d/aet_gam_eff059.bin EE1E53CA\nrom/2d/aet_gam_eff062.bin 190E50E7\nrom/2d/aet_gam_eff064.bin ED06C4CA\nrom/2d/aet_gam_eff066.bin D835C1A3\nrom/2d/aet_gam_eff068.bin 8903F7AA\nrom/2d/aet_gam_eff003.bin EAC1934E\nrom/2d/aet_gam_eff020.bin 5DBBF6FE\nrom/2d/aet_gam_eff039.bin 1ECBFA5A\nrom/2d/aet_gam_eff069.bin 416890D6\nrom/2d/aet_gam_pv012.bin AEE04144\nrom/2d/aet_gam_pv029.bin AD7D5AE0\nrom/2d/aet_gam_pv051.bin 2122D840\nrom/2d/aet_gam_pv081.bin 7664E65C\nrom/2d/aet_gam_pv101.bin 8393438D\nrom/2d/aet_gam_pv219.bin EE806ADF\nrom/2d/aet_gam_pv241.bin A7D2614D\nrom/2d/aet_gam_pv401.bin D07BCAAC\nrom/2d/aet_gam_pv418.bin 53ECF586\nrom/2d/aet_gam_pv439.bin B2C28B89\nrom/2d/aet_gam_pv614.bin 6EDE3B97\nrom/2d/aet_gam_eff070.bin 09BC7C1C\nrom/2d/aet_gam_eff071.bin CC73DB84\nrom/2d/aet_gam_gover.bin 09D7C254\nrom/2d/aet_gam_loadsc.bin 7963C4A9\nrom/2d/aet_gam_prize.bin 1E2846DA\nrom/2d/aet_gam_pv001.bin E6E74F84\nrom/2d/aet_gam_pv002.bin 8D6DF4FD\nrom/2d/aet_gam_pv003.bin 1CE7D3CA\nrom/2d/aet_gam_pv004.bin FE48B122\nrom/2d/aet_gam_pv005.bin 8FD8AFA1\nrom/2d/aet_gam_pv006.bin 07EB0DA9\nrom/2d/aet_gam_pv007.bin 7E74CFEA\nrom/2d/aet_gam_pv008.bin B2574F07\nrom/2d/aet_gam_pv009.bin 2E301A10\nrom/2d/aet_gam_pv010.bin BABB0D20\nrom/2d/aet_gam_pv011.bin CB1429ED\nrom/2d/aet_gam_pv013.bin 05D2C5C1\nrom/2d/aet_gam_pv014.bin C41C7FE1\nrom/2d/aet_gam_pv015.bin EF41F5DA\nrom/2d/aet_gam_pv016.bin D7B1123E\nrom/2d/aet_gam_pv017.bin 546DB118\nrom/2d/aet_gam_pv018.bin 9AB30147\nrom/2d/aet_gam_pv019.bin 64B4B5DC\nrom/2d/aet_gam_pv020.bin 6E5C96E6\nrom/2d/aet_gam_pv021.bin 088838FA\nrom/2d/aet_gam_pv022.bin 1A8F6532\nrom/2d/aet_gam_pv023.bin C056AD4B\nrom/2d/aet_gam_pv024.bin 515ED110\nrom/2d/aet_gam_pv025.bin 6FE12511\nrom/2d/aet_gam_pv026.bin 6E26F328\nrom/2d/aet_gam_pv027.bin EFD6C9B6\nrom/2d/aet_gam_pv028.bin 1482CFCF\nrom/2d/aet_gam_pv030.bin 160EE7EA\nrom/2d/aet_gam_pv031.bin AA7C9174\nrom/2d/aet_gam_pv032.bin F9C2598D\nrom/2d/aet_gam_pv037.bin EAA27AB5\nrom/2d/aet_gam_pv038.bin 1F4AA200\nrom/2d/aet_gam_pv039.bin BFD68A30\nrom/2d/aet_gam_pv040.bin CF95644A\nrom/2d/aet_gam_pv041.bin 5A2ECE48\nrom/2d/aet_gam_pv042.bin B6310B5E\nrom/2d/aet_gam_pv043.bin E2898816\nrom/2d/aet_gam_pv044.bin B1AB87E9\nrom/2d/aet_gam_pv045.bin 28C73421\nrom/2d/aet_gam_pv046.bin CEFEA9B0\nrom/2d/aet_gam_pv047.bin 588C06ED\nrom/2d/aet_gam_pv049.bin 85EF545C\nrom/2d/aet_gam_pv050.bin B91CBEF8\nrom/2d/aet_gam_pv052.bin 005901F8\nrom/2d/aet_gam_pv053.bin BA007D9B\nrom/2d/aet_gam_pv054.bin 04D136CD\nrom/2d/aet_gam_pv055.bin 68E2082D\nrom/2d/aet_gam_pv056.bin CA212F05\nrom/2d/aet_gam_pv057.bin BFF02BCB\nrom/2d/aet_gam_pv058.bin 3B65AF12\nrom/2d/aet_gam_pv059.bin E6ABAADF\nrom/2d/aet_gam_pv060.bin 13C8094A\nrom/2d/aet_gam_pv061.bin 1012FCB1\nrom/2d/aet_gam_pv062.bin 3F0EF22D\nrom/2d/aet_gam_pv063.bin 0784436F\nrom/2d/aet_gam_pv064.bin C9A7A9DA\nrom/2d/aet_gam_pv065.bin 9E850405\nrom/2d/aet_gam_pv066.bin 4F5F6A11\nrom/2d/aet_gam_pv079.bin 9F655847\nrom/2d/aet_gam_pv082.bin B33E8479\nrom/2d/aet_gam_pv083.bin 79E07D40\nrom/2d/aet_gam_pv084.bin A6A91BD3\nrom/2d/aet_gam_pv085.bin E378723B\nrom/2d/aet_gam_pv086.bin 5BF9496E\nrom/2d/aet_gam_pv087.bin CEFB8796\nrom/2d/aet_gam_pv088.bin 7FE8E46E\nrom/2d/aet_gam_pv089.bin 6004FBFD\nrom/2d/aet_gam_pv090.bin 57D0927D\nrom/2d/aet_gam_pv091.bin EBCD72F8\nrom/2d/aet_gam_pv092.bin AE0D55A0\nrom/2d/aet_gam_pv093.bin E8E74C32\nrom/2d/aet_gam_pv094.bin 9796D219\nrom/2d/aet_gam_pv095.bin FB26493B\nrom/2d/aet_gam_pv096.bin B220A23E\nrom/2d/aet_gam_pv097.bin CEB4C05D\nrom/2d/aet_gam_pv102.bin FA09CCE9\nrom/2d/aet_gam_pv103.bin D65FA7D7\nrom/2d/aet_gam_pv104.bin 031B7F2A\nrom/2d/aet_gam_pv201.bin CFD26150\nrom/2d/aet_gam_pv202.bin 6CA90732\nrom/2d/aet_gam_pv203.bin 4C8F8074\nrom/2d/aet_gam_pv204.bin F97799C3\nrom/2d/aet_gam_pv205.bin 4511EFBB\nrom/2d/aet_gam_pv206.bin C0E46571\nrom/2d/aet_gam_pv207.bin 3D640DCF\nrom/2d/aet_gam_pv208.bin DBA3F7B8\nrom/2d/aet_gam_pv210.bin FCB7D648\nrom/2d/aet_gam_pv211.bin F74B0B3C\nrom/2d/aet_gam_pv212.bin C2F1FA82\nrom/2d/aet_gam_pv214.bin B3ABD741\nrom/2d/aet_gam_pv218.bin A0053424\nrom/2d/aet_gam_pv220.bin 4ACB327D\nrom/2d/aet_gam_pv221.bin 11C26E3A\nrom/2d/aet_gam_pv222.bin C7032A46\nrom/2d/aet_gam_pv223.bin B84D2EAC\nrom/2d/aet_gam_pv224.bin 682A403E\nrom/2d/aet_gam_pv225.bin 2DF9AF01\nrom/2d/aet_gam_pv227.bin 5F0E38C9\nrom/2d/aet_gam_pv231.bin 1C2B920D\nrom/2d/aet_gam_pv232.bin 78DF2216\nrom/2d/aet_gam_pv233.bin 19BD1844\nrom/2d/aet_gam_pv234.bin B282DBBC\nrom/2d/aet_gam_pv235.bin 54248A02\nrom/2d/aet_gam_pv236.bin EA51F69F\nrom/2d/aet_gam_pv238.bin 4C387743\nrom/2d/aet_gam_pv239.bin AFC2E4AC\nrom/2d/aet_gam_pv240.bin 18D3033B\nrom/2d/aet_gam_pv242.bin 05F31BAC\nrom/2d/aet_gam_pv243.bin 45DCD9CD\nrom/2d/aet_gam_pv244.bin B061306F\nrom/2d/aet_gam_pv246.bin 52E56E4B\nrom/2d/aet_gam_pv247.bin A2D0D07E\nrom/2d/aet_gam_pv248.bin D557386D\nrom/2d/aet_gam_pv249.bin 0D1E8591\nrom/2d/aet_gam_pv250.bin 19CCD433\nrom/2d/aet_gam_pv251.bin E13D3214\nrom/2d/aet_gam_pv253.bin 02B0356C\nrom/2d/aet_gam_pv255.bin DEF1DCBE\nrom/2d/aet_gam_pv257.bin B5788C4A\nrom/2d/aet_gam_pv259.bin C1361A15\nrom/2d/aet_gam_pv260.bin 6F8A00AB\nrom/2d/aet_gam_pv261.bin 1EB9B443\nrom/2d/aet_gam_pv262.bin C193CF99\nrom/2d/aet_gam_pv402.bin 29CE5FFA\nrom/2d/aet_gam_pv403.bin F6097E3C\nrom/2d/aet_gam_pv404.bin 9C14B8C8\nrom/2d/aet_gam_pv405.bin B6BD1746\nrom/2d/aet_gam_pv406.bin 9365F284\nrom/2d/aet_gam_pv407.bin 95DA3DD2\nrom/2d/aet_gam_pv408.bin 8BCB843A\nrom/2d/aet_gam_pv409.bin 21C37D5B\nrom/2d/aet_gam_pv410.bin 36AC625B\nrom/2d/aet_gam_pv411.bin 912BB58A\nrom/2d/aet_gam_pv412.bin EB7A4904\nrom/2d/aet_gam_pv413.bin AB8E5AAF\nrom/2d/aet_gam_pv414.bin 11CC7550\nrom/2d/aet_gam_pv415.bin 0925C041\nrom/2d/aet_gam_pv416.bin 736FC49D\nrom/2d/aet_gam_pv417.bin D0082398\nrom/2d/aet_gam_pv419.bin 03554786\nrom/2d/aet_gam_pv420.bin 1D8F1E8D\nrom/2d/aet_gam_pv421.bin F1F00E73\nrom/2d/aet_gam_pv422.bin 925DC0BF\nrom/2d/aet_gam_pv423.bin AF8CA86A\nrom/2d/aet_gam_pv424.bin D8DA8F9E\nrom/2d/aet_gam_pv425.bin D32053E1\nrom/2d/aet_gam_pv426.bin F889402A\nrom/2d/aet_gam_pv427.bin 0D1E1E52\nrom/2d/aet_gam_pv432.bin 19FCFC52\nrom/2d/aet_gam_pv433.bin E1A4490A\nrom/2d/aet_gam_pv434.bin E2E311BA\nrom/2d/aet_gam_pv435.bin 5F2D875C\nrom/2d/aet_gam_pv436.bin 7D1D22A9\nrom/2d/aet_gam_pv437.bin A5300656\nrom/2d/aet_gam_pv438.bin 103D7878\nrom/2d/aet_gam_pv440.bin BA13691A\nrom/2d/aet_gam_pv441.bin E0E9AD35\nrom/2d/aet_gam_pv442.bin D8A61C74\nrom/2d/aet_gam_pv443.bin 795B315A\nrom/2d/aet_gam_pv600.bin D1C06C7B\nrom/2d/aet_gam_pv601.bin BE69364D\nrom/2d/aet_gam_pv602.bin 1B202632\nrom/2d/aet_gam_pv603.bin 93F706FB\nrom/2d/aet_gam_pv604.bin 04191A0E\nrom/2d/aet_gam_pv605.bin 1FC591D6\nrom/2d/aet_gam_pv607.bin 2AC99219\nrom/2d/aet_gam_pv609.bin 293F4B15\nrom/2d/aet_gam_pv610.bin 10400231\nrom/2d/aet_gam_pv611.bin ACAD04ED\nrom/2d/aet_gam_pv612.bin 37656207\nrom/2d/aet_gam_pv613.bin 9B5C31D9\nrom/2d/aet_gam_pv615.bin 8EFD4DEA\nrom/2d/aet_gam_pv616.bin 7CD942CC\nrom/2d/aet_gam_pv617.bin D3A2B388\nrom/2d/aet_gam_pv618.bin A8720EEA\nrom/2d/aet_gam_pv619.bin 0B88450C\nrom/2d/aet_gam_pv620.bin 007BE74C\nrom/2d/aet_gam_pv621.bin 5DDBE09A\nrom/2d/aet_gam_pv622.bin 84F8CB7E\nrom/2d/aet_gam_pv623.bin 4926BFCE\nrom/2d/aet_gam_pv624.bin 8CEEF213\nrom/2d/aet_gam_pv625.bin 559C83E0\nrom/2d/aet_gam_pv626.bin 08E0EE65\nrom/2d/aet_gam_pv627.bin CBD252A9\nrom/2d/aet_gam_pv628.bin 28A40F96\nrom/2d/aet_gam_pv629.bin 7E431FDA\nrom/2d/aet_gam_pv630.bin 656B5435\nrom/2d/aet_gam_pv637.bin 19B6FE3C\nrom/2d/aet_gam_pv638.bin 6E68391D\nrom/2d/aet_gam_pv639.bin AFD77F7C\nrom/2d/aet_gam_pv640.bin BF0AF0B4\nrom/2d/aet_gam_pv641.bin EAAAB719\nrom/2d/aet_gam_pv642.bin 6A68C8AC\nrom/2d/aet_gam_pv710.bin B2EEA5DE\nrom/2d/aet_gam_pv722.bin 92377687\nrom/2d/aet_gam_pv723.bin 7203235E\nrom/2d/aet_gam_pv724.bin 4E29F7BB\nrom/2d/aet_gam_pv725.bin 3E436F62\nrom/2d/aet_gam_pv726.bin 1F9E0044\nrom/2d/aet_gam_pv727.bin 4B7EFEC0\nrom/2d/aet_gam_pv728.bin 1509033A\nrom/2d/aet_gam_pv729.bin A3D7DE5F\nrom/2d/aet_gam_pv730.bin 50DF7386\nrom/2d/aet_gam_pv732.bin 66A76C51\nrom/2d/aet_gam_pv733.bin 4D4F08A3\nrom/2d/aet_gam_pv734.bin 6ED126DD\nrom/2d/aet_gam_pv736.bin A369B8C5\nrom/2d/aet_gam_pv737.bin 48DA06E9\nrom/2d/aet_gam_pv738.bin 25C9970F\nrom/2d/aet_gam_pv739.bin C2A6D2EC\nrom/2d/aet_gam_pv740.bin 74BDF12D\nrom/2d/aet_gam_pv832.bin DF13EE28\nrom/2d/aet_gam_qstrslt.bin E8E0E478\nrom/2d/aet_gam_result.bin 31B3BA04\nrom/2d/aet_gam_sc.bin C63569D5\nrom/2d/aet_gam_skin001.bin C2413FB5\nrom/2d/aet_gam_skin002.bin BA5EF4C0\nrom/2d/aet_gam_skin003.bin FAB0CFD2\nrom/2d/aet_gam_skin004.bin 4DEFD50F\nrom/2d/aet_gam_skin006.bin AE73E1BE\nrom/2d/aet_gam_skin007.bin 1AF8F2A3\nrom/2d/aet_gam_skin008.bin 9F3FEF8A\nrom/2d/aet_gam_skin009.bin 1101004A\nrom/2d/aet_gam_skin010.bin EE0B0ED1\nrom/2d/aet_gam_skin011.bin FC66A3A0\nrom/2d/aet_gam_skin012.bin A698122B\nrom/2d/aet_gam_skin013.bin C462CA57\nrom/2d/aet_gam_skin014.bin 263A4098\nrom/2d/aet_gam_skin015.bin D38F22A1\nrom/2d/aet_gam_skin016.bin 8971932A\nrom/2d/aet_gam_skin017.bin DED47AF3\nrom/2d/aet_gam_skin018.bin E3DA794F\nrom/2d/aet_gam_skin019.bin 68225A98\nrom/2d/aet_gam_skin020.bin FA84AB90\nrom/2d/aet_gam_skin021.bin C4E1BE5C\nrom/2d/aet_gam_skin023.bin B82B95C4\nrom/2d/aet_gam_skin024.bin CF8C46B4\nrom/2d/aet_gam_skin025.bin 4A6A3638\nrom/2d/aet_gam_skin026.bin ED018827\nrom/2d/aet_gam_skin027.bin D3649DEB\nrom/2d/aet_gam_skin028.bin 5DA04F45\nrom/2d/aet_gam_skin029.bin 80702CC7\nrom/2d/aet_gam_skin030.bin 7F7A225C\nrom/2d/aet_gam_skin031.bin F144CD9C\nrom/2d/aet_gam_skin032.bin 20D38CA0\nrom/2d/aet_gam_skin033.bin 5E0F1E2E\nrom/2d/aet_gam_skin034.bin 65CC92F8\nrom/2d/aet_gam_skin035.bin D14781E5\nrom/2d/aet_gam_skin036.bin EE20BC79\nrom/2d/aet_gam_skin037.bin 90FC2EF7\nrom/2d/aet_gam_skin038.bin 3BB72E35\nrom/2d/aet_gam_skin040.bin 78403F7A\nrom/2d/aet_gam_skin041.bin 069CADF4\nrom/2d/aet_gam_skin042.bin 751B6728\nrom/2d/aet_gam_skin043.bin B4FB8D8F\nrom/2d/aet_gam_skin044.bin B6F1A991\nrom/2d/aet_gam_skin045.bin C82D3B1F\nrom/2d/aet_gam_skin046.bin BBAAF1C3\nrom/2d/aet_gam_skin047.bin 35941E03\nrom/2d/aet_gam_skin048.bin 632EC7CE\nrom/2d/aet_gam_skin049.bin 1DF25540\nrom/2d/aet_gam_skin050.bin E2F85BDB\nrom/2d/aet_gam_skin051.bin C9CF4208\nrom/2d/aet_gam_skin052.bin 720A7B31\nrom/2d/aet_gam_skin053.bin AFF1445D\nrom/2d/aet_gam_skin054.bin 9432C88B\nrom/2d/aet_gam_skin055.bin 1A0C274B\nrom/2d/aet_gam_skin057.bin B547F4F9\nrom/2d/aet_gam_skin058.bin 1E0CF43B\nrom/2d/aet_gam_skin059.bin AA87E726\nrom/2d/aet_gam_skin060.bin 1883A570\nrom/2d/aet_gam_skin061.bin 665F37FE\nrom/2d/aet_gam_skin062.bin 30456988\nrom/2d/aet_gam_skin063.bin BE7B8648\nrom/2d/aet_gam_skin064.bin 27A8817E\nrom/2d/aet_gam_skin065.bin 597413F0\nrom/2d/aet_gam_skin066.bin 2AF3D92C\nrom/2d/aet_gam_skin067.bin EB13338B\nrom/2d/aet_gam_skin068.bin 98C98C6B\nrom/2d/aet_gam_skin069.bin E6151EE5\nrom/2d/aet_gam_skin070.bin 191F107E\nrom/2d/aet_gam_skin071.bin F5C5850D\nrom/2d/aet_gam_skin072.bin 2452C431\nrom/2d/aet_gam_skin074.bin 614DDA69\nrom/2d/aet_gam_skin075.bin D5C6C974\nrom/2d/aet_gam_skin076.bin 33F7D0D4\nrom/2d/aet_gam_skin077.bin 4D2B425A\nrom/2d/aet_gam_skin078.bin E6604298\nrom/2d/aet_gam_skin079.bin CD575B4B\nrom/2d/aet_gam_skin080.bin 70868130\nrom/2d/aet_gam_skin081.bin 777BFF13\nrom/2d/aet_gam_skin082.bin 04FC35CF\nrom/2d/aet_gam_skin083.bin B07726D2\nrom/2d/aet_gam_skin084.bin B6F43065\nrom/2d/aet_gam_skin085.bin C828A2EB\nrom/2d/aet_gam_skin086.bin BBAF6837\nrom/2d/aet_gam_skin087.bin 359187F7\nrom/2d/aet_gam_skin088.bin 3CCA0CD5\nrom/2d/aet_gam_skin089.bin 42169E5B\nrom/2d/aet_gam_skin091.bin 0770982A\nrom/2d/aet_gam_skin092.bin 74F752F6\nrom/2d/aet_gam_skin093.bin FAC9BD36\nrom/2d/aet_gam_skin094.bin 631ABA00\nrom/2d/aet_gam_skin095.bin 1DC6288E\nrom/2d/aet_gam_skin096.bin 6E41E252\nrom/2d/aet_gam_skin097.bin AFA108F5\nrom/2d/aet_gam_skin098.bin DC7BB715\nrom/2d/aet_gam_skin099.bin A2A7259B\nrom/2d/aet_gam_skin100.bin D9F1EEA9\nrom/2d/aet_gam_skin101.bin C1CE1500\nrom/2d/aet_gam_skin102.bin B249DFDC\nrom/2d/aet_gam_skin103.bin 06C2CCC1\nrom/2d/aet_gam_skin104.bin 0041DA76\nrom/2d/aet_gam_skin105.bin 7E9D48F8\nrom/2d/aet_gam_skin106.bin 0D1A8224\nrom/2d/aet_gam_skin108.bin 8A7FE6C6\nrom/2d/aet_gam_skin109.bin F4A37448\nrom/2d/aet_gam_skin110.bin 8735ECD8\nrom/2d/aet_gam_skin111.bin E93DCE5C\nrom/2d/aet_gam_skin112.bin 4965294A\nrom/2d/aet_gam_skin113.bin BCD04B73\nrom/2d/aet_gam_skin114.bin AE6ABCF2\nrom/2d/aet_gam_skin115.bin AB3DA385\nrom/2d/aet_gam_skin116.bin 624A1CCB\nrom/2d/aet_gam_skin117.bin 97FF7EF2\nrom/2d/aet_gam_skin118.bin 15CD0567\nrom/2d/aet_gam_skin119.bin 4268ECBE\nrom/2d/aet_gam_skin120.bin 5B6937F7\nrom/2d/aet_gam_skin121.bin D45D610C\nrom/2d/aet_gam_skin122.bin 8EA3D087\nrom/2d/aet_gam_skin123.bin D906395E\nrom/2d/aet_gam_skin125.bin E101CAFF\nrom/2d/aet_gam_skin126.bin 4A17BF01\nrom/2d/aet_gam_skin127.bin 34CB2D8F\nrom/2d/aet_gam_skin128.bin 8FFA5D8C\nrom/2d/aet_gam_skin129.bin 11BEC28D\nrom/2d/aet_gam_skin130.bin 4CA447F6\nrom/2d/aet_gam_skin131.bin AF2B9FA6\nrom/2d/aet_gam_skin132.bin EA38377F\nrom/2d/aet_gam_skin133.bin BD9DDEA6\nrom/2d/aet_gam_skin134.bin 101B510E\nrom/2d/aet_gam_skin135.bin 9F2F07F5\nrom/2d/aet_gam_skin136.bin C5D1B67E\nrom/2d/aet_gam_skin137.bin 92745FA7\nrom/2d/aet_gam_skin138.bin DFE79842\nrom/2d/aet_gam_skin139.bin D8A8FC50\nrom/2d/aet_gam_skin140.bin 156102DF\nrom/2d/aet_gam_skin142.bin 183A5A8D\nrom/2d/aet_gam_skin143.bin 330D435E\nrom/2d/aet_gam_skin144.bin C08C3C6D\nrom/2d/aet_gam_skin145.bin D9075B8E\nrom/2d/aet_gam_skin146.bin AD2B3E15\nrom/2d/aet_gam_skin147.bin FA8ED7CC\nrom/2d/aet_gam_skin148.bin 2389C7AD\nrom/2d/aet_gam_skin149.bin 9DC8441F\nrom/2d/aet_gam_skin150.bin 4BBB31D3\nrom/2d/aet_gam_skin151.bin 1C1ED80A\nrom/2d/aet_gam_skin152.bin B60214CF\nrom/2d/aet_gam_skin153.bin A39481C7\nrom/2d/aet_gam_skin154.bin C93E0CD3\nrom/2d/aet_gam_skin155.bin 9E9BE50A\nrom/2d/aet_gam_skin156.bin 7B592CA8\nrom/2d/aet_gam_skin157.bin F46D7A53\nrom/2d/aet_gam_skin159.bin 21FAE81F\nrom/2d/aet_gam_skin160.bin 77253631\nrom/2d/aet_gam_skin161.bin 82905408\nrom/2d/aet_gam_skin162.bin E3BCE134\nrom/2d/aet_gam_skin163.bin B41908ED\nrom/2d/aet_gam_skin164.bin 6CF47EFF\nrom/2d/aet_gam_skin165.bin 06110D47\nrom/2d/aet_gam_skin166.bin 5CEFBCCC\nrom/2d/aet_gam_skin167.bin 0B4A5515\nrom/2d/aet_gam_skin168.bin E33C7FAC\nrom/2d/aet_gam_skin169.bin D773E190\nrom/2d/aet_gam_skin170.bin 2879EF0B\nrom/2d/aet_gam_skin171.bin A64700CB\nrom/2d/aet_gam_skin172.bin 77D041F7\nrom/2d/aet_gam_skin173.bin 090CD379\nrom/2d/aet_gam_skin174.bin 32CF5FAF\nrom/2d/aet_gam_skin176.bin 5839C0F6\nrom/2d/aet_gam_skin177.bin 26E55278\nrom/2d/aet_gam_skin178.bin 91881848\nrom/2d/aet_gam_skin179.bin 96332EA8\nrom/2d/aet_gam_skin180.bin E3A00736\nrom/2d/aet_gam_skin181.bin DBF43F1E\nrom/2d/aet_gam_skin182.bin 02DAACB5\nrom/2d/aet_gam_skin183.bin 7C063E3B\nrom/2d/aet_gam_skin184.bin 47C5B2ED\nrom/2d/aet_gam_skin185.bin C9FB5D2D\nrom/2d/aet_gam_skin186.bin 186C1C11\nrom/2d/aet_gam_skin187.bin 59168BCC\nrom/2d/aet_gam_skin188.bin E1705DA3\nrom/2d/aet_gam_skin189.bin 6E440B58\nrom/2d/aet_gam_skin190.bin B8377E94\nrom/2d/aet_gam_skin191.bin EF92974D\nrom/2d/aet_gam_skin193.bin B03B39B1\nrom/2d/aet_gam_skin194.bin A281CE30\nrom/2d/aet_gam_skin195.bin F52427E9\nrom/2d/aet_gam_skin196.bin 1BF0A7EB\nrom/2d/aet_gam_skin197.bin 7181C6B3\nrom/2d/aet_gam_skin198.bin 42909FCE\nrom/2d/aet_gam_skin199.bin 15357617\nrom/2d/aet_gam_skin200.bin 7ED2A040\nrom/2d/aet_gam_skin201.bin 000E32CE\nrom/2d/aet_gam_skin202.bin 7389F812\nrom/2d/aet_gam_skin203.bin FDB717D2\nrom/2d/aet_gam_skin204.bin 0EA52218\nrom/2d/aet_gam_skin205.bin 2171F566\nrom/2d/aet_gam_skin206.bin 03FE7A4A\nrom/2d/aet_gam_skin207.bin 7ED85B9A\nrom/2d/aet_gam_skin208.bin 849B1EA8\nrom/2d/aet_gam_skin210.bin 120098DC\nrom/2d/aet_gam_skin211.bin 9D34CE27\nrom/2d/aet_gam_skin212.bin 6D0DC1B5\nrom/2d/aet_gam_skin213.bin 3AA8286C\nrom/2d/aet_gam_skin214.bin D8F0A2A3\nrom/2d/aet_gam_skin215.bin 2D45C09A\nrom/2d/aet_gam_skin216.bin 77BB7111\nrom/2d/aet_gam_skin217.bin 201E98C8\nrom/2d/aet_gam_skin218.bin 687B62CE\nrom/2d/aet_gam_skin219.bin E4AC0313\nrom/2d/aet_gam_skin220.bin 88C621E0\nrom/2d/aet_gam_skin221.bin E2235258\nrom/2d/aet_gam_skin222.bin B8DDE3D3\nrom/2d/aet_gam_skin223.bin EF780A0A\nrom/2d/aet_gam_skin224.bin 0D2080C5\nrom/2d/aet_gam_skin225.bin F895E2FC\nrom/2d/aet_gam_skin227.bin 4EEF2D66\nrom/2d/aet_gam_skin228.bin 8A55FC55\nrom/2d/aet_gam_skin229.bin 77594CFB\nrom/2d/aet_gam_skin230.bin A12A3937\nrom/2d/aet_gam_skin231.bin F68FD0EE\nrom/2d/aet_gam_skin232.bin 5C931C2B\nrom/2d/aet_gam_skin233.bin A9267E12\nrom/2d/aet_gam_skin234.bin BB9C8993\nrom/2d/aet_gam_skin235.bin EC39604A\nrom/2d/aet_gam_skin236.bin 7C905052\nrom/2d/aet_gam_skin237.bin 01879BB8\nrom/2d/aet_gam_skin238.bin 36200621\nrom/2d/aet_gam_skin239.bin D6C22F75\nrom/2d/aet_gam_skin240.bin 74EAAC35\nrom/2d/aet_gam_skin241.bin C652758F\nrom/2d/aet_gam_skin242.bin 6E5FF8DC\nrom/2d/aet_gam_skin244.bin 14D3C19D\nrom/2d/aet_gam_skin245.bin A66B1827\nrom/2d/aet_gam_skin246.bin 0E669574\nrom/2d/aet_gam_skin247.bin 42384B55\nrom/2d/aet_gam_skin248.bin B87B0E67\nrom/2d/aet_gam_skin249.bin C55D2FB7\nrom/2d/aet_gam_skin250.bin 6B5F64DC\nrom/2d/aet_gam_skin251.bin 448BB3A2\nrom/2d/aet_gam_skin252.bin 66043C8E\nrom/2d/aet_gam_skin253.bin BEC7F002\nrom/2d/aet_gam_skin254.bin E9B75E96\nrom/2d/aet_gam_skin255.bin C00AEAED\nrom/2d/aet_gam_skin256.bin E4EC06C4\nrom/2d/aet_gam_skin257.bin 9FA34411\nrom/2d/aet_gam_skin258.bin F333BEDF\nrom/2d/aet_gam_skin259.bin DA8E0AA4\nrom/2d/aet_gam_pv731.bin FC604D55\nrom/2d/aet_gam_skin005.bin E0B4B103\nrom/2d/aet_gam_skin022.bin E000DD02\nrom/2d/aet_gam_skin039.bin B589C1F5\nrom/2d/aet_gam_skin056.bin CB9B6677\nrom/2d/aet_gam_skin073.bin 5A8E56BF\nrom/2d/aet_gam_skin090.bin 318006CB\nrom/2d/aet_gam_skin107.bin 83246DE4\nrom/2d/aet_gam_skin124.bin 7F96FF56\nrom/2d/aet_gam_skin141.bin 6BBD9051\nrom/2d/aet_gam_skin158.bin 765F01C6\nrom/2d/aet_gam_skin175.bin F32FB508\nrom/2d/aet_gam_skin192.bin 458E5B88\nrom/2d/aet_gam_skin209.bin 7B4F9539\nrom/2d/aet_gam_skin226.bin A26B5377\nrom/2d/aet_gam_skin261.bin 4AD2E413\nrom/2d/aet_gam_skin262.bin 685D6B3F\nrom/2d/aet_gam_skin263.bin 4C27202D\nrom/2d/aet_gam_skin264.bin 039D5AC2\nrom/2d/aet_gam_skin265.bin 2B6B26AA\nrom/2d/aet_gam_skin266.bin 4B38DD44\nrom/2d/aet_gam_skin267.bin 63CEA12C\nrom/2d/aet_gam_skin268.bin E32F65E3\nrom/2d/aet_gam_skin269.bin 9E094433\nrom/2d/aet_gam_skin270.bin 300B0F58\nrom/2d/aet_gam_skin271.bin 3D8CC0F9\nrom/2d/aet_gam_skin272.bin 3D50570A\nrom/2d/aet_gam_skin273.bin E5939B86\nrom/2d/aet_gam_skin274.bin 8F5852A0\nrom/2d/aet_gam_skin275.bin A08C85DE\nrom/2d/aet_gam_skin276.bin A050122D\nrom/2d/aet_gam_skin278.bin 096EA68E\nrom/2d/aet_gam_skin279.bin 2AB2B96E\nrom/2d/aet_gam_skin280.bin 20720541\nrom/2d/aet_gam_skin281.bin A579161E\nrom/2d/aet_gam_skin282.bin A9AD4973\nrom/2d/aet_gam_skin283.bin A42A86D2\nrom/2d/aet_gam_skin284.bin C2E9876A\nrom/2d/aet_gam_skin285.bin B0F58FC7\nrom/2d/aet_gam_skin286.bin BC21D0AA\nrom/2d/aet_gam_skin287.bin BDAED795\nrom/2d/aet_gam_skin288.bin A1F5BC51\nrom/2d/aet_gam_skin289.bin E2240B60\nrom/2d/aet_gam_skin290.bin EAEED3A3\nrom/2d/aet_gam_skin291.bin 13537904\nrom/2d/aet_gam_skin292.bin 7F8A8EB8\nrom/2d/aet_gam_skin293.bin 8064DE9E\nrom/2d/aet_gam_skin295.bin A2D607CD\nrom/2d/aet_gam_skin296.bin F828B646\nrom/2d/aet_gam_skin297.bin AF8D5F9F\nrom/2d/aet_gam_skin298.bin FF0E419B\nrom/2d/aet_gam_skin299.bin 06B3EB3C\nrom/2d/aet_gam_skin300.bin 66E1C1EA\nrom/2d/aet_gam_skin301.bin 3D4CE0AD\nrom/2d/aet_gam_skin302.bin 83BE00F4\nrom/2d/aet_gam_skin303.bin ACA5AC98\nrom/2d/aet_gam_skin304.bin 90448B58\nrom/2d/aet_gam_skin305.bin E9BAB2C0\nrom/2d/aet_gam_skin306.bin 751B4A46\nrom/2d/aet_gam_skin307.bin 13F6F160\nrom/2d/aet_gam_skin308.bin 4B45843A\nrom/2d/aet_gam_skin309.bin 1CE06DE3\nrom/2d/aet_gam_skin310.bin 3A716561\nrom/2d/aet_gam_skin312.bin 953AB6D3\nrom/2d/aet_gam_skin313.bin C29F5F0A\nrom/2d/aet_gam_skin314.bin 1A722918\nrom/2d/aet_gam_skin315.bin 70975AA0\nrom/2d/aet_gam_skin316.bin 2A69EB2B\nrom/2d/aet_gam_skin317.bin 7DCC02F2\nrom/2d/aet_gam_skin318.bin 0F1C0429\nrom/2d/aet_gam_skin319.bin FAA96610\nrom/2d/aet_gam_skin320.bin 5C94C570\nrom/2d/aet_gam_skin321.bin 0B312CA9\nrom/2d/aet_gam_skin322.bin EEF3E50B\nrom/2d/aet_gam_skin323.bin 61C7B3F0\nrom/2d/aet_gam_skin324.bin 737D4471\nrom/2d/aet_gam_skin325.bin 24D8ADA8\nrom/2d/aet_gam_skin326.bin 8EC4616D\nrom/2d/aet_gam_skin327.bin 7B710354\nrom/2d/aet_gam_skin329.bin AEE69118\nrom/2d/aet_gam_skin330.bin B2C26547\nrom/2d/aet_gam_skin331.bin D82716FF\nrom/2d/aet_gam_skin332.bin 82D9A774\nrom/2d/aet_gam_skin333.bin 7B8B05C0\nrom/2d/aet_gam_skin334.bin 6931F241\nrom/2d/aet_gam_skin335.bin 3E941B98\nrom/2d/aet_gam_skin336.bin 3F5FC1E7\nrom/2d/aet_gam_skin337.bin 811E4255\nrom/2d/aet_gam_skin338.bin 647BCCAD\nrom/2d/aet_gam_skin339.bin EA45236D\nrom/2d/aet_gam_skin340.bin 278CDDE2\nrom/2d/aet_gam_skin341.bin 59504F6C\nrom/2d/aet_gam_skin342.bin 2AD785B0\nrom/2d/aet_gam_skin343.bin 5F0F3A74\nrom/2d/aet_gam_skin344.bin 9EBA43DC\nrom/2d/aet_gam_skin346.bin 93E11B8E\nrom/2d/aet_gam_skin347.bin 1DDFF44E\nrom/2d/aet_gam_skin348.bin 14847F6C\nrom/2d/aet_gam_skin349.bin 6A58EDE2\nrom/2d/aet_gam_skin350.bin 9552E379\nrom/2d/aet_gam_skin351.bin 21D9F064\nrom/2d/aet_gam_skin352.bin 6F1EA0D9\nrom/2d/aet_gam_skin353.bin 11C23257\nrom/2d/aet_gam_skin354.bin 2A01BE81\nrom/2d/aet_gam_skin355.bin A43F5141\nrom/2d/aet_gam_skin356.bin 75A8107D\nrom/2d/aet_gam_skin357.bin 0B7482F3\nrom/2d/aet_gam_skin358.bin A03F8231\nrom/2d/aet_gam_skin359.bin 61DF6896\nrom/2d/aet_gam_skin360.bin 360A0F83\nrom/2d/aet_gam_skin361.bin 48D69D0D\nrom/2d/aet_gam_skin363.bin B56FB811\nrom/2d/aet_gam_skin364.bin 2CBCBF27\nrom/2d/aet_gam_skin365.bin 52602DA9\nrom/2d/aet_gam_skin366.bin 695698EF\nrom/2d/aet_gam_skin367.bin 178A0A61\nrom/2d/aet_gam_skin368.bin F963D178\nrom/2d/aet_gam_skin369.bin 87BF43F6\nrom/2d/aet_gam_skin370.bin 78B54D6D\nrom/2d/aet_gam_skin371.bin F68BA2AD\nrom/2d/aet_gam_skin372.bin 271CE391\nrom/2d/aet_gam_skin373.bin 59C0711F\nrom/2d/aet_gam_skin374.bin 6203FDC9\nrom/2d/aet_gam_skin375.bin 47EA04B3\nrom/2d/aet_gam_skin376.bin DD89A404\nrom/2d/aet_gam_skin377.bin A355368A\nrom/2d/aet_gam_skin378.bin 081E3648\nrom/2d/aet_gam_skin380.bin 51A37BF6\nrom/2d/aet_gam_skin381.bin 2F7FE978\nrom/2d/aet_gam_skin382.bin 5CF823A4\nrom/2d/aet_gam_skin383.bin E87330B9\nrom/2d/aet_gam_skin384.bin EEF0260E\nrom/2d/aet_gam_skin385.bin A388B533\nrom/2d/aet_gam_skin386.bin F97604B8\nrom/2d/aet_gam_skin387.bin AED3ED61\nrom/2d/aet_gam_skin388.bin E6B61767\nrom/2d/aet_gam_skin389.bin 8C946F3B\nrom/2d/aet_gam_skin390.bin 90B09B64\nrom/2d/aet_gam_skin391.bin FA55E8DC\nrom/2d/aet_gam_skin392.bin 9779BA90\nrom/2d/aet_gam_skin393.bin F70EB08E\nrom/2d/aet_gam_skin394.bin 15563A41\nrom/2d/aet_gam_skin395.bin E0E35878\nrom/2d/aet_gam_skin397.bin E7B4ACFB\nrom/2d/aet_gam_skin398.bin DABAAF47\nrom/2d/aet_gam_skin399.bin 556C4E03\nrom/2d/aet_gam_skin400.bin A1C7E655\nrom/2d/aet_gam_skin401.bin F6620F8C\nrom/2d/aet_gam_skin402.bin 5C7EC349\nrom/2d/aet_gam_skin403.bin A9CBA170\nrom/2d/aet_gam_skin404.bin BB7156F1\nrom/2d/aet_gam_skin405.bin ECD4BF28\nrom/2d/aet_gam_skin406.bin 7C7D8F30\nrom/2d/aet_gam_skin407.bin 1698FC88\nrom/2d/aet_gam_skin408.bin 94AA871D\nrom/2d/aet_gam_skin409.bin C30F6EC4\nrom/2d/aet_gam_skin410.bin 036BE362\nrom/2d/aet_gam_skin411.bin F6DE815B\nrom/2d/aet_gam_skin412.bin AC2030D0\nrom/2d/aet_gam_skin414.bin AFB7842E\nrom/2d/aet_gam_skin415.bin 52BB3480\nrom/2d/aet_gam_skin416.bin 0E41E144\nrom/2d/aet_gam_skin417.bin 5FE06CD2\nrom/2d/aet_gam_skin418.bin 2D306A09\nrom/2d/aet_gam_skin419.bin D8850830\nrom/2d/aet_gam_skin420.bin E729A267\nrom/2d/aet_gam_skin421.bin C104C0D7\nrom/2d/aet_gam_skin422.bin 51ADF0CF\nrom/2d/aet_gam_skin423.bin 3B488377\nrom/2d/aet_gam_skin424.bin 3DEB2D54\nrom/2d/aet_gam_skin425.bin 7E579D2F\nrom/2d/aet_gam_skin426.bin D44B51EA\nrom/2d/aet_gam_skin427.bin 21FE33D3\nrom/2d/aet_gam_skin428.bin A3CC4846\nrom/2d/aet_gam_skin429.bin F469A19F\nrom/2d/aet_gam_skin431.bin 000FC76C\nrom/2d/aet_gam_skin432.bin 5AF176E7\nrom/2d/aet_gam_skin433.bin 0B50FB71\nrom/2d/aet_gam_skin434.bin EF0C15F1\nrom/2d/aet_gam_skin435.bin 1AB977C8\nrom/2d/aet_gam_skin436.bin 4047C643\nrom/2d/aet_gam_skin437.bin 17E22F9A\nrom/2d/aet_gam_skin438.bin 5F87D59C\nrom/2d/aet_gam_skin439.bin 3562A624\nrom/2d/aet_gam_skin440.bin 47A746ED\nrom/2d/aet_gam_skin441.bin 1002AF34\nrom/2d/aet_gam_skin442.bin BA1E63F1\nrom/2d/aet_gam_skin443.bin 4FAB01C8\nrom/2d/aet_gam_skin444.bin 60C796B1\nrom/2d/aet_gam_skin445.bin 37627F68\nrom/2d/aet_gam_skin446.bin 0B7FC5EF\nrom/2d/aet_gam_skin448.bin E59C561D\nrom/2d/aet_gam_skin449.bin 8FEFDF3C\nrom/2d/aet_gam_skin450.bin F76BE19D\nrom/2d/aet_gam_skin451.bin E092E735\nrom/2d/aet_gam_skin452.bin 77584B08\nrom/2d/aet_gam_skin453.bin BF3B49C9\nrom/2d/aet_gam_skin454.bin A18976D6\nrom/2d/aet_gam_skin455.bin B0563E07\nrom/2d/aet_gam_skin456.bin 20FF0E1F\nrom/2d/aet_gam_skin457.bin 4A1A7DA7\nrom/2d/aet_gam_skin458.bin C8280632\nrom/2d/aet_gam_skin459.bin D9F74EE3\nrom/2d/aet_gam_skin460.bin C95231C5\nrom/2d/aet_gam_skin461.bin 3F587124\nrom/2d/aet_gam_skin462.bin 65A6C0AF\nrom/2d/aet_gam_skin463.bin 32032976\nrom/2d/aet_gam_skin465.bin 10B1F025\nrom/2d/aet_gam_skin466.bin 4A4F41AE\nrom/2d/aet_gam_skin467.bin 1DEAA877\nrom/2d/aet_gam_skin468.bin B1A20DE7\nrom/2d/aet_gam_skin469.bin 44176FDE\nrom/2d/aet_gam_skin470.bin 92641A12\nrom/2d/aet_gam_skin471.bin C5C1F3CB\nrom/2d/aet_gam_skin472.bin 5568C3D3\nrom/2d/aet_gam_skin473.bin 3F8DB06B\nrom/2d/aet_gam_skin474.bin 2D3747EA\nrom/2d/aet_gam_skin475.bin A40A0D78\nrom/2d/aet_gam_skin476.bin 0E16C1BD\nrom/2d/aet_gam_skin477.bin FBA3A384\nrom/2d/aet_gam_skin478.bin 7991D811\nrom/2d/aet_gam_skin479.bin 2E3431C8\nrom/2d/aet_gam_skin480.bin 3C0ADF5D\nrom/2d/aet_gam_skin482.bin 733D5142\nrom/2d/aet_gam_skin483.bin ECDA4B7E\nrom/2d/aet_gam_skin484.bin FE60BCFF\nrom/2d/aet_gam_skin485.bin A9C55526\nrom/2d/aet_gam_skin486.bin 03D999E3\nrom/2d/aet_gam_skin487.bin F66CFBDA\nrom/2d/aet_gam_skin488.bin 745E804F\nrom/2d/aet_gam_skin489.bin DB150030\nrom/2d/aet_gam_skin490.bin C731F46F\nrom/2d/aet_gam_skin491.bin ADD487D7\nrom/2d/aet_gam_skin492.bin F72A365C\nrom/2d/aet_gam_skin493.bin A08FDF85\nrom/2d/aet_gam_skin494.bin 42D7554A\nrom/2d/aet_gam_skin495.bin B7623773\nrom/2d/aet_gam_skin496.bin 2EA0EBE9\nrom/2d/aet_gam_skin497.bin 79050230\nrom/2d/aet_gam_skin499.bin CB3F5777\nrom/2d/aet_gam_skin500.bin 8536ADE0\nrom/2d/aet_gam_skin501.bin D2934439\nrom/2d/aet_gam_skin502.bin 788F88FC\nrom/2d/aet_gam_skin503.bin DCE630B7\nrom/2d/aet_gam_skin504.bin CE5CC736\nrom/2d/aet_gam_skin505.bin 99F92EEF\nrom/2d/aet_gam_skin506.bin 09501EF7\nrom/2d/aet_gam_skin507.bin 63B56D4F\nrom/2d/aet_gam_skin508.bin E18716DA\nrom/2d/aet_gam_skin509.bin B622FF03\nrom/2d/aet_gam_skin510.bin E1DEB885\nrom/2d/aet_gam_skin511.bin CBF1DED5\nrom/2d/aet_gam_skin512.bin 49DFA154\nrom/2d/aet_gam_skin513.bin BC6AC36D\nrom/2d/aet_gam_skin514.bin AED034EC\nrom/2d/aet_gam_skin516.bin F660E7E3\nrom/2d/aet_gam_skin517.bin 6987FDDF\nrom/2d/aet_gam_skin518.bin EBB5864A\nrom/2d/aet_gam_skin519.bin BC106F93\nrom/2d/aet_gam_skin520.bin EACFB1BD\nrom/2d/aet_gam_skin521.bin 15767F55\nrom/2d/aet_gam_skin522.bin 4F88CEDE\nrom/2d/aet_gam_skin523.bin 182D2707\nrom/2d/aet_gam_skin524.bin C0C05115\nrom/2d/aet_gam_skin525.bin AA2522AD\nrom/2d/aet_gam_skin526.bin F0DB9326\nrom/2d/aet_gam_skin527.bin A77E7AFF\nrom/2d/aet_gam_skin528.bin D5AE7C24\nrom/2d/aet_gam_skin529.bin 201B1E1D\nrom/2d/aet_gam_skin530.bin 838ECA79\nrom/2d/aet_gam_skin531.bin D42B23A0\nrom/2d/aet_gam_skin260.bin 02ABF466\nrom/2d/aet_gam_skin277.bin FF252B22\nrom/2d/aet_gam_skin294.bin 03B98177\nrom/2d/aet_gam_skin311.bin CFC40758\nrom/2d/aet_gam_skin328.bin F94378C1\nrom/2d/aet_gam_skin345.bin E066D152\nrom/2d/aet_gam_skin362.bin 3B5157D1\nrom/2d/aet_gam_skin379.bin 8620D988\nrom/2d/aet_gam_skin396.bin B0114522\nrom/2d/aet_gam_skin413.bin FB85D909\nrom/2d/aet_gam_skin430.bin 8F3B9197\nrom/2d/aet_gam_skin447.bin 5A784D70\nrom/2d/aet_gam_skin464.bin 9F85A6DE\nrom/2d/aet_gam_skin481.bin 9ADDEEB0\nrom/2d/aet_gam_skin498.bin 440B018C\nrom/2d/aet_gam_skin533.bin BEDDBCF9\nrom/2d/aet_gam_skin534.bin AC674B78\nrom/2d/aet_gam_skin535.bin FBC2A2A1\nrom/2d/aet_gam_skin536.bin 51DE6E64\nrom/2d/aet_gam_skin537.bin A46B0C5D\nrom/2d/aet_gam_skin538.bin 5DF5B638\nrom/2d/aet_gam_skin539.bin 0A505FE1\nrom/2d/aet_gam_skin540.bin 689A8ECF\nrom/2d/aet_gam_skin541.bin B9A0F78D\nrom/2d/aet_gam_skin542.bin 2909C795\nrom/2d/aet_gam_skin543.bin 43ECB42D\nrom/2d/aet_gam_skin544.bin 515643AC\nrom/2d/aet_gam_skin545.bin 06F3AA75\nrom/2d/aet_gam_skin546.bin ACEF66B0\nrom/2d/aet_gam_skin547.bin 648C6471\nrom/2d/aet_gam_skin548.bin E6BE1FE4\nrom/2d/aet_gam_skin550.bin 328308AC\nrom/2d/aet_gam_skin551.bin AD641290\nrom/2d/aet_gam_skin552.bin F79AA31B\nrom/2d/aet_gam_skin553.bin A03F4AC2\nrom/2d/aet_gam_skin554.bin 4267C00D\nrom/2d/aet_gam_skin555.bin 7A747E64\nrom/2d/aet_gam_skin556.bin D279F337\nrom/2d/aet_gam_skin557.bin 329BDA63\nrom/2d/aet_gam_skin558.bin 05699851\nrom/2d/aet_gam_skin559.bin 1364A037\nrom/2d/aet_gam_skin560.bin E5F312E6\nrom/2d/aet_gam_skin561.bin 05113BB2\nrom/2d/aet_gam_skin562.bin AD2FFC78\nrom/2d/aet_gam_skin563.bin 1F9725C2\nrom/2d/aet_gam_skin564.bin 742C5AE8\nrom/2d/aet_gam_skin565.bin 94CE73BC\nrom/2d/aet_gam_skin567.bin D97C3897\nrom/2d/aet_gam_skin568.bin EEDBA50E\nrom/2d/aet_gam_skin569.bin 0E398C5A\nrom/2d/aet_gam_skin570.bin F98E384B\nrom/2d/aet_gam_skin571.bin 6DC91FDF\nrom/2d/aet_gam_skin572.bin C5F7D815\nrom/2d/aet_gam_skin573.bin 774F01AF\nrom/2d/aet_gam_skin574.bin 53BE3211\nrom/2d/aet_gam_skin575.bin 041BDBC8\nrom/2d/aet_gam_skin576.bin 94B2EBD0\nrom/2d/aet_gam_skin577.bin FE579868\nrom/2d/aet_gam_skin578.bin 7C65E3FD\nrom/2d/aet_gam_skin579.bin 2BC00A24\nrom/2d/aet_gam_skin580.bin 87C825A3\nrom/2d/aet_gam_skin581.bin 727D479A\nrom/2d/aet_gam_skin582.bin 2883F611\nrom/2d/aet_gam_skin584.bin 347FAB8A\nrom/2d/aet_gam_skin585.bin AB98B1B6\nrom/2d/aet_gam_skin586.bin F166003D\nrom/2d/aet_gam_skin587.bin A6C3E9E4\nrom/2d/aet_gam_skin588.bin D413EF3F\nrom/2d/aet_gam_skin589.bin 21A68D06\nrom/2d/aet_gam_skin590.bin F7D5F8CA\nrom/2d/aet_gam_skin591.bin A0701113\nrom/2d/aet_gam_skin592.bin DE62A038\nrom/2d/aet_gam_skin593.bin B487D380\nrom/2d/aet_gam_skin594.bin A63D2401\nrom/2d/aet_gam_skin595.bin F198CDD8\nrom/2d/aet_gam_skin596.bin 5B84011D\nrom/2d/aet_gam_skin597.bin AE316324\nrom/2d/aet_gam_skin598.bin 2C0318B1\nrom/2d/aet_gam_skin599.bin 7BA6F168\nrom/2d/aet_gam_skin601.bin A20EE822\nrom/2d/aet_gam_skin602.bin 94A1C04B\nrom/2d/aet_gam_skin603.bin 1B9596B0\nrom/2d/aet_gam_skin604.bin 092F6131\nrom/2d/aet_gam_skin605.bin 5E8A88E8\nrom/2d/aet_gam_skin606.bin F496442D\nrom/2d/aet_gam_skin607.bin 01232614\nrom/2d/aet_gam_skin608.bin 83115D81\nrom/2d/aet_gam_skin609.bin D4B4B458\nrom/2d/aet_gam_skin610.bin C8904007\nrom/2d/aet_gam_skin611.bin A27533BF\nrom/2d/aet_gam_skin612.bin 20174530\nrom/2d/aet_gam_skin613.bin 77B2ACE9\nrom/2d/aet_gam_skin614.bin 95EA2626\nrom/2d/aet_gam_skin615.bin 605F441F\nrom/2d/aet_gam_skin616.bin 3AA1F594\nrom/2d/aet_gam_skin618.bin BADDEC85\nrom/2d/aet_gam_skin619.bin FBA255F2\nrom/2d/aet_gam_skin620.bin 5D9FF692\nrom/2d/aet_gam_skin621.bin 0A3A1F4B\nrom/2d/aet_gam_skin622.bin A026D38E\nrom/2d/aet_gam_skin623.bin 5593B1B7\nrom/2d/aet_gam_skin624.bin 47294636\nrom/2d/aet_gam_skin625.bin 108CAFEF\nrom/2d/aet_gam_skin626.bin C05B5AB0\nrom/2d/aet_gam_skin627.bin ECC48800\nrom/2d/aet_gam_skin628.bin 6EF6F395\nrom/2d/aet_gam_skin629.bin 39531A4C\nrom/2d/aet_gam_skin630.bin 6EAF5DCA\nrom/2d/aet_gam_skin631.bin 44803B9A\nrom/2d/aet_gam_skin632.bin EE9CF75F\nrom/2d/aet_gam_skin633.bin 1B299566\nrom/2d/aet_gam_skin635.bin CADD9E3B\nrom/2d/aet_gam_skin636.bin 2F1F5799\nrom/2d/aet_gam_skin637.bin A02B0162\nrom/2d/aet_gam_skin638.bin 22197AF7\nrom/2d/aet_gam_skin639.bin 75BC932E\nrom/2d/aet_gam_skin640.bin C3FEE058\nrom/2d/aet_gam_skin641.bin 7A3C5060\nrom/2d/aet_gam_skin642.bin 20C2E1EB\nrom/2d/aet_gam_skin643.bin 77670832\nrom/2d/aet_gam_skin644.bin AF8A7E20\nrom/2d/aet_gam_skin645.bin C56F0D98\nrom/2d/aet_gam_skin646.bin 9F91BC13\nrom/2d/aet_gam_skin647.bin C83455CA\nrom/2d/aet_gam_skin648.bin A74E84BA\nrom/2d/aet_gam_skin649.bin 4F513128\nrom/2d/aet_gam_skin650.bin 992244E4\nrom/2d/aet_gam_skin652.bin C19297EB\nrom/2d/aet_gam_skin653.bin 5E758DD7\nrom/2d/aet_gam_skin654.bin 4CCF7A56\nrom/2d/aet_gam_skin655.bin 1B6A938F\nrom/2d/aet_gam_skin656.bin B1765F4A\nrom/2d/aet_gam_skin657.bin 44C33D73\nrom/2d/aet_gam_skin658.bin C6F146E6\nrom/2d/aet_gam_skin659.bin 9154AF3F\nrom/2d/aet_gam_skin660.bin 1303D349\nrom/2d/aet_gam_skin661.bin C239AA0B\nrom/2d/aet_gam_skin662.bin 52909A13\nrom/2d/aet_gam_skin663.bin 3875E9AB\nrom/2d/aet_gam_skin664.bin 2ACF1E2A\nrom/2d/aet_gam_skin665.bin 7D6AF7F3\nrom/2d/aet_gam_skin666.bin D7763B36\nrom/2d/aet_gam_skin667.bin 22C3590F\nrom/2d/aet_gam_skin669.bin C36B40DC\nrom/2d/aet_gam_skin670.bin EFBBAB87\nrom/2d/aet_gam_skin671.bin 89CD921E\nrom/2d/aet_gam_skin672.bin 01A34840\nrom/2d/aet_gam_skin673.bin 8496CA4C\nrom/2d/aet_gam_skin674.bin B856E3C8\nrom/2d/aet_gam_skin675.bin 937B22BA\nrom/2d/aet_gam_skin676.bin C9859331\nrom/2d/aet_gam_skin677.bin 9E207AE8\nrom/2d/aet_gam_skin678.bin 04D5EB3B\nrom/2d/aet_gam_skin679.bin FCDE3611\nrom/2d/aet_gam_skin680.bin B8C4A72F\nrom/2d/aet_gam_skin681.bin 68251FEA\nrom/2d/aet_gam_skin682.bin 72F43FEE\nrom/2d/aet_gam_skin683.bin BD138451\nrom/2d/aet_gam_skin684.bin 73AC4E4D\nrom/2d/aet_gam_skin686.bin 9214C369\nrom/2d/aet_gam_skin687.bin C69321B9\nrom/2d/aet_gam_skin688.bin 62AC5CD2\nrom/2d/aet_gam_skin689.bin E439B04A\nrom/2d/aet_gam_skin690.bin 4D698247\nrom/2d/aet_gam_skin691.bin 19BD04B1\nrom/2d/aet_gam_skin692.bin 360F11E6\nrom/2d/aet_gam_skin693.bin 42A6469A\nrom/2d/aet_gam_skin694.bin A13FC014\nrom/2d/aet_gam_skin695.bin 4E8A99BB\nrom/2d/aet_gam_skin696.bin A524750B\nrom/2d/aet_gam_skin697.bin 4A912CA4\nrom/2d/aet_gam_skin698.bin 42C414EE\nrom/2d/aet_gam_skin699.bin AD714D41\nrom/2d/aet_gam_skin700.bin 756536B5\nrom/2d/aet_gam_skin701.bin 74D58C38\nrom/2d/aet_gam_skin703.bin 4E26A389\nrom/2d/aet_gam_skin704.bin B818AC9D\nrom/2d/aet_gam_skin705.bin DCDFF5A8\nrom/2d/aet_gam_skin706.bin 03FC6A95\nrom/2d/aet_gam_skin707.bin 8B5CA5D5\nrom/2d/aet_gam_skin708.bin AD2D3AF8\nrom/2d/aet_gam_skin709.bin 258DF5B8\nrom/2d/aet_gam_skin710.bin 127CC176\nrom/2d/aet_gam_skin711.bin 3558E246\nrom/2d/aet_gam_skin712.bin C74A5ACD\nrom/2d/aet_gam_skin713.bin 4FEA958D\nrom/2d/aet_gam_skin714.bin D9142814\nrom/2d/aet_gam_skin715.bin 7A48D585\nrom/2d/aet_gam_skin716.bin B6566BFA\nrom/2d/aet_gam_skin717.bin 3EF6A4BA\nrom/2d/aet_gam_skin718.bin 5FDC15F3\nrom/2d/aet_gam_skin720.bin 718600C1\nrom/2d/aet_gam_skin721.bin F926CF81\nrom/2d/aet_gam_skin722.bin 14327470\nrom/2d/aet_gam_skin723.bin 64EE32E2\nrom/2d/aet_gam_skin724.bin AF02871D\nrom/2d/aet_gam_skin725.bin 27A2485D\nrom/2d/aet_gam_skin726.bin CAB6F3AC\nrom/2d/aet_gam_skin727.bin ED92D09C\nrom/2d/aet_gam_skin728.bin A94C0E6F\nrom/2d/aet_gam_skin729.bin 6E6C0D93\nrom/2d/aet_gam_skin730.bin C53140D8\nrom/2d/aet_gam_skin731.bin 918B0A1B\nrom/2d/aet_gam_skin732.bin 2B5DC7D2\nrom/2d/aet_gam_skin733.bin 6DE631CD\nrom/2d/aet_gam_skin734.bin 482255AB\nrom/2d/aet_gam_skin735.bin A8C729C3\nrom/2d/aet_gam_skin737.bin 045DF73C\nrom/2d/aet_gam_skin738.bin B5E78C4D\nrom/2d/aet_key_input.bin 412AC6F6\nrom/2d/aet_key_pass.bin A91ABBA8\nrom/2d/aet_key_svol.bin DE7F571C\nrom/2d/aet_key_win.bin FA746366\nrom/2d/aet_sel_belt.bin 6C18ECF9\nrom/2d/aet_sel_camp.bin F19129A3\nrom/2d/aet_sel_camp02.bin 16B7E02C\nrom/2d/aet_sel_card.bin 4E59ECF8\nrom/2d/aet_sel_cardbg.bin 89300B2F\nrom/2d/aet_sel_cardinfo.bin 82D22242\nrom/2d/aet_sel_chlle.bin 83C0A2DF\nrom/2d/aet_sel_cmn.bin FAAF83E1\nrom/2d/aet_sel_credit.bin E595BD64\nrom/2d/aet_sel_ctst.bin 02963C34\nrom/2d/aet_sel_module.bin A926F5DB\nrom/2d/aet_sel_pleff.bin 01AEFCC4\nrom/2d/aet_sel_print.bin EAD97CCB\nrom/2d/aet_sel_procedure.bin 9FED77BC\nrom/2d/aet_sel_pv.bin DD3699BB\nrom/2d/aet_sel_qst.bin C51EDE22\nrom/2d/aet_sel_result.bin 3DDEDFE1\nrom/2d/aet_sel_sc.bin 5C88B3CD\nrom/2d/aet_sel_stamp.bin EB5BAFB3\nrom/2d/aet_sel_ticket.bin 4AC2DA60\nrom/2d/aet_sel_vaccess.bin BA76F087\nrom/2d/aet_sel_watch.bin 7DD6BA35\nrom/2d/spr_adv_cmn.farc 63AC4E17\nrom/2d/spr_adv_nobl.farc B7815633\nrom/2d/spr_adv_rnk.farc 8461A29F\nrom/2d/spr_adv_scrnk.farc 7A8840CF\nrom/2d/spr_clt_crd0001.farc FD13378F\nrom/2d/spr_clt_crd0002.farc 6EF16A55\nrom/2d/spr_clt_crd0003.farc EFA6A229\nrom/2d/spr_clt_crd0004.farc 18E61B83\nrom/2d/spr_clt_crd0005.farc 88EB5991\nrom/2d/spr_clt_crd0006.farc 87FCB3BE\nrom/2d/spr_clt_crd0007.farc 7C589481\nrom/2d/spr_clt_crd0008.farc A0D66982\nrom/2d/spr_clt_crd0009.farc C2F3B864\nrom/2d/spr_clt_crd0010.farc 4FA0625C\nrom/2d/spr_clt_crd0011.farc 564BFA88\nrom/2d/spr_clt_crd0012.farc 3D23E87B\nrom/2d/spr_clt_crd0013.farc 4119B616\nrom/2d/spr_clt_crd0014.farc 96DAB27B\nrom/2d/spr_clt_crd0015.farc EDDD981D\nrom/2d/spr_clt_crd0017.farc 7FC26192\nrom/2d/spr_clt_crd0018.farc A45C2651\nrom/2d/spr_clt_crd0019.farc 16308EEF\nrom/2d/spr_clt_crd0020.farc E20646DF\nrom/2d/spr_clt_crd0021.farc A6410D68\nrom/2d/spr_clt_crd0022.farc 9C3F2945\nrom/2d/spr_clt_crd0023.farc ED2E4FD2\nrom/2d/spr_clt_crd0024.farc 5F6BF9F4\nrom/2d/spr_clt_crd0025.farc 8D08B83F\nrom/2d/spr_clt_crd0026.farc 57E4CC14\nrom/2d/spr_clt_crd0027.farc 5B426303\nrom/2d/spr_clt_crd0028.farc EDF371C4\nrom/2d/spr_clt_crd0029.farc A9A9E428\nrom/2d/spr_clt_crd0030.farc 182CE2FC\nrom/2d/spr_clt_crd0031.farc B823AAA6\nrom/2d/aet_gam_skin532.bin 31E9EA02\nrom/2d/aet_gam_skin549.bin B11BF63D\nrom/2d/aet_gam_skin566.bin 3C5B0B20\nrom/2d/aet_gam_skin583.bin 732ED756\nrom/2d/aet_gam_skin600.bin 5E6FA905\nrom/2d/aet_gam_skin617.bin 6D041C4D\nrom/2d/aet_gam_skin634.bin 9D7877E2\nrom/2d/aet_gam_skin651.bin CE87AD3D\nrom/2d/aet_gam_skin668.bin A0F1229A\nrom/2d/aet_gam_skin685.bin A34DF688\nrom/2d/aet_gam_skin702.bin A193FA26\nrom/2d/aet_gam_skin719.bin 78F836C3\nrom/2d/aet_gam_skin736.bin 21CE8420\nrom/2d/aet_sel_ctstinfo.bin 5906CD1C\nrom/2d/spr_clt_crd0000.farc 9B8C0B11\nrom/2d/aet_gam_pv631.bin 7ECFFA92\nrom/2d/aet_gam_skin243.bin 7F5BF42E\nrom/2d/aet_gam_skin515.bin F975DD35\nrom/2d/spr_clt_crd0016.farc 2A9666F4\nrom/2d/spr_clt_crd0256.farc 219CEB01\nrom/2d/spr_clt_crd0496.farc A6C4BB9C\nrom/2d/spr_cmnitm_thmb126.farc 92D22208\nrom/2d/spr_edit_d2pvback124.farc F3D207D5\nrom/2d/spr_edit_pvback120.farc 32405428\nrom/2d/spr_gam_pv250.farc 29A2CCEA\nrom/2d/spr_gam_skin140.farc 63AB73A4\nrom/2d/spr_gam_skin380.farc CC6B697A\nrom/2d/spr_gam_skin620.farc 9687CAB8\nrom/2d/spr_sel_md106cmn.farc 2A0ADFEC\nrom/2d/spr_sel_md387cmn.farc 90C69099\nrom/2d/spr_clt_crd0033.farc 8BE4CFBB\nrom/2d/spr_clt_crd0034.farc 2F88B7F4\nrom/2d/spr_clt_crd0035.farc EEFABFBC\nrom/2d/spr_clt_crd0036.farc F1E1C8B5\nrom/2d/spr_clt_crd0037.farc BCA53BA5\nrom/2d/spr_clt_crd0038.farc 4BCDD699\nrom/2d/spr_clt_crd0039.farc E7C9781E\nrom/2d/spr_clt_crd0040.farc ECCB31F1\nrom/2d/spr_clt_crd0041.farc 0671C1BA\nrom/2d/spr_clt_crd0042.farc 41A4EA4F\nrom/2d/spr_clt_crd0043.farc 8386D7A1\nrom/2d/spr_clt_crd0044.farc 443AE836\nrom/2d/spr_clt_crd0045.farc 3C4F3C9E\nrom/2d/spr_clt_crd0046.farc C2C19F33\nrom/2d/spr_clt_crd0047.farc 8AE4D281\nrom/2d/spr_clt_crd0049.farc 16CA7CCD\nrom/2d/spr_clt_crd0050.farc 9755AD5C\nrom/2d/spr_clt_crd0051.farc 42432B61\nrom/2d/spr_clt_crd0052.farc B09E1FD6\nrom/2d/spr_clt_crd0053.farc 728BAE10\nrom/2d/spr_clt_crd0054.farc CBEAFAF5\nrom/2d/spr_clt_crd0055.farc 39630AB6\nrom/2d/spr_clt_crd0056.farc 9AA88312\nrom/2d/spr_clt_crd0057.farc 82A11F35\nrom/2d/spr_clt_crd0058.farc 1B3C5784\nrom/2d/spr_clt_crd0059.farc 917DFF00\nrom/2d/spr_clt_crd0060.farc 41286463\nrom/2d/spr_clt_crd0061.farc B32BE4DC\nrom/2d/spr_clt_crd0062.farc DE8BB496\nrom/2d/spr_clt_crd0063.farc 032FF2E4\nrom/2d/spr_clt_crd0065.farc 8DB1F93E\nrom/2d/spr_clt_crd0066.farc 12130F6E\nrom/2d/spr_clt_crd0067.farc CC557569\nrom/2d/spr_clt_crd0068.farc 813BB39E\nrom/2d/spr_clt_crd0069.farc 77ADAFE2\nrom/2d/spr_clt_crd0070.farc 7724F616\nrom/2d/spr_clt_crd0071.farc C3D0D87D\nrom/2d/spr_clt_crd0072.farc 6055ECF1\nrom/2d/spr_clt_crd0073.farc 2FD22E5D\nrom/2d/spr_clt_crd0074.farc D6FEC042\nrom/2d/spr_clt_crd0075.farc 0D673BE2\nrom/2d/spr_clt_crd0076.farc 5741D73E\nrom/2d/spr_clt_crd0077.farc ACD9924E\nrom/2d/spr_clt_crd0078.farc 1F41DC88\nrom/2d/spr_clt_crd0079.farc 66D4E9A4\nrom/2d/spr_clt_crd0081.farc 95EAE737\nrom/2d/spr_clt_crd0082.farc 2F634713\nrom/2d/spr_clt_crd0083.farc 40BCDB13\nrom/2d/spr_clt_crd0084.farc BC796B88\nrom/2d/spr_clt_crd0085.farc ECE4A103\nrom/2d/spr_clt_crd0086.farc 8E12F327\nrom/2d/spr_clt_crd0087.farc E8151174\nrom/2d/spr_clt_crd0088.farc 7CFD4768\nrom/2d/spr_clt_crd0089.farc D7D8A038\nrom/2d/spr_clt_crd0090.farc FB7F4BB6\nrom/2d/spr_clt_crd0091.farc 3CCAACB8\nrom/2d/spr_clt_crd0092.farc 50D66B02\nrom/2d/spr_clt_crd0093.farc 345BE5B8\nrom/2d/spr_clt_crd0094.farc 69FEC7FE\nrom/2d/spr_clt_crd0095.farc EAA6A756\nrom/2d/spr_clt_crd0097.farc BE5C8156\nrom/2d/spr_clt_crd0098.farc C6C5EF86\nrom/2d/spr_clt_crd0099.farc 51A4F68A\nrom/2d/spr_clt_crd0100.farc CA32F65F\nrom/2d/spr_clt_crd0101.farc 82E75E5E\nrom/2d/spr_clt_crd0102.farc 376CC02D\nrom/2d/spr_clt_crd0103.farc 5F02EB92\nrom/2d/spr_clt_crd0104.farc 1ED0BEDA\nrom/2d/spr_clt_crd0105.farc E5247815\nrom/2d/spr_clt_crd0106.farc 2F67D13E\nrom/2d/spr_clt_crd0107.farc 745E4376\nrom/2d/spr_clt_crd0108.farc 30E478DB\nrom/2d/spr_clt_crd0109.farc 086AE4E3\nrom/2d/spr_clt_crd0110.farc D9ACEFB6\nrom/2d/spr_clt_crd0111.farc 8C3B8B1F\nrom/2d/spr_clt_crd0113.farc 196D3031\nrom/2d/spr_clt_crd0114.farc 0D7BC41B\nrom/2d/spr_clt_crd0115.farc 15A2B3E0\nrom/2d/spr_clt_crd0116.farc 31F778A7\nrom/2d/spr_clt_crd0117.farc 2EDECBFF\nrom/2d/spr_clt_crd0118.farc F10F5FDE\nrom/2d/spr_clt_crd0119.farc 45676125\nrom/2d/spr_clt_crd0120.farc E10C92DF\nrom/2d/spr_clt_crd0121.farc 424B780B\nrom/2d/spr_clt_crd0122.farc B94E1B6E\nrom/2d/spr_clt_crd0123.farc 9F01DACE\nrom/2d/spr_clt_crd0124.farc D811F3C7\nrom/2d/spr_clt_crd0125.farc F6DDDF7A\nrom/2d/spr_clt_crd0126.farc 1FB318D5\nrom/2d/spr_clt_crd0127.farc B3A0FDBE\nrom/2d/spr_clt_crd0129.farc BA86CFE3\nrom/2d/spr_clt_crd0130.farc F2D6544E\nrom/2d/spr_clt_crd0131.farc B095FBFB\nrom/2d/spr_clt_crd0132.farc E449660F\nrom/2d/spr_clt_crd0133.farc 3FFC3174\nrom/2d/spr_clt_crd0134.farc C21A3E56\nrom/2d/spr_clt_crd0135.farc E909B7DE\nrom/2d/spr_clt_crd0136.farc E7BCEAFA\nrom/2d/spr_clt_crd0137.farc 84A6DB04\nrom/2d/spr_clt_crd0138.farc BC382F28\nrom/2d/spr_clt_crd0139.farc 70B20385\nrom/2d/spr_clt_crd0140.farc 80FD1790\nrom/2d/spr_clt_crd0141.farc C69A3C27\nrom/2d/spr_clt_crd0142.farc F6B0062A\nrom/2d/spr_clt_crd0143.farc 6BA3E949\nrom/2d/spr_clt_crd0145.farc 6DEA68ED\nrom/2d/spr_clt_crd0146.farc 067E4234\nrom/2d/spr_clt_crd0147.farc DBA7E919\nrom/2d/spr_clt_crd0148.farc DEBF860F\nrom/2d/spr_clt_crd0149.farc FC3FCCAD\nrom/2d/spr_clt_crd0150.farc 375AF59E\nrom/2d/spr_clt_crd0151.farc 29D4A822\nrom/2d/spr_clt_crd0152.farc 8268A508\nrom/2d/spr_clt_crd0153.farc EC0C683C\nrom/2d/spr_clt_crd0154.farc 79FEBFB7\nrom/2d/spr_clt_crd0155.farc 6EF7DAC2\nrom/2d/spr_clt_crd0156.farc DF7B69D8\nrom/2d/spr_clt_crd0157.farc 0A21D140\nrom/2d/spr_clt_crd0158.farc F661E6BD\nrom/2d/spr_clt_crd0159.farc 5158B2D3\nrom/2d/spr_clt_crd0161.farc 25B771E4\nrom/2d/spr_clt_crd0162.farc 0E73B6EE\nrom/2d/spr_clt_crd0163.farc 996C1DBA\nrom/2d/spr_clt_crd0164.farc 2EF000E6\nrom/2d/spr_clt_crd0165.farc 27FB0C89\nrom/2d/spr_clt_crd0166.farc 9E60E390\nrom/2d/spr_clt_crd0167.farc 460C2218\nrom/2d/spr_clt_crd0168.farc 196117C8\nrom/2d/spr_clt_crd0169.farc 9C82DBAA\nrom/2d/spr_clt_crd0170.farc BB09A2DD\nrom/2d/spr_clt_crd0171.farc 59371886\nrom/2d/spr_clt_crd0172.farc FD3E3E1D\nrom/2d/spr_clt_crd0173.farc C9A8CCFB\nrom/2d/spr_clt_crd0174.farc 19637D32\nrom/2d/spr_clt_crd0175.farc 395F238F\nrom/2d/spr_clt_crd0177.farc 25C5D9C9\nrom/2d/spr_clt_crd0178.farc 338E9473\nrom/2d/spr_clt_crd0179.farc 8CD00722\nrom/2d/spr_clt_crd0180.farc 7C4EA866\nrom/2d/spr_clt_crd0181.farc 8B7ED769\nrom/2d/spr_clt_crd0182.farc 95A2432C\nrom/2d/spr_clt_crd0183.farc 2263E909\nrom/2d/spr_clt_crd0184.farc 80260B3A\nrom/2d/spr_clt_crd0185.farc 93FCC82E\nrom/2d/spr_clt_crd0186.farc 1042305E\nrom/2d/spr_clt_crd0187.farc E9D4F837\nrom/2d/spr_clt_crd0188.farc DAE20C88\nrom/2d/spr_clt_crd0189.farc 3A28F601\nrom/2d/spr_clt_crd0190.farc 06EB92B8\nrom/2d/spr_clt_crd0191.farc E0D493E2\nrom/2d/spr_clt_crd0193.farc 9A313552\nrom/2d/spr_clt_crd0194.farc 72852AAE\nrom/2d/spr_clt_crd0195.farc 8C30F600\nrom/2d/spr_clt_crd0196.farc 870462E9\nrom/2d/spr_clt_crd0197.farc CB135E66\nrom/2d/spr_clt_crd0198.farc F2A88D76\nrom/2d/spr_clt_crd0199.farc 4CC2D71A\nrom/2d/spr_clt_crd0200.farc 8B442C87\nrom/2d/spr_clt_crd0201.farc 29155A59\nrom/2d/spr_clt_crd0202.farc 597322FF\nrom/2d/spr_clt_crd0203.farc 5A573EA4\nrom/2d/spr_clt_crd0204.farc 27EDBABE\nrom/2d/spr_clt_crd0205.farc B0C67A20\nrom/2d/spr_clt_crd0206.farc EB4DA998\nrom/2d/spr_clt_crd0207.farc 3423245D\nrom/2d/spr_clt_crd0209.farc 826BABE1\nrom/2d/spr_clt_crd0210.farc 81970474\nrom/2d/spr_clt_crd0211.farc 5B3224DE\nrom/2d/spr_clt_crd0212.farc A4A7C17F\nrom/2d/spr_clt_crd0213.farc 16C93BA8\nrom/2d/spr_clt_crd0214.farc CC66E68F\nrom/2d/spr_clt_crd0215.farc 7B4D5D8A\nrom/2d/spr_clt_crd0216.farc 064BDF75\nrom/2d/spr_clt_crd0217.farc 072A2454\nrom/2d/spr_clt_crd0218.farc 5509F2FC\nrom/2d/spr_clt_crd0219.farc 06862E5E\nrom/2d/spr_clt_crd0220.farc 86A969DB\nrom/2d/spr_clt_crd0221.farc 1AAE8454\nrom/2d/spr_clt_crd0222.farc A3228293\nrom/2d/spr_clt_crd0223.farc 6AEDEB84\nrom/2d/spr_clt_crd0225.farc FF850087\nrom/2d/spr_clt_crd0226.farc D3278B96\nrom/2d/spr_clt_crd0227.farc FB67AA09\nrom/2d/spr_clt_crd0228.farc 8B3A6187\nrom/2d/spr_clt_crd0229.farc B935DC79\nrom/2d/spr_clt_crd0230.farc AA954203\nrom/2d/spr_clt_crd0231.farc FA801A35\nrom/2d/spr_clt_crd0232.farc AA0D04F7\nrom/2d/spr_clt_crd0233.farc B44F1CEF\nrom/2d/spr_clt_crd0234.farc 79F04BD5\nrom/2d/spr_clt_crd0235.farc 5DE246BF\nrom/2d/spr_clt_crd0236.farc EEAD4FD3\nrom/2d/spr_clt_crd0237.farc 3D6823DD\nrom/2d/spr_clt_crd0238.farc CE1ADDA8\nrom/2d/spr_clt_crd0239.farc 25554AF5\nrom/2d/spr_clt_crd0241.farc 437BD547\nrom/2d/spr_clt_crd0242.farc 7C237E02\nrom/2d/spr_clt_crd0243.farc 79A2F0ED\nrom/2d/spr_clt_crd0244.farc C1D2710C\nrom/2d/spr_clt_crd0245.farc 3DED9D28\nrom/2d/spr_clt_crd0246.farc 4F9CAEC8\nrom/2d/spr_clt_crd0247.farc 83B8B189\nrom/2d/spr_clt_crd0248.farc 3F3627AC\nrom/2d/spr_clt_crd0249.farc 69F38F97\nrom/2d/spr_clt_crd0250.farc 27FA30E2\nrom/2d/spr_clt_crd0251.farc 129718E8\nrom/2d/spr_clt_crd0252.farc 9AAAD586\nrom/2d/spr_clt_crd0253.farc 02E2A863\nrom/2d/spr_clt_crd0254.farc ECF37BA4\nrom/2d/spr_clt_crd0255.farc F1220D92\nrom/2d/spr_clt_crd0257.farc 18D656B7\nrom/2d/spr_clt_crd0258.farc 6E805129\nrom/2d/spr_clt_crd0259.farc 69794B8B\nrom/2d/spr_clt_crd0260.farc 69255A94\nrom/2d/spr_clt_crd0261.farc 0471A11D\nrom/2d/spr_clt_crd0262.farc 6A02B7D3\nrom/2d/spr_clt_crd0263.farc 8A31D028\nrom/2d/spr_clt_crd0264.farc 653557E8\nrom/2d/spr_clt_crd0265.farc BCA807A7\nrom/2d/spr_clt_crd0266.farc AE171793\nrom/2d/spr_clt_crd0267.farc 32EE2148\nrom/2d/spr_clt_crd0268.farc 9CD972FF\nrom/2d/spr_clt_crd0269.farc 9A338227\nrom/2d/spr_clt_crd0270.farc 7017A70E\nrom/2d/spr_clt_crd0271.farc 47B6DE9A\nrom/2d/spr_clt_crd0032.farc FEE053F3\nrom/2d/spr_clt_crd0048.farc 4047B087\nrom/2d/spr_clt_crd0064.farc A4133BC6\nrom/2d/spr_clt_crd0080.farc 5415E2F0\nrom/2d/spr_clt_crd0096.farc 67D90159\nrom/2d/spr_clt_crd0112.farc 9836D155\nrom/2d/spr_clt_crd0128.farc 62363338\nrom/2d/spr_clt_crd0144.farc 57B704DB\nrom/2d/spr_clt_crd0160.farc 2726750E\nrom/2d/spr_clt_crd0176.farc 5ADB239B\nrom/2d/spr_clt_crd0192.farc 0E1F171A\nrom/2d/spr_clt_crd0208.farc F590124E\nrom/2d/spr_clt_crd0224.farc 5E7DE45C\nrom/2d/spr_clt_crd0240.farc 0D0C7A2F\nrom/2d/spr_clt_crd0273.farc 0450B058\nrom/2d/spr_clt_crd0274.farc B4449148\nrom/2d/spr_clt_crd0275.farc 94F4C104\nrom/2d/spr_clt_crd0276.farc 85D4E2C5\nrom/2d/spr_clt_crd0277.farc 86108771\nrom/2d/spr_clt_crd0278.farc CD90B87E\nrom/2d/spr_clt_crd0279.farc 2F9CB5CD\nrom/2d/spr_clt_crd0280.farc 9EDCDCCE\nrom/2d/spr_clt_crd0281.farc 14BFE86A\nrom/2d/spr_clt_crd0282.farc C4D375BD\nrom/2d/spr_clt_crd0283.farc D6A2A7D0\nrom/2d/spr_clt_crd0284.farc 2B93F3B7\nrom/2d/spr_clt_crd0285.farc 32F467A3\nrom/2d/spr_clt_crd0286.farc F23AA9AB\nrom/2d/spr_clt_crd0287.farc 5A584321\nrom/2d/spr_clt_crd0289.farc DD2C64FA\nrom/2d/spr_clt_crd0290.farc 60FAD2DD\nrom/2d/spr_clt_crd0291.farc 1CBB7F3A\nrom/2d/spr_clt_crd0292.farc 52AFECBF\nrom/2d/spr_clt_crd0293.farc 03A98975\nrom/2d/spr_clt_crd0294.farc C55C4BEE\nrom/2d/spr_clt_crd0295.farc 14A7A1DF\nrom/2d/spr_clt_crd0296.farc C8681046\nrom/2d/spr_clt_crd0297.farc F6BF8CC6\nrom/2d/spr_clt_crd0298.farc 20118285\nrom/2d/spr_clt_crd0299.farc E3BB96FF\nrom/2d/spr_clt_crd0300.farc 93FBC985\nrom/2d/spr_clt_crd0301.farc E584BEA5\nrom/2d/spr_clt_crd0302.farc AB41692D\nrom/2d/spr_clt_crd0303.farc 0A9FA74A\nrom/2d/spr_clt_crd0305.farc 1F530FF4\nrom/2d/spr_clt_crd0306.farc 5186EBF9\nrom/2d/spr_clt_crd0307.farc 0116C5F3\nrom/2d/spr_clt_crd0308.farc 6D1172A9\nrom/2d/spr_clt_crd0309.farc EF8069FD\nrom/2d/spr_clt_crd0310.farc 756D7C0E\nrom/2d/spr_clt_crd0311.farc 9AC7A389\nrom/2d/spr_clt_crd0312.farc EA40A4CE\nrom/2d/spr_clt_crd0313.farc 3AAD1A03\nrom/2d/spr_clt_crd0314.farc FC84EE7B\nrom/2d/spr_clt_crd0315.farc AB386A59\nrom/2d/spr_clt_crd0316.farc 170BBC21\nrom/2d/spr_clt_crd0317.farc 6FF211F1\nrom/2d/spr_clt_crd0318.farc 4D836995\nrom/2d/spr_clt_crd0319.farc 0A14F28B\nrom/2d/spr_clt_crd0321.farc 9F8F383B\nrom/2d/spr_clt_crd0322.farc 21EA6834\nrom/2d/spr_clt_crd0323.farc 4534FD28\nrom/2d/spr_clt_crd0324.farc EC47137F\nrom/2d/spr_clt_crd0325.farc 24594AFC\nrom/2d/spr_clt_crd0326.farc EA36DDB2\nrom/2d/spr_clt_crd0327.farc D43FBE13\nrom/2d/spr_clt_crd0328.farc CC314573\nrom/2d/spr_clt_crd0329.farc B5FAE9C7\nrom/2d/spr_clt_crd0330.farc 7335A9E7\nrom/2d/spr_clt_crd0331.farc 9CF5C21F\nrom/2d/spr_clt_crd0332.farc 2CE7CEE7\nrom/2d/spr_clt_crd0333.farc 076873E3\nrom/2d/spr_clt_crd0334.farc 4DECB4F6\nrom/2d/spr_clt_crd0335.farc 8DD76A0D\nrom/2d/spr_clt_crd0337.farc 588A531C\nrom/2d/spr_clt_crd0338.farc FF8CBE9F\nrom/2d/spr_clt_crd0339.farc 43DF557D\nrom/2d/spr_clt_crd0340.farc 0EA7A3D7\nrom/2d/spr_clt_crd0341.farc 118AC41A\nrom/2d/spr_clt_crd0342.farc 0F16C23D\nrom/2d/spr_clt_crd0343.farc 76F149C0\nrom/2d/spr_clt_crd0344.farc 9141DF23\nrom/2d/spr_clt_crd0345.farc C0D25B1B\nrom/2d/spr_clt_crd0346.farc 0B8E62A3\nrom/2d/spr_clt_crd0347.farc CAAD2E14\nrom/2d/spr_clt_crd0348.farc AA14A495\nrom/2d/spr_clt_crd0349.farc A6C49D21\nrom/2d/spr_clt_crd0350.farc 991054FC\nrom/2d/spr_clt_crd0351.farc 449C8583\nrom/2d/spr_clt_crd0353.farc 48CC9F52\nrom/2d/spr_clt_crd0354.farc BF4A384A\nrom/2d/spr_clt_crd0355.farc AD03FB36\nrom/2d/spr_clt_crd0356.farc D7EA3568\nrom/2d/spr_clt_crd0357.farc 0B3F2DF7\nrom/2d/spr_clt_crd0358.farc D7587039\nrom/2d/spr_clt_crd0359.farc 6F55617A\nrom/2d/spr_clt_crd0360.farc 34720F1E\nrom/2d/spr_clt_crd0361.farc 237463DC\nrom/2d/spr_clt_crd0362.farc C3C26C34\nrom/2d/spr_clt_crd0363.farc C25CF7F2\nrom/2d/spr_clt_crd0364.farc 45114CF2\nrom/2d/spr_clt_crd0365.farc D04DBA12\nrom/2d/spr_clt_crd0366.farc D384D410\nrom/2d/spr_clt_crd0367.farc 327C4A64\nrom/2d/spr_clt_crd0369.farc 06201281\nrom/2d/spr_clt_crd0370.farc B55807A7\nrom/2d/spr_clt_crd0371.farc 91D77D78\nrom/2d/spr_clt_crd0372.farc A2DE2CA0\nrom/2d/spr_clt_crd0373.farc 7A12FE36\nrom/2d/spr_clt_crd0374.farc 6D6859C1\nrom/2d/spr_clt_crd0375.farc 87A92304\nrom/2d/spr_clt_crd0376.farc 61AF9CD1\nrom/2d/spr_clt_crd0377.farc E2826888\nrom/2d/spr_clt_crd0378.farc E503AB73\nrom/2d/spr_clt_crd0379.farc A162FC30\nrom/2d/spr_clt_crd0380.farc BDAD3E67\nrom/2d/spr_clt_crd0381.farc 980206CA\nrom/2d/spr_clt_crd0382.farc 5EBF95C3\nrom/2d/spr_clt_crd0383.farc CBAE7000\nrom/2d/spr_clt_crd0385.farc 1F1B515E\nrom/2d/spr_clt_crd0386.farc 16EC9FC6\nrom/2d/spr_clt_crd0387.farc ED9E08F4\nrom/2d/spr_clt_crd0388.farc 2D4D7B2F\nrom/2d/spr_clt_crd0389.farc 45C96158\nrom/2d/spr_clt_crd0390.farc 356F0600\nrom/2d/spr_clt_crd0391.farc 5D9B501C\nrom/2d/spr_clt_crd0392.farc F09D5EE5\nrom/2d/spr_clt_crd0393.farc 6610C516\nrom/2d/spr_clt_crd0394.farc 20C21D8B\nrom/2d/spr_clt_crd0395.farc 51296B90\nrom/2d/spr_clt_crd0396.farc BCA4D64C\nrom/2d/spr_clt_crd0397.farc 528BCD43\nrom/2d/spr_clt_crd0398.farc 5C9B83BB\nrom/2d/spr_clt_crd0399.farc C08781B4\nrom/2d/spr_clt_crd0401.farc 932DCC4B\nrom/2d/spr_clt_crd0402.farc 1AEC90E0\nrom/2d/spr_clt_crd0403.farc A8AD7EB4\nrom/2d/spr_clt_crd0404.farc 8B5D140D\nrom/2d/spr_clt_crd0405.farc FA045AF8\nrom/2d/spr_clt_crd0406.farc BB87A584\nrom/2d/spr_clt_crd0407.farc 46D54F21\nrom/2d/spr_clt_crd0408.farc D7224866\nrom/2d/spr_clt_crd0409.farc 225E8284\nrom/2d/spr_clt_crd0410.farc 6CD88D60\nrom/2d/spr_clt_crd0411.farc 95C4E0F2\nrom/2d/spr_clt_crd0412.farc 57C9CEF4\nrom/2d/spr_clt_crd0413.farc 4424070C\nrom/2d/spr_clt_crd0414.farc 21123AF4\nrom/2d/spr_clt_crd0415.farc CF16F771\nrom/2d/spr_clt_crd0417.farc 2C0B81FF\nrom/2d/spr_clt_crd0418.farc E104E78A\nrom/2d/spr_clt_crd0419.farc 5AF1DC70\nrom/2d/spr_clt_crd0420.farc F40AFB6B\nrom/2d/spr_clt_crd0421.farc 6EFB51E4\nrom/2d/spr_clt_crd0422.farc 13B9EBA2\nrom/2d/spr_clt_crd0423.farc 6EDCBD27\nrom/2d/spr_clt_crd0424.farc 251828AE\nrom/2d/spr_clt_crd0425.farc 6E3F18B7\nrom/2d/spr_clt_crd0426.farc 14292F5F\nrom/2d/spr_clt_crd0427.farc DF277A84\nrom/2d/spr_clt_crd0428.farc ACA710F5\nrom/2d/spr_clt_crd0429.farc F5111F5E\nrom/2d/spr_clt_crd0430.farc E2B01983\nrom/2d/spr_clt_crd0431.farc 7C872E08\nrom/2d/spr_clt_crd0433.farc E9B3BD05\nrom/2d/spr_clt_crd0434.farc 9862345D\nrom/2d/spr_clt_crd0435.farc 72F50BD3\nrom/2d/spr_clt_crd0436.farc B81F7F15\nrom/2d/spr_clt_crd0437.farc B4118720\nrom/2d/spr_clt_crd0438.farc 82813EC0\nrom/2d/spr_clt_crd0439.farc 02DD3299\nrom/2d/spr_clt_crd0440.farc D85A029F\nrom/2d/spr_clt_crd0441.farc 6AD2613D\nrom/2d/spr_clt_crd0442.farc 5E832BAA\nrom/2d/spr_clt_crd0443.farc C8F6D23F\nrom/2d/spr_clt_crd0444.farc 0327EB27\nrom/2d/spr_clt_crd0445.farc F655A3B6\nrom/2d/spr_clt_crd0446.farc 3F74702E\nrom/2d/spr_clt_crd0447.farc 049FFC38\nrom/2d/spr_clt_crd0449.farc 5A74BC97\nrom/2d/spr_clt_crd0450.farc 75844781\nrom/2d/spr_clt_crd0451.farc 642449CE\nrom/2d/spr_clt_crd0452.farc 45F9ECFD\nrom/2d/spr_clt_crd0453.farc 71D446B6\nrom/2d/spr_clt_crd0454.farc ED449A89\nrom/2d/spr_clt_crd0455.farc 30FDC7AF\nrom/2d/spr_clt_crd0456.farc C274F4DB\nrom/2d/spr_clt_crd0457.farc B5D43ED0\nrom/2d/spr_clt_crd0458.farc 858A78B1\nrom/2d/spr_clt_crd0459.farc 6C8AF025\nrom/2d/spr_clt_crd0460.farc 08319FE0\nrom/2d/spr_clt_crd0461.farc F6ED92E7\nrom/2d/spr_clt_crd0462.farc 57F82118\nrom/2d/spr_clt_crd0463.farc 87F738C7\nrom/2d/spr_clt_crd0465.farc 818F7E7B\nrom/2d/spr_clt_crd0466.farc 1EDAA09A\nrom/2d/spr_clt_crd0467.farc 2118DD73\nrom/2d/spr_clt_crd0468.farc 968B1CA3\nrom/2d/spr_clt_crd0469.farc 40E6A1B2\nrom/2d/spr_clt_crd0470.farc 512331A3\nrom/2d/spr_clt_crd0471.farc 50AE8441\nrom/2d/spr_clt_crd0472.farc 2F6D3117\nrom/2d/spr_clt_crd0473.farc 84BB0A77\nrom/2d/spr_clt_crd0474.farc BAA1F6A5\nrom/2d/spr_clt_crd0475.farc 305657A9\nrom/2d/spr_clt_crd0476.farc A62C0056\nrom/2d/spr_clt_crd0477.farc 3EEAA623\nrom/2d/spr_clt_crd0478.farc 2D273E3E\nrom/2d/spr_clt_crd0479.farc 899035AF\nrom/2d/spr_clt_crd0481.farc AAD4CFC9\nrom/2d/spr_clt_crd0482.farc 936FFB1C\nrom/2d/spr_clt_crd0483.farc E172674D\nrom/2d/spr_clt_crd0484.farc 4510B167\nrom/2d/spr_clt_crd0485.farc F3E577C8\nrom/2d/spr_clt_crd0486.farc A4F81A9A\nrom/2d/spr_clt_crd0487.farc A270D3EC\nrom/2d/spr_clt_crd0488.farc 63609C14\nrom/2d/spr_clt_crd0489.farc 00782258\nrom/2d/spr_clt_crd0490.farc 1E55C8B6\nrom/2d/spr_clt_crd0491.farc A855DF2E\nrom/2d/spr_clt_crd0492.farc B2B24B45\nrom/2d/spr_clt_crd0493.farc 8EE44FC2\nrom/2d/spr_clt_crd0494.farc 8D185B9E\nrom/2d/spr_clt_crd0495.farc 56B1C991\nrom/2d/spr_clt_crd0497.farc 73764F78\nrom/2d/spr_clt_crd0498.farc 49DF7E7B\nrom/2d/spr_clt_crd0499.farc E17884FB\nrom/2d/spr_clt_crd0500.farc 896E1C1F\nrom/2d/spr_clt_crd0501.farc A4114828\nrom/2d/spr_clt_crd0502.farc FD702D6A\nrom/2d/spr_clt_crd0503.farc E2932265\nrom/2d/spr_clt_crd0504.farc BBEFDA41\nrom/2d/spr_clt_crd0505.farc C3B73473\nrom/2d/spr_clt_crd0506.farc 15F24578\nrom/2d/spr_clt_crd0507.farc D4225F68\nrom/2d/spr_clt_crd0508.farc 12169A81\nrom/2d/spr_clt_crd0509.farc D3937D2F\nrom/2d/spr_clt_crd0510.farc 219A5AB5\nrom/2d/spr_clt_crd0511.farc 06A9416D\nrom/2d/spr_clt_crd0272.farc A3DBAF31\nrom/2d/spr_clt_crd0288.farc DFD3FDB0\nrom/2d/spr_clt_crd0304.farc 0FB24CB1\nrom/2d/spr_clt_crd0320.farc 1DD9D751\nrom/2d/spr_clt_crd0336.farc FC8CC500\nrom/2d/spr_clt_crd0352.farc CD5A1C1C\nrom/2d/spr_clt_crd0368.farc 152DFE3F\nrom/2d/spr_clt_crd0384.farc 224862EE\nrom/2d/spr_clt_crd0400.farc ECF125DE\nrom/2d/spr_clt_crd0416.farc 70F0FC0B\nrom/2d/spr_clt_crd0432.farc D4433EC5\nrom/2d/spr_clt_crd0448.farc B1B07759\nrom/2d/spr_clt_crd0464.farc 0438161E\nrom/2d/spr_clt_crd0480.farc C3CFC072\nrom/2d/spr_clt_crd0513.farc FEA66A2C\nrom/2d/spr_clt_crd0514.farc 4376A6F0\nrom/2d/spr_clt_crd0515.farc 67E940F7\nrom/2d/spr_clt_crd0516.farc DE7F0D7F\nrom/2d/spr_clt_crd0517.farc 699E7AB7\nrom/2d/spr_clt_crd0518.farc 40809834\nrom/2d/spr_clt_crd0519.farc 17F85980\nrom/2d/spr_clt_crd0520.farc 0C0506BC\nrom/2d/spr_clt_crd0521.farc EE61BF96\nrom/2d/spr_clt_crd0522.farc 9CE13B4C\nrom/2d/spr_clt_crd0523.farc F334C049\nrom/2d/spr_clt_crd0524.farc 1DABD845\nrom/2d/spr_clt_crd0525.farc 317058A2\nrom/2d/spr_clt_crd0526.farc F1A136D5\nrom/2d/spr_clt_crd0527.farc B6BBE487\nrom/2d/spr_clt_crd0529.farc 39076D2A\nrom/2d/spr_clt_crd0530.farc B5FD8538\nrom/2d/spr_clt_crd0531.farc 0E00E317\nrom/2d/spr_clt_crd0532.farc 54238A21\nrom/2d/spr_clt_crd0533.farc C2E7C67D\nrom/2d/spr_clt_crd0534.farc F6B5A045\nrom/2d/spr_clt_crd0535.farc 19F6DAA5\nrom/2d/spr_clt_crd0536.farc 7CC36CF1\nrom/2d/spr_clt_crd0537.farc 0666A026\nrom/2d/spr_clt_crd0538.farc DBF02126\nrom/2d/spr_clt_crd0539.farc 09765719\nrom/2d/spr_clt_crd0540.farc B36E49A1\nrom/2d/spr_clt_crd0541.farc 8BAB0700\nrom/2d/spr_clt_crd0542.farc E1A544BC\nrom/2d/spr_clt_crd0543.farc 095F9AF2\nrom/2d/spr_clt_crd0545.farc 4A88A5E1\nrom/2d/spr_clt_crd0546.farc 61525C24\nrom/2d/spr_clt_crd0547.farc C5DF9385\nrom/2d/spr_clt_crd0554.farc B8DD3726\nrom/2d/spr_clt_crd0555.farc 810505D9\nrom/2d/spr_clt_crd0556.farc 4F80BD2C\nrom/2d/spr_clt_crd0557.farc A3850395\nrom/2d/spr_clt_crd0558.farc C644EEA0\nrom/2d/spr_clt_crd0559.farc B9CAB4C0\nrom/2d/spr_clt_crd0560.farc A2DC96E5\nrom/2d/spr_clt_crd0561.farc 55EAE3BF\nrom/2d/spr_clt_crd0562.farc 41135D7B\nrom/2d/spr_clt_crd0563.farc 2F8C032D\nrom/2d/spr_clt_crd0564.farc 41FF084C\nrom/2d/spr_clt_crd0565.farc 2DD485E4\nrom/2d/spr_clt_crd0567.farc 6C490A8D\nrom/2d/spr_clt_crd0568.farc 2E0762ED\nrom/2d/spr_clt_crd0569.farc 50BDCB97\nrom/2d/spr_clt_crd0570.farc 32B595E8\nrom/2d/spr_clt_crd0571.farc 604A8C4F\nrom/2d/spr_clt_crd0572.farc E9C2C549\nrom/2d/spr_clt_crd0573.farc 19C22B5E\nrom/2d/spr_clt_crd0574.farc 3C2DA897\nrom/2d/spr_clt_crd0575.farc D591E13D\nrom/2d/spr_clt_crd0576.farc 0545499F\nrom/2d/spr_clt_crd0577.farc 1650954E\nrom/2d/spr_clt_crd0578.farc 60F704BE\nrom/2d/spr_clt_crd0579.farc 42211C3D\nrom/2d/spr_clt_crd0580.farc 179A97EA\nrom/2d/spr_clt_crd0581.farc 4D6FDC7C\nrom/2d/spr_clt_crd0583.farc F998C3CA\nrom/2d/spr_clt_crd0584.farc 979C140B\nrom/2d/spr_clt_crd0585.farc 2800D55A\nrom/2d/spr_clt_crd0586.farc EBE4B7C2\nrom/2d/spr_clt_crd0587.farc C661BA07\nrom/2d/spr_clt_crd0588.farc 715D63F5\nrom/2d/spr_clt_crd0589.farc 60CB3A64\nrom/2d/spr_clt_crd0590.farc FEEB451E\nrom/2d/spr_clt_crd0591.farc 472E78D2\nrom/2d/spr_clt_crd0592.farc 14AA1B15\nrom/2d/spr_clt_crd0593.farc 8F352779\nrom/2d/spr_clt_crd0594.farc 34C1EF88\nrom/2d/spr_clt_crd0595.farc 2C3D94B2\nrom/2d/spr_clt_crd0596.farc 2879D97F\nrom/2d/spr_clt_crd0597.farc 5668463F\nrom/2d/spr_clt_crd0599.farc 4204140B\nrom/2d/spr_clt_crd0600.farc 889E2AD8\nrom/2d/spr_clt_crd0601.farc 07E9B906\nrom/2d/spr_clt_crd0602.farc 24810A4A\nrom/2d/spr_clt_crd0603.farc 2125456D\nrom/2d/spr_clt_crd0604.farc 8AAD1240\nrom/2d/spr_clt_crd0605.farc 804AFC36\nrom/2d/spr_clt_crd0606.farc 335226DF\nrom/2d/spr_clt_crd0607.farc DD93E6CD\nrom/2d/spr_clt_crd0608.farc F5E652B5\nrom/2d/spr_clt_crd0609.farc 6523C018\nrom/2d/spr_clt_crd0610.farc 847B5F4E\nrom/2d/spr_clt_crd0611.farc 6E90B0DE\nrom/2d/spr_clt_crd0612.farc 5C324D55\nrom/2d/spr_clt_crd0613.farc D9A2E251\nrom/2d/spr_clt_crd0615.farc 52FB3A26\nrom/2d/spr_clt_crd0616.farc 6ABDB673\nrom/2d/spr_clt_crd0617.farc F3346E42\nrom/2d/spr_clt_crd0618.farc F22C7BCB\nrom/2d/spr_clt_crd0619.farc E81D08CB\nrom/2d/spr_clt_crd0620.farc F11601CD\nrom/2d/spr_clt_crd0621.farc E3A9D4CA\nrom/2d/spr_clt_crd0622.farc EECE482B\nrom/2d/spr_clt_crd0623.farc F7FB0E0F\nrom/2d/spr_clt_crd0624.farc 55CC82D0\nrom/2d/spr_clt_crd0625.farc EDCC49F7\nrom/2d/spr_clt_crd0626.farc 1C654665\nrom/2d/spr_clt_crd0627.farc F0DEAA43\nrom/2d/spr_clt_crd0628.farc CC637B79\nrom/2d/spr_clt_crd0629.farc DA4B1C0C\nrom/2d/spr_clt_crd0631.farc D0C8FCFE\nrom/2d/spr_clt_crd0632.farc E7A887A3\nrom/2d/spr_clt_crd0633.farc C3B699A2\nrom/2d/spr_cmnitm_thmb000.farc 3BF802D7\nrom/2d/spr_cmnitm_thmb001.farc 87FE0BAE\nrom/2d/spr_cmnitm_thmb002.farc 19A94810\nrom/2d/spr_cmnitm_thmb003.farc 61F75201\nrom/2d/spr_cmnitm_thmb004.farc 57377D31\nrom/2d/spr_cmnitm_thmb005.farc 04E78FD9\nrom/2d/spr_cmnitm_thmb006.farc B7607B4C\nrom/2d/spr_cmnitm_thmb007.farc D75DE0D0\nrom/2d/spr_cmnitm_thmb008.farc F00FA336\nrom/2d/spr_cmnitm_thmb009.farc D3D3EC32\nrom/2d/spr_cmnitm_thmb010.farc CD63FAE3\nrom/2d/spr_cmnitm_thmb011.farc AE034C03\nrom/2d/spr_cmnitm_thmb013.farc 54A57D3B\nrom/2d/spr_cmnitm_thmb014.farc 157F59C3\nrom/2d/spr_cmnitm_thmb015.farc 07D91CE7\nrom/2d/spr_cmnitm_thmb016.farc 8055D762\nrom/2d/spr_cmnitm_thmb017.farc 3B693DE1\nrom/2d/spr_cmnitm_thmb018.farc A02CA759\nrom/2d/spr_cmnitm_thmb019.farc F83F3A72\nrom/2d/spr_cmnitm_thmb020.farc 030BC2DC\nrom/2d/spr_cmnitm_thmb021.farc EE81D68B\nrom/2d/spr_cmnitm_thmb022.farc E0F6CAD1\nrom/2d/spr_cmnitm_thmb023.farc 512C9DB6\nrom/2d/spr_cmnitm_thmb024.farc 70EB5A92\nrom/2d/spr_cmnitm_thmb025.farc 658C848B\nrom/2d/spr_cmnitm_thmb026.farc 63B0B06E\nrom/2d/spr_cmnitm_thmb027.farc 9120812A\nrom/2d/spr_cmnitm_thmb029.farc 21C4AB84\nrom/2d/spr_cmnitm_thmb030.farc CFB5FC7C\nrom/2d/spr_cmnitm_thmb031.farc 7E9EA67D\nrom/2d/spr_cmnitm_thmb032.farc 61508BA9\nrom/2d/spr_cmnitm_thmb033.farc DCDF2232\nrom/2d/spr_cmnitm_thmb034.farc C4A4BF5E\nrom/2d/spr_cmnitm_thmb035.farc 9BE47166\nrom/2d/spr_cmnitm_thmb036.farc 4BBE8C73\nrom/2d/spr_cmnitm_thmb037.farc F04780D8\nrom/2d/spr_cmnitm_thmb038.farc 3AF62619\nrom/2d/spr_cmnitm_thmb039.farc 66142A47\nrom/2d/spr_cmnitm_thmb040.farc 130F0370\nrom/2d/spr_cmnitm_thmb041.farc 0E7DB9DE\nrom/2d/spr_cmnitm_thmb042.farc 75C7DD4F\nrom/2d/spr_cmnitm_thmb043.farc 06B5D150\nrom/2d/spr_cmnitm_thmb045.farc 19D8C419\nrom/2d/spr_cmnitm_thmb046.farc 895800B6\nrom/2d/spr_cmnitm_thmb047.farc 94CCD300\nrom/2d/spr_cmnitm_thmb048.farc 26ED365F\nrom/2d/spr_cmnitm_thmb049.farc A7991D43\nrom/2d/spr_cmnitm_thmb050.farc 0FD56968\nrom/2d/spr_cmnitm_thmb051.farc 635AF470\nrom/2d/spr_cmnitm_thmb052.farc 020A137E\nrom/2d/spr_cmnitm_thmb053.farc 7BD3086D\nrom/2d/spr_cmnitm_thmb054.farc E9A98D34\nrom/2d/spr_cmnitm_thmb055.farc 83D673F7\nrom/2d/spr_cmnitm_thmb056.farc 045BFF5A\nrom/2d/spr_cmnitm_thmb057.farc 39A83BB3\nrom/2d/spr_cmnitm_thmb058.farc 544C29DC\nrom/2d/spr_cmnitm_thmb059.farc 9CAE4C33\nrom/2d/spr_cmnitm_thmb061.farc BDE51386\nrom/2d/spr_cmnitm_thmb062.farc 0312DE2C\nrom/2d/spr_cmnitm_thmb067.farc 3F07EFA0\nrom/2d/spr_cmnitm_thmb068.farc 0E1B637C\nrom/2d/spr_cmnitm_thmb069.farc 60854CD6\nrom/2d/spr_cmnitm_thmb070.farc 15EE28AD\nrom/2d/spr_cmnitm_thmb071.farc 8071FE78\nrom/2d/spr_cmnitm_thmb072.farc 7122EACF\nrom/2d/spr_cmnitm_thmb073.farc C5E9C414\nrom/2d/spr_cmnitm_thmb074.farc FF1743E3\nrom/2d/spr_cmnitm_thmb075.farc 4D1B6952\nrom/2d/spr_cmnitm_thmb076.farc 7CE4A2A8\nrom/2d/spr_cmnitm_thmb077.farc 1F8DFB07\nrom/2d/spr_cmnitm_thmb078.farc EB085A92\nrom/2d/spr_cmnitm_thmb079.farc 32A742EC\nrom/2d/spr_cmnitm_thmb081.farc 8EF0117D\nrom/2d/spr_cmnitm_thmb082.farc B48788A6\nrom/2d/spr_cmnitm_thmb083.farc 6DBC73D0\nrom/2d/spr_cmnitm_thmb084.farc 3CC0CF05\nrom/2d/spr_cmnitm_thmb085.farc 6ECB207B\nrom/2d/spr_cmnitm_thmb086.farc DB782B38\nrom/2d/spr_cmnitm_thmb087.farc EC115037\nrom/2d/spr_cmnitm_thmb088.farc 59F06997\nrom/2d/spr_cmnitm_thmb089.farc 4D198A97\nrom/2d/spr_cmnitm_thmb097.farc 8996E533\nrom/2d/spr_cmnitm_thmb098.farc 2CB25E32\nrom/2d/spr_cmnitm_thmb099.farc 21B48F53\nrom/2d/spr_cmnitm_thmb100.farc 7C13A883\nrom/2d/spr_cmnitm_thmb101.farc 8CEA5684\nrom/2d/spr_cmnitm_thmb102.farc 43909A1D\nrom/2d/spr_cmnitm_thmb104.farc 778C03B3\nrom/2d/spr_cmnitm_thmb105.farc 4CB4ECBD\nrom/2d/spr_cmnitm_thmb106.farc EC74D09C\nrom/2d/spr_cmnitm_thmb107.farc 7BD4FE5A\nrom/2d/spr_cmnitm_thmb115.farc 7922A05B\nrom/2d/spr_cmnitm_thmb116.farc BE5FB8B7\nrom/2d/spr_cmnitm_thmb117.farc 3C9AF3E1\nrom/2d/spr_cmnitm_thmb118.farc 7B9C0B04\nrom/2d/spr_cmnitm_thmb119.farc 233BF573\nrom/2d/spr_cmnitm_thmb120.farc 50FFF57F\nrom/2d/spr_cmnitm_thmb121.farc 5CFBE020\nrom/2d/spr_cmnitm_thmb122.farc 7F7EA6D1\nrom/2d/spr_cmnitm_thmb123.farc 215B6B54\nrom/2d/spr_cmnitm_thmb124.farc 1D73F83A\nrom/2d/spr_cmnitm_thmb125.farc 936361B6\nrom/2d/spr_cmnitm_thmb127.farc 2DEA12C4\nrom/2d/spr_cmnitm_thmb128.farc CB898F79\nrom/2d/spr_cmnitm_thmb129.farc 84EC8F36\nrom/2d/spr_cmnitm_thmb130.farc 19A01BED\nrom/2d/spr_cmnitm_thmb131.farc AE785C68\nrom/2d/spr_cmnitm_thmb132.farc 6792F789\nrom/2d/spr_cmnitm_thmb133.farc 0F6BE457\nrom/2d/spr_cmnitm_thmb134.farc B62D774D\nrom/2d/spr_cmnitm_thmb135.farc 14E8F2F6\nrom/2d/spr_cmnitm_thmb136.farc 2460E02A\nrom/2d/spr_cmnitm_thmb137.farc 3E9D4CA3\nrom/2d/spr_cmnitm_thmb138.farc 305C875B\nrom/2d/spr_cmnitm_thmb139.farc 74715668\nrom/2d/spr_cmnitm_thmb140.farc E5207DF6\nrom/2d/spr_cmnitm_thmb141.farc 0C68A95E\nrom/2d/spr_clt_crd0512.farc 2E2C4B75\nrom/2d/spr_clt_crd0528.farc 5B507467\nrom/2d/spr_clt_crd0544.farc FCB89DF6\nrom/2d/spr_clt_crd0566.farc 62C863ED\nrom/2d/spr_clt_crd0582.farc 07EDED80\nrom/2d/spr_clt_crd0598.farc 6592A2EB\nrom/2d/spr_clt_crd0614.farc B7C8BF86\nrom/2d/spr_clt_crd0630.farc 7A205AC8\nrom/2d/spr_cmnitm_thmb012.farc 291D2C01\nrom/2d/spr_cmnitm_thmb028.farc 2B340B5E\nrom/2d/spr_cmnitm_thmb044.farc 75416E1C\nrom/2d/spr_cmnitm_thmb060.farc 24118B43\nrom/2d/spr_cmnitm_thmb080.farc 64ADEE94\nrom/2d/spr_cmnitm_thmb103.farc A48B4491\nrom/2d/spr_cmnitm_thmb143.farc 380F10D2\nrom/2d/spr_cmnitm_thmb144.farc A7A9C044\nrom/2d/spr_cmnitm_thmb145.farc 45FD2861\nrom/2d/spr_cmnitm_thmb146.farc EB2ACC0E\nrom/2d/spr_cmnitm_thmb147.farc 1BE146D3\nrom/2d/spr_cmnitm_thmb148.farc 27DC3402\nrom/2d/spr_cmnitm_thmb149.farc 6D5F6E74\nrom/2d/spr_cmnitm_thmb150.farc 0CCED482\nrom/2d/spr_cmnitm_thmb151.farc 1417B4A8\nrom/2d/spr_cmnitm_thmb152.farc 7190851D\nrom/2d/spr_cmnitm_thmb153.farc 77F23130\nrom/2d/spr_cmnitm_thmb154.farc 5AF5D394\nrom/2d/spr_cmnitm_thmb155.farc 34BDE1E5\nrom/2d/spr_cmnitm_thmb156.farc 4E5F6E5C\nrom/2d/spr_cmnitm_thmb157.farc 76997CFE\nrom/2d/spr_cmnitm_thmb159.farc 6AE0CE81\nrom/2d/spr_cmnitm_thmb160.farc BAEAF750\nrom/2d/spr_cmnitm_thmb161.farc 2F0DAE7C\nrom/2d/spr_cmnitm_thmb162.farc 68C3B12E\nrom/2d/spr_cmnitm_thmb163.farc 3CCBE77B\nrom/2d/spr_cmnitm_thmb164.farc 58717997\nrom/2d/spr_cmnitm_thmb165.farc 6153243F\nrom/2d/spr_cmnitm_thmb166.farc 78C7CE03\nrom/2d/spr_cmnitm_thmb167.farc B4F8B445\nrom/2d/spr_cmnitm_thmb168.farc B06A05F1\nrom/2d/spr_cmnitm_thmb169.farc 9AFA7038\nrom/2d/spr_cmnitm_thmb170.farc A44A57D7\nrom/2d/spr_cmnitm_thmb171.farc 06705E65\nrom/2d/spr_cmnitm_thmb172.farc 9E3505B6\nrom/2d/spr_cmnitm_thmb173.farc 82BAE98D\nrom/2d/spr_cmnitm_thmb175.farc 0540496D\nrom/2d/spr_cmnitm_thmb176.farc A9F7D4F0\nrom/2d/spr_cmnitm_thmb177.farc FF8AD638\nrom/2d/spr_cmnitm_thmb178.farc C81ED01A\nrom/2d/spr_cmnitm_thmb179.farc 9DBC752E\nrom/2d/spr_cmnitm_thmb180.farc 653E74B3\nrom/2d/spr_cmnitm_thmb181.farc 41D7E99E\nrom/2d/spr_cmnitm_thmb182.farc 90CB4836\nrom/2d/spr_cmnitm_thmb183.farc 57034357\nrom/2d/spr_cmnitm_thmb184.farc B2747FDC\nrom/2d/spr_cmnitm_thmb185.farc FEEFD811\nrom/2d/spr_cmnitm_thmb186.farc A3AEB537\nrom/2d/spr_cmnitm_thmb187.farc 8F119FC3\nrom/2d/spr_cmnitm_thmb188.farc 955430D9\nrom/2d/spr_cmnitm_thmb189.farc 1491F3BF\nrom/2d/spr_cmnitm_thmb191.farc ED7631EB\nrom/2d/spr_cmnitm_thmb192.farc 7AC5DD40\nrom/2d/spr_cmnitm_thmb193.farc 163D5E77\nrom/2d/spr_cmnitm_thmb194.farc 7C1739FC\nrom/2d/spr_cmnitm_thmb195.farc E689666A\nrom/2d/spr_cmnitm_thmb196.farc EC9F423C\nrom/2d/spr_cmnitm_thmb197.farc 732BCFFD\nrom/2d/spr_cmnitm_thmb198.farc DA55475A\nrom/2d/spr_cmnitm_thmb199.farc BDEFFDCC\nrom/2d/spr_cmnitm_thmb200.farc 51935B77\nrom/2d/spr_cmnitm_thmb201.farc 074C7AC9\nrom/2d/spr_cmnitm_thmb204.farc BB2EFB07\nrom/2d/spr_cmnitm_thmb205.farc 82639F9B\nrom/2d/spr_cmnitm_thmb206.farc 31547CF4\nrom/2d/spr_cmnitm_thmb207.farc F6A0C479\nrom/2d/spr_cmnitm_thmb209.farc BF505F7B\nrom/2d/spr_cmnitm_thmb210.farc 764CF999\nrom/2d/spr_cmnitm_thmb211.farc 412130F1\nrom/2d/spr_cmnitm_thmb212.farc 822FCD98\nrom/2d/spr_cmnitm_thmb213.farc 32F04176\nrom/2d/spr_cmnitm_thmb214.farc 6DD4F8A1\nrom/2d/spr_cmnitm_thmb215.farc E8B3C135\nrom/2d/spr_cmnitm_thmb216.farc 7596C1C1\nrom/2d/spr_cmnitm_thmb217.farc 42620DE5\nrom/2d/spr_cmnitm_thmb218.farc 07DE9C01\nrom/2d/spr_cmnitm_thmb219.farc 4EA29B11\nrom/2d/spr_cmnitm_thmb220.farc B0715B82\nrom/2d/spr_cmnitm_thmb221.farc 98AD437D\nrom/2d/spr_cmnitm_thmb222.farc ADAC6DCE\nrom/2d/spr_cmnitm_thmb223.farc 9BD75784\nrom/2d/spr_cmnitm_thmb225.farc 1A856805\nrom/2d/spr_cmnitm_thmb226.farc 3E3B2CBC\nrom/2d/spr_cmnitm_thmb227.farc 0B069CA4\nrom/2d/spr_cmnitm_thmb228.farc 2B97321B\nrom/2d/spr_cmnitm_thmb229.farc 9E23D89C\nrom/2d/spr_cmnitm_thmb230.farc FBA6C68D\nrom/2d/spr_cmnitm_thmb231.farc 941C997E\nrom/2d/spr_cmnitm_thmb232.farc B0CB5684\nrom/2d/spr_cmnitm_thmb233.farc 6700CE40\nrom/2d/spr_cmnitm_thmbdummy.farc 307703B9\nrom/2d/spr_cmn_all.farc 80292D0A\nrom/2d/spr_db.bin EC621CDD\nrom/2d/spr_edit_d2pvback001.farc 50434D45\nrom/2d/spr_edit_d2pvback002.farc 50D9B3BB\nrom/2d/spr_edit_d2pvback003.farc F3EA746C\nrom/2d/spr_edit_d2pvback005.farc 9B85FABB\nrom/2d/spr_edit_d2pvback006.farc B8D0BDC2\nrom/2d/spr_edit_d2pvback007.farc 49DC486E\nrom/2d/spr_edit_d2pvback008.farc C51A0687\nrom/2d/spr_edit_d2pvback009.farc 6524CE00\nrom/2d/spr_edit_d2pvback010.farc B34A181C\nrom/2d/spr_edit_d2pvback011.farc 77E9AD66\nrom/2d/spr_edit_d2pvback012.farc 1FF58560\nrom/2d/spr_edit_d2pvback013.farc 968C5376\nrom/2d/spr_edit_d2pvback014.farc D2ABA707\nrom/2d/spr_edit_d2pvback015.farc BCA6FD2F\nrom/2d/spr_edit_d2pvback016.farc E4265452\nrom/2d/spr_edit_d2pvback017.farc 6955AC38\nrom/2d/spr_edit_d2pvback018.farc CA2E9A0E\nrom/2d/spr_edit_d2pvback020.farc 4DDDB8B5\nrom/2d/spr_edit_d2pvback021.farc 641F80E2\nrom/2d/spr_edit_d2pvback022.farc BB5CD0A5\nrom/2d/spr_edit_d2pvback023.farc 2C3A26EB\nrom/2d/spr_edit_d2pvback024.farc 942FFC45\nrom/2d/spr_edit_d2pvback025.farc 17438318\nrom/2d/spr_edit_d2pvback026.farc 431DCAF6\nrom/2d/spr_edit_d2pvback027.farc F3DBA385\nrom/2d/spr_edit_d2pvback028.farc 72E0FF74\nrom/2d/spr_edit_d2pvback029.farc 120A1687\nrom/2d/spr_edit_d2pvback030.farc E8C79524\nrom/2d/spr_edit_d2pvback031.farc 0AAE328D\nrom/2d/spr_edit_d2pvback032.farc B4C83F64\nrom/2d/spr_edit_d2pvback033.farc 54A4A25E\nrom/2d/spr_edit_d2pvback035.farc 91041989\nrom/2d/spr_edit_d2pvback036.farc 743FA727\nrom/2d/spr_edit_d2pvback037.farc 7A2CAC98\nrom/2d/spr_edit_d2pvback038.farc 71607DA7\nrom/2d/spr_edit_d2pvback039.farc 25E0E1AC\nrom/2d/spr_edit_d2pvback040.farc F95566AB\nrom/2d/spr_edit_d2pvback041.farc 6887CE8F\nrom/2d/spr_edit_d2pvback042.farc 2CF8D0BE\nrom/2d/spr_edit_d2pvback043.farc 11973CE3\nrom/2d/spr_edit_d2pvback044.farc 51FB335A\nrom/2d/spr_edit_d2pvback045.farc BF9C43E3\nrom/2d/spr_edit_d2pvback046.farc 5D3C0DE6\nrom/2d/spr_edit_d2pvback047.farc 229F2C9A\nrom/2d/spr_edit_d2pvback048.farc 1F8D7B06\nrom/2d/spr_edit_d2pvback050.farc CAE2C43C\nrom/2d/spr_edit_d2pvback051.farc 7DD084AD\nrom/2d/spr_edit_d2pvback052.farc B16B8932\nrom/2d/spr_edit_d2pvback053.farc B5B4CF44\nrom/2d/spr_edit_d2pvback054.farc FEA824AE\nrom/2d/spr_edit_d2pvback055.farc 6BBCCAD6\nrom/2d/spr_edit_d2pvback056.farc 3B7538F9\nrom/2d/spr_edit_d2pvback057.farc 3B2FF441\nrom/2d/spr_edit_d2pvback058.farc 303ECC8A\nrom/2d/spr_edit_d2pvback059.farc F70C5D5F\nrom/2d/spr_edit_d2pvback060.farc 5995EF52\nrom/2d/spr_edit_d2pvback061.farc EA1175CC\nrom/2d/spr_edit_d2pvback062.farc 87EEC54B\nrom/2d/spr_edit_d2pvback063.farc 64491289\nrom/2d/spr_edit_d2pvback065.farc 6EB2352B\nrom/2d/spr_edit_d2pvback066.farc 7A7A88D4\nrom/2d/spr_edit_d2pvback067.farc 57315CC6\nrom/2d/spr_edit_d2pvback068.farc 0E4B6FCA\nrom/2d/spr_edit_d2pvback069.farc F81B6262\nrom/2d/spr_edit_d2pvback070.farc E92D803B\nrom/2d/spr_edit_d2pvback071.farc 24E5510A\nrom/2d/spr_edit_d2pvback072.farc 2F8A79E7\nrom/2d/spr_edit_d2pvback073.farc B50AAC8C\nrom/2d/spr_edit_d2pvback074.farc 9607052B\nrom/2d/spr_edit_d2pvback075.farc A05A145A\nrom/2d/spr_edit_d2pvback076.farc B4237AB4\nrom/2d/spr_edit_d2pvback077.farc 38EE7DA9\nrom/2d/spr_edit_d2pvback078.farc 028AAAC3\nrom/2d/spr_edit_d2pvback080.farc F3F4652D\nrom/2d/spr_edit_d2pvback081.farc 950446AF\nrom/2d/spr_edit_d2pvback082.farc F224558A\nrom/2d/spr_edit_d2pvback083.farc F2DBD939\nrom/2d/spr_edit_d2pvback084.farc 003BE641\nrom/2d/spr_edit_d2pvback085.farc 58AD3731\nrom/2d/spr_edit_d2pvback086.farc E7C22119\nrom/2d/spr_edit_d2pvback087.farc 2BC3CDFC\nrom/2d/spr_edit_d2pvback088.farc 2EA1D7C7\nrom/2d/spr_edit_d2pvback089.farc 58F8F108\nrom/2d/spr_edit_d2pvback090.farc AF2B2BF0\nrom/2d/spr_edit_d2pvback091.farc E60EBECD\nrom/2d/spr_edit_d2pvback092.farc A5800426\nrom/2d/spr_edit_d2pvback093.farc 326D06B7\nrom/2d/spr_edit_d2pvback095.farc 4C44C536\nrom/2d/spr_edit_d2pvback096.farc B1214490\nrom/2d/spr_edit_d2pvback097.farc 48DA23C8\nrom/2d/spr_edit_d2pvback098.farc 36184D4C\nrom/2d/spr_edit_d2pvback099.farc AEAA2889\nrom/2d/spr_edit_d2pvback100.farc 0DB35A94\nrom/2d/spr_edit_d2pvback101.farc 4B9C8AC4\nrom/2d/spr_edit_d2pvback102.farc 63FB4EC8\nrom/2d/spr_edit_d2pvback103.farc 67A1D26D\nrom/2d/spr_edit_d2pvback104.farc 6AB8996E\nrom/2d/spr_edit_d2pvback105.farc 8E1E7394\nrom/2d/spr_edit_d2pvback106.farc 242CD76A\nrom/2d/spr_edit_d2pvback107.farc 17B27107\nrom/2d/spr_edit_d2pvback108.farc 9003DB9F\nrom/2d/spr_edit_d2pvback110.farc D8171151\nrom/2d/spr_edit_d2pvback111.farc 92DEE23A\nrom/2d/spr_edit_d2pvback112.farc 074F9736\nrom/2d/spr_edit_d2pvback113.farc 37FF513F\nrom/2d/spr_edit_d2pvback114.farc 87A6610F\nrom/2d/spr_edit_d2pvback115.farc B7DDB0F1\nrom/2d/spr_edit_d2pvback116.farc 983CC4C6\nrom/2d/spr_edit_d2pvback117.farc A2627F69\nrom/2d/spr_edit_d2pvback118.farc 64B88794\nrom/2d/spr_edit_d2pvback119.farc D1CFB435\nrom/2d/spr_edit_d2pvback120.farc E2E9DC78\nrom/2d/spr_edit_d2pvback121.farc C6CB7261\nrom/2d/spr_edit_d2pvback122.farc 8C84F383\nrom/2d/spr_edit_d2pvback123.farc 3D0A274B\nrom/2d/spr_edit_d2pvback125.farc CD087987\nrom/2d/spr_edit_d2pvback126.farc 17A704C5\nrom/2d/spr_edit_d2pvback127.farc B08B59C7\nrom/2d/spr_edit_d2pvback128.farc CE19EBC3\nrom/2d/spr_edit_d2pvback129.farc 192ED88A\nrom/2d/spr_edit_d2pvback130.farc AD8C49EC\nrom/2d/spr_edit_d2pvback131.farc C349082A\nrom/2d/spr_edit_d2pvback132.farc 129E8ACE\nrom/2d/spr_edit_d2pvback133.farc 17E2F86B\nrom/2d/spr_edit_d2pvback134.farc 39F50AF3\nrom/2d/spr_edit_d2pvback135.farc 3BABA73B\nrom/2d/spr_edit_d2pvback136.farc 75E032E1\nrom/2d/spr_edit_d2pvback137.farc A7E901E5\nrom/2d/spr_edit_d2pvback138.farc 7B1ECF89\nrom/2d/spr_cmnitm_thmb142.farc B415F12B\nrom/2d/spr_cmnitm_thmb158.farc 661AA3FB\nrom/2d/spr_cmnitm_thmb174.farc 1D1E665D\nrom/2d/spr_cmnitm_thmb190.farc 8C0F26A0\nrom/2d/spr_cmnitm_thmb208.farc 95B6DC8C\nrom/2d/spr_cmnitm_thmb224.farc 48D033B0\nrom/2d/spr_edit_d2pvback004.farc BFC8D5FE\nrom/2d/spr_edit_d2pvback019.farc 54D0F8C6\nrom/2d/spr_edit_d2pvback034.farc 0895B8A4\nrom/2d/spr_edit_d2pvback049.farc 1B9A0F54\nrom/2d/spr_edit_d2pvback064.farc C30335B4\nrom/2d/spr_edit_d2pvback079.farc 02423814\nrom/2d/spr_edit_d2pvback094.farc 5F902CBB\nrom/2d/spr_edit_d2pvback109.farc 206BD780\nrom/2d/spr_edit_d2pvback140.farc 3EC45D8A\nrom/2d/spr_edit_d2pvback141.farc B8D74ED9\nrom/2d/spr_edit_d2pvback142.farc D874B06A\nrom/2d/spr_edit_d2pvback143.farc D35510C6\nrom/2d/spr_edit_d2pvback144.farc B92625AA\nrom/2d/spr_edit_d2pvback145.farc 6E2805A6\nrom/2d/spr_edit_d2pvback146.farc A40BE610\nrom/2d/spr_edit_d2pvback147.farc 24B7E3F9\nrom/2d/spr_edit_d2pvback148.farc 775CDD78\nrom/2d/spr_edit_d2pvback149.farc FBB7FF91\nrom/2d/spr_edit_d2pvback150.farc C0646C7B\nrom/2d/spr_edit_d2pvback151.farc 5CA98AAF\nrom/2d/spr_edit_d2pvback152.farc 26D9D688\nrom/2d/spr_edit_d2pvback153.farc E070902B\nrom/2d/spr_edit_d2pvback155.farc F5C4DF62\nrom/2d/spr_edit_d2pvback156.farc 2136DAAB\nrom/2d/spr_edit_d2pvback157.farc 9B416808\nrom/2d/spr_edit_d2pvback158.farc B42A755D\nrom/2d/spr_edit_d2pvback159.farc A95CD414\nrom/2d/spr_edit_d2pvback160.farc D6D18534\nrom/2d/spr_edit_d2pvback161.farc 5814E4E8\nrom/2d/spr_edit_d2pvback162.farc 575079CD\nrom/2d/spr_edit_d2pvback163.farc C2D6D594\nrom/2d/spr_edit_d2pvback164.farc 806BFABE\nrom/2d/spr_edit_d2pvback165.farc 44082317\nrom/2d/spr_edit_d2pvback166.farc EBF8C82F\nrom/2d/spr_edit_d2pvback167.farc E3929E80\nrom/2d/spr_edit_d2pvback168.farc 582DE8AC\nrom/2d/spr_edit_d2pvback170.farc B775718C\nrom/2d/spr_edit_d2pvback171.farc 97A57C4C\nrom/2d/spr_edit_d2pvback172.farc EA07AD8B\nrom/2d/spr_edit_d2pvback173.farc 98CC4FF0\nrom/2d/spr_edit_d2pvback174.farc FB7EB2D4\nrom/2d/spr_edit_d2pvback175.farc 59526246\nrom/2d/spr_edit_d2pvback176.farc BC5DC445\nrom/2d/spr_edit_d2pvback177.farc 2410C5F2\nrom/2d/spr_edit_d2pvback178.farc 7EF89BDB\nrom/2d/spr_edit_d2pvback179.farc C9FC3304\nrom/2d/spr_edit_d2pvback180.farc 9EEA1BCF\nrom/2d/spr_edit_d2pvback181.farc AC1562A9\nrom/2d/spr_edit_d2pvback182.farc F03C125E\nrom/2d/spr_edit_d2pvback183.farc CF25CCA9\nrom/2d/spr_edit_d2pvback185.farc B26EA8BB\nrom/2d/spr_edit_d2pvback186.farc 84E0DB75\nrom/2d/spr_edit_d2pvback187.farc F207C202\nrom/2d/spr_edit_d2pvback188.farc 33D5277F\nrom/2d/spr_edit_d2pvback189.farc 50E2C1DC\nrom/2d/spr_edit_d2pvback190.farc 33107A30\nrom/2d/spr_edit_d2pvback191.farc B61B356C\nrom/2d/spr_edit_d2pvback192.farc C3B0946A\nrom/2d/spr_edit_d2pvback193.farc ED2822DA\nrom/2d/spr_edit_d2pvbackblack.farc 24959A65\nrom/2d/spr_edit_d2pvbackwhite.farc 365564B8\nrom/2d/spr_edit_expvback001.farc 44CFA847\nrom/2d/spr_edit_expvback002.farc A7F9DAA0\nrom/2d/spr_edit_expvback003.farc B799FAB5\nrom/2d/spr_edit_expvback005.farc DBB6603D\nrom/2d/spr_edit_expvback006.farc 72125736\nrom/2d/spr_edit_expvback007.farc 803480EC\nrom/2d/spr_edit_expvback008.farc FC57C391\nrom/2d/spr_edit_expvback009.farc 1FD48307\nrom/2d/spr_edit_expvback010.farc 444B6C7C\nrom/2d/spr_edit_expvback011.farc 854BD288\nrom/2d/spr_edit_expvback012.farc 06BA52DF\nrom/2d/spr_edit_expvback013.farc 3D9E7057\nrom/2d/spr_edit_expvback014.farc D7F92668\nrom/2d/spr_edit_expvback015.farc F1DBB0E5\nrom/2d/spr_edit_expvback016.farc AB08A81F\nrom/2d/spr_edit_expvback017.farc A7B037ED\nrom/2d/spr_edit_expvback018.farc 35A097DC\nrom/2d/spr_edit_expvback020.farc 6505899C\nrom/2d/spr_edit_expvback021.farc BF2125F8\nrom/2d/spr_edit_expvback022.farc A8E71B93\nrom/2d/spr_edit_expvback023.farc C2227E57\nrom/2d/spr_edit_expvback024.farc 7AE5EB9A\nrom/2d/spr_edit_expvback025.farc A81172BD\nrom/2d/spr_edit_expvback026.farc 0ABEAA91\nrom/2d/spr_edit_expvback027.farc CA20C59D\nrom/2d/spr_edit_expvback028.farc 4FF04881\nrom/2d/spr_edit_expvback029.farc 976FB916\nrom/2d/spr_edit_expvback030.farc B0DDFA27\nrom/2d/spr_edit_expvback031.farc EE813946\nrom/2d/spr_edit_expvback032.farc C52AD686\nrom/2d/spr_edit_fpvback112.farc D98AC008\nrom/2d/spr_edit_fpvback5017.farc 834BA1B3\nrom/2d/spr_edit_fpvbackblack.farc 6F5366BE\nrom/2d/spr_edit_fpvbackpgreen.farc 3BE3DA4A\nrom/2d/spr_edit_fpvbackppink.farc 3B959D87\nrom/2d/spr_edit_fpvbackpsky.farc D1363439\nrom/2d/spr_edit_fpvbackpyellow.farc A13043D9\nrom/2d/spr_edit_fpvbacksky.farc 0E9C493E\nrom/2d/spr_edit_fpvbackwhite.farc 14ED681D\nrom/2d/spr_edit_pvback001.farc 09283BCC\nrom/2d/spr_edit_pvback002.farc 6C4CD251\nrom/2d/spr_edit_pvback003.farc C8C5B0E7\nrom/2d/spr_edit_pvback004.farc 2B4214C1\nrom/2d/spr_edit_pvback005.farc E387202D\nrom/2d/spr_edit_pvback006.farc C8EA28F8\nrom/2d/spr_edit_pvback007.farc 265020DB\nrom/2d/spr_edit_pvback009.farc 114834EB\nrom/2d/spr_edit_pvback010.farc 9D434A6D\nrom/2d/spr_edit_pvback011.farc F6982F09\nrom/2d/spr_edit_pvback012.farc 0ED15FB6\nrom/2d/spr_edit_pvback013.farc 06FA841E\nrom/2d/spr_edit_pvback014.farc 67D7CAB2\nrom/2d/spr_edit_pvback015.farc 203BF640\nrom/2d/spr_edit_pvback016.farc 4B040AD0\nrom/2d/spr_edit_pvback017.farc 6AD374AD\nrom/2d/spr_edit_pvback018.farc 49453A6D\nrom/2d/spr_edit_pvback019.farc 7387B2C0\nrom/2d/spr_edit_pvback020.farc 4997A640\nrom/2d/spr_edit_pvback021.farc 9EA0FC5F\nrom/2d/spr_edit_pvback022.farc 934E9DE5\nrom/2d/spr_edit_pvback023.farc B6AA0182\nrom/2d/spr_edit_pvback025.farc 04904383\nrom/2d/spr_edit_pvback026.farc 1F2EF5AF\nrom/2d/spr_edit_pvback027.farc E443918B\nrom/2d/spr_edit_pvback028.farc B2F1F869\nrom/2d/spr_edit_pvback029.farc 96DE3B20\nrom/2d/spr_edit_pvback030.farc 30D12417\nrom/2d/spr_edit_pvback031.farc B96E7637\nrom/2d/spr_edit_pvback032.farc 2491B37D\nrom/2d/spr_edit_pvback033.farc 18B1938F\nrom/2d/spr_edit_pvback034.farc 87F46128\nrom/2d/spr_edit_pvback035.farc 86AA6D4E\nrom/2d/spr_edit_pvback036.farc 42D51CFF\nrom/2d/spr_edit_pvback037.farc A3B2A065\nrom/2d/spr_edit_pvback038.farc 2BA345A7\nrom/2d/spr_edit_pvback039.farc E239A6E9\nrom/2d/spr_edit_pvback041.farc 4E420972\nrom/2d/spr_edit_pvback042.farc E8B3FD4A\nrom/2d/spr_edit_pvback043.farc 9EF824C6\nrom/2d/spr_edit_pvback044.farc 39C72CC8\nrom/2d/spr_edit_pvback045.farc 1417FF93\nrom/2d/spr_edit_pvback046.farc B1EEC3A8\nrom/2d/spr_edit_pvback047.farc 693A2BDF\nrom/2d/spr_edit_pvback048.farc AB4C8ABF\nrom/2d/spr_edit_pvback049.farc 90EF6322\nrom/2d/spr_edit_pvback050.farc 9DDC2D9E\nrom/2d/spr_edit_pvback051.farc B4DA82CC\nrom/2d/spr_edit_pvback052.farc 6704C01C\nrom/2d/spr_edit_pvback053.farc FB610011\nrom/2d/spr_edit_pvback054.farc F08CC8A3\nrom/2d/spr_edit_pvback055.farc C745ECC8\nrom/2d/spr_edit_pvback057.farc 1FA3208E\nrom/2d/spr_edit_pvback058.farc CC50E493\nrom/2d/spr_edit_pvback059.farc 8CE5FF80\nrom/2d/spr_edit_pvback060.farc 02637918\nrom/2d/spr_edit_pvback061.farc E1704EB7\nrom/2d/spr_edit_pvback062.farc B4CB222B\nrom/2d/spr_edit_pvback063.farc EC481E2D\nrom/2d/spr_edit_pvback064.farc 64A0B004\nrom/2d/spr_edit_pvback065.farc 7561B011\nrom/2d/spr_edit_pvback066.farc 6E90EE21\nrom/2d/spr_edit_pvback067.farc B532DE8F\nrom/2d/spr_edit_pvback068.farc 24B4D9D3\nrom/2d/spr_edit_pvback069.farc 10CA9982\nrom/2d/spr_edit_pvback070.farc 7978062E\nrom/2d/spr_edit_pvback071.farc 759136AD\nrom/2d/spr_edit_pvback073.farc 8C94FA3A\nrom/2d/spr_edit_pvback074.farc 87515685\nrom/2d/spr_edit_pvback075.farc 02761675\nrom/2d/spr_edit_pvback076.farc 30AA4C87\nrom/2d/spr_edit_pvback077.farc 9EB20F1D\nrom/2d/spr_edit_pvback078.farc 667C6458\nrom/2d/spr_edit_pvback079.farc 115A96E6\nrom/2d/spr_edit_pvback080.farc 0D4F610C\nrom/2d/spr_edit_pvback081.farc FF6EE782\nrom/2d/spr_edit_pvback082.farc 11B35AD6\nrom/2d/spr_edit_pvback083.farc D4A18AB2\nrom/2d/spr_edit_pvback084.farc 39195830\nrom/2d/spr_edit_pvback085.farc 6CB5BC70\nrom/2d/spr_edit_pvback086.farc 619AD43B\nrom/2d/spr_edit_pvback087.farc 43D0EB96\nrom/2d/spr_edit_pvback089.farc 01FB7502\nrom/2d/spr_edit_pvback090.farc 0DA4D844\nrom/2d/spr_edit_pvback091.farc EEB3CC2F\nrom/2d/spr_edit_pvback092.farc 95737E11\nrom/2d/spr_edit_pvback093.farc C75F2A3E\nrom/2d/spr_edit_pvback094.farc 6A3FD521\nrom/2d/spr_edit_pvback095.farc B267084B\nrom/2d/spr_edit_pvback096.farc 9D16D3E2\nrom/2d/spr_edit_pvback097.farc B90C51D6\nrom/2d/spr_edit_pvback098.farc EDF08D0C\nrom/2d/spr_edit_pvback099.farc 55577A20\nrom/2d/spr_edit_pvback100.farc CE8C42A0\nrom/2d/spr_edit_pvback101.farc 76253B1C\nrom/2d/spr_edit_pvback102.farc DDD63227\nrom/2d/spr_edit_pvback103.farc ED641D06\nrom/2d/spr_edit_pvback105.farc 5BC99CA0\nrom/2d/spr_edit_pvback106.farc F6F0448E\nrom/2d/spr_edit_pvback107.farc 93DFE62B\nrom/2d/spr_edit_pvback108.farc AC34DE5D\nrom/2d/spr_edit_pvback109.farc 8A82C74B\nrom/2d/spr_edit_pvback110.farc E996A6B9\nrom/2d/spr_edit_pvback111.farc 76289A08\nrom/2d/spr_edit_pvback112.farc A926207F\nrom/2d/spr_edit_pvback113.farc 4F13D3F4\nrom/2d/spr_edit_pvback114.farc AF3B46E9\nrom/2d/spr_edit_pvback115.farc E796E2DC\nrom/2d/spr_edit_pvback116.farc 59A89CF9\nrom/2d/spr_edit_pvback117.farc EC1818B6\nrom/2d/spr_edit_pvback118.farc E95A6168\nrom/2d/spr_edit_pvback119.farc 7585C1F6\nrom/2d/spr_edit_d2pvback139.farc 4A7027CB\nrom/2d/spr_edit_d2pvback154.farc D19B8739\nrom/2d/spr_edit_d2pvback169.farc 4CBE599D\nrom/2d/spr_edit_d2pvback184.farc 5C8E2E42\nrom/2d/spr_edit_expvback004.farc 56AE7ED9\nrom/2d/spr_edit_expvback019.farc EB6FA986\nrom/2d/spr_edit_fpvback5012.farc BF5C974C\nrom/2d/spr_edit_pvback008.farc B027B995\nrom/2d/spr_edit_pvback024.farc B60E42AB\nrom/2d/spr_edit_pvback040.farc 65352F9E\nrom/2d/spr_edit_pvback056.farc 76D4DFE1\nrom/2d/spr_edit_pvback072.farc 2F5C96AB\nrom/2d/spr_edit_pvback088.farc D1F180CA\nrom/2d/spr_edit_pvback104.farc 34D8A728\nrom/2d/spr_edit_pvback121.farc 5F704564\nrom/2d/spr_edit_pvback122.farc A910518E\nrom/2d/spr_edit_pvback123.farc ABB2A68B\nrom/2d/spr_edit_pvback124.farc FF03A488\nrom/2d/spr_edit_pvback125.farc F2E2C120\nrom/2d/spr_edit_pvback126.farc B0FC8FE9\nrom/2d/spr_edit_pvback127.farc 6E99B888\nrom/2d/spr_edit_pvback128.farc 95D1E0AE\nrom/2d/spr_edit_pvback129.farc F78F096A\nrom/2d/spr_edit_pvback130.farc 814C7CA5\nrom/2d/spr_edit_pvback131.farc 43FB85AA\nrom/2d/spr_edit_pvback132.farc 6418D471\nrom/2d/spr_edit_pvback133.farc 2501118C\nrom/2d/spr_edit_pvback134.farc 34353A86\nrom/2d/spr_edit_pvback135.farc 10A7CDC1\nrom/2d/spr_edit_pvback137.farc 67AF0C5D\nrom/2d/spr_edit_pvback138.farc D6E866F8\nrom/2d/spr_edit_pvback139.farc 4C233E01\nrom/2d/spr_edit_pvback140.farc C7160C78\nrom/2d/spr_edit_pvback141.farc 51A42A8D\nrom/2d/spr_edit_pvback142.farc 14863455\nrom/2d/spr_edit_pvback143.farc E7B266BD\nrom/2d/spr_edit_pvback144.farc 7E0F4422\nrom/2d/spr_edit_pvback145.farc 12C31787\nrom/2d/spr_edit_pvback146.farc 532D09E1\nrom/2d/spr_edit_pvback147.farc 6A33F52D\nrom/2d/spr_edit_pvback148.farc A57A76C7\nrom/2d/spr_edit_pvback149.farc 5B4F6F1E\nrom/2d/spr_edit_pvback150.farc 13A58AF2\nrom/2d/spr_edit_pvback151.farc 6FF97F94\nrom/2d/spr_edit_pvback153.farc 51F9AC4E\nrom/2d/spr_edit_pvback154.farc 1C5A7BAE\nrom/2d/spr_edit_pvback155.farc 0AF11A97\nrom/2d/spr_edit_pvback156.farc 06E5FF47\nrom/2d/spr_edit_pvback157.farc CC5D54B9\nrom/2d/spr_edit_pvback158.farc C2C7318D\nrom/2d/spr_edit_pvback159.farc 48719D14\nrom/2d/spr_edit_pvback160.farc B8E4C10C\nrom/2d/spr_edit_pvback161.farc BDCA5AB7\nrom/2d/spr_edit_pvback162.farc 3EEB25C1\nrom/2d/spr_edit_pvback163.farc F13D9FE4\nrom/2d/spr_edit_pvback164.farc 042C39E3\nrom/2d/spr_edit_pvback165.farc 1CCE8D52\nrom/2d/spr_edit_pvback166.farc E22D60C9\nrom/2d/spr_edit_pvback167.farc 78619471\nrom/2d/spr_edit_pvback169.farc 2D4936D0\nrom/2d/spr_edit_pvback170.farc B60244F3\nrom/2d/spr_edit_pvback171.farc E10AEEAE\nrom/2d/spr_edit_pvback172.farc 566E78DB\nrom/2d/spr_edit_pvback173.farc 9022A4C3\nrom/2d/spr_edit_pvback174.farc 94F001F6\nrom/2d/spr_edit_pvback175.farc AA3BC42D\nrom/2d/spr_edit_pvback176.farc C402E3C1\nrom/2d/spr_edit_pvback177.farc DC7E8105\nrom/2d/spr_edit_pvback178.farc 7DC824BB\nrom/2d/spr_edit_pvback179.farc 6E7D7242\nrom/2d/spr_edit_pvback180.farc FDF1DE98\nrom/2d/spr_edit_pvback181.farc 9BF66E68\nrom/2d/spr_edit_pvback182.farc DAFC7900\nrom/2d/spr_edit_pvback183.farc 59F93331\nrom/2d/spr_edit_pvback185.farc 1D3FDAE5\nrom/2d/spr_edit_pvback186.farc CB68061D\nrom/2d/spr_edit_pvback187.farc C8B8F8B1\nrom/2d/spr_edit_pvback188.farc F33F5D1F\nrom/2d/spr_edit_pvback189.farc 2282DE7C\nrom/2d/spr_edit_pvback190.farc A6E4F6E6\nrom/2d/spr_edit_pvback191.farc 318D2AF0\nrom/2d/spr_edit_pvback192.farc 24783F09\nrom/2d/spr_edit_pvback193.farc D3D2247A\nrom/2d/spr_edit_pvback194.farc A70DE235\nrom/2d/spr_edit_pvback195.farc 001D6C5E\nrom/2d/spr_edit_pvback196.farc E2F9FFCA\nrom/2d/spr_ent_cmn.farc 97CDF167\nrom/2d/spr_ent_name.farc 152B7D26\nrom/2d/spr_ent_passintro.farc 4B8D1660\nrom/2d/spr_fnt_24.farc D66210B0\nrom/2d/spr_fnt_cmn.farc 941C69B7\nrom/2d/spr_gam_cmn.farc 1C98B74A\nrom/2d/spr_gam_cont.farc F7B7076E\nrom/2d/spr_gam_ctstrslt.farc 4C578B1F\nrom/2d/spr_gam_edttit.farc C7EDCEE3\nrom/2d/spr_gam_eff000.farc 895A1C83\nrom/2d/spr_gam_eff001.farc 3825AF96\nrom/2d/spr_gam_eff002.farc E033A2E7\nrom/2d/spr_gam_eff003.farc 28240DCC\nrom/2d/spr_gam_eff004.farc 2BA5D979\nrom/2d/spr_gam_eff005.farc E8228193\nrom/2d/spr_gam_eff006.farc 40CDE81B\nrom/2d/spr_gam_eff007.farc 2DE1BDAA\nrom/2d/spr_gam_eff008.farc 594C9BF5\nrom/2d/spr_gam_eff009.farc 5C84ADE3\nrom/2d/spr_gam_eff010.farc BF247759\nrom/2d/spr_gam_eff012.farc A598D232\nrom/2d/spr_gam_eff013.farc 2D0B87E3\nrom/2d/spr_gam_eff014.farc 3F04E418\nrom/2d/spr_gam_eff015.farc F8AC8969\nrom/2d/spr_gam_eff016.farc 0D80D33C\nrom/2d/spr_gam_eff017.farc F7B28415\nrom/2d/spr_gam_eff018.farc 7AEEF16E\nrom/2d/spr_gam_eff019.farc 6A807A3E\nrom/2d/spr_gam_eff020.farc 2E022AB8\nrom/2d/spr_gam_eff021.farc 92DD2F78\nrom/2d/spr_gam_eff022.farc 182DCAFC\nrom/2d/spr_gam_eff023.farc 78EE92CB\nrom/2d/spr_gam_eff024.farc 4F4723B8\nrom/2d/spr_gam_eff025.farc 6243F306\nrom/2d/spr_gam_eff026.farc 20EE883C\nrom/2d/spr_gam_eff027.farc C6970238\nrom/2d/spr_gam_eff029.farc 8B1B08B3\nrom/2d/spr_gam_eff030.farc 97D57462\nrom/2d/spr_gam_eff031.farc 20C3327C\nrom/2d/spr_gam_eff032.farc 022540C4\nrom/2d/spr_gam_eff033.farc 273F57BA\nrom/2d/spr_gam_eff034.farc 571353B3\nrom/2d/spr_gam_eff035.farc 54952025\nrom/2d/spr_gam_eff036.farc E884E6F4\nrom/2d/spr_gam_eff039.farc 5F48EA20\nrom/2d/spr_gam_eff040.farc 49D6ED5B\nrom/2d/spr_gam_eff041.farc 77E30035\nrom/2d/spr_gam_eff042.farc 2A38C780\nrom/2d/spr_gam_eff044.farc F343E336\nrom/2d/spr_gam_eff050.farc 0216C5AD\nrom/2d/spr_gam_eff051.farc 02D2DE8D\nrom/2d/spr_gam_eff052.farc 3D06885C\nrom/2d/spr_gam_eff054.farc B2DCF406\nrom/2d/spr_gam_eff055.farc 9CCC47CD\nrom/2d/spr_gam_eff058.farc F48387E1\nrom/2d/spr_gam_eff059.farc EBB1E2B6\nrom/2d/spr_gam_eff062.farc 7007E324\nrom/2d/spr_gam_eff064.farc 68D9E66A\nrom/2d/spr_gam_eff066.farc E0C04F37\nrom/2d/spr_gam_eff068.farc 6D8AC44F\nrom/2d/spr_gam_eff069.farc 83659F18\nrom/2d/spr_gam_eff070.farc 3BA59982\nrom/2d/spr_gam_eff071.farc 45DEE936\nrom/2d/spr_gam_gover.farc 83F6CE92\nrom/2d/spr_gam_loadsc.farc CE39FD1F\nrom/2d/spr_gam_prize.farc 1820107D\nrom/2d/spr_gam_pv001.farc B7F24C96\nrom/2d/spr_gam_pv002.farc 1A573F87\nrom/2d/spr_gam_pv004.farc B673A628\nrom/2d/spr_gam_pv005.farc 56D749B5\nrom/2d/spr_gam_pv006.farc 31E23BEA\nrom/2d/spr_gam_pv007.farc B8EB299B\nrom/2d/spr_gam_pv008.farc 6D6EBA20\nrom/2d/spr_gam_pv009.farc 486BA8F6\nrom/2d/spr_gam_pv010.farc 6A1E0612\nrom/2d/spr_gam_pv011.farc 75DB3950\nrom/2d/spr_gam_pv012.farc 93AC16CF\nrom/2d/spr_gam_pv013.farc C57E34B3\nrom/2d/spr_gam_pv014.farc 9C7C9157\nrom/2d/spr_gam_pv015.farc 2804B5D4\nrom/2d/spr_gam_pv016.farc 4469E014\nrom/2d/spr_gam_pv017.farc DFB785B7\nrom/2d/spr_gam_pv018.farc 6804CA01\nrom/2d/spr_gam_pv019.farc 91829AC1\nrom/2d/spr_gam_pv021.farc CFE657E4\nrom/2d/spr_gam_pv022.farc 56B47BFA\nrom/2d/spr_gam_pv023.farc DE5ED11B\nrom/2d/spr_gam_pv024.farc 96D2E2A2\nrom/2d/spr_gam_pv025.farc 2E6567FF\nrom/2d/spr_gam_pv026.farc 449EA678\nrom/2d/spr_gam_pv027.farc 9A0B3989\nrom/2d/spr_gam_pv028.farc 670E985F\nrom/2d/spr_gam_pv029.farc D8B0C086\nrom/2d/spr_gam_pv030.farc B20A114D\nrom/2d/spr_gam_pv031.farc D7A761D0\nrom/2d/spr_gam_pv032.farc 45B60CD6\nrom/2d/spr_gam_pv037.farc 924161FB\nrom/2d/spr_gam_pv038.farc 3B880257\nrom/2d/spr_gam_pv039.farc 0123CDBB\nrom/2d/spr_gam_pv040.farc A142070E\nrom/2d/spr_gam_pv042.farc 1BD21692\nrom/2d/spr_gam_pv043.farc BABD4173\nrom/2d/spr_gam_pv044.farc 0074558F\nrom/2d/spr_gam_pv045.farc 086EDC52\nrom/2d/spr_gam_pv046.farc 73A205F5\nrom/2d/spr_gam_pv047.farc 5B5254D9\nrom/2d/spr_gam_pv049.farc 28CC0C87\nrom/2d/spr_gam_pv050.farc 7AF5B274\nrom/2d/spr_gam_pv051.farc 8058000E\nrom/2d/spr_gam_pv052.farc B5FF5516\nrom/2d/spr_gam_pv053.farc 347FAB6A\nrom/2d/spr_gam_pv054.farc 8B80C532\nrom/2d/spr_gam_pv055.farc 879D7DBF\nrom/2d/spr_gam_pv056.farc 2CD1269C\nrom/2d/spr_gam_pv057.farc 86E18952\nrom/2d/spr_gam_pv058.farc AD0A5D4F\nrom/2d/spr_gam_pv060.farc 53DFB303\nrom/2d/spr_gam_pv061.farc 277EC0EE\nrom/2d/spr_gam_pv062.farc BCC2FAD5\nrom/2d/spr_gam_pv063.farc 3A53BA51\nrom/2d/spr_gam_pv064.farc 5E3B7223\nrom/2d/spr_gam_pv065.farc 012C8271\nrom/2d/spr_gam_pv066.farc 4DAD13AB\nrom/2d/spr_gam_pv079.farc A020F8C1\nrom/2d/spr_gam_pv081.farc F804650D\nrom/2d/spr_gam_pv082.farc 633E4BAC\nrom/2d/spr_gam_pv083.farc 13332444\nrom/2d/spr_gam_pv084.farc 1C282285\nrom/2d/spr_gam_pv085.farc ACBFB852\nrom/2d/spr_gam_pv086.farc F0180ECC\nrom/2d/spr_gam_pv087.farc 8CF0C2F7\nrom/2d/spr_gam_pv088.farc B11726A2\nrom/2d/spr_gam_pv090.farc 5653CAF5\nrom/2d/spr_gam_pv091.farc D73E1953\nrom/2d/spr_gam_pv092.farc 9E5DE42E\nrom/2d/spr_gam_pv093.farc A83C8E79\nrom/2d/spr_gam_pv094.farc 2BF4F79C\nrom/2d/spr_gam_pv095.farc 01EB6DC8\nrom/2d/spr_gam_pv096.farc 64A0E62B\nrom/2d/spr_gam_pv097.farc 56E47B39\nrom/2d/spr_gam_pv101.farc 0FBA2CEE\nrom/2d/spr_gam_pv102.farc CF81080E\nrom/2d/spr_gam_pv103.farc 67EE5F6E\nrom/2d/spr_gam_pv104.farc 36B35829\nrom/2d/spr_gam_pv201.farc 02916CE8\nrom/2d/spr_gam_pv202.farc 47AD16FB\nrom/2d/spr_gam_pv203.farc 2DAA64E7\nrom/2d/spr_gam_pv204.farc 76B2E933\nrom/2d/spr_gam_pv206.farc 492347F5\nrom/2d/spr_gam_pv207.farc 791CB511\nrom/2d/spr_gam_pv208.farc 988B35C9\nrom/2d/spr_gam_pv210.farc 99E20AF0\nrom/2d/spr_gam_pv211.farc 1EB4B7B7\nrom/2d/spr_gam_pv212.farc 595AB601\nrom/2d/spr_gam_pv214.farc C9A3490C\nrom/2d/spr_gam_pv218.farc ABCE0D51\nrom/2d/spr_gam_pv219.farc 18230F8B\nrom/2d/spr_gam_pv220.farc 3F3942F4\nrom/2d/spr_gam_pv221.farc 0C9E2939\nrom/2d/spr_gam_pv222.farc 4C42D6E3\nrom/2d/spr_gam_pv223.farc 1F31F00B\nrom/2d/spr_gam_pv224.farc 3B66DEE5\nrom/2d/spr_gam_pv225.farc D6AD8EA1\nrom/2d/spr_gam_pv227.farc 3A2DCA12\nrom/2d/spr_gam_pv232.farc 28E3920A\nrom/2d/spr_gam_pv233.farc 82FEB22A\nrom/2d/spr_gam_pv234.farc 313CFCBB\nrom/2d/spr_gam_pv235.farc 24C08116\nrom/2d/spr_gam_pv236.farc 801E1CE2\nrom/2d/spr_gam_pv238.farc 0B114887\nrom/2d/spr_gam_pv239.farc 31636DBB\nrom/2d/spr_gam_pv240.farc 2D3E5E05\nrom/2d/spr_gam_pv241.farc E148CF9B\nrom/2d/spr_gam_pv242.farc AC375602\nrom/2d/spr_gam_pv243.farc 1528D441\nrom/2d/spr_gam_pv244.farc 46972DB4\nrom/2d/spr_gam_pv246.farc 8A8D4B04\nrom/2d/spr_gam_pv247.farc 328C1C5F\nrom/2d/spr_gam_pv248.farc 81FCF737\nrom/2d/spr_gam_pv249.farc 52AACC86\nrom/2d/spr_edit_pvback136.farc 578F6F28\nrom/2d/spr_edit_pvback152.farc 1C8D0492\nrom/2d/spr_edit_pvback168.farc A016E6C3\nrom/2d/spr_edit_pvback184.farc F4865B40\nrom/2d/spr_fnt_bold24.farc E14D7C63\nrom/2d/spr_gam_eff011.farc 2A7CD334\nrom/2d/spr_gam_eff028.farc BCB85E7A\nrom/2d/spr_gam_eff053.farc D0EE6AA4\nrom/2d/spr_gam_pv003.farc D0AE03EE\nrom/2d/spr_gam_pv020.farc D168A99D\nrom/2d/spr_gam_pv041.farc 1AFEA73D\nrom/2d/spr_gam_pv059.farc F9C55BB2\nrom/2d/spr_gam_pv089.farc C0949A1C\nrom/2d/spr_gam_pv205.farc BB5BB526\nrom/2d/spr_gam_pv231.farc 142B8B88\nrom/2d/spr_gam_pv251.farc 0EBA1C57\nrom/2d/spr_gam_pv253.farc 238D6F2A\nrom/2d/spr_gam_pv255.farc E9B3F903\nrom/2d/spr_gam_pv257.farc 226D5FB0\nrom/2d/spr_gam_pv259.farc BB7094F4\nrom/2d/spr_gam_pv260.farc F60A6F47\nrom/2d/spr_gam_pv261.farc 3D6AD59B\nrom/2d/spr_gam_pv262.farc 9903BA2C\nrom/2d/spr_gam_pv401.farc 1D38FAAF\nrom/2d/spr_gam_pv402.farc DA979D0F\nrom/2d/spr_gam_pv403.farc A75321CC\nrom/2d/spr_gam_pv404.farc 80727876\nrom/2d/spr_gam_pv405.farc EBD9E633\nrom/2d/spr_gam_pv406.farc 6833C465\nrom/2d/spr_gam_pv407.farc FE14C740\nrom/2d/spr_gam_pv408.farc 64E25C14\nrom/2d/spr_gam_pv410.farc 7188ED3C\nrom/2d/spr_gam_pv411.farc DCA400CA\nrom/2d/spr_gam_pv412.farc 21670C0B\nrom/2d/spr_gam_pv413.farc A138D53D\nrom/2d/spr_gam_pv414.farc 0F72886B\nrom/2d/spr_gam_pv415.farc BC57561B\nrom/2d/spr_gam_pv416.farc 9C3430B7\nrom/2d/spr_gam_pv417.farc 21FF9166\nrom/2d/spr_gam_pv418.farc BDA8AABA\nrom/2d/spr_gam_pv419.farc F0841186\nrom/2d/spr_gam_pv420.farc 4099821D\nrom/2d/spr_gam_pv421.farc 83798474\nrom/2d/spr_gam_pv422.farc A38C8989\nrom/2d/spr_gam_pv423.farc E082C06A\nrom/2d/spr_gam_pv424.farc 07E8580D\nrom/2d/spr_gam_pv425.farc C84ED116\nrom/2d/spr_gam_pv427.farc A5B1E7AC\nrom/2d/spr_gam_pv432.farc 6E6AE632\nrom/2d/spr_gam_pv433.farc 4D02FF84\nrom/2d/spr_gam_pv434.farc EF164590\nrom/2d/spr_gam_pv435.farc D0E5BBB4\nrom/2d/spr_gam_pv436.farc AF179835\nrom/2d/spr_gam_pv437.farc 6EDBA1CD\nrom/2d/spr_gam_pv438.farc 184FF550\nrom/2d/spr_gam_pv439.farc 93F70524\nrom/2d/spr_gam_pv440.farc 5A705391\nrom/2d/spr_gam_pv441.farc 54FA5475\nrom/2d/spr_gam_pv442.farc FD37418D\nrom/2d/spr_gam_pv443.farc 9236EFB3\nrom/2d/spr_gam_pv600.farc 0AADB7AE\nrom/2d/spr_gam_pv601.farc 05F774B4\nrom/2d/spr_gam_pv602.farc F929E665\nrom/2d/spr_gam_pv604.farc BD8A1B75\nrom/2d/spr_gam_pv605.farc 3E2C8491\nrom/2d/spr_gam_pv607.farc 0F0E0C21\nrom/2d/spr_gam_pv609.farc 87C4FE9B\nrom/2d/spr_gam_pv610.farc D3A48F8B\nrom/2d/spr_gam_pv611.farc B8A74D3C\nrom/2d/spr_gam_pv612.farc 72180427\nrom/2d/spr_gam_pv613.farc 8871E9B5\nrom/2d/spr_gam_pv614.farc 8BA887B0\nrom/2d/spr_gam_pv615.farc DF1DC8D3\nrom/2d/spr_gam_pv616.farc 736F5AB2\nrom/2d/spr_gam_pv617.farc 3DF7A017\nrom/2d/spr_gam_pv618.farc 01CF4072\nrom/2d/spr_gam_pv619.farc B38C8F0A\nrom/2d/spr_gam_pv620.farc 017DE469\nrom/2d/spr_gam_pv621.farc 6545E375\nrom/2d/spr_gam_pv623.farc D93BC612\nrom/2d/spr_gam_pv624.farc D7357F48\nrom/2d/spr_gam_pv625.farc DD8C91F0\nrom/2d/spr_gam_pv626.farc 8A8ADF14\nrom/2d/spr_gam_pv627.farc 8B5E2D6B\nrom/2d/spr_gam_pv628.farc C00B65C9\nrom/2d/spr_gam_pv629.farc FE444AA2\nrom/2d/spr_gam_pv630.farc AEB1E7CF\nrom/2d/spr_gam_pv631.farc 2CB8030E\nrom/2d/spr_gam_pv637.farc 6C46032A\nrom/2d/spr_gam_pv638.farc 0B26E6D2\nrom/2d/spr_gam_pv639.farc 64199178\nrom/2d/spr_gam_pv640.farc FF3A3519\nrom/2d/spr_gam_pv641.farc D9A89B09\nrom/2d/spr_gam_pv642.farc 19650DBC\nrom/2d/spr_gam_pv710.farc 6A7306E8\nrom/2d/spr_gam_pv723.farc BAB6301A\nrom/2d/spr_gam_pv724.farc 36A206D4\nrom/2d/spr_gam_pv725.farc 9BDC1BBB\nrom/2d/spr_gam_pv726.farc C7A93901\nrom/2d/spr_gam_pv727.farc EE206AEF\nrom/2d/spr_gam_pv728.farc 47FA6AC2\nrom/2d/spr_gam_pv729.farc B4A955E8\nrom/2d/spr_gam_pv730.farc 1AD6D6D6\nrom/2d/spr_gam_pv731.farc 94C2B4C4\nrom/2d/spr_gam_pv732.farc D9F40392\nrom/2d/spr_gam_pv733.farc 55A88FB8\nrom/2d/spr_gam_pv734.farc 9752A452\nrom/2d/spr_gam_pv736.farc 605A37C6\nrom/2d/spr_gam_pv737.farc F3275FC3\nrom/2d/spr_gam_pv738.farc F841D7DA\nrom/2d/spr_gam_pv739.farc 6EE1ACB4\nrom/2d/spr_gam_pv832.farc A82BD0D5\nrom/2d/spr_gam_qstrslt.farc 76AB293C\nrom/2d/spr_gam_result.farc 3F37ECF7\nrom/2d/spr_gam_sc.farc C7E3D196\nrom/2d/spr_gam_skin001.farc 6E3232AE\nrom/2d/spr_gam_skin002.farc 29AC0917\nrom/2d/spr_gam_skin003.farc 917D9845\nrom/2d/spr_gam_skin004.farc 1BA3A30C\nrom/2d/spr_gam_skin005.farc 56821BD1\nrom/2d/spr_gam_skin006.farc 34EDA103\nrom/2d/spr_gam_skin007.farc 1445628B\nrom/2d/spr_gam_skin008.farc 49CE545F\nrom/2d/spr_gam_skin009.farc 8C62A81A\nrom/2d/spr_gam_skin010.farc E474C44A\nrom/2d/spr_gam_skin011.farc 97FF8F67\nrom/2d/spr_gam_skin013.farc 10BA9E34\nrom/2d/spr_gam_skin014.farc 6F70300B\nrom/2d/spr_gam_skin015.farc C343A113\nrom/2d/spr_gam_skin016.farc 604D410E\nrom/2d/spr_gam_skin017.farc BC5102D7\nrom/2d/spr_gam_skin018.farc F6308CB9\nrom/2d/spr_gam_skin019.farc 762215BE\nrom/2d/spr_gam_skin020.farc 0DB6CAEC\nrom/2d/spr_gam_skin021.farc AC2214D9\nrom/2d/spr_gam_skin022.farc 8F47C96E\nrom/2d/spr_gam_skin023.farc 1C907271\nrom/2d/spr_gam_skin024.farc 9DC04809\nrom/2d/spr_gam_skin025.farc BC948EC6\nrom/2d/spr_gam_skin026.farc B6E4876D\nrom/2d/spr_gam_skin027.farc 4BFCAB8C\nrom/2d/spr_gam_skin029.farc CF98FD1E\nrom/2d/spr_gam_skin030.farc C4BD909B\nrom/2d/spr_gam_skin031.farc 3C8A6129\nrom/2d/spr_gam_skin032.farc 56FF72D4\nrom/2d/spr_gam_skin033.farc EFAE951C\nrom/2d/spr_gam_skin034.farc 3AD96FF1\nrom/2d/spr_gam_skin035.farc 2F3CA13D\nrom/2d/spr_gam_skin036.farc ADD5ABF5\nrom/2d/spr_gam_skin037.farc 3425E921\nrom/2d/spr_gam_skin038.farc 70F684C8\nrom/2d/spr_gam_skin039.farc E665F275\nrom/2d/spr_gam_skin040.farc D7736A19\nrom/2d/spr_gam_skin041.farc 3BB0B486\nrom/2d/spr_gam_skin042.farc 5AD46ECF\nrom/2d/spr_gam_skin043.farc 9C67361C\nrom/2d/spr_gam_skin045.farc 41ADC977\nrom/2d/spr_gam_skin046.farc 669665C2\nrom/2d/spr_gam_skin047.farc 565A9386\nrom/2d/spr_gam_skin048.farc 5316BDCB\nrom/2d/spr_gam_skin049.farc FCFEF119\nrom/2d/spr_gam_skin050.farc CC05B9AE\nrom/2d/spr_gam_skin051.farc DCD8E2A2\nrom/2d/spr_gam_skin052.farc 1D984F35\nrom/2d/spr_gam_skin053.farc 6E5CAD95\nrom/2d/spr_gam_skin054.farc 24DC4C04\nrom/2d/spr_gam_skin055.farc 7507B97E\nrom/2d/spr_gam_skin056.farc 96DF0077\nrom/2d/spr_gam_skin057.farc 5AAAFB99\nrom/2d/spr_gam_skin058.farc 2AA54AB3\nrom/2d/spr_gam_skin059.farc 877F9460\nrom/2d/spr_gam_skin061.farc 016C7903\nrom/2d/spr_gam_skin062.farc 95560243\nrom/2d/spr_gam_skin063.farc F7F443C1\nrom/2d/spr_gam_skin064.farc 3C8B47B8\nrom/2d/spr_gam_skin065.farc 609CF6EC\nrom/2d/spr_gam_skin066.farc 4CBBAD0B\nrom/2d/spr_gam_skin067.farc 7F9656CE\nrom/2d/spr_gam_skin068.farc DB45BA3F\nrom/2d/spr_gam_skin069.farc F5FE0341\nrom/2d/spr_gam_skin070.farc C8F05356\nrom/2d/spr_gam_skin071.farc F465A6DB\nrom/2d/spr_gam_skin072.farc 7282F788\nrom/2d/spr_gam_skin073.farc 10F60384\nrom/2d/spr_gam_skin074.farc FA2C72AD\nrom/2d/spr_gam_skin075.farc 6C6A9A50\nrom/2d/spr_gam_skin077.farc 7338C843\nrom/2d/spr_gam_skin078.farc 4BAFBC94\nrom/2d/spr_gam_skin079.farc D58843C5\nrom/2d/spr_gam_skin080.farc 8187172B\nrom/2d/spr_gam_skin081.farc 75F08EA0\nrom/2d/spr_gam_skin082.farc 6B5C0CDC\nrom/2d/spr_gam_skin083.farc F88A5E2D\nrom/2d/spr_gam_skin084.farc AD09953B\nrom/2d/spr_gam_skin085.farc 53412389\nrom/2d/spr_gam_skin086.farc 259F02B7\nrom/2d/spr_gam_skin087.farc 53D55B0C\nrom/2d/spr_gam_skin088.farc 47377FF2\nrom/2d/spr_gam_skin089.farc A09CC23F\nrom/2d/spr_gam_skin090.farc 11BD2585\nrom/2d/spr_gam_skin091.farc C8D2E06E\nrom/2d/spr_gam_skin093.farc 3DB305D3\nrom/2d/spr_gam_skin094.farc D6E59229\nrom/2d/spr_gam_skin095.farc 5F6F005E\nrom/2d/spr_gam_skin096.farc 0DD8FBC6\nrom/2d/spr_gam_skin097.farc 2C811C23\nrom/2d/spr_gam_skin098.farc 3C29C3DC\nrom/2d/spr_gam_skin099.farc 09B38925\nrom/2d/spr_gam_skin100.farc F9F2C57C\nrom/2d/spr_gam_skin101.farc 597DE267\nrom/2d/spr_gam_skin102.farc 8C778668\nrom/2d/spr_gam_skin103.farc 06289C62\nrom/2d/spr_gam_skin104.farc F9A08822\nrom/2d/spr_gam_skin105.farc 13D2A3AC\nrom/2d/spr_gam_skin106.farc 6400E16D\nrom/2d/spr_gam_skin107.farc F6EA5BD8\nrom/2d/spr_gam_skin109.farc 73D27A79\nrom/2d/spr_gam_skin110.farc BDD0B317\nrom/2d/spr_gam_skin111.farc 83BC7444\nrom/2d/spr_gam_skin112.farc D00ECC79\nrom/2d/spr_gam_skin113.farc 45017F1D\nrom/2d/spr_gam_skin114.farc 8C78C122\nrom/2d/spr_gam_skin115.farc 8EE21595\nrom/2d/spr_gam_skin116.farc 061C1D8C\nrom/2d/spr_gam_skin117.farc DB383718\nrom/2d/spr_gam_skin118.farc 31FA2872\nrom/2d/spr_gam_skin119.farc 5807B613\nrom/2d/spr_gam_skin120.farc E517B442\nrom/2d/spr_gam_skin121.farc CFEB20FB\nrom/2d/spr_gam_skin122.farc 53E28516\nrom/2d/spr_gam_skin123.farc BA43A0E3\nrom/2d/spr_gam_skin125.farc 7FF7CD4D\nrom/2d/spr_gam_skin126.farc EE653938\nrom/2d/spr_gam_skin127.farc 82E9D966\nrom/2d/spr_gam_skin128.farc BB2A9498\nrom/2d/spr_gam_skin129.farc 5B26789F\nrom/2d/spr_gam_skin130.farc 2751F41F\nrom/2d/spr_gam_skin131.farc FD668E17\nrom/2d/spr_gam_skin132.farc 6C3FD4FE\nrom/2d/spr_gam_skin133.farc 7A1CE29C\nrom/2d/spr_gam_skin134.farc 915008AD\nrom/2d/spr_gam_skin135.farc 3E88B310\nrom/2d/spr_gam_skin136.farc 1C2F18C2\nrom/2d/spr_gam_skin137.farc 51940BDF\nrom/2d/spr_gam_skin138.farc 197E79D6\nrom/2d/spr_gam_skin139.farc 2D68E7B9\nrom/2d/spr_gam_skin141.farc 82C1463C\nrom/2d/spr_gam_skin142.farc AFE7FB7E\nrom/2d/spr_gam_skin143.farc 2821F933\nrom/2d/spr_gam_skin144.farc 9A8CA0F7\nrom/2d/spr_gam_skin145.farc 9880E40F\nrom/2d/spr_gam_skin146.farc 3B4DB648\nrom/2d/spr_gam_skin147.farc D1AF5BD6\nrom/2d/spr_gam_skin148.farc 6E500130\nrom/2d/spr_gam_skin149.farc 4C03A954\nrom/2d/spr_gam_skin150.farc 1C0E79BE\nrom/2d/spr_gam_skin151.farc 0A6019A8\nrom/2d/spr_gam_skin152.farc 05872897\nrom/2d/spr_gam_skin153.farc 44E5DE8B\nrom/2d/spr_gam_skin154.farc 6C285360\nrom/2d/spr_gam_skin155.farc 8146BCE9\nrom/2d/spr_gam_pv409.farc 934ACED8\nrom/2d/spr_gam_pv426.farc 5F30B69E\nrom/2d/spr_gam_pv603.farc 418D5D73\nrom/2d/spr_gam_pv622.farc E6B1FDF1\nrom/2d/spr_gam_pv722.farc 9CE56E7C\nrom/2d/spr_gam_pv740.farc 0528048C\nrom/2d/spr_gam_skin012.farc 87C40946\nrom/2d/spr_gam_skin028.farc 910C1E78\nrom/2d/spr_gam_skin044.farc 303BA1CF\nrom/2d/spr_gam_skin060.farc 488B746E\nrom/2d/spr_gam_skin076.farc A56C0654\nrom/2d/spr_gam_skin092.farc 4036BEA1\nrom/2d/spr_gam_skin108.farc 6A170BC0\nrom/2d/spr_gam_skin124.farc 76927D65\nrom/2d/spr_gam_skin157.farc AC4AEEA6\nrom/2d/spr_gam_skin158.farc BA3A882F\nrom/2d/spr_gam_skin159.farc 2E28FC72\nrom/2d/spr_gam_skin160.farc E5C06523\nrom/2d/spr_gam_skin161.farc 213575C2\nrom/2d/spr_gam_skin162.farc FAB693FF\nrom/2d/spr_gam_skin163.farc 62EA4E1B\nrom/2d/spr_gam_skin164.farc F4C38E6E\nrom/2d/spr_gam_skin165.farc 546BB9CC\nrom/2d/spr_gam_skin166.farc 2E3EEAB3\nrom/2d/spr_gam_skin167.farc 945875F5\nrom/2d/spr_gam_skin168.farc 91A8C4B9\nrom/2d/spr_gam_skin169.farc 4F1A93E8\nrom/2d/spr_gam_skin170.farc 12008D32\nrom/2d/spr_gam_skin171.farc 246AFDD9\nrom/2d/spr_gam_skin173.farc 3D06C7A7\nrom/2d/spr_gam_skin174.farc DB4D0DB2\nrom/2d/spr_gam_skin175.farc 2E37ECDA\nrom/2d/spr_gam_skin176.farc 8ABD1366\nrom/2d/spr_gam_skin177.farc DF1BD45E\nrom/2d/spr_gam_skin178.farc 7EA1F1A1\nrom/2d/spr_gam_skin179.farc C633916F\nrom/2d/spr_gam_skin180.farc 2D5BB5BE\nrom/2d/spr_gam_skin181.farc D85320C7\nrom/2d/spr_gam_skin182.farc 877DABB6\nrom/2d/spr_gam_skin183.farc EBB1BDBF\nrom/2d/spr_gam_skin184.farc 0D4B2C4D\nrom/2d/spr_gam_skin185.farc 3BB746DF\nrom/2d/spr_gam_skin186.farc 194A8FD4\nrom/2d/spr_gam_skin187.farc 315F8645\nrom/2d/spr_gam_skin189.farc 0C4A1956\nrom/2d/spr_gam_skin190.farc 0BD7F47B\nrom/2d/spr_gam_skin191.farc 3D662BFD\nrom/2d/spr_gam_skin192.farc 0853096E\nrom/2d/spr_gam_skin193.farc 8A3B688E\nrom/2d/spr_gam_skin194.farc 7F3B2C60\nrom/2d/spr_gam_skin195.farc EF1265AC\nrom/2d/spr_gam_skin196.farc BF27249F\nrom/2d/spr_gam_skin197.farc C62A9A57\nrom/2d/spr_gam_skin198.farc 08334067\nrom/2d/spr_gam_skin199.farc 6170FFB7\nrom/2d/spr_gam_skin200.farc C5A56544\nrom/2d/spr_gam_skin201.farc 62A82F14\nrom/2d/spr_gam_skin202.farc 03291D9E\nrom/2d/spr_gam_skin203.farc DE1CE3DE\nrom/2d/spr_gam_skin205.farc 5349AE91\nrom/2d/spr_gam_skin206.farc 4DE2A24E\nrom/2d/spr_gam_skin207.farc 76CEF542\nrom/2d/spr_gam_skin208.farc 84E47E9B\nrom/2d/spr_gam_skin209.farc 7D4B61DE\nrom/2d/spr_gam_skin210.farc 2D6C57F0\nrom/2d/spr_gam_skin211.farc 0D2A6D4D\nrom/2d/spr_gam_skin212.farc E3958547\nrom/2d/spr_gam_skin213.farc C5837830\nrom/2d/spr_gam_skin214.farc 06455AAA\nrom/2d/spr_gam_skin215.farc 55F5FBE5\nrom/2d/spr_gam_skin216.farc 04116B50\nrom/2d/spr_gam_skin217.farc 6A51B3D7\nrom/2d/spr_gam_skin218.farc 5E53CA0D\nrom/2d/spr_gam_skin219.farc 750D74E7\nrom/2d/spr_gam_skin221.farc 4B93A691\nrom/2d/spr_gam_skin222.farc 83BDCB3E\nrom/2d/spr_gam_skin223.farc 064BC916\nrom/2d/spr_gam_skin224.farc C558E788\nrom/2d/spr_gam_skin225.farc 5BB4E30A\nrom/2d/spr_gam_skin226.farc A2E46E44\nrom/2d/spr_gam_skin227.farc C8CF8005\nrom/2d/spr_gam_skin228.farc E20A2397\nrom/2d/spr_gam_skin229.farc D3A63A33\nrom/2d/spr_gam_skin230.farc 5FFBD0D2\nrom/2d/spr_gam_skin231.farc 0BEB5174\nrom/2d/spr_gam_skin232.farc 5B3F1C9D\nrom/2d/spr_gam_skin233.farc 8D26860B\nrom/2d/spr_gam_skin234.farc 46AF1572\nrom/2d/spr_gam_skin235.farc 3A72DF5A\nrom/2d/spr_gam_skin237.farc 292A096B\nrom/2d/spr_gam_skin238.farc F1DD0C79\nrom/2d/spr_gam_skin239.farc 765D02D5\nrom/2d/spr_gam_skin240.farc 40BE79DD\nrom/2d/spr_gam_skin241.farc B1C7F323\nrom/2d/spr_gam_skin242.farc BAD8C4C6\nrom/2d/spr_gam_skin243.farc E4B06316\nrom/2d/spr_gam_skin244.farc 642BBC80\nrom/2d/spr_gam_skin245.farc 2120628D\nrom/2d/spr_gam_skin246.farc FC3FF9EB\nrom/2d/spr_gam_skin247.farc 7DC2500D\nrom/2d/spr_gam_skin248.farc 64F79258\nrom/2d/spr_gam_skin249.farc 98938832\nrom/2d/spr_gam_skin250.farc 32A1112D\nrom/2d/spr_gam_skin251.farc 6CAF075F\nrom/2d/spr_gam_skin253.farc F17FF505\nrom/2d/spr_gam_skin254.farc 88F969CC\nrom/2d/spr_gam_skin255.farc 46479B89\nrom/2d/spr_gam_skin256.farc 791BC41F\nrom/2d/spr_gam_skin257.farc EFF76375\nrom/2d/spr_gam_skin258.farc 63A68EEA\nrom/2d/spr_gam_skin259.farc 4D2CD618\nrom/2d/spr_gam_skin260.farc 7634DEA1\nrom/2d/spr_gam_skin261.farc 7C3F941F\nrom/2d/spr_gam_skin262.farc 513C1ACB\nrom/2d/spr_gam_skin263.farc 652216E4\nrom/2d/spr_gam_skin264.farc F22F1F41\nrom/2d/spr_gam_skin265.farc 0400CFFD\nrom/2d/spr_gam_skin266.farc 69522239\nrom/2d/spr_gam_skin267.farc D216645E\nrom/2d/spr_gam_skin269.farc CCB18287\nrom/2d/spr_gam_skin270.farc D350CB27\nrom/2d/spr_gam_skin271.farc ECDD5AA7\nrom/2d/spr_gam_skin272.farc 104E65A3\nrom/2d/spr_gam_skin273.farc CF14413B\nrom/2d/spr_gam_skin274.farc 4790A140\nrom/2d/spr_gam_skin275.farc 8E891B38\nrom/2d/spr_gam_skin276.farc FF4302F5\nrom/2d/spr_gam_skin277.farc DB8296F7\nrom/2d/spr_gam_skin278.farc D5E598BE\nrom/2d/spr_gam_skin279.farc 63498094\nrom/2d/spr_gam_skin280.farc B204B71E\nrom/2d/spr_gam_skin281.farc B4044ADF\nrom/2d/spr_gam_skin282.farc 13D27312\nrom/2d/spr_gam_skin283.farc 6FBAFA54\nrom/2d/spr_gam_skin285.farc B5E2128E\nrom/2d/spr_gam_skin286.farc FBFD281F\nrom/2d/spr_gam_skin287.farc 8A4B3ABF\nrom/2d/spr_gam_skin288.farc BEFE6D90\nrom/2d/spr_gam_skin289.farc 823B5350\nrom/2d/spr_gam_skin290.farc 76EBDDBB\nrom/2d/spr_gam_skin291.farc 32B85569\nrom/2d/spr_gam_skin292.farc 035E98B6\nrom/2d/spr_gam_skin293.farc 14ECF739\nrom/2d/spr_gam_skin294.farc 1345B4BD\nrom/2d/spr_gam_skin295.farc 6A436CB0\nrom/2d/spr_gam_skin296.farc EE3669B3\nrom/2d/spr_gam_skin297.farc 3DEEF457\nrom/2d/spr_gam_skin298.farc 8B36E987\nrom/2d/spr_gam_skin299.farc A0D75383\nrom/2d/spr_gam_skin301.farc 1E12899B\nrom/2d/spr_gam_skin302.farc A5259F83\nrom/2d/spr_gam_skin303.farc 19D199BE\nrom/2d/spr_gam_skin304.farc ABCAE847\nrom/2d/spr_gam_skin305.farc FDBB8089\nrom/2d/spr_gam_skin306.farc 99C492D4\nrom/2d/spr_gam_skin307.farc A4D80C00\nrom/2d/spr_gam_skin308.farc E4FAC20F\nrom/2d/spr_gam_skin309.farc 2119CCFC\nrom/2d/spr_gam_skin310.farc FE2CBF8F\nrom/2d/spr_gam_skin311.farc D2573BEC\nrom/2d/spr_gam_skin312.farc 81802175\nrom/2d/spr_gam_skin313.farc E67A81AB\nrom/2d/spr_gam_skin314.farc 2FF053CE\nrom/2d/spr_gam_skin315.farc C166DC8E\nrom/2d/spr_gam_skin317.farc 88F0369F\nrom/2d/spr_gam_skin318.farc 4FC9EA63\nrom/2d/spr_gam_skin319.farc 376CAD82\nrom/2d/spr_gam_skin320.farc 92DA64DC\nrom/2d/spr_gam_skin321.farc C7FB624C\nrom/2d/spr_gam_skin322.farc B0443A14\nrom/2d/spr_gam_skin323.farc 186D3B3F\nrom/2d/spr_gam_skin324.farc 583CC3D2\nrom/2d/spr_gam_skin325.farc FBC9575D\nrom/2d/spr_gam_skin326.farc 4812FEBC\nrom/2d/spr_gam_skin327.farc 60183558\nrom/2d/spr_gam_skin328.farc 7280C762\nrom/2d/spr_gam_skin329.farc B45E1DE7\nrom/2d/spr_gam_skin330.farc CAE601DD\nrom/2d/spr_gam_skin331.farc D8FF8505\nrom/2d/spr_gam_skin333.farc A761F204\nrom/2d/spr_gam_skin334.farc 243B997B\nrom/2d/spr_gam_skin335.farc 3BE11438\nrom/2d/spr_gam_skin336.farc E889ED86\nrom/2d/spr_gam_skin337.farc 01328DA6\nrom/2d/spr_gam_skin338.farc 672C5A68\nrom/2d/spr_gam_skin339.farc C456A306\nrom/2d/spr_gam_skin340.farc 1D5D2A6F\nrom/2d/spr_gam_skin341.farc 4C47932D\nrom/2d/spr_gam_skin342.farc 6F44F7CF\nrom/2d/spr_gam_skin343.farc A09CF774\nrom/2d/spr_gam_skin344.farc 7C18B8ED\nrom/2d/spr_gam_skin345.farc A4B0CFB0\nrom/2d/spr_gam_skin346.farc 27E1C209\nrom/2d/spr_gam_skin347.farc D22E260C\nrom/2d/spr_gam_skin349.farc 887F3BB2\nrom/2d/spr_gam_skin350.farc FE8251EF\nrom/2d/spr_gam_skin351.farc 19BE22F2\nrom/2d/spr_gam_skin352.farc 7D78C170\nrom/2d/spr_gam_skin353.farc 03DB4DEC\nrom/2d/spr_gam_skin354.farc 1AAD4695\nrom/2d/spr_gam_skin355.farc C858E37C\nrom/2d/spr_gam_skin356.farc 758BEAEA\nrom/2d/spr_gam_skin357.farc 5AE898A6\nrom/2d/spr_gam_skin358.farc 46A067E6\nrom/2d/spr_gam_skin359.farc 44329EA4\nrom/2d/spr_gam_skin360.farc 097A85D7\nrom/2d/spr_gam_skin361.farc 8D410442\nrom/2d/spr_gam_skin362.farc 1293B821\nrom/2d/spr_gam_skin363.farc CE541011\nrom/2d/spr_gam_skin365.farc 36B76AC2\nrom/2d/spr_gam_skin366.farc 49573C0A\nrom/2d/spr_gam_skin367.farc 1F25F1B3\nrom/2d/spr_gam_skin368.farc 71B2F2EC\nrom/2d/spr_gam_skin369.farc 3431A816\nrom/2d/spr_gam_skin370.farc 9914FBDB\nrom/2d/spr_gam_skin371.farc B54B13C2\nrom/2d/spr_gam_skin372.farc 56F8D19C\nrom/2d/spr_gam_skin373.farc 2C6CFB72\nrom/2d/spr_gam_skin374.farc 15107A13\nrom/2d/spr_gam_skin375.farc 05AFA54F\nrom/2d/spr_gam_skin376.farc B31354F5\nrom/2d/spr_gam_skin377.farc BE1C6032\nrom/2d/spr_gam_skin378.farc 079AF5BA\nrom/2d/spr_gam_skin379.farc 5BA201F5\nrom/2d/spr_gam_skin381.farc 4D21F93D\nrom/2d/spr_gam_skin382.farc 45608EA2\nrom/2d/spr_gam_skin383.farc C41D03E5\nrom/2d/spr_gam_skin384.farc 4DF69F9C\nrom/2d/spr_gam_skin385.farc A9C3AB92\nrom/2d/spr_gam_skin386.farc C6E70899\nrom/2d/spr_gam_skin387.farc 0A8141C7\nrom/2d/spr_gam_skin388.farc 1505F7C7\nrom/2d/spr_gam_skin389.farc 94D0DF39\nrom/2d/spr_gam_skin390.farc BECB900B\nrom/2d/spr_gam_skin391.farc FBCFADB5\nrom/2d/spr_gam_skin392.farc ED2A0817\nrom/2d/spr_gam_skin393.farc 9054C792\nrom/2d/spr_gam_skin394.farc 60C01AE6\nrom/2d/spr_gam_skin395.farc B6FA8F6B\nrom/2d/spr_gam_skin156.farc 55C8558D\nrom/2d/spr_gam_skin172.farc BB26ACB9\nrom/2d/spr_gam_skin188.farc 28572ADE\nrom/2d/spr_gam_skin204.farc 659837C7\nrom/2d/spr_gam_skin220.farc 57B1B695\nrom/2d/spr_gam_skin236.farc AFB2024E\nrom/2d/spr_gam_skin252.farc 0E8FE590\nrom/2d/spr_gam_skin268.farc 272700AE\nrom/2d/spr_gam_skin284.farc 33D7D8B9\nrom/2d/spr_gam_skin300.farc 691CBB9C\nrom/2d/spr_gam_skin316.farc 4A63EF3C\nrom/2d/spr_gam_skin332.farc 771064B1\nrom/2d/spr_gam_skin348.farc 6AF2A532\nrom/2d/spr_gam_skin364.farc 5F2BC875\nrom/2d/spr_gam_skin397.farc 48F0031C\nrom/2d/spr_gam_skin398.farc 68FBD5D2\nrom/2d/spr_gam_skin399.farc AF7C0FD6\nrom/2d/spr_gam_skin400.farc A88F6536\nrom/2d/spr_gam_skin401.farc C18E1982\nrom/2d/spr_gam_skin402.farc 637E00EA\nrom/2d/spr_gam_skin403.farc CFDA6BA4\nrom/2d/spr_gam_skin404.farc FAC7EBDB\nrom/2d/spr_gam_skin405.farc 79C7092F\nrom/2d/spr_gam_skin406.farc 0089897F\nrom/2d/spr_gam_skin407.farc F6101226\nrom/2d/spr_gam_skin408.farc 19BF076C\nrom/2d/spr_gam_skin409.farc C90A89D2\nrom/2d/spr_gam_skin410.farc D4FB5228\nrom/2d/spr_gam_skin411.farc 91743714\nrom/2d/spr_gam_skin413.farc D6693870\nrom/2d/spr_gam_skin414.farc 3447F05C\nrom/2d/spr_gam_skin415.farc DE0C86AB\nrom/2d/spr_gam_skin416.farc E116B108\nrom/2d/spr_gam_skin417.farc F608CD12\nrom/2d/spr_gam_skin418.farc F9A4E896\nrom/2d/spr_gam_skin419.farc AFD0E811\nrom/2d/spr_gam_skin420.farc 7D6AEE63\nrom/2d/spr_gam_skin421.farc B88D0F16\nrom/2d/spr_gam_skin422.farc 2EDC376D\nrom/2d/spr_gam_skin423.farc FD5618F3\nrom/2d/spr_gam_skin424.farc 1CB46C9A\nrom/2d/spr_gam_skin425.farc 40253D85\nrom/2d/spr_gam_skin426.farc 491152CE\nrom/2d/spr_gam_skin427.farc 11DCB0B9\nrom/2d/spr_gam_skin429.farc EA1603D6\nrom/2d/spr_gam_skin430.farc A8BB6AB1\nrom/2d/spr_gam_skin431.farc F606D081\nrom/2d/spr_gam_skin432.farc C1BD0920\nrom/2d/spr_gam_skin433.farc A3AE2919\nrom/2d/spr_gam_skin434.farc 1E25FFA1\nrom/2d/spr_gam_skin435.farc 9AC67ED4\nrom/2d/spr_gam_skin436.farc 4DBD9041\nrom/2d/spr_gam_skin437.farc AE543D9D\nrom/2d/spr_gam_skin438.farc 276DD19B\nrom/2d/spr_gam_skin439.farc A5E8DDEE\nrom/2d/spr_gam_skin440.farc 4A977120\nrom/2d/spr_gam_skin441.farc 0E5DAFF2\nrom/2d/spr_gam_skin442.farc 9C743A76\nrom/2d/spr_gam_skin443.farc 18ECF3E1\nrom/2d/spr_gam_skin445.farc 385FBD5B\nrom/2d/spr_gam_skin446.farc 916EF2E8\nrom/2d/spr_gam_skin447.farc 403EC100\nrom/2d/spr_gam_skin448.farc 73BDADC2\nrom/2d/spr_gam_skin449.farc 69EE1C96\nrom/2d/spr_gam_skin450.farc 70FD9817\nrom/2d/spr_gam_skin451.farc 547C2D7B\nrom/2d/spr_gam_skin452.farc E6176EC8\nrom/2d/spr_gam_skin453.farc 585279AA\nrom/2d/spr_gam_skin454.farc 27E15842\nrom/2d/spr_gam_skin455.farc 5AB2CB02\nrom/2d/spr_gam_skin456.farc 2B7E4D65\nrom/2d/spr_gam_skin457.farc 5F76FB14\nrom/2d/spr_gam_skin458.farc C53CC6AD\nrom/2d/spr_gam_skin459.farc 40D75373\nrom/2d/spr_gam_skin461.farc CFBFC2B2\nrom/2d/spr_gam_skin462.farc 04D5F9F7\nrom/2d/spr_gam_skin463.farc BF4B01A5\nrom/2d/spr_gam_skin464.farc D4796281\nrom/2d/spr_gam_skin465.farc 690749F8\nrom/2d/spr_gam_skin466.farc C6925ED9\nrom/2d/spr_gam_skin467.farc 723E07EC\nrom/2d/spr_gam_skin468.farc 147A8591\nrom/2d/spr_gam_skin469.farc E9159010\nrom/2d/spr_gam_skin470.farc D821D25E\nrom/2d/spr_gam_skin471.farc C10B3528\nrom/2d/spr_gam_skin472.farc EA0CAABE\nrom/2d/spr_gam_skin473.farc 65C6EBAE\nrom/2d/spr_gam_skin474.farc 5BCB2893\nrom/2d/spr_gam_skin475.farc 5992DF44\nrom/2d/spr_gam_skin477.farc A70057B3\nrom/2d/spr_gam_skin478.farc D135B10D\nrom/2d/spr_gam_skin479.farc 61766565\nrom/2d/spr_gam_skin480.farc CDACD963\nrom/2d/spr_gam_skin481.farc 6C8402FF\nrom/2d/spr_gam_skin482.farc 6D1752A6\nrom/2d/spr_gam_skin483.farc 0C89F0AF\nrom/2d/spr_gam_skin484.farc BDBD5C1E\nrom/2d/spr_gam_skin485.farc A916DC24\nrom/2d/spr_gam_skin486.farc 36EBBA49\nrom/2d/spr_gam_skin487.farc 6786512A\nrom/2d/spr_gam_skin488.farc 332070E8\nrom/2d/spr_gam_skin489.farc 91381044\nrom/2d/spr_gam_skin490.farc 43F9C184\nrom/2d/spr_gam_skin491.farc CE79517E\nrom/2d/spr_gam_skin493.farc C52E8C49\nrom/2d/spr_gam_skin494.farc D9686DFA\nrom/2d/spr_gam_skin495.farc A856EFBC\nrom/2d/spr_gam_skin496.farc F6C8CDED\nrom/2d/spr_gam_skin497.farc 4E7F2F0A\nrom/2d/spr_gam_skin498.farc 81A67984\nrom/2d/spr_gam_skin499.farc D34DFD11\nrom/2d/spr_gam_skin500.farc 04305B74\nrom/2d/spr_gam_skin501.farc 55DA9CF5\nrom/2d/spr_gam_skin502.farc 98FA1A1F\nrom/2d/spr_gam_skin503.farc 062A6FBD\nrom/2d/spr_gam_skin504.farc 5928C9E8\nrom/2d/spr_gam_skin505.farc 4FCF679B\nrom/2d/spr_gam_skin506.farc F1187256\nrom/2d/spr_gam_skin507.farc 1ED856FC\nrom/2d/spr_gam_skin509.farc AB9AD4ED\nrom/2d/spr_gam_skin510.farc EA2F4A65\nrom/2d/spr_gam_skin511.farc 49C18C27\nrom/2d/spr_gam_skin512.farc AE59DDAA\nrom/2d/spr_gam_skin513.farc 0751AE1A\nrom/2d/spr_gam_skin514.farc F02B33F3\nrom/2d/spr_gam_skin515.farc B618804D\nrom/2d/spr_gam_skin516.farc A2061A99\nrom/2d/spr_gam_skin517.farc 2D351823\nrom/2d/spr_gam_skin518.farc 0FA870E2\nrom/2d/spr_gam_skin519.farc 11FADC90\nrom/2d/spr_gam_skin520.farc 51BBA25E\nrom/2d/spr_gam_skin521.farc 306C2E79\nrom/2d/spr_gam_skin522.farc 6389AED2\nrom/2d/spr_gam_skin523.farc CE8D9287\nrom/2d/spr_gam_skin525.farc BB6DB929\nrom/2d/spr_gam_skin526.farc 76E10F3B\nrom/2d/spr_gam_skin527.farc 49904A1B\nrom/2d/spr_gam_skin528.farc A23B0274\nrom/2d/spr_gam_skin529.farc 2F177209\nrom/2d/spr_gam_skin530.farc 558A364D\nrom/2d/spr_gam_skin531.farc E5525598\nrom/2d/spr_gam_skin532.farc 256D6ABD\nrom/2d/spr_gam_skin533.farc F1AB08E6\nrom/2d/spr_gam_skin534.farc 7E29621A\nrom/2d/spr_gam_skin535.farc 18953920\nrom/2d/spr_gam_skin536.farc FD1CA8B1\nrom/2d/spr_gam_skin537.farc 88CF9F77\nrom/2d/spr_gam_skin538.farc E4F19521\nrom/2d/spr_gam_skin539.farc E11BF044\nrom/2d/spr_gam_skin541.farc 33F0C4BF\nrom/2d/spr_gam_skin542.farc 45B647AB\nrom/2d/spr_gam_skin543.farc A97328FE\nrom/2d/spr_gam_skin544.farc DB3D45D4\nrom/2d/spr_gam_skin545.farc A379E385\nrom/2d/spr_gam_skin546.farc 47297228\nrom/2d/spr_gam_skin547.farc AC95AABA\nrom/2d/spr_gam_skin548.farc 7DAD0CB2\nrom/2d/spr_gam_skin549.farc 8EECFA07\nrom/2d/spr_gam_skin550.farc E41CDA4F\nrom/2d/spr_gam_skin551.farc DFED7AA6\nrom/2d/spr_gam_skin552.farc 21E4CAEB\nrom/2d/spr_gam_skin553.farc C44F08F9\nrom/2d/spr_gam_skin554.farc 6232D35C\nrom/2d/spr_gam_skin555.farc E3058DC1\nrom/2d/spr_gam_skin557.farc F9AFBC1D\nrom/2d/spr_gam_skin558.farc 284ED781\nrom/2d/spr_gam_skin559.farc B1B1566C\nrom/2d/spr_gam_skin560.farc 28680972\nrom/2d/spr_gam_skin561.farc 1FD1D122\nrom/2d/spr_gam_skin562.farc B12AEC36\nrom/2d/spr_gam_skin563.farc BAC28C56\nrom/2d/spr_gam_skin564.farc 12EA7D6C\nrom/2d/spr_gam_skin565.farc 9DA625FB\nrom/2d/spr_gam_skin566.farc FB110876\nrom/2d/spr_gam_skin567.farc 9A55A9E5\nrom/2d/spr_gam_skin568.farc A278E0C1\nrom/2d/spr_gam_skin569.farc 6D3DD213\nrom/2d/spr_gam_skin570.farc 3BAED99F\nrom/2d/spr_gam_skin571.farc 1761FE79\nrom/2d/spr_gam_skin573.farc 1195494C\nrom/2d/spr_gam_skin574.farc 5F06E847\nrom/2d/spr_gam_skin575.farc 2A98F45D\nrom/2d/spr_gam_skin576.farc 7EAE9630\nrom/2d/spr_gam_skin577.farc 230C603B\nrom/2d/spr_gam_skin578.farc 8792A9E6\nrom/2d/spr_gam_skin579.farc 48086A87\nrom/2d/spr_gam_skin580.farc 3F62F27D\nrom/2d/spr_gam_skin581.farc 2A4F006F\nrom/2d/spr_gam_skin582.farc D0DB4342\nrom/2d/spr_gam_skin583.farc 20BA949A\nrom/2d/spr_gam_skin584.farc F4C6A89C\nrom/2d/spr_gam_skin585.farc EE1B36A0\nrom/2d/spr_gam_skin586.farc 92152214\nrom/2d/spr_gam_skin587.farc F8A8FE2A\nrom/2d/spr_gam_skin589.farc C10231B4\nrom/2d/spr_gam_skin590.farc F1CD4F8C\nrom/2d/spr_gam_skin591.farc 4B9D029D\nrom/2d/spr_gam_skin592.farc 66894535\nrom/2d/spr_gam_skin593.farc CEE6FA39\nrom/2d/spr_gam_skin594.farc 9A3C8770\nrom/2d/spr_gam_skin595.farc 47252511\nrom/2d/spr_gam_skin596.farc 93406346\nrom/2d/spr_gam_skin597.farc 270CF698\nrom/2d/spr_gam_skin598.farc F7651610\nrom/2d/spr_gam_skin599.farc 2CE3DE17\nrom/2d/spr_gam_skin600.farc 135DB950\nrom/2d/spr_gam_skin601.farc 1B2C833C\nrom/2d/spr_gam_skin602.farc 86004CDF\nrom/2d/spr_gam_skin603.farc 5EF2DF43\nrom/2d/spr_gam_skin605.farc 01494348\nrom/2d/spr_gam_skin606.farc 6E2F7612\nrom/2d/spr_gam_skin607.farc 8C60474C\nrom/2d/spr_gam_skin608.farc 07EEE36E\nrom/2d/spr_gam_skin609.farc EF69D980\nrom/2d/spr_gam_skin610.farc 84CB09B2\nrom/2d/spr_gam_skin611.farc 7196632E\nrom/2d/spr_gam_skin612.farc 1C48AFA0\nrom/2d/spr_gam_skin613.farc 2E320389\nrom/2d/spr_gam_skin614.farc 56470FD4\nrom/2d/spr_gam_skin615.farc 48333E38\nrom/2d/spr_gam_skin616.farc D23274B2\nrom/2d/spr_gam_skin617.farc DDE9DD5C\nrom/2d/spr_gam_skin618.farc 60D1951B\nrom/2d/spr_gam_skin619.farc FE79B24C\nrom/2d/spr_gam_skin621.farc BEE1D8D3\nrom/2d/spr_gam_skin622.farc B72AFD6E\nrom/2d/spr_gam_skin623.farc FAA3FB71\nrom/2d/spr_gam_skin624.farc 91483F49\nrom/2d/spr_gam_skin625.farc 5447A97D\nrom/2d/spr_gam_skin626.farc 67FEB956\nrom/2d/spr_gam_skin627.farc 8BADD44B\nrom/2d/spr_gam_skin628.farc 478F97DB\nrom/2d/spr_gam_skin629.farc 04B97C74\nrom/2d/spr_gam_skin630.farc 81F447C0\nrom/2d/spr_gam_skin631.farc 8064F63E\nrom/2d/spr_gam_skin632.farc 59F682E3\nrom/2d/spr_gam_skin633.farc B1488E05\nrom/2d/spr_gam_skin634.farc AF95CFB1\nrom/2d/spr_gam_skin635.farc 7BBDB3AC\nrom/2d/spr_gam_skin396.farc 86FF64EB\nrom/2d/spr_gam_skin412.farc 5479C73B\nrom/2d/spr_gam_skin428.farc 51720281\nrom/2d/spr_gam_skin444.farc D55BA50C\nrom/2d/spr_gam_skin460.farc F8C92597\nrom/2d/spr_gam_skin476.farc 3201C1F1\nrom/2d/spr_gam_skin492.farc 911B0F1E\nrom/2d/spr_gam_skin508.farc 101357CF\nrom/2d/spr_gam_skin524.farc D31EB3A9\nrom/2d/spr_gam_skin540.farc A4AFA155\nrom/2d/spr_gam_skin556.farc AAE533E2\nrom/2d/spr_gam_skin572.farc 391D920F\nrom/2d/spr_gam_skin588.farc 76ED0EEC\nrom/2d/spr_gam_skin604.farc 5FAB3484\nrom/2d/spr_gam_skin637.farc E996E7A9\nrom/2d/spr_gam_skin638.farc D9ED3359\nrom/2d/spr_gam_skin639.farc DAFB2D5C\nrom/2d/spr_gam_skin640.farc BEEBF9C2\nrom/2d/spr_gam_skin641.farc 15578686\nrom/2d/spr_gam_skin642.farc CE899F79\nrom/2d/spr_gam_skin643.farc F7C24B32\nrom/2d/spr_gam_skin644.farc 1597F1B1\nrom/2d/spr_gam_skin645.farc 2609DB1C\nrom/2d/spr_gam_skin646.farc 53882E2A\nrom/2d/spr_gam_skin647.farc 8BA46654\nrom/2d/spr_gam_skin648.farc 0F2F170D\nrom/2d/spr_gam_skin649.farc 7D63D287\nrom/2d/spr_gam_skin650.farc F3C37917\nrom/2d/spr_gam_skin651.farc 1D09A770\nrom/2d/spr_gam_skin653.farc EAFAF620\nrom/2d/spr_gam_skin654.farc 62A23483\nrom/2d/spr_gam_skin655.farc 35C554C8\nrom/2d/spr_gam_skin656.farc 55EE1781\nrom/2d/spr_gam_skin657.farc 479787C7\nrom/2d/spr_gam_skin658.farc 93B31554\nrom/2d/spr_gam_skin659.farc F82A66E4\nrom/2d/spr_gam_skin660.farc E493E6B2\nrom/2d/spr_gam_skin661.farc AA505CCB\nrom/2d/spr_gam_skin662.farc 7F961122\nrom/2d/spr_gam_skin663.farc 2E3F506C\nrom/2d/spr_gam_skin664.farc 29F196D3\nrom/2d/spr_gam_skin665.farc 7984FC3D\nrom/2d/spr_gam_skin666.farc 5AC71FB4\nrom/2d/spr_gam_skin667.farc 2A14F577\nrom/2d/spr_gam_skin669.farc 45C4EA57\nrom/2d/spr_gam_skin670.farc 0146BAD1\nrom/2d/spr_gam_skin671.farc 9602FF0E\nrom/2d/spr_gam_skin672.farc 2B6F8C48\nrom/2d/spr_gam_skin673.farc CF940512\nrom/2d/spr_gam_skin674.farc FFE7A6C4\nrom/2d/spr_gam_skin675.farc 646442DF\nrom/2d/spr_gam_skin676.farc 26415E80\nrom/2d/spr_gam_skin677.farc A7C5D4FB\nrom/2d/spr_gam_skin678.farc D7214978\nrom/2d/spr_gam_skin679.farc 6AD8BCD6\nrom/2d/spr_gam_skin680.farc 9EF3CE2B\nrom/2d/spr_gam_skin681.farc 10E954BA\nrom/2d/spr_gam_skin682.farc 7237BF5F\nrom/2d/spr_gam_skin683.farc 3607D04A\nrom/2d/spr_gam_skin685.farc 9DDD57A9\nrom/2d/spr_gam_skin686.farc D039A92D\nrom/2d/spr_gam_skin687.farc E39CF117\nrom/2d/spr_gam_skin688.farc BFC9CF74\nrom/2d/spr_gam_skin689.farc BFA76C24\nrom/2d/spr_gam_skin690.farc CAF3BF1A\nrom/2d/spr_gam_skin691.farc 2FE63DA6\nrom/2d/spr_gam_skin692.farc B9FDDA9C\nrom/2d/spr_gam_skin693.farc 19081AB0\nrom/2d/spr_gam_skin694.farc 3D7FA01A\nrom/2d/spr_gam_skin695.farc 35C471D5\nrom/2d/spr_gam_skin696.farc 6223137B\nrom/2d/spr_gam_skin697.farc 2C37169E\nrom/2d/spr_gam_skin698.farc 13EA2B8E\nrom/2d/spr_gam_skin699.farc 63FDDDE3\nrom/2d/spr_gam_skin701.farc 246E58E3\nrom/2d/spr_gam_skin702.farc 0E52CE69\nrom/2d/spr_gam_skin703.farc 9308C215\nrom/2d/spr_gam_skin704.farc BDCDF00C\nrom/2d/spr_gam_skin705.farc F8692CF3\nrom/2d/spr_gam_skin706.farc DEBCF063\nrom/2d/spr_gam_skin707.farc 04373D68\nrom/2d/spr_gam_skin708.farc 3D15E9C4\nrom/2d/spr_gam_skin709.farc 4F5EAC67\nrom/2d/spr_gam_skin710.farc 6E7A4FCE\nrom/2d/spr_gam_skin711.farc 939D63EB\nrom/2d/spr_gam_skin712.farc 270ED214\nrom/2d/spr_gam_skin713.farc 8439D0F4\nrom/2d/spr_gam_skin714.farc 3968AC7D\nrom/2d/spr_gam_skin715.farc EE86EB0C\nrom/2d/spr_gam_skin717.farc 0DC5C341\nrom/2d/spr_gam_skin718.farc 0562F88B\nrom/2d/spr_gam_skin719.farc 00E795BC\nrom/2d/spr_gam_skin720.farc E296C9F5\nrom/2d/spr_gam_skin721.farc 63AB3C06\nrom/2d/spr_gam_skin722.farc 3119A062\nrom/2d/spr_gam_skin723.farc 80D26AEF\nrom/2d/spr_gam_skin724.farc 30A08F1B\nrom/2d/spr_gam_skin725.farc 82977D58\nrom/2d/spr_gam_skin726.farc AEF4D6AC\nrom/2d/spr_gam_skin727.farc 75F58D1F\nrom/2d/spr_gam_skin728.farc 4030D903\nrom/2d/spr_gam_skin729.farc 0259AFEB\nrom/2d/spr_gam_skin730.farc FE01A120\nrom/2d/spr_gam_skin731.farc F413A01E\nrom/2d/spr_gam_skin732.farc B65939F0\nrom/2d/spr_gam_skin734.farc 2C534188\nrom/2d/spr_gam_skin735.farc 13619217\nrom/2d/spr_gam_skin736.farc 84D4D74F\nrom/2d/spr_gam_skin737.farc CF85862B\nrom/2d/spr_gam_skin738.farc 4EAD001B\nrom/2d/spr_key_input.farc 7B1D919F\nrom/2d/spr_key_pass.farc 510C4E3E\nrom/2d/spr_key_svol.farc F36D4C3C\nrom/2d/spr_key_win.farc B2BF23FC\nrom/2d/spr_ps3_cmn.farc CBB6BC31\nrom/2d/spr_sel_belt.farc 5CA010E4\nrom/2d/spr_sel_camp.farc 09B08ECD\nrom/2d/spr_sel_camp02.farc C0DFBFAC\nrom/2d/spr_sel_card.farc 3A89847E\nrom/2d/spr_sel_cardbg.farc 17D7BFCA\nrom/2d/spr_sel_cardinfo.farc CFAFFF58\nrom/2d/spr_sel_chlle.farc 9C363ABD\nrom/2d/spr_sel_cmn.farc A7C4C6E6\nrom/2d/spr_sel_credit.farc E25D8D66\nrom/2d/spr_sel_ctst.farc C840A759\nrom/2d/spr_sel_ctstinfo.farc F2F85F7B\nrom/2d/spr_sel_md000cmn.farc D4D72210\nrom/2d/spr_sel_md001cmn.farc ED4A373D\nrom/2d/spr_sel_md002cmn.farc 7E906D98\nrom/2d/spr_sel_md003cmn.farc 88067D06\nrom/2d/spr_sel_md004cmn.farc D98275B0\nrom/2d/spr_sel_md005cmn.farc DF950D67\nrom/2d/spr_sel_md006cmn.farc 2935636C\nrom/2d/spr_sel_md007cmn.farc AF659C86\nrom/2d/spr_sel_md008cmn.farc 2C93C6B9\nrom/2d/spr_sel_md009cmn.farc DD2840CE\nrom/2d/spr_sel_md011cmn.farc 6E41366F\nrom/2d/spr_sel_md012cmn.farc FB9537C0\nrom/2d/spr_sel_md013cmn.farc 6AFD4C00\nrom/2d/spr_sel_md014cmn.farc 34DBAB4A\nrom/2d/spr_sel_md015cmn.farc 2F46642A\nrom/2d/spr_sel_md016cmn.farc 8524D5DA\nrom/2d/spr_sel_md017cmn.farc 87241B9E\nrom/2d/spr_sel_md018cmn.farc 4C6B046D\nrom/2d/spr_sel_md019cmn.farc 48BE5C32\nrom/2d/spr_sel_md020cmn.farc EBFE946E\nrom/2d/spr_sel_md021cmn.farc 29D6BE37\nrom/2d/spr_sel_md022cmn.farc 7AD6580A\nrom/2d/spr_sel_md023cmn.farc ED295AC0\nrom/2d/spr_sel_md024cmn.farc AE762D89\nrom/2d/spr_sel_md025cmn.farc 7C7CAE55\nrom/2d/spr_sel_md027cmn.farc 42CB075E\nrom/2d/spr_sel_md028cmn.farc 3572F661\nrom/2d/spr_sel_md029cmn.farc 2EF6A3E8\nrom/2d/spr_sel_md030cmn.farc D184982D\nrom/2d/spr_sel_md031cmn.farc AF7D6CB0\nrom/2d/spr_sel_md032cmn.farc E8419E04\nrom/2d/spr_sel_md033cmn.farc 86BCB446\nrom/2d/spr_sel_md034cmn.farc 7C3D43AA\nrom/2d/spr_sel_md035cmn.farc 75790ED0\nrom/2d/spr_sel_md036cmn.farc 3218CFD0\nrom/2d/spr_sel_md037cmn.farc 51AED5BB\nrom/2d/spr_sel_md038cmn.farc AAF7CDDD\nrom/2d/spr_sel_md039cmn.farc E48A72C3\nrom/2d/spr_sel_md040cmn.farc 53A11A5C\nrom/2d/spr_sel_md041cmn.farc D43B82C1\nrom/2d/spr_sel_md043cmn.farc E8C131B1\nrom/2d/spr_sel_md044cmn.farc D784EBC8\nrom/2d/spr_sel_md045cmn.farc 5CD6DF62\nrom/2d/spr_sel_md046cmn.farc F56A515F\nrom/2d/spr_sel_md047cmn.farc 31E8B849\nrom/2d/spr_sel_md048cmn.farc F8BA82DE\nrom/2d/spr_sel_md049cmn.farc B923E35E\nrom/2d/spr_sel_md050cmn.farc D05E433B\nrom/2d/spr_sel_md051cmn.farc 67C27B98\nrom/2d/spr_sel_md052cmn.farc 8E25972B\nrom/2d/spr_sel_md053cmn.farc 491B2870\nrom/2d/spr_sel_md054cmn.farc CAA63094\nrom/2d/spr_sel_md055cmn.farc DF31269D\nrom/2d/spr_sel_md056cmn.farc 051611BE\nrom/2d/spr_sel_md057cmn.farc 8E1BB0DB\nrom/2d/spr_sel_md059cmn.farc 36F5A9C5\nrom/2d/spr_sel_md060cmn.farc 6A302388\nrom/2d/spr_sel_md061cmn.farc B7A68CB3\nrom/2d/spr_sel_md062cmn.farc F42196A8\nrom/2d/spr_sel_md063cmn.farc 75DE4B36\nrom/2d/spr_sel_md064cmn.farc A82E2824\nrom/2d/spr_sel_md065cmn.farc 109EF815\nrom/2d/spr_sel_md066cmn.farc 2249BF47\nrom/2d/spr_sel_md067cmn.farc CC04472C\nrom/2d/spr_sel_md068cmn.farc 94F0C985\nrom/2d/spr_sel_md069cmn.farc CA877836\nrom/2d/spr_sel_md070cmn.farc B65EE353\nrom/2d/spr_sel_md071cmn.farc A4AD93D2\nrom/2d/spr_sel_md072cmn.farc BCFDD3E5\nrom/2d/spr_sel_md073cmn.farc AB3EFB69\nrom/2d/spr_sel_md075cmn.farc A5FA2D73\nrom/2d/spr_sel_md076cmn.farc 7C3C9D8A\nrom/2d/spr_sel_md077cmn.farc 0A071331\nrom/2d/spr_sel_md078cmn.farc 9E02CD06\nrom/2d/spr_sel_md079cmn.farc 5B452564\nrom/2d/spr_sel_md080cmn.farc A89AD893\nrom/2d/spr_sel_md081cmn.farc F3FF45E6\nrom/2d/spr_sel_md082cmn.farc 8B458374\nrom/2d/spr_sel_md083cmn.farc 1F618BD1\nrom/2d/spr_sel_md084cmn.farc 82ED6A2A\nrom/2d/spr_sel_md085cmn.farc 66353A29\nrom/2d/spr_sel_md086cmn.farc AF3650A6\nrom/2d/spr_sel_md087cmn.farc C1E2E969\nrom/2d/spr_sel_md088cmn.farc D382F01D\nrom/2d/spr_sel_md089cmn.farc 56588034\nrom/2d/spr_sel_md091cmn.farc D0977447\nrom/2d/spr_sel_md092cmn.farc 7CCEB627\nrom/2d/spr_sel_md093cmn.farc AB16A101\nrom/2d/spr_sel_md094cmn.farc 85D9A5CF\nrom/2d/spr_sel_md095cmn.farc 79BF62B5\nrom/2d/spr_sel_md096cmn.farc B53DC5DE\nrom/2d/spr_sel_md097cmn.farc CC11C8A4\nrom/2d/spr_sel_md098cmn.farc 94143BCB\nrom/2d/spr_sel_md099cmn.farc B197B409\nrom/2d/spr_sel_md100cmn.farc 9464B4F7\nrom/2d/spr_sel_md101cmn.farc EBDB8F06\nrom/2d/spr_sel_md102cmn.farc 3E7105BF\nrom/2d/spr_sel_md103cmn.farc 1B176058\nrom/2d/spr_sel_md104cmn.farc 541A8979\nrom/2d/spr_sel_md105cmn.farc 813D372C\nrom/2d/spr_sel_md107cmn.farc B935345A\nrom/2d/spr_sel_md108cmn.farc 2FB06F7F\nrom/2d/spr_sel_md109cmn.farc A0C37863\nrom/2d/spr_sel_md110cmn.farc 2D185F49\nrom/2d/spr_sel_md111cmn.farc 94E9DB54\nrom/2d/spr_sel_md112cmn.farc 9FEAE96C\nrom/2d/spr_sel_md113cmn.farc 9932A753\nrom/2d/spr_sel_md114cmn.farc 7A06FE4D\nrom/2d/spr_sel_md115cmn.farc 5DE2131E\nrom/2d/spr_sel_md116cmn.farc E149D86D\nrom/2d/spr_sel_md117cmn.farc A0DF197B\nrom/2d/spr_sel_md118cmn.farc 720A981E\nrom/2d/spr_sel_md119cmn.farc 7D80ECDE\nrom/2d/spr_sel_md120cmn.farc 681A24B5\nrom/2d/spr_sel_md121cmn.farc DE9C54F1\nrom/2d/spr_gam_skin636.farc 6DD57A0D\nrom/2d/spr_gam_skin652.farc A8A4C31E\nrom/2d/spr_gam_skin668.farc 8C7D97AD\nrom/2d/spr_gam_skin684.farc 5052474A\nrom/2d/spr_gam_skin700.farc E73CE052\nrom/2d/spr_gam_skin716.farc 84A226A0\nrom/2d/spr_gam_skin733.farc 2C8F3179\nrom/2d/spr_sel_cardpt.farc 012B093E\nrom/2d/spr_sel_md010cmn.farc 9A0493CD\nrom/2d/spr_sel_md026cmn.farc 57937214\nrom/2d/spr_sel_md042cmn.farc 55F7CF20\nrom/2d/spr_sel_md058cmn.farc 00423A19\nrom/2d/spr_sel_md074cmn.farc 8B84B47B\nrom/2d/spr_sel_md090cmn.farc D3D4E809\nrom/2d/spr_sel_md124cmn.farc 58E31C27\nrom/2d/spr_sel_md125cmn.farc 404FAF80\nrom/2d/spr_sel_md126cmn.farc B7C49332\nrom/2d/spr_sel_md127cmn.farc 69348B7F\nrom/2d/spr_sel_md128cmn.farc 38312A99\nrom/2d/spr_sel_md129cmn.farc 37E8DB5E\nrom/2d/spr_sel_md130cmn.farc 60AFC1A2\nrom/2d/spr_sel_md131cmn.farc 0694C447\nrom/2d/spr_sel_md132cmn.farc EA571FDE\nrom/2d/spr_sel_md133cmn.farc F7C3D15F\nrom/2d/spr_sel_md134cmn.farc 9559E200\nrom/2d/spr_sel_md135cmn.farc 402BA99F\nrom/2d/spr_sel_md136cmn.farc A77D4A99\nrom/2d/spr_sel_md137cmn.farc 3779EC4F\nrom/2d/spr_sel_md138cmn.farc 9EB48E01\nrom/2d/spr_sel_md141cmn.farc 70BEECD3\nrom/2d/spr_sel_md142cmn.farc EE331894\nrom/2d/spr_sel_md143cmn.farc EC03E85F\nrom/2d/spr_sel_md144cmn.farc 204E1559\nrom/2d/spr_sel_md145cmn.farc C971133B\nrom/2d/spr_sel_md146cmn.farc 6DF619F2\nrom/2d/spr_sel_md147cmn.farc B303A19F\nrom/2d/spr_sel_md148cmn.farc 26FB8918\nrom/2d/spr_sel_md149cmn.farc 0CF40FB3\nrom/2d/spr_sel_md150cmn.farc D578C247\nrom/2d/spr_sel_md151cmn.farc 513C4674\nrom/2d/spr_sel_md153cmn.farc 121BAA44\nrom/2d/spr_sel_md154cmn.farc F0D0D1F1\nrom/2d/spr_sel_md155cmn.farc CC97C72C\nrom/2d/spr_sel_md156cmn.farc B8D80793\nrom/2d/spr_sel_md158cmn.farc 475E98BE\nrom/2d/spr_sel_md159cmn.farc 0F5EBB9F\nrom/2d/spr_sel_md160cmn.farc A94001E5\nrom/2d/spr_sel_md161cmn.farc 7865A368\nrom/2d/spr_sel_md162cmn.farc 3EB04470\nrom/2d/spr_sel_md163cmn.farc 025C7E80\nrom/2d/spr_sel_md164cmn.farc 02E3D7CD\nrom/2d/spr_sel_md165cmn.farc CA35DBC3\nrom/2d/spr_sel_md166cmn.farc 72460319\nrom/2d/spr_sel_md167cmn.farc 3E4AC722\nrom/2d/spr_sel_md168cmn.farc 4C5D03F0\nrom/2d/spr_sel_md169cmn.farc 7C49DF15\nrom/2d/spr_sel_md170cmn.farc 80705547\nrom/2d/spr_sel_md171cmn.farc 7094AC5B\nrom/2d/spr_sel_md172cmn.farc 2565E954\nrom/2d/spr_sel_md189cmn.farc 6A7391EA\nrom/2d/spr_sel_md190cmn.farc 91F58825\nrom/2d/spr_sel_md191cmn.farc 488D3E62\nrom/2d/spr_sel_md192cmn.farc 42A35D32\nrom/2d/spr_sel_md193cmn.farc 5AAB29EE\nrom/2d/spr_sel_md194cmn.farc D9FB38C7\nrom/2d/spr_sel_md195cmn.farc 0C7027DE\nrom/2d/spr_sel_md196cmn.farc 51C90E00\nrom/2d/spr_sel_md197cmn.farc D96F05BA\nrom/2d/spr_sel_md198cmn.farc 47813592\nrom/2d/spr_sel_md199cmn.farc 1B3066D2\nrom/2d/spr_sel_md200cmn.farc B7EDF7C7\nrom/2d/spr_sel_md201cmn.farc 3332D891\nrom/2d/spr_sel_md202cmn.farc 43769336\nrom/2d/spr_sel_md203cmn.farc 85C9BEDC\nrom/2d/spr_sel_md205cmn.farc 0AC0094A\nrom/2d/spr_sel_md206cmn.farc 0812A155\nrom/2d/spr_sel_md207cmn.farc 4FB9C91C\nrom/2d/spr_sel_md208cmn.farc 9E4CB7A7\nrom/2d/spr_sel_md209cmn.farc 50DB9E5D\nrom/2d/spr_sel_md210cmn.farc 0B6340CB\nrom/2d/spr_sel_md211cmn.farc AF61FF44\nrom/2d/spr_sel_md212cmn.farc A7EDA87D\nrom/2d/spr_sel_md213cmn.farc 754663AB\nrom/2d/spr_sel_md214cmn.farc 986B9915\nrom/2d/spr_sel_md215cmn.farc 4F9D3BDE\nrom/2d/spr_sel_md216cmn.farc 4C123FEA\nrom/2d/spr_sel_md217cmn.farc 794E52EF\nrom/2d/spr_sel_md218cmn.farc CE9079CC\nrom/2d/spr_sel_md219cmn.farc F9BF90CF\nrom/2d/spr_sel_md221cmn.farc C0771547\nrom/2d/spr_sel_md222cmn.farc A402DB51\nrom/2d/spr_sel_md223cmn.farc 4071E361\nrom/2d/spr_sel_md224cmn.farc DCC74941\nrom/2d/spr_sel_md225cmn.farc C55D9503\nrom/2d/spr_sel_md226cmn.farc 7F657E0C\nrom/2d/spr_sel_md227cmn.farc C43CDFEA\nrom/2d/spr_sel_md228cmn.farc 9769B9AA\nrom/2d/spr_sel_md229cmn.farc 4F633E0E\nrom/2d/spr_sel_md230cmn.farc 90544B6F\nrom/2d/spr_sel_md231cmn.farc 7A281CC8\nrom/2d/spr_sel_md232cmn.farc C0A6AB1D\nrom/2d/spr_sel_md233cmn.farc 709A5C3C\nrom/2d/spr_sel_md234cmn.farc 9A7DBD71\nrom/2d/spr_sel_md235cmn.farc 204463FB\nrom/2d/spr_sel_md237cmn.farc 45D6DA6F\nrom/2d/spr_sel_md238cmn.farc E0CEA628\nrom/2d/spr_sel_md239cmn.farc ACC55FF7\nrom/2d/spr_sel_md240cmn.farc 80E4D2CA\nrom/2d/spr_sel_md241cmn.farc 44C4B0CA\nrom/2d/spr_sel_md242cmn.farc 48EC5BCD\nrom/2d/spr_sel_md243cmn.farc 5F774B2F\nrom/2d/spr_sel_md244cmn.farc 68A46044\nrom/2d/spr_sel_md245cmn.farc 8F078DB7\nrom/2d/spr_sel_md246cmn.farc A4008067\nrom/2d/spr_sel_md247cmn.farc F7A9F517\nrom/2d/spr_sel_md248cmn.farc 95016388\nrom/2d/spr_sel_md249cmn.farc 71757242\nrom/2d/spr_sel_md250cmn.farc 553F3B79\nrom/2d/spr_sel_md251cmn.farc 9F01B411\nrom/2d/spr_sel_md253cmn.farc F7250B7B\nrom/2d/spr_sel_md254cmn.farc 199DFA0E\nrom/2d/spr_sel_md255cmn.farc 778CBDF7\nrom/2d/spr_sel_md256cmn.farc D1A80319\nrom/2d/spr_sel_md257cmn.farc 9CB6AF77\nrom/2d/spr_sel_md258cmn.farc BD66017E\nrom/2d/spr_sel_md259cmn.farc 362EAE49\nrom/2d/spr_sel_md260cmn.farc 0DC36A01\nrom/2d/spr_sel_md261cmn.farc 4EEC97DD\nrom/2d/spr_sel_md262cmn.farc FE94AA67\nrom/2d/spr_sel_md263cmn.farc 4878593D\nrom/2d/spr_sel_md264cmn.farc 1FD1398A\nrom/2d/spr_sel_md265cmn.farc E04CE3A5\nrom/2d/spr_sel_md266cmn.farc D4A14D6D\nrom/2d/spr_sel_md267cmn.farc 6ED234AA\nrom/2d/spr_sel_md269cmn.farc 1A1A9F0F\nrom/2d/spr_sel_md270cmn.farc 10075705\nrom/2d/spr_sel_md271cmn.farc 92D251EA\nrom/2d/spr_sel_md272cmn.farc 10D674EE\nrom/2d/spr_sel_md273cmn.farc F0A7A538\nrom/2d/spr_sel_md274cmn.farc 12FF184C\nrom/2d/spr_sel_md275cmn.farc 6DF1C025\nrom/2d/spr_sel_md276cmn.farc 9ED5C00C\nrom/2d/spr_sel_md277cmn.farc 49B0931C\nrom/2d/spr_sel_md278cmn.farc 5318C2C0\nrom/2d/spr_sel_md279cmn.farc BEFE0CA6\nrom/2d/spr_sel_md280cmn.farc 6DF1DCDD\nrom/2d/spr_sel_md281cmn.farc B26BE272\nrom/2d/spr_sel_md282cmn.farc 8A121E8E\nrom/2d/spr_sel_md283cmn.farc E010F359\nrom/2d/spr_sel_md285cmn.farc AE4B449F\nrom/2d/spr_sel_md286cmn.farc 2EE1D789\nrom/2d/spr_sel_md287cmn.farc 2E5FDCDE\nrom/2d/spr_sel_md288cmn.farc 756C92C1\nrom/2d/spr_sel_md289cmn.farc 55855678\nrom/2d/spr_sel_md290cmn.farc C180C0FF\nrom/2d/spr_sel_md291cmn.farc 9C2A3E9B\nrom/2d/spr_sel_md292cmn.farc 725D909C\nrom/2d/spr_sel_md293cmn.farc EB687739\nrom/2d/spr_sel_md294cmn.farc 8B4D7EA6\nrom/2d/spr_sel_md295cmn.farc D38A9792\nrom/2d/spr_sel_md296cmn.farc D6DB5E38\nrom/2d/spr_sel_md297cmn.farc 9D0F3798\nrom/2d/spr_sel_md298cmn.farc 56305863\nrom/2d/spr_sel_md299cmn.farc 8F883F7A\nrom/2d/spr_sel_md301cmn.farc 20852DD6\nrom/2d/spr_sel_md302cmn.farc 5C3C8CBD\nrom/2d/spr_sel_md303cmn.farc 75C792B8\nrom/2d/spr_sel_md304cmn.farc A0EE04DF\nrom/2d/spr_sel_md305cmn.farc 4272D6B1\nrom/2d/spr_sel_md306cmn.farc 82D49B0E\nrom/2d/spr_sel_md308cmn.farc 6EB4B05A\nrom/2d/spr_sel_md309cmn.farc AAABEC37\nrom/2d/spr_sel_md310cmn.farc 1D222272\nrom/2d/spr_sel_md311cmn.farc 7B900C1B\nrom/2d/spr_sel_md313cmn.farc A0647392\nrom/2d/spr_sel_md314cmn.farc A9866E6F\nrom/2d/spr_sel_md315cmn.farc 068D6754\nrom/2d/spr_sel_md316cmn.farc 83673222\nrom/2d/spr_sel_md317cmn.farc 44C0DCD9\nrom/2d/spr_sel_md319cmn.farc FBE25B65\nrom/2d/spr_sel_md320cmn.farc DE0920D6\nrom/2d/spr_sel_md321cmn.farc 3FFFEF3C\nrom/2d/spr_sel_md322cmn.farc F0437C9A\nrom/2d/spr_sel_md323cmn.farc EF8D3C8F\nrom/2d/spr_sel_md324cmn.farc 459AFEBE\nrom/2d/spr_sel_md325cmn.farc 31E035DD\nrom/2d/spr_sel_md326cmn.farc 33236FEC\nrom/2d/spr_sel_md327cmn.farc C851E799\nrom/2d/spr_sel_md328cmn.farc B6F3F004\nrom/2d/spr_sel_md329cmn.farc 6FA1D011\nrom/2d/spr_sel_md330cmn.farc 97B08CB0\nrom/2d/spr_sel_md331cmn.farc 66590F3E\nrom/2d/spr_sel_md332cmn.farc FF419342\nrom/2d/spr_sel_md334cmn.farc 22315B17\nrom/2d/spr_sel_md336cmn.farc 9A4D6C56\nrom/2d/spr_sel_md338cmn.farc 007EEBEF\nrom/2d/spr_sel_md339cmn.farc A0BB4052\nrom/2d/spr_sel_md340cmn.farc 5501E4BC\nrom/2d/spr_sel_md341cmn.farc 2DF05A46\nrom/2d/spr_sel_md343cmn.farc BE824CCC\nrom/2d/spr_sel_md344cmn.farc 6FC610B7\nrom/2d/spr_sel_md345cmn.farc 983FFF53\nrom/2d/spr_sel_md346cmn.farc 897276A0\nrom/2d/spr_sel_md347cmn.farc 4B51942D\nrom/2d/spr_sel_md348cmn.farc 1B3A16F6\nrom/2d/spr_sel_md349cmn.farc 40BCD8EE\nrom/2d/spr_sel_md350cmn.farc 6513D83A\nrom/2d/spr_sel_md351cmn.farc 7D08ED63\nrom/2d/spr_sel_md352cmn.farc B867B87C\nrom/2d/spr_sel_md354cmn.farc 7F3D565D\nrom/2d/spr_sel_md355cmn.farc 8867F186\nrom/2d/spr_sel_md356cmn.farc 93046E0C\nrom/2d/spr_sel_md358cmn.farc 4108BAFE\nrom/2d/spr_sel_md359cmn.farc C762D647\nrom/2d/spr_sel_md360cmn.farc BC22D320\nrom/2d/spr_sel_md361cmn.farc BFAF809A\nrom/2d/spr_sel_md362cmn.farc EE9A101F\nrom/2d/spr_sel_md363cmn.farc A7E5861F\nrom/2d/spr_sel_md364cmn.farc CE2555F5\nrom/2d/spr_sel_md365cmn.farc 2102411E\nrom/2d/spr_sel_md366cmn.farc 6186D355\nrom/2d/spr_sel_md367cmn.farc 7F29F9B2\nrom/2d/spr_sel_md368cmn.farc E4B42F0C\nrom/2d/spr_sel_md369cmn.farc A73D4C92\nrom/2d/spr_sel_md371cmn.farc C39A440B\nrom/2d/spr_sel_md372cmn.farc D7619BAD\nrom/2d/spr_sel_md373cmn.farc BD387821\nrom/2d/spr_sel_md374cmn.farc 249E6DE0\nrom/2d/spr_sel_md375cmn.farc 60C43316\nrom/2d/spr_sel_md376cmn.farc 8E24DD56\nrom/2d/spr_sel_md377cmn.farc ED996202\nrom/2d/spr_sel_md378cmn.farc 34E44846\nrom/2d/spr_sel_md379cmn.farc 6823D1D1\nrom/2d/spr_sel_md380cmn.farc 300FC755\nrom/2d/spr_sel_md381cmn.farc 22A94428\nrom/2d/spr_sel_md382cmn.farc 385F7B3B\nrom/2d/spr_sel_md383cmn.farc D30C977D\nrom/2d/spr_sel_md385cmn.farc C8DDEF31\nrom/2d/spr_sel_md386cmn.farc 0C42F222\nrom/2d/spr_sel_md122cmn.farc 41AEA635\nrom/2d/spr_sel_md139cmn.farc EF08F922\nrom/2d/spr_sel_md157cmn.farc 8E1F744A\nrom/2d/spr_sel_md188cmn.farc A6D39499\nrom/2d/spr_sel_md204cmn.farc DAF555A8\nrom/2d/spr_sel_md220cmn.farc F20B27FF\nrom/2d/spr_sel_md236cmn.farc A48405CD\nrom/2d/spr_sel_md252cmn.farc F4A688D6\nrom/2d/spr_sel_md268cmn.farc 367B8ADA\nrom/2d/spr_sel_md284cmn.farc D72B316F\nrom/2d/spr_sel_md300cmn.farc 95789835\nrom/2d/spr_sel_md318cmn.farc 5D72025B\nrom/2d/spr_sel_md335cmn.farc 146A34BE\nrom/2d/spr_sel_md353cmn.farc 0D6CA6DF\nrom/2d/spr_sel_md370cmn.farc F9C4188D\nrom/2d/spr_sel_md389cmn.farc 75107950\nrom/2d/spr_sel_md390cmn.farc F873F513\nrom/2d/spr_sel_md391cmn.farc 07CDA695\nrom/2d/spr_sel_md392cmn.farc A4D0F65A\nrom/2d/spr_sel_md393cmn.farc 3368B3C9\nrom/2d/spr_sel_md394cmn.farc 42AD8862\nrom/2d/spr_sel_md395cmn.farc 51A6E42D\nrom/2d/spr_sel_md398cmn.farc 30BA5953\nrom/2d/spr_sel_md402cmn.farc 52FA728B\nrom/2d/spr_sel_md403cmn.farc EB8387FE\nrom/2d/spr_sel_md404cmn.farc 76F7CB66\nrom/2d/spr_sel_md405cmn.farc A6B8CCDF\nrom/2d/spr_sel_md406cmn.farc E70532BE\nrom/2d/spr_sel_md407cmn.farc 32CC17D8\nrom/2d/spr_sel_md408cmn.farc 2456BA5A\nrom/2d/spr_sel_md410cmn.farc 0E2C8EC9\nrom/2d/spr_sel_md411cmn.farc 299F803E\nrom/2d/spr_sel_md412cmn.farc 946AA144\nrom/2d/spr_sel_md420cmn.farc 8806E9ED\nrom/2d/spr_sel_md421cmn.farc DD4922A0\nrom/2d/spr_sel_md422cmn.farc 0C6BA932\nrom/2d/spr_sel_md423cmn.farc FB5D32B0\nrom/2d/spr_sel_mdrallcmn.farc B6BFCF83\nrom/2d/spr_sel_mdrhakcmn.farc 3BD9C57B\nrom/2d/spr_sel_mdrkaicmn.farc 878212BE\nrom/2d/spr_sel_mdrlencmn.farc 35F69D1B\nrom/2d/spr_sel_mdrlukcmn.farc 22E5A6F7\nrom/2d/spr_sel_mdrmeicmn.farc EABECED2\nrom/2d/spr_sel_mdrmikcmn.farc 885DD236\nrom/2d/spr_sel_mdrnercmn.farc 0A74A115\nrom/2d/spr_sel_mdrrincmn.farc 261EF27C\nrom/2d/spr_sel_mdrtetcmn.farc 46840F30\nrom/2d/spr_sel_module.farc 3C6630C9\nrom/2d/spr_sel_plate.farc BCF8CAAC\nrom/2d/spr_sel_pleff.farc 8337AB99\nrom/2d/spr_sel_print.farc 26D2303D\nrom/2d/spr_sel_procedure.farc ED11EFA2\nrom/2d/spr_sel_pv.farc 81844A7F\nrom/2d/spr_sel_pv001.farc D46959B5\nrom/2d/spr_sel_pv002.farc 2DD72BAD\nrom/2d/spr_sel_pv003.farc 0CF2CF56\nrom/2d/spr_sel_pv004.farc 942F2DB2\nrom/2d/spr_sel_pv005.farc 9741ADC1\nrom/2d/spr_sel_pv006.farc 7A596887\nrom/2d/spr_sel_pv007.farc A9168BE6\nrom/2d/spr_sel_pv008.farc E8500089\nrom/2d/spr_sel_pv009.farc 1290ED53\nrom/2d/spr_sel_pv011.farc 28FE23F2\nrom/2d/spr_sel_pv012.farc 6FD7ED24\nrom/2d/spr_sel_pv013.farc 697866A7\nrom/2d/spr_sel_pv014.farc 9782DEE5\nrom/2d/spr_sel_pv015.farc 739D0D6D\nrom/2d/spr_sel_pv016.farc FCB1DE3F\nrom/2d/spr_sel_pv017.farc 0A3D0748\nrom/2d/spr_sel_pv018.farc 02EFBE70\nrom/2d/spr_sel_pv019.farc 9B72B2B4\nrom/2d/spr_sel_pv020.farc 3EA38C78\nrom/2d/spr_sel_pv021.farc 90D1D986\nrom/2d/spr_sel_pv022.farc 3985D648\nrom/2d/spr_sel_pv023.farc 590175EC\nrom/2d/spr_sel_pv024.farc 6EC6CC27\nrom/2d/spr_sel_pv025.farc C8440080\nrom/2d/spr_sel_pv026.farc 31FC176D\nrom/2d/spr_sel_pv028.farc BAE101F4\nrom/2d/spr_sel_pv029.farc 0B1DE72B\nrom/2d/spr_sel_pv030.farc 05F3E845\nrom/2d/spr_sel_pv031.farc C201E872\nrom/2d/spr_sel_pv032.farc 2D78EBA8\nrom/2d/spr_sel_pv037.farc F8B04AD7\nrom/2d/spr_sel_pv038.farc C7CB6E4E\nrom/2d/spr_sel_pv039.farc F035DFBA\nrom/2d/spr_sel_pv040.farc 86DAFB68\nrom/2d/spr_sel_pv041.farc 0724327D\nrom/2d/spr_sel_pv042.farc 76200131\nrom/2d/spr_sel_pv043.farc B2D79FF0\nrom/2d/spr_sel_pv044.farc 2FCD192D\nrom/2d/spr_sel_pv045.farc A21E7EBD\nrom/2d/spr_sel_pv046.farc 6A90C874\nrom/2d/spr_sel_pv047.farc 95CD9431\nrom/2d/spr_sel_pv049.farc E900B8E9\nrom/2d/spr_sel_pv050.farc 209D945E\nrom/2d/spr_sel_pv051.farc D0BBB8DE\nrom/2d/spr_sel_pv052.farc F123017A\nrom/2d/spr_sel_pv053.farc 84454657\nrom/2d/spr_sel_pv054.farc A94822FA\nrom/2d/spr_sel_pv055.farc 67674E3F\nrom/2d/spr_sel_pv056.farc 662C5554\nrom/2d/spr_sel_pv057.farc C4284A2A\nrom/2d/spr_sel_pv058.farc 86DE71C8\nrom/2d/spr_sel_pv059.farc 231EAEEC\nrom/2d/spr_sel_pv060.farc 848F95D4\nrom/2d/spr_sel_pv061.farc B6E3926B\nrom/2d/spr_sel_pv062.farc 0DC06C3B\nrom/2d/spr_sel_pv063.farc 3B6755A3\nrom/2d/spr_sel_pv064.farc 772E4782\nrom/2d/spr_sel_pv066.farc 37DC8976\nrom/2d/spr_sel_pv079.farc 0162211B\nrom/2d/spr_sel_pv081.farc 9547577E\nrom/2d/spr_sel_pv082.farc F4980F2C\nrom/2d/spr_sel_pv083.farc 2445268F\nrom/2d/spr_sel_pv084.farc E1E2C923\nrom/2d/spr_sel_pv085.farc 3B29FFC8\nrom/2d/spr_sel_pv086.farc 99F8FEA5\nrom/2d/spr_sel_pv087.farc 63ACE06E\nrom/2d/spr_sel_pv088.farc EEEEE1FE\nrom/2d/spr_sel_pv089.farc 6F6FA7FC\nrom/2d/spr_sel_pv090.farc BC2A33A4\nrom/2d/spr_sel_pv091.farc 26240E5A\nrom/2d/spr_sel_pv092.farc 036104D1\nrom/2d/spr_sel_pv093.farc 280B5809\nrom/2d/spr_sel_pv094.farc 31867CFA\nrom/2d/spr_sel_pv096.farc BE2CAFD0\nrom/2d/spr_sel_pv097.farc E883063A\nrom/2d/spr_sel_pv101.farc 2180585F\nrom/2d/spr_sel_pv102.farc D137ED22\nrom/2d/spr_sel_pv103.farc 935967B8\nrom/2d/spr_sel_pv104.farc 350DE770\nrom/2d/spr_sel_pv201.farc 05A3B011\nrom/2d/spr_sel_pv202.farc 1B4AC54F\nrom/2d/spr_sel_pv203.farc 895584C6\nrom/2d/spr_sel_pv204.farc 4DC18373\nrom/2d/spr_sel_pv205.farc 208DFF63\nrom/2d/spr_sel_pv206.farc 68428D4F\nrom/2d/spr_sel_pv207.farc 02CA1629\nrom/2d/spr_sel_pv208.farc 6E5E0B25\nrom/2d/spr_sel_pv209.farc 3D71A758\nrom/2d/spr_sel_pv210.farc C8E60F64\nrom/2d/spr_sel_pv212.farc FB1E13D8\nrom/2d/spr_sel_pv213.farc 6DA4821A\nrom/2d/spr_sel_pv214.farc A7212F65\nrom/2d/spr_sel_pv215.farc 60E2FFF3\nrom/2d/spr_sel_pv216.farc A7EC2D60\nrom/2d/spr_sel_pv218.farc 1E683805\nrom/2d/spr_sel_pv219.farc C80FBD72\nrom/2d/spr_sel_pv220.farc 9B955F54\nrom/2d/spr_sel_pv221.farc 17E5CBBE\nrom/2d/spr_sel_pv222.farc 221C9B5B\nrom/2d/spr_sel_pv223.farc 882B356D\nrom/2d/spr_sel_pv224.farc 7A623880\nrom/2d/spr_sel_pv225.farc 54FCD8DC\nrom/2d/spr_sel_pv226.farc 6135244E\nrom/2d/spr_sel_pv227.farc F382C089\nrom/2d/spr_sel_pv228.farc CD8F90E9\nrom/2d/spr_sel_pv232.farc 68459057\nrom/2d/spr_sel_pv233.farc 5A77A8C1\nrom/2d/spr_sel_pv234.farc 43A601E9\nrom/2d/spr_sel_pv235.farc 55E2309F\nrom/2d/spr_sel_pv236.farc 4871D2C2\nrom/2d/spr_sel_pv238.farc 01085810\nrom/2d/spr_sel_pv239.farc B5F3A07B\nrom/2d/spr_sel_pv240.farc C78AD4CD\nrom/2d/spr_sel_pv241.farc D6CAE408\nrom/2d/spr_sel_pv242.farc 43E8FC59\nrom/2d/spr_sel_pv243.farc 9971A3BF\nrom/2d/spr_sel_pv244.farc 79D4C878\nrom/2d/spr_sel_pv246.farc 8710365C\nrom/2d/spr_sel_pv247.farc 1F2C7DB8\nrom/2d/spr_sel_pv248.farc 7900EB10\nrom/2d/spr_sel_pv249.farc F259DA9E\nrom/2d/spr_sel_pv251.farc 37A98829\nrom/2d/spr_sel_pv253.farc 2C110128\nrom/2d/spr_sel_pv255.farc 5C7FC3C8\nrom/2d/spr_sel_pv257.farc 3E011A25\nrom/2d/spr_sel_pv259.farc C70B7317\nrom/2d/spr_sel_pv260.farc CD16C39A\nrom/2d/spr_sel_pv261.farc 457FE2D8\nrom/2d/spr_sel_pv262.farc 1F766DE0\nrom/2d/spr_sel_pv265.farc 1B7B2C85\nrom/2d/spr_sel_pv401.farc D56CB113\nrom/2d/spr_sel_pv402.farc 0002AF17\nrom/2d/spr_sel_pv403.farc 6F0990EB\nrom/2d/spr_sel_pv404.farc 4E05F4F9\nrom/2d/spr_sel_pv405.farc E0791BC8\nrom/2d/spr_sel_pv406.farc 2B06C165\nrom/2d/spr_sel_pv407.farc 07DB3D5E\nrom/2d/spr_sel_pv409.farc B1BD9D1B\nrom/2d/spr_sel_pv410.farc 2E1B78AD\nrom/2d/spr_sel_pv411.farc DB5BE3BA\nrom/2d/spr_sel_pv412.farc 93B9392F\nrom/2d/spr_sel_pv413.farc DBED2390\nrom/2d/spr_sel_pv414.farc A506CD33\nrom/2d/spr_sel_pv415.farc 9B655835\nrom/2d/spr_sel_pv416.farc 270D5E9C\nrom/2d/spr_sel_pv417.farc BA0847E1\nrom/2d/spr_sel_pv418.farc C691D619\nrom/2d/spr_sel_pv419.farc B595653B\nrom/2d/spr_sel_pv420.farc 94A44FA3\nrom/2d/spr_sel_pv421.farc F5E4C8B7\nrom/2d/spr_sel_pv422.farc 91618229\nrom/2d/spr_sel_pv423.farc 90C634C9\nrom/2d/spr_sel_pv424.farc F342C15C\nrom/2d/spr_sel_pv426.farc 0DFDF8B4\nrom/2d/spr_sel_pv427.farc DD47D4F2\nrom/2d/spr_sel_pv428.farc 5DB83762\nrom/2d/spr_sel_pv429.farc 5DE3702F\nrom/2d/spr_sel_pv430.farc 4A42A9FE\nrom/2d/spr_sel_pv431.farc EDC78E46\nrom/2d/spr_sel_pv432.farc F8854AB5\nrom/2d/spr_sel_pv433.farc 7C3D3C24\nrom/2d/spr_sel_pv434.farc 7415972B\nrom/2d/spr_sel_pv435.farc 31566E71\nrom/2d/spr_sel_pv436.farc BBE5846E\nrom/2d/spr_sel_pv437.farc 9FA1A231\nrom/2d/spr_sel_pv438.farc EA769FE7\nrom/2d/spr_sel_pv439.farc 2E7EAD02\nrom/2d/spr_sel_pv440.farc 7F24C4ED\nrom/2d/spr_sel_pv441.farc 84B4250E\nrom/2d/spr_sel_pv443.farc D631E622\nrom/2d/spr_sel_pv600.farc 1948E586\nrom/2d/spr_sel_pv601.farc 5E73CFAC\nrom/2d/spr_sel_pv602.farc 6553A25A\nrom/2d/spr_sel_pv603.farc 989683FF\nrom/2d/spr_sel_pv604.farc 50D80BD3\nrom/2d/spr_sel_pv605.farc 6BE37422\nrom/2d/spr_sel_pv607.farc 1C8F9B24\nrom/2d/spr_sel_pv608.farc 3BFAD4F4\nrom/2d/spr_sel_pv609.farc F10A0DC4\nrom/2d/spr_sel_pv610.farc C64EA504\nrom/2d/spr_sel_pv611.farc 8101FB4A\nrom/2d/spr_sel_pv612.farc 9E2D8D1D\nrom/2d/spr_sel_pv613.farc 4B5B3AE1\nrom/2d/spr_sel_pv614.farc 49A27804\nrom/2d/spr_sel_pv615.farc 86210159\nrom/2d/spr_sel_pv617.farc B714E3C6\nrom/2d/spr_sel_pv618.farc F0A816A4\nrom/2d/spr_sel_pv619.farc 6507AA67\nrom/2d/spr_sel_pv620.farc A4AE47C9\nrom/2d/spr_sel_pv621.farc CBA1E04B\nrom/2d/spr_sel_pv622.farc 855115CB\nrom/2d/spr_sel_pv623.farc 7CF97C75\nrom/2d/spr_sel_pv624.farc 1192C3C7\nrom/2d/spr_sel_pv625.farc 9AE951F8\nrom/2d/spr_sel_pv626.farc B4B61FD0\nrom/2d/spr_sel_pv627.farc 8C79AB6C\nrom/2d/spr_sel_pv628.farc 8D8F7EB2\nrom/2d/spr_sel_pv629.farc 09EEBF00\nrom/2d/spr_sel_pv630.farc 058645F6\nrom/2d/spr_sel_pv631.farc 538EBD85\nrom/2d/spr_sel_pv637.farc EA951BC4\nrom/2d/spr_sel_pv639.farc 044B4B74\nrom/2d/spr_sel_pv640.farc 2D019485\nrom/2d/spr_sel_pv641.farc EBF6E9AF\nrom/2d/spr_sel_pv642.farc 923F6B17\nrom/2d/spr_sel_pv710.farc D986D6B5\nrom/2d/spr_sel_pv722.farc 2991CE7B\nrom/2d/spr_sel_pv723.farc 60460640\nrom/2d/spr_sel_pv724.farc FA90CF20\nrom/2d/spr_sel_pv725.farc 3B73F3F4\nrom/2d/spr_sel_pv726.farc 951350DE\nrom/2d/spr_sel_pv727.farc 57822532\nrom/2d/spr_sel_pv728.farc 3C7088B2\nrom/2d/spr_sel_pv729.farc 3E756D05\nrom/2d/spr_sel_pv730.farc 93EE4384\nrom/2d/spr_sel_pv731.farc 34574138\nrom/2d/spr_sel_pv732.farc 62100DF1\nrom/2d/spr_sel_md409cmn.farc 90C681AF\nrom/2d/spr_sel_mdrsakcmn.farc E96A0882\nrom/2d/spr_sel_pv010.farc BC1FC1A4\nrom/2d/spr_sel_pv027.farc 41F01C2D\nrom/2d/spr_sel_pv048.farc 3D68DCF2\nrom/2d/spr_sel_pv065.farc 5A009E24\nrom/2d/spr_sel_pv095.farc F3F8E0BB\nrom/2d/spr_sel_pv211.farc 3D4276EF\nrom/2d/spr_sel_pv231.farc 4304049D\nrom/2d/spr_sel_pv250.farc 4B5E17D5\nrom/2d/spr_sel_pv408.farc 1669E5FC\nrom/2d/spr_sel_pv425.farc 5C88A012\nrom/2d/spr_sel_pv442.farc 32D68B8F\nrom/2d/spr_sel_pv616.farc 4852CE5C\nrom/2d/spr_sel_pv638.farc 6DC0263D\nrom/2d/spr_sel_pv733.farc 3F6E4868\nrom/2d/spr_sel_pv734.farc 84765085\nrom/2d/spr_sel_pv736.farc B41F59EA\nrom/2d/spr_sel_pv737.farc 3F785D0F\nrom/2d/spr_sel_pv738.farc E90D92C6\nrom/2d/spr_sel_pv739.farc 86907E3A\nrom/2d/spr_sel_pv740.farc 98B6D24E\nrom/2d/spr_sel_pv832.farc 979FD4C7\nrom/2d/spr_sel_qst.farc 0DE020E6\nrom/2d/spr_sel_result.farc 1650912C\nrom/2d/spr_sel_sc.farc 935A6CF2\nrom/2d/spr_sel_skin001.farc FAED1701\nrom/2d/spr_sel_song.farc A39B458B\nrom/2d/spr_sel_songcmn.farc DB8E002C\nrom/2d/spr_sel_stamp.farc ECADE5C4\nrom/2d/spr_sel_ticket.farc B859F8C6\nrom/2d/spr_sel_vaccess.farc AE30643C\nrom/2d/spr_sel_watch.farc FF0EA620\nrom/auth_3d/EFFCHRPV612KAI002.farc 99671723\nrom/auth_3d/auth_3d_db.bin CAEFF330\nrom/auth_3d/auth_3d_setting.bin 919ED660\nrom/auth_3d/CAMPV001.farc A17C0C98\nrom/auth_3d/CAMPV002.farc D3665CAF\nrom/auth_3d/CAMPV003.farc 59E28ED6\nrom/auth_3d/CAMPV004.farc B2524665\nrom/auth_3d/CAMPV005.farc 575FF6A6\nrom/auth_3d/CAMPV006.farc D6B5BF51\nrom/auth_3d/CAMPV007.farc 27FA06A6\nrom/auth_3d/CAMPV008.farc 5BB7B7B9\nrom/auth_3d/CAMPV009.farc 770134E5\nrom/auth_3d/CAMPV010.farc 33D43661\nrom/auth_3d/CAMPV011.farc DAE53599\nrom/auth_3d/CAMPV012.farc 597B4733\nrom/auth_3d/CAMPV013.farc E01EB1A6\nrom/auth_3d/CAMPV014.farc C8EFD180\nrom/auth_3d/CAMPV015.farc 0898C8B4\nrom/auth_3d/CAMPV017.farc 17FE1C7A\nrom/auth_3d/CAMPV018.farc CE35B750\nrom/auth_3d/CAMPV019.farc 7682AD09\nrom/auth_3d/CAMPV020.farc 6CCE6914\nrom/auth_3d/CAMPV021.farc F720FE88\nrom/auth_3d/CAMPV0211.farc FFEFB0A8\nrom/auth_3d/CAMPV022.farc 3E4D6251\nrom/auth_3d/CAMPV023.farc 177D4FA8\nrom/auth_3d/CAMPV024.farc 3341C7CD\nrom/auth_3d/CAMPV025.farc 26F0CC09\nrom/auth_3d/CAMPV027.farc CF9AD56E\nrom/auth_3d/CAMPV028.farc 35435D13\nrom/auth_3d/CAMPV029.farc A4336C7F\nrom/auth_3d/CAMPV030.farc DCAF0A42\nrom/auth_3d/CAMPV031.farc 2BA20177\nrom/auth_3d/CAMPV032.farc FCF4E988\nrom/auth_3d/CAMPV037.farc 7BEB2878\nrom/auth_3d/CAMPV039.farc 6F1C8497\nrom/auth_3d/CAMPV040.farc FDB333C7\nrom/auth_3d/CAMPV041.farc AA1EC6C2\nrom/auth_3d/CAMPV042.farc 3E02A307\nrom/auth_3d/CAMPV043.farc BE05DA83\nrom/auth_3d/CAMPV044.farc B74F07D9\nrom/auth_3d/CAMPV045.farc 1BDD253F\nrom/auth_3d/CAMPV046.farc FDF3CB83\nrom/auth_3d/CAMPV047.farc E5748AA0\nrom/auth_3d/CAMPV048.farc 52E11359\nrom/auth_3d/CAMPV049.farc 6EB2D0BD\nrom/auth_3d/CAMPV050.farc 7A4F6F6A\nrom/auth_3d/CAMPV051.farc F12D737B\nrom/auth_3d/CAMPV052.farc 48B254A3\nrom/auth_3d/CAMPV053.farc 7E9348E8\nrom/auth_3d/CAMPV054.farc 5C707289\nrom/auth_3d/CAMPV055.farc 2A005B3E\nrom/auth_3d/CAMPV057.farc 34AA78C9\nrom/auth_3d/CAMPV058.farc AE48379C\nrom/auth_3d/CAMPV059.farc C130499A\nrom/auth_3d/CAMPV060.farc A7EF2D9C\nrom/auth_3d/CAMPV061.farc ACBC6DB2\nrom/auth_3d/CAMPV062.farc 34B743B3\nrom/auth_3d/CAMPV063.farc 13FAFC49\nrom/auth_3d/CAMPV064.farc E8284036\nrom/auth_3d/CAMPV065.farc 416C942A\nrom/auth_3d/CAMPV066.farc D884B667\nrom/auth_3d/CAMPV067.farc AF10BDF8\nrom/auth_3d/CAMPV068.farc BA528797\nrom/auth_3d/CAMPV079.farc ADD29858\nrom/auth_3d/CAMPV081.farc 54CC3FC0\nrom/auth_3d/CAMPV082.farc EF3EF30F\nrom/auth_3d/CAMPV083.farc 6EA2F143\nrom/auth_3d/CAMPV084.farc DB5FC262\nrom/auth_3d/CAMPV016.farc A5286DBD\nrom/auth_3d/CAMPV038.farc 15A90F20\nrom/auth_3d/CAMPV056.farc 08506229\nrom/auth_3d/CAMPV085.farc 593D8569\nrom/auth_3d/CAMPV204.farc 58412FB0\nrom/auth_3d/CAMPV226.farc 5E3C3318\nrom/auth_3d/CAMPV248.farc 1B1529B2\nrom/auth_3d/CAMPV603.farc 38B7CEE8\nrom/auth_3d/CAMPV622.farc 898E9E01\nrom/auth_3d/CAMPV723.farc 5D2AE6FB\nrom/auth_3d/CAMPV832.farc 38913457\nrom/auth_3d/EFFCHRPV262HAK001.farc B7B191A2\nrom/auth_3d/EFFCHRPV262MIK100.farc 9B41ECCA\nrom/auth_3d/EFFCHRPV441MEI001.farc 95814B38\nrom/auth_3d/EFFCHRPV605HAK001.farc F3F3F2AF\nrom/auth_3d/CAMPV086.farc 6EFF73AB\nrom/auth_3d/CAMPV087.farc 3FE2CB3E\nrom/auth_3d/CAMPV088.farc AE2A9BC9\nrom/auth_3d/CAMPV089.farc E844A2B6\nrom/auth_3d/CAMPV090.farc 1C0279AB\nrom/auth_3d/CAMPV091.farc 8373BBA6\nrom/auth_3d/CAMPV092.farc 81B7EAAD\nrom/auth_3d/CAMPV093.farc CEFF6C7D\nrom/auth_3d/CAMPV094.farc 6ED5CEA3\nrom/auth_3d/CAMPV095.farc 90833959\nrom/auth_3d/CAMPV096.farc FB7CAF8A\nrom/auth_3d/CAMPV097.farc BDF113D5\nrom/auth_3d/CAMPV102.farc 89583338\nrom/auth_3d/CAMPV103.farc BDA6D4E5\nrom/auth_3d/CAMPV104.farc 9CB50C53\nrom/auth_3d/CAMPV201.farc 44544FBF\nrom/auth_3d/CAMPV202.farc 456CE270\nrom/auth_3d/CAMPV205.farc 0B3A1508\nrom/auth_3d/CAMPV206.farc 0F40C7AF\nrom/auth_3d/CAMPV207.farc 3ED9F519\nrom/auth_3d/CAMPV208.farc 21D1E978\nrom/auth_3d/CAMPV210.farc A955F032\nrom/auth_3d/CAMPV211.farc A7711650\nrom/auth_3d/CAMPV212.farc 8784367E\nrom/auth_3d/CAMPV213.farc AB48B193\nrom/auth_3d/CAMPV214.farc 2EE942DB\nrom/auth_3d/CAMPV218.farc 905699EC\nrom/auth_3d/CAMPV219.farc 8ADC7EF4\nrom/auth_3d/CAMPV220.farc EE090C7C\nrom/auth_3d/CAMPV221.farc FCE79E7E\nrom/auth_3d/CAMPV222.farc E7C02725\nrom/auth_3d/CAMPV223.farc 956B2416\nrom/auth_3d/CAMPV224.farc 08E24EBC\nrom/auth_3d/CAMPV225.farc 60921430\nrom/auth_3d/CAMPV227.farc EF8CA9F7\nrom/auth_3d/CAMPV228.farc 63021B09\nrom/auth_3d/CAMPV231.farc 000DE946\nrom/auth_3d/CAMPV232.farc 56E1BAFF\nrom/auth_3d/CAMPV233.farc 20138F7A\nrom/auth_3d/CAMPV234.farc F8913B0C\nrom/auth_3d/CAMPV235.farc D3B64B5E\nrom/auth_3d/CAMPV236.farc 06AB81C9\nrom/auth_3d/CAMPV238.farc 4AA6A19A\nrom/auth_3d/CAMPV239.farc 9B9B08FD\nrom/auth_3d/CAMPV240.farc 7D3F1C76\nrom/auth_3d/CAMPV241.farc 905C4BC6\nrom/auth_3d/CAMPV242.farc 3B5BD39F\nrom/auth_3d/CAMPV243.farc 84851459\nrom/auth_3d/CAMPV244.farc 26652501\nrom/auth_3d/CAMPV246.farc 3BE59EA9\nrom/auth_3d/CAMPV247.farc 2728A4A0\nrom/auth_3d/CAMPV249.farc EA8B2721\nrom/auth_3d/CAMPV250.farc 22CFA171\nrom/auth_3d/CAMPV251.farc B1473A80\nrom/auth_3d/CAMPV253.farc 218B5578\nrom/auth_3d/CAMPV255.farc 70965058\nrom/auth_3d/CAMPV257.farc 4329CB08\nrom/auth_3d/CAMPV259.farc F54B2C7E\nrom/auth_3d/CAMPV260.farc 6E310078\nrom/auth_3d/CAMPV261.farc 8C330967\nrom/auth_3d/CAMPV262.farc 49B13727\nrom/auth_3d/CAMPV432.farc 81E24223\nrom/auth_3d/CAMPV433.farc 28C37489\nrom/auth_3d/CAMPV434.farc AF0A2A7C\nrom/auth_3d/CAMPV435.farc EE95209A\nrom/auth_3d/CAMPV600.farc 16E77529\nrom/auth_3d/CAMPV601.farc F9D597F8\nrom/auth_3d/CAMPV602.farc 079F6FCB\nrom/auth_3d/CAMPV604.farc F6021B0A\nrom/auth_3d/CAMPV605.farc F8C827B6\nrom/auth_3d/CAMPV607.farc 0A15735B\nrom/auth_3d/CAMPV608.farc AA2AF17D\nrom/auth_3d/CAMPV609.farc 5B68E2FE\nrom/auth_3d/CAMPV610.farc 73DE32AB\nrom/auth_3d/CAMPV611.farc 8FC15FC1\nrom/auth_3d/CAMPV612.farc 7022DBDD\nrom/auth_3d/CAMPV613.farc 78B5B76C\nrom/auth_3d/CAMPV614.farc B7AAED11\nrom/auth_3d/CAMPV615.farc B3FF7A29\nrom/auth_3d/CAMPV616.farc 9DABD42E\nrom/auth_3d/CAMPV617.farc 50FBD4D0\nrom/auth_3d/CAMPV618.farc 3254703F\nrom/auth_3d/CAMPV619.farc 1040CF3D\nrom/auth_3d/CAMPV620.farc EA120BBC\nrom/auth_3d/CAMPV621.farc 8CAD5A81\nrom/auth_3d/CAMPV623.farc 020EA366\nrom/auth_3d/CAMPV624.farc 3C60A120\nrom/auth_3d/CAMPV625.farc 5F17AA9C\nrom/auth_3d/CAMPV626.farc DB0CC623\nrom/auth_3d/CAMPV627.farc 0A32168B\nrom/auth_3d/CAMPV628.farc E0806ACD\nrom/auth_3d/CAMPV629.farc 4AB9E983\nrom/auth_3d/CAMPV630.farc D7E9FEB5\nrom/auth_3d/CAMPV631.farc 544C3223\nrom/auth_3d/CAMPV637.farc E3E96BA9\nrom/auth_3d/CAMPV638.farc 57771EDA\nrom/auth_3d/CAMPV639.farc F31ADC24\nrom/auth_3d/CAMPV640.farc 26A0FB6E\nrom/auth_3d/CAMPV641.farc 80EADECB\nrom/auth_3d/CAMPV642.farc 9C73CF16\nrom/auth_3d/CAMPV710.farc B1D29058\nrom/auth_3d/CAMPV722.farc 84DC0FAF\nrom/auth_3d/CAMPV724.farc FF82C33E\nrom/auth_3d/CAMPV725.farc 4BDC92C3\nrom/auth_3d/CAMPV726.farc E6157C20\nrom/auth_3d/CAMPV727.farc F139C788\nrom/auth_3d/CAMPV728.farc 776EE649\nrom/auth_3d/CAMPV729.farc 3B54F09B\nrom/auth_3d/CAMPV730.farc 20E1FB85\nrom/auth_3d/CAMPV731.farc 3275CD42\nrom/auth_3d/CAMPV732.farc 694CAF6A\nrom/auth_3d/CAMPV733.farc 72F37F3B\nrom/auth_3d/CAMPV734.farc 05ADB091\nrom/auth_3d/CAMPV736.farc 000FBFBD\nrom/auth_3d/CAMPV737.farc 796A42EA\nrom/auth_3d/CAMPV738.farc A341652D\nrom/auth_3d/CAMPV739.farc 8162DCDD\nrom/auth_3d/CAMPV740.farc 194AEE61\nrom/auth_3d/CHRPV605.farc 88FCF752\nrom/auth_3d/EFFCHRPV243HAK001.farc 14290C22\nrom/auth_3d/EFFCHRPV243KAI001.farc A92BA963\nrom/auth_3d/EFFCHRPV243LEN001.farc A6D7201A\nrom/auth_3d/EFFCHRPV243LUK001.farc A06F23B7\nrom/auth_3d/EFFCHRPV243MEI001.farc CCDC6A89\nrom/auth_3d/EFFCHRPV243MIK001.farc 42F16C54\nrom/auth_3d/EFFCHRPV243NER001.farc C20F547B\nrom/auth_3d/EFFCHRPV243RIN001.farc 13A99A9B\nrom/auth_3d/EFFCHRPV243SAK001.farc 13CB2376\nrom/auth_3d/EFFCHRPV243TET001.farc 58A7F437\nrom/auth_3d/EFFCHRPV244KAI001.farc 413623CA\nrom/auth_3d/EFFCHRPV244KAI002.farc 4F64A70E\nrom/auth_3d/EFFCHRPV244LEN001.farc 1E938412\nrom/auth_3d/EFFCHRPV244LEN002.farc B6F5E60C\nrom/auth_3d/EFFCHRPV262HAK002.farc 92FF9BA6\nrom/auth_3d/EFFCHRPV262KAI001.farc 5CE06302\nrom/auth_3d/EFFCHRPV262KAI002.farc 42622D2D\nrom/auth_3d/EFFCHRPV262KAI100.farc 318C29D6\nrom/auth_3d/EFFCHRPV262KAI101.farc B5B3CBDD\nrom/auth_3d/EFFCHRPV262LEN001.farc D3BCB624\nrom/auth_3d/EFFCHRPV262LEN002.farc 957E1770\nrom/auth_3d/EFFCHRPV262LUK001.farc 77CF97A3\nrom/auth_3d/EFFCHRPV262LUK002.farc CB409B26\nrom/auth_3d/EFFCHRPV262MEI001.farc B6AAC873\nrom/auth_3d/EFFCHRPV262MEI002.farc 8AB4C6C6\nrom/auth_3d/EFFCHRPV262MEI100.farc A039B7C3\nrom/auth_3d/EFFCHRPV262MEI101.farc 09086369\nrom/auth_3d/EFFCHRPV262MIK001.farc E7E96ADD\nrom/auth_3d/EFFCHRPV262MIK002.farc 65E85D3E\nrom/auth_3d/EFFCHRPV262MIK101.farc 390C1AC0\nrom/auth_3d/EFFCHRPV262NER001.farc D293CACA\nrom/auth_3d/EFFCHRPV262NER002.farc 8C01535F\nrom/auth_3d/EFFCHRPV262RIN001.farc 0409B8EB\nrom/auth_3d/EFFCHRPV262RIN002.farc 5A3F50ED\nrom/auth_3d/EFFCHRPV262RIN100.farc 1557FF55\nrom/auth_3d/EFFCHRPV262RIN101.farc 137B4160\nrom/auth_3d/EFFCHRPV262SAK001.farc 4CAB7162\nrom/auth_3d/EFFCHRPV262SAK002.farc E43D47DE\nrom/auth_3d/EFFCHRPV262TET001.farc DDD43BA3\nrom/auth_3d/EFFCHRPV262TET002.farc D4B62E47\nrom/auth_3d/EFFCHRPV441HAK001.farc 5C671F95\nrom/auth_3d/EFFCHRPV441KAI001.farc EAD57E16\nrom/auth_3d/EFFCHRPV441LEN001.farc E15C682B\nrom/auth_3d/EFFCHRPV441LUK001.farc 3ACCBD31\nrom/auth_3d/EFFCHRPV441MIK001.farc 667D6CEE\nrom/auth_3d/EFFCHRPV441NER001.farc F4F20658\nrom/auth_3d/EFFCHRPV441RIN001.farc 21570A6A\nrom/auth_3d/EFFCHRPV441SAK001.farc 061FBDAA\nrom/auth_3d/EFFCHRPV441TET001.farc 26CEDB14\nrom/auth_3d/EFFCHRPV602HAK001.farc 9D442247\nrom/auth_3d/EFFCHRPV602KAI001.farc 027C89AC\nrom/auth_3d/EFFCHRPV602LEN001.farc 6CCBDB8E\nrom/auth_3d/EFFCHRPV602LUK001.farc 7D65E2CC\nrom/auth_3d/EFFCHRPV602MEI001.farc E821B024\nrom/auth_3d/EFFCHRPV602MIK001.farc C54D340B\nrom/auth_3d/EFFCHRPV602NER001.farc 092BD6FA\nrom/auth_3d/EFFCHRPV602RIN001.farc 065E696B\nrom/auth_3d/EFFCHRPV602SAK001.farc DF7750D8\nrom/auth_3d/EFFCHRPV602TET001.farc 45C05290\nrom/auth_3d/EFFCHRPV605KAI001.farc 51F4A74B\nrom/auth_3d/EFFCHRPV605LEN001.farc E363BCB0\nrom/auth_3d/EFFCHRPV605LUK001.farc DEA5A23C\nrom/auth_3d/EFFCHRPV605MEI001.farc 7F0461A3\nrom/auth_3d/EFFCHRPV605MIK001.farc 86DC836F\nrom/auth_3d/EFFCHRPV605NER001.farc 292FCE85\nrom/auth_3d/EFFCHRPV605RIN001.farc A82FF005\nrom/auth_3d/EFFCHRPV605SAK001.farc 1B31B05F\nrom/auth_3d/EFFCHRPV605TET001.farc BCA3FBB7\nrom/auth_3d/EFFCHRPV609LEN003.farc 4A30E18C\nrom/auth_3d/EFFCHRPV609LUK004.farc B3905482\nrom/auth_3d/EFFCHRPV609MIK001.farc 23B6D0B6\nrom/auth_3d/EFFCHRPV609RIN002.farc A93B4A0A\nrom/auth_3d/EFFCHRPV612HAK002.farc A421939D\nrom/auth_3d/EFFCHRPV612KAI001.farc 237151B0\nrom/auth_3d/EFFCHRPV612LEN001.farc 341AA5B4\nrom/auth_3d/EFFCHRPV612LEN002.farc 55932B20\nrom/auth_3d/EFFCHRPV612LUK001.farc E7401294\nrom/auth_3d/EFFCHRPV612LUK002.farc A88D1781\nrom/auth_3d/EFFCHRPV612MEI001.farc 14284F24\nrom/auth_3d/EFFCHRPV612MEI002.farc 201EBC8E\nrom/auth_3d/EFFCHRPV612MIK001.farc 7275DCBA\nrom/auth_3d/EFFCHRPV612MIK002.farc 969D6DA2\nrom/auth_3d/EFFCHRPV612NER002.farc 08D61C5A\nrom/auth_3d/EFFCHRPV612RIN001.farc B2607E6D\nrom/auth_3d/EFFCHRPV612RIN002.farc 1F5429FC\nrom/auth_3d/EFFCHRPV612SAK001.farc C4940352\nrom/auth_3d/EFFCHRPV612SAK002.farc 52624ACE\nrom/auth_3d/EFFCHRPV612TET002.farc 3C9BBCE9\nrom/auth_3d/EFFCHRPV614KAI009.farc BCFD96BA\nrom/auth_3d/EFFCHRPV614LUK002.farc D44BB0E9\nrom/auth_3d/EFFCHRPV614LUK003.farc 76D721A7\nrom/auth_3d/EFFCHRPV614LUK004.farc 8D67B00A\nrom/auth_3d/EFFCHRPV614LUK005.farc 258B7011\nrom/auth_3d/EFFCHRPV614LUK006.farc 1C5F9201\nrom/auth_3d/EFFCHRPV614LUK007.farc FE5404F3\nrom/auth_3d/EFFCHRPV614LUK008.farc 31F25333\nrom/auth_3d/EFFCHRPV614LUK009.farc 199890CD\nrom/auth_3d/EFFCHRPV614LUK010.farc 1F0D4D1A\nrom/auth_3d/EFFCHRPV614MEI009.farc A7DBD981\nrom/auth_3d/EFFCHRPV614MIK009.farc 5ACCA867\nrom/auth_3d/EFFCHRPV614TET009.farc 24587A53\nrom/auth_3d/EFFCHRPV617HAK001.farc 32EC0948\nrom/auth_3d/EFFCHRPV617KAI001.farc 9A01A6B7\nrom/auth_3d/EFFCHRPV617LEN001.farc 519D2509\nrom/auth_3d/EFFCHRPV617MEI001.farc A72D97F8\nrom/auth_3d/EFFCHRPV617MIK001.farc 58F773CD\nrom/auth_3d/EFFCHRPV617NER001.farc ADBCB01B\nrom/auth_3d/EFFCHRPV617RIN001.farc 41E91D03\nrom/auth_3d/EFFCHRPV617SAK001.farc FC0E42EA\nrom/auth_3d/EFFCHRPV617TET001.farc 9CA9ADCE\nrom/auth_3d/EFFCHRPV624EXT001.farc 22B377ED\nrom/auth_3d/EFFCHRPV624EXT002.farc F9C198D1\nrom/auth_3d/EFFCHRPV624HAK001.farc 3EA5DB1B\nrom/auth_3d/EFFCHRPV624HAK002.farc C41F0EAF\nrom/auth_3d/EFFCHRPV624KAI001.farc 54387144\nrom/auth_3d/EFFCHRPV624KAI002.farc 8CB3DC01\nrom/auth_3d/EFFCHRPV624LEN001.farc 0D656936\nrom/auth_3d/EFFCHRPV624LEN002.farc C4986826\nrom/auth_3d/EFFCHRPV624LUK001.farc 26114C9A\nrom/auth_3d/EFFCHRPV624MEI001.farc DDFC3D16\nrom/auth_3d/EFFCHRPV624MEI002.farc 58196757\nrom/auth_3d/EFFCHRPV624MIK001.farc 971A6440\nrom/auth_3d/EFFCHRPV624MIK002.farc 41F5765C\nrom/auth_3d/EFFCHRPV624NER001.farc CB0D49DE\nrom/auth_3d/EFFCHRPV624NER002.farc 370E99E5\nrom/auth_3d/EFFCHRPV624RIN001.farc CE4F052A\nrom/auth_3d/EFFCHRPV624RIN002.farc D34E520D\nrom/auth_3d/EFFCHRPV624SAK001.farc CEA0E988\nrom/auth_3d/EFFCHRPV624SAK002.farc 3B9897C4\nrom/auth_3d/EFFCHRPV624TET001.farc EF0AB355\nrom/auth_3d/EFFCHRPV624TET002.farc 13D27B23\nrom/auth_3d/EFFCHRPV630HAK001.farc 40F2AC88\nrom/auth_3d/EFFCHRPV630HAK002.farc BE401C00\nrom/auth_3d/EFFCHRPV630KAI001.farc 8F5723D4\nrom/auth_3d/EFFCHRPV630LEN001.farc 9BD6713D\nrom/auth_3d/EFFCHRPV630LEN002.farc D0FD196F\nrom/auth_3d/EFFCHRPV630LUK001.farc 2BAE4517\nrom/auth_3d/EFFCHRPV630LUK002.farc D70397B3\nrom/auth_3d/EFFCHRPV630MEI001.farc 2F4CC925\nrom/auth_3d/EFFCHRPV630MEI002.farc AFD16838\nrom/auth_3d/EFFCHRPV630MIK001.farc A421F14E\nrom/auth_3d/EFFCHRPV630MIK002.farc 19936BBF\nrom/auth_3d/EFFCHRPV630NER001.farc 8F2053A9\nrom/auth_3d/EFFCHRPV630NER002.farc 75A79608\nrom/auth_3d/EFFCHRPV630RIN001.farc C6EAF079\nrom/auth_3d/EFFCHRPV630RIN002.farc 4EEDEEBD\nrom/auth_3d/EFFCHRPV630SAK001.farc 28C1B15C\nrom/auth_3d/EFFCHRPV630SAK002.farc 1EF24B87\nrom/auth_3d/EFFCHRPV630TET001.farc E89E4B7A\nrom/auth_3d/EFFCHRPV637KAI005.farc 131FE02C\nrom/auth_3d/EFFCHRPV637LEN002.farc 764A35DC\nrom/auth_3d/EFFCHRPV637LUK003.farc DFB5597C\nrom/auth_3d/EFFCHRPV637MEI004.farc 9FF0645B\nrom/auth_3d/EFFCHRPV637MIK001.farc 7ADE5BD2\nrom/auth_3d/EFFCHRPV637MIK002.farc 2E487296\nrom/auth_3d/EFFCHRPV637MIK003.farc 6E372AAB\nrom/auth_3d/EFFCHRPV637MIK004.farc 2C541DC2\nrom/auth_3d/EFFCHRPV637MIK005.farc 0795EB26\nrom/auth_3d/EFFCHRPV637RIN001.farc F7CDEFAE\nrom/auth_3d/EFFCHRPV641HAK002.farc 386FF542\nrom/auth_3d/EFFCHRPV641HAK003.farc D093B9B7\nrom/auth_3d/EFFCHRPV641KAI002.farc D8923AB7\nrom/auth_3d/EFFCHRPV641KAI003.farc 3B6BF935\nrom/auth_3d/EFFCHRPV641LEN002.farc 94EB4E03\nrom/auth_3d/EFFCHRPV641LUK002.farc 3B4618F4\nrom/auth_3d/EFFCHRPV641LUK003.farc DD090C6F\nrom/auth_3d/EFFCHRPV641MEI002.farc FB8C80EA\nrom/auth_3d/EFFCHRPV641MEI003.farc CF0AF161\nrom/auth_3d/EFFCHRPV641MIK001.farc 289C1B41\nrom/auth_3d/EFFCHRPV641MIK002.farc BA8EEB01\nrom/auth_3d/EFFCHRPV641MIK003.farc 0D3569A9\nrom/auth_3d/EFFCHRPV641NER002.farc A38E3256\nrom/auth_3d/EFFCHRPV641NER003.farc C4BCB75A\nrom/auth_3d/EFFCHRPV641RIN002.farc 9E9DE037\nrom/auth_3d/EFFCHRPV641RIN003.farc 489A53D5\nrom/auth_3d/EFFCHRPV641SAK002.farc 66A7153E\nrom/auth_3d/EFFCHRPV641SAK003.farc AED2244F\nrom/auth_3d/EFFCHRPV641TET002.farc 5A583B37\nrom/auth_3d/EFFCHRPV641TET003.farc AF8F8DD5\nrom/auth_3d/EFFCHRPV722KAI100.farc C6A6AABB\nrom/auth_3d/EFFCHRPV722LEN100.farc 5B71EC8A\nrom/auth_3d/EFFCHRPV722LUK100.farc 75243F7F\nrom/auth_3d/EFFCHRPV722MEI100.farc 669E9430\nrom/auth_3d/EFFCHRPV722MIK100.farc 35F55992\nrom/auth_3d/EFFCHRPV722NER100.farc 26DBBA42\nrom/auth_3d/EFFCHRPV722RIN100.farc F7146F91\nrom/auth_3d/EFFCHRPV722SAK100.farc C5E6D14E\nrom/auth_3d/EFFCHRPV722TET100.farc 931939E5\nrom/auth_3d/EFFCHRPV725HAK001.farc D22DF2B9\nrom/auth_3d/EFFCHRPV725KAI001.farc 2AC6F0B3\nrom/auth_3d/EFFCHRPV725LEN001.farc 86DB1336\nrom/auth_3d/EFFCHRPV725LUK001.farc D53B5AD3\nrom/auth_3d/EFFCHRPV725MEI001.farc AE641F2A\nrom/auth_3d/EFFCHRPV725MIK001.farc 5A306AB4\nrom/auth_3d/EFFCHRPV725RIN001.farc 288FF10F\nrom/auth_3d/EFFCHRPV725SAK001.farc 5AF64D32\nrom/auth_3d/EFFCHRPV725TET001.farc 826B8C74\nrom/auth_3d/EFFCHRPV726HAK001.farc 6A7109EA\nrom/auth_3d/EFFCHRPV726HAK002.farc 709151FF\nrom/auth_3d/EFFCHRPV726KAI001.farc 071EE862\nrom/auth_3d/EFFCHRPV726KAI002.farc D3380A31\nrom/auth_3d/EFFCHRPV726LEN001.farc E8337FC9\nrom/auth_3d/EFFCHRPV726LUK001.farc 14AAD090\nrom/auth_3d/EFFCHRPV726LUK002.farc B77542F1\nrom/auth_3d/EFFCHRPV726MEI001.farc EC342F94\nrom/auth_3d/EFFCHRPV726MEI002.farc E737AD68\nrom/auth_3d/EFFCHRPV726MIK001.farc 55E678D8\nrom/auth_3d/EFFCHRPV726MIK002.farc 9B4DF05F\nrom/auth_3d/EFFCHRPV726NER001.farc 87A24376\nrom/auth_3d/EFFCHRPV726SAK001.farc D57BF68B\nrom/auth_3d/EFFCHRPV726SAK002.farc 1D4E5076\nrom/auth_3d/EFFCHRPV726TET001.farc 42A3F649\nrom/auth_3d/EFFCHRPV726TET002.farc EEE3FE8C\nrom/auth_3d/EFFCHRPV730HAK001.farc 537BF140\nrom/auth_3d/EFFCHRPV730HAK002.farc 7F2FD0B8\nrom/auth_3d/EFFCHRPV730KAI001.farc FE19777F\nrom/auth_3d/EFFCHRPV730KAI002.farc 127A4AAA\nrom/auth_3d/EFFCHRPV730LEN001.farc 1305216A\nrom/auth_3d/EFFCHRPV730LEN002.farc 14F89B2D\nrom/auth_3d/EFFCHRPV730LUK001.farc 36972BD8\nrom/auth_3d/EFFCHRPV730LUK002.farc AED4094F\nrom/auth_3d/EFFCHRPV730MEI001.farc CC525C27\nrom/auth_3d/EFFCHRPV730MEI002.farc ABC1B507\nrom/auth_3d/EFFCHRPV730MIK001.farc 57648548\nrom/auth_3d/EFFCHRPV730NER001.farc DF1206B3\nrom/auth_3d/EFFCHRPV730NER002.farc FDD5BF90\nrom/auth_3d/EFFCHRPV730RIN001.farc 747EC171\nrom/auth_3d/EFFCHRPV730RIN002.farc 3755A7BB\nrom/auth_3d/EFFCHRPV730SAK001.farc 33DE145B\nrom/auth_3d/EFFCHRPV730SAK002.farc 98F7B5CE\nrom/auth_3d/EFFCHRPV730TET001.farc C3E416B8\nrom/auth_3d/EFFCHRPV730TET002.farc 2D14E03F\nrom/auth_3d/EFFCHRPV737HAK001.farc 294FBC2F\nrom/auth_3d/EFFCHRPV737HAK002.farc C9D88161\nrom/auth_3d/EFFCHRPV737KAI001.farc BC26BCEA\nrom/auth_3d/EFFCHRPV737KAI002.farc D93EF807\nrom/auth_3d/EFFCHRPV737LEN001.farc 14097056\nrom/auth_3d/EFFCHRPV737LEN002.farc 383B4B95\nrom/auth_3d/EFFCHRPV737LUK001.farc B9F78091\nrom/auth_3d/EFFCHRPV737MEI001.farc EAF610A5\nrom/auth_3d/EFFCHRPV737MEI002.farc 74FE4A7B\nrom/auth_3d/EFFCHRPV737MIK001.farc 9590D42F\nrom/auth_3d/EFFCHRPV737MIK002.farc D06C4FB6\nrom/auth_3d/EFFCHRPV737NER001.farc 8AF3E413\nrom/auth_3d/EFFCHRPV737NER002.farc BC44041D\nrom/auth_3d/EFFCHRPV737RIN001.farc FF3CF72E\nrom/auth_3d/EFFCHRPV737RIN002.farc 453C8197\nrom/auth_3d/EFFCHRPV737SAK001.farc 6FC8AD87\nrom/auth_3d/EFFCHRPV737SAK002.farc A36CD8C8\nrom/auth_3d/EFFCHRPV737TET001.farc 8F8BF63F\nrom/auth_3d/EFFCHRPV737TET002.farc 5BEE5D3E\nrom/auth_3d/EFFCHRPV739HAK100.farc 730FA3A5\nrom/auth_3d/EFFCHRPV739KAI100.farc D5B4C1CC\nrom/auth_3d/EFFCHRPV739LEN100.farc D5EE1C34\nrom/auth_3d/EFFCHRPV739LUK100.farc 9CF0B074\nrom/auth_3d/EFFCHRPV739MIK100.farc 1952C977\nrom/auth_3d/EFFCHRPV739NER100.farc F4DC13E7\nrom/auth_3d/EFFCHRPV739RIN100.farc B7254AB4\nrom/auth_3d/EFFCHRPV739SAK100.farc 7F1B99D5\nrom/auth_3d/EFFCHRPV739TET100.farc BA5312E5\nrom/auth_3d/EFFSTGD2NS035.farc 56E7780B\nrom/auth_3d/EFFSTGD2NS036.farc 48F3CC15\nrom/auth_3d/EFFSTGD2NS037.farc 97B98D05\nrom/auth_3d/EFFSTGD2NS038.farc DD1D0848\nrom/auth_3d/EFFSTGD2NS039.farc 89D7DD5D\nrom/auth_3d/EFFSTGD2NS040.farc D12C11DE\nrom/auth_3d/EFFSTGD2NS041.farc 7AAF8E1A\nrom/auth_3d/EFFSTGD2NS042.farc 76661BE3\nrom/auth_3d/EFFSTGD2NS043.farc ACF8B360\nrom/auth_3d/EFFSTGD2NS044.farc 6A3F9079\nrom/auth_3d/EFFSTGD2NS045.farc EED96011\nrom/auth_3d/EFFSTGD2NS047.farc 656FC964\nrom/auth_3d/EFFSTGD2NS048.farc 5AC38C59\nrom/auth_3d/EFFSTGD2NS049.farc 2E71BE98\nrom/auth_3d/EFFSTGD2NS050.farc 38CEF718\nrom/auth_3d/EFFSTGD2NS051.farc 3B0EAA02\nrom/auth_3d/EFFSTGD2NS052.farc 81E60C01\nrom/auth_3d/EFFSTGD2NS053.farc 261C53E3\nrom/auth_3d/EFFSTGD2NS054.farc 04552910\nrom/auth_3d/EFFSTGD2NS055.farc 3083D881\nrom/auth_3d/EFFSTGD2NS056.farc A2D8A6E3\nrom/auth_3d/EFFSTGD2NS057.farc 52E08FAD\nrom/auth_3d/EFFSTGD2NS058.farc 81A7B12B\nrom/auth_3d/EFFSTGD2NS059.farc C4D5A892\nrom/auth_3d/EFFSTGD2NS060.farc 7127C843\nrom/auth_3d/EFFSTGD2NS061.farc 06233586\nrom/auth_3d/EFFSTGD2NS062.farc AE7802D0\nrom/auth_3d/EFFSTGD2NS064.farc D8DDD32B\nrom/auth_3d/EFFSTGD2NS065.farc F43B3F58\nrom/auth_3d/EFFSTGD2NS066.farc 776FC8F4\nrom/auth_3d/EFFSTGD2NS067.farc FBEF8588\nrom/auth_3d/EFFSTGD2NS068.farc 14C37277\nrom/auth_3d/EFFSTGD2NS069.farc 51453E7B\nrom/auth_3d/EFFSTGD2NS070.farc 21A2BE9A\nrom/auth_3d/EFFSTGD2NS071.farc D5AD75A0\nrom/auth_3d/EFFSTGD2NS072.farc 147AB236\nrom/auth_3d/EFFSTGD2NS073.farc A4A69E7E\nrom/auth_3d/EFFSTGD2NS074.farc 5D00DBC7\nrom/auth_3d/EFFSTGD2NS075.farc 87885D79\nrom/auth_3d/EFFSTGD2NS076.farc 5FD5BF99\nrom/auth_3d/EFFSTGD2NS077.farc FBA8CE5F\nrom/auth_3d/EFFSTGD2NS078.farc F04FCCD1\nrom/auth_3d/EFFSTGD2NS079.farc 597328D7\nrom/auth_3d/EFFSTGD2NS081.farc 99DE4F67\nrom/auth_3d/EFFSTGD2NS082.farc 53AE74EE\nrom/auth_3d/EFFSTGD2PV037.farc 3834E510\nrom/auth_3d/EFFSTGD2PV038.farc 43A89E70\nrom/auth_3d/EFFSTGD2PV039.farc D33529C4\nrom/auth_3d/EFFSTGD2PV040.farc E9B2E49C\nrom/auth_3d/EFFSTGD2PV041.farc 76FF7B08\nrom/auth_3d/EFFSTGD2PV042.farc E31E04D8\nrom/auth_3d/EFFSTGD2PV043.farc 5EFAEBEF\nrom/auth_3d/EFFSTGD2PV044.farc 363C03E1\nrom/auth_3d/EFFSTGD2PV045.farc FF7F790B\nrom/auth_3d/EFFSTGD2PV046.farc 329B8AFE\nrom/auth_3d/EFFSTGD2PV047.farc 09FFD3BD\nrom/auth_3d/EFFSTGD2PV048.farc 9AB62769\nrom/auth_3d/EFFSTGD2PV050.farc A9867640\nrom/auth_3d/EFFSTGD2PV051.farc 03E5FC74\nrom/auth_3d/EFFCHRPV614LUK001.farc 2EDB9186\nrom/auth_3d/EFFCHRPV617LUK001.farc CEAE38A9\nrom/auth_3d/EFFCHRPV624LUK002.farc CB9498B0\nrom/auth_3d/EFFCHRPV630KAI002.farc DDBD7883\nrom/auth_3d/EFFCHRPV630TET002.farc 3905A779\nrom/auth_3d/EFFCHRPV641LEN003.farc 2A2CB4A1\nrom/auth_3d/EFFCHRPV722HAK100.farc 3B7D1CA0\nrom/auth_3d/EFFCHRPV725NER001.farc 6687BE37\nrom/auth_3d/EFFCHRPV726RIN001.farc D77F4F98\nrom/auth_3d/EFFCHRPV730MIK002.farc 5FB23E61\nrom/auth_3d/EFFCHRPV737LUK002.farc 39D906EE\nrom/auth_3d/EFFCHRPV739MEI100.farc 447A1A16\nrom/auth_3d/EFFSTGD2NS046.farc C99F2C50\nrom/auth_3d/EFFSTGD2NS063.farc 3D57AC24\nrom/auth_3d/EFFSTGD2NS080.farc 80E1CBC6\nrom/auth_3d/EFFSTGD2PV052.farc 98E253A9\nrom/auth_3d/EFFSTGNS001.farc B912AFB2\nrom/auth_3d/EFFSTGNS018.farc 6F1F6348\nrom/auth_3d/EFFSTGNS083.farc AFF6D169\nrom/auth_3d/EFFSTGNS102.farc 853C28F7\nrom/auth_3d/EFFSTGNS120.farc F81F7332\nrom/auth_3d/EFFSTGPV005.farc C5A421FF\nrom/auth_3d/EFFSTGPV067.farc 3BC5F250\nrom/auth_3d/EFFSTGPV096.farc 537B9369\nrom/auth_3d/EFFSTGPV233.farc 776D1628\nrom/auth_3d/EFFSTGPV253.farc FC8CC520\nrom/auth_3d/EFFSTGPV604.farc 628B1393\nrom/auth_3d/EFFSTGPV622.farc ECE35007\nrom/auth_3d/EFFSTGPV723.farc 0E3A4028\nrom/auth_3d/EFFSTGTST002.farc 07BDF62F\nrom/auth_3d/EFFSTGD2PV053.farc 68AB1053\nrom/auth_3d/EFFSTGD2PV055.farc EFB3EBF6\nrom/auth_3d/EFFSTGD2PV056.farc 375F78FA\nrom/auth_3d/EFFSTGD2PV057.farc C45DFC16\nrom/auth_3d/EFFSTGD2PV058.farc 7D0A6D6D\nrom/auth_3d/EFFSTGD2PV060.farc 408CAA2D\nrom/auth_3d/EFFSTGD2PV061.farc 883F27BE\nrom/auth_3d/EFFSTGD2PV062.farc B25E5AF8\nrom/auth_3d/EFFSTGD2PV063.farc A52C311B\nrom/auth_3d/EFFSTGD2PV064.farc 6BF97759\nrom/auth_3d/EFFSTGD2PV065.farc 476F6EB4\nrom/auth_3d/EFFSTGD2PV066.farc F7323A79\nrom/auth_3d/EFFSTGD2PV208.farc 029246A8\nrom/auth_3d/EFFSTGD2PV212.farc 8FB2FDCD\nrom/auth_3d/EFFSTGD2PV213.farc 3D509180\nrom/auth_3d/EFFSTGD2PV214.farc 177EAEDC\nrom/auth_3d/EFFSTGNS002.farc 24F39D22\nrom/auth_3d/EFFSTGNS003.farc 42A642B0\nrom/auth_3d/EFFSTGNS004.farc E14182EF\nrom/auth_3d/EFFSTGNS005.farc E04A5403\nrom/auth_3d/EFFSTGNS006.farc 68B054BE\nrom/auth_3d/EFFSTGNS007.farc 6E2AF236\nrom/auth_3d/EFFSTGNS008.farc 35FB4883\nrom/auth_3d/EFFSTGNS009.farc 1256742C\nrom/auth_3d/EFFSTGNS010.farc 7EDEB50B\nrom/auth_3d/EFFSTGNS011.farc 25D1312A\nrom/auth_3d/EFFSTGNS012.farc 416A58C1\nrom/auth_3d/EFFSTGNS013.farc 87DBF99E\nrom/auth_3d/EFFSTGNS014.farc E9CC9AF1\nrom/auth_3d/EFFSTGNS015.farc B3E33E14\nrom/auth_3d/EFFSTGNS016.farc AA22A1C4\nrom/auth_3d/EFFSTGNS017.farc 0A5350F2\nrom/auth_3d/EFFSTGNS019.farc AA740CBD\nrom/auth_3d/EFFSTGNS020.farc D8E33D69\nrom/auth_3d/EFFSTGNS021.farc 102CB3F6\nrom/auth_3d/EFFSTGNS022.farc A0EB9514\nrom/auth_3d/EFFSTGNS023.farc C2BAE832\nrom/auth_3d/EFFSTGNS024.farc 284C217C\nrom/auth_3d/EFFSTGNS025.farc 1A2809C6\nrom/auth_3d/EFFSTGNS026.farc 3AED2D27\nrom/auth_3d/EFFSTGNS027.farc 63B8C81E\nrom/auth_3d/EFFSTGNS028.farc A27DC810\nrom/auth_3d/EFFSTGNS029.farc 6E017704\nrom/auth_3d/EFFSTGNS030.farc 97D0B447\nrom/auth_3d/EFFSTGNS031.farc 982FDBA7\nrom/auth_3d/EFFSTGNS032.farc 239AF751\nrom/auth_3d/EFFSTGNS033.farc 0A5AF007\nrom/auth_3d/EFFSTGNS034.farc D17D92FB\nrom/auth_3d/EFFSTGNS084.farc D09EE6E0\nrom/auth_3d/EFFSTGNS085.farc 017DBEB1\nrom/auth_3d/EFFSTGNS086.farc 781A37A5\nrom/auth_3d/EFFSTGNS087.farc C8EE8274\nrom/auth_3d/EFFSTGNS088.farc 6A24DC4B\nrom/auth_3d/EFFSTGNS089.farc C31F7676\nrom/auth_3d/EFFSTGNS090.farc D19B2995\nrom/auth_3d/EFFSTGNS091.farc 32FF1E89\nrom/auth_3d/EFFSTGNS093.farc 83C4272C\nrom/auth_3d/EFFSTGNS094.farc 00ED62FC\nrom/auth_3d/EFFSTGNS095.farc 0066C3AD\nrom/auth_3d/EFFSTGNS096.farc 8B3B4116\nrom/auth_3d/EFFSTGNS097.farc FEFC3C74\nrom/auth_3d/EFFSTGNS099.farc 69DC3BFB\nrom/auth_3d/EFFSTGNS100.farc ED88B2AC\nrom/auth_3d/EFFSTGNS101.farc 207E2AD1\nrom/auth_3d/EFFSTGNS103.farc 585411A4\nrom/auth_3d/EFFSTGNS104.farc 19491CEF\nrom/auth_3d/EFFSTGNS105.farc 29DAE468\nrom/auth_3d/EFFSTGNS106.farc D7444861\nrom/auth_3d/EFFSTGNS107.farc 848ADD64\nrom/auth_3d/EFFSTGNS108.farc 33716808\nrom/auth_3d/EFFSTGNS109.farc 10E532B2\nrom/auth_3d/EFFSTGNS111.farc 360B0E34\nrom/auth_3d/EFFSTGNS112.farc 534D174C\nrom/auth_3d/EFFSTGNS113.farc A6986CC2\nrom/auth_3d/EFFSTGNS114.farc AC8D2D58\nrom/auth_3d/EFFSTGNS115.farc 2C80ED98\nrom/auth_3d/EFFSTGNS116.farc D4A521B6\nrom/auth_3d/EFFSTGNS117.farc 9849C734\nrom/auth_3d/EFFSTGNS118.farc C17EE495\nrom/auth_3d/EFFSTGNS119.farc F27D02A5\nrom/auth_3d/EFFSTGNS121.farc E82C2B27\nrom/auth_3d/EFFSTGNS122.farc 4A181157\nrom/auth_3d/EFFSTGNS123.farc 20B16FB2\nrom/auth_3d/EFFSTGNS124.farc D2873675\nrom/auth_3d/EFFSTGNS125.farc 98828B4A\nrom/auth_3d/EFFSTGNS126.farc 063FE2A1\nrom/auth_3d/EFFSTGNS210.farc 01B9D711\nrom/auth_3d/EFFSTGNS221.farc B8EBCDB3\nrom/auth_3d/EFFSTGNS249.farc E09AD874\nrom/auth_3d/EFFSTGNS257.farc 6A640592\nrom/auth_3d/EFFSTGNS266.farc 301867A1\nrom/auth_3d/EFFSTGNS267.farc AE005E82\nrom/auth_3d/EFFSTGNS272.farc E49D885A\nrom/auth_3d/EFFSTGPV001.farc F9FEB62C\nrom/auth_3d/EFFSTGPV003.farc 96845EAB\nrom/auth_3d/EFFSTGPV004.farc 5849E0A9\nrom/auth_3d/EFFSTGPV006.farc 89F96B10\nrom/auth_3d/EFFSTGPV007.farc 593E0B3A\nrom/auth_3d/EFFSTGPV008.farc 54EF4457\nrom/auth_3d/EFFSTGPV009.farc 15840DD4\nrom/auth_3d/EFFSTGPV011.farc B4E1D0AC\nrom/auth_3d/EFFSTGPV012.farc CC586711\nrom/auth_3d/EFFSTGPV013.farc E40C05ED\nrom/auth_3d/EFFSTGPV014.farc E2E5AC21\nrom/auth_3d/EFFSTGPV015.farc A4379211\nrom/auth_3d/EFFSTGPV018.farc 146B786C\nrom/auth_3d/EFFSTGPV019.farc E77DE414\nrom/auth_3d/EFFSTGPV020.farc F8B695AE\nrom/auth_3d/EFFSTGPV022.farc C6959A68\nrom/auth_3d/EFFSTGPV024.farc D91051D8\nrom/auth_3d/EFFSTGPV025.farc CAFEE286\nrom/auth_3d/EFFSTGPV028.farc 3EADAEFC\nrom/auth_3d/EFFSTGPV079.farc D293E97C\nrom/auth_3d/EFFSTGPV081.farc B71827F1\nrom/auth_3d/EFFSTGPV082.farc CE5FAECD\nrom/auth_3d/EFFSTGPV083.farc F0F7BFB1\nrom/auth_3d/EFFSTGPV084.farc FDE8BE3C\nrom/auth_3d/EFFSTGPV085.farc 89C58918\nrom/auth_3d/EFFSTGPV086.farc 7450135A\nrom/auth_3d/EFFSTGPV087.farc 68F2F90D\nrom/auth_3d/EFFSTGPV088.farc 92DF4B2B\nrom/auth_3d/EFFSTGPV089.farc EB0A3D25\nrom/auth_3d/EFFSTGPV090.farc 05D6DC20\nrom/auth_3d/EFFSTGPV091.farc 56FEBD4B\nrom/auth_3d/EFFSTGPV092.farc EEDCF405\nrom/auth_3d/EFFSTGPV093.farc E5C7511B\nrom/auth_3d/EFFSTGPV094.farc 9D5614C9\nrom/auth_3d/EFFSTGPV095.farc FABA15D0\nrom/auth_3d/EFFSTGPV097.farc 8E420DF4\nrom/auth_3d/EFFSTGPV103.farc F25E564C\nrom/auth_3d/EFFSTGPV104.farc C59723E6\nrom/auth_3d/EFFSTGPV218.farc B2351797\nrom/auth_3d/EFFSTGPV219.farc DFFBFEA6\nrom/auth_3d/EFFSTGPV220.farc FCB28A14\nrom/auth_3d/EFFSTGPV221.farc 62EBA54B\nrom/auth_3d/EFFSTGPV222.farc CF115598\nrom/auth_3d/EFFSTGPV223.farc C69DC3CE\nrom/auth_3d/EFFSTGPV224.farc 7E468741\nrom/auth_3d/EFFSTGPV225.farc F7D14238\nrom/auth_3d/EFFSTGPV226.farc 89A43F57\nrom/auth_3d/EFFSTGPV227.farc 6BD9D3EF\nrom/auth_3d/EFFSTGPV228.farc DA57FDA9\nrom/auth_3d/EFFSTGPV231.farc 041ACC05\nrom/auth_3d/EFFSTGPV232.farc 9F15B969\nrom/auth_3d/EFFSTGPV234.farc E2CD691E\nrom/auth_3d/EFFSTGPV235.farc 82F20CB4\nrom/auth_3d/EFFSTGPV236.farc B6004989\nrom/auth_3d/EFFSTGPV238.farc 2DDE64B2\nrom/auth_3d/EFFSTGPV239.farc B4DAF769\nrom/auth_3d/EFFSTGPV240.farc DC7C0F72\nrom/auth_3d/EFFSTGPV241.farc 7BFFA12F\nrom/auth_3d/EFFSTGPV242.farc 379CDADF\nrom/auth_3d/EFFSTGPV243.farc 668DBDF2\nrom/auth_3d/EFFSTGPV244.farc A872E9BF\nrom/auth_3d/EFFSTGPV246.farc 55A9EAA4\nrom/auth_3d/EFFSTGPV247.farc 030A5522\nrom/auth_3d/EFFSTGPV248.farc D44BB66D\nrom/auth_3d/EFFSTGPV249.farc DD9FD30B\nrom/auth_3d/EFFSTGPV250.farc 8E6577F2\nrom/auth_3d/EFFSTGPV251.farc FD6858EE\nrom/auth_3d/EFFSTGPV255.farc F09AFE08\nrom/auth_3d/EFFSTGPV257.farc 5B7697F7\nrom/auth_3d/EFFSTGPV259.farc 46687791\nrom/auth_3d/EFFSTGPV260.farc 39776F5C\nrom/auth_3d/EFFSTGPV261.farc 604AC337\nrom/auth_3d/EFFSTGPV262.farc F1CAE011\nrom/auth_3d/EFFSTGPV432.farc 375F56EF\nrom/auth_3d/EFFSTGPV433.farc 235157D7\nrom/auth_3d/EFFSTGPV434.farc 54F28967\nrom/auth_3d/EFFSTGPV435.farc 223D7600\nrom/auth_3d/EFFSTGPV440.farc 6CAA4160\nrom/auth_3d/EFFSTGPV441.farc 3B53F7EA\nrom/auth_3d/EFFSTGPV600.farc A7A740A8\nrom/auth_3d/EFFSTGPV601.farc 3F46E14F\nrom/auth_3d/EFFSTGPV602.farc ADE4E5D3\nrom/auth_3d/EFFSTGPV603.farc EFF8CA4D\nrom/auth_3d/EFFSTGPV605.farc FEDCE396\nrom/auth_3d/EFFSTGPV607.farc B44CCE0B\nrom/auth_3d/EFFSTGPV608.farc 35F0BEEF\nrom/auth_3d/EFFSTGPV609.farc 3AB7D8E3\nrom/auth_3d/EFFSTGPV610.farc 29C067BA\nrom/auth_3d/EFFSTGPV611.farc 29E8D82E\nrom/auth_3d/EFFSTGPV612.farc 3245289F\nrom/auth_3d/EFFSTGPV613.farc 10A529B9\nrom/auth_3d/EFFSTGPV614.farc C65D1288\nrom/auth_3d/EFFSTGPV615.farc FFA78BA4\nrom/auth_3d/EFFSTGPV616.farc D4A74294\nrom/auth_3d/EFFSTGPV617.farc 547F5ED9\nrom/auth_3d/EFFSTGPV618.farc 2F4EE7B5\nrom/auth_3d/EFFSTGPV619.farc 2F5435F4\nrom/auth_3d/EFFSTGPV620.farc 5CFA2E7D\nrom/auth_3d/EFFSTGPV621.farc 8C4A2812\nrom/auth_3d/EFFSTGPV623.farc BC453A9F\nrom/auth_3d/EFFSTGPV624.farc F4F419CD\nrom/auth_3d/EFFSTGPV625.farc BC3DE62E\nrom/auth_3d/EFFSTGPV626.farc 4352E3BC\nrom/auth_3d/EFFSTGPV627.farc 69319D7F\nrom/auth_3d/EFFSTGPV628.farc 940EB82E\nrom/auth_3d/EFFSTGPV629.farc AD8891E0\nrom/auth_3d/EFFSTGPV630.farc 0AF7FFA6\nrom/auth_3d/EFFSTGPV631.farc C7354479\nrom/auth_3d/EFFSTGPV637.farc FE437FCB\nrom/auth_3d/EFFSTGPV638.farc CC980E20\nrom/auth_3d/EFFSTGPV639.farc 6DB65008\nrom/auth_3d/EFFSTGPV640.farc EEC9A82B\nrom/auth_3d/EFFSTGPV641.farc 0F0AC200\nrom/auth_3d/EFFSTGPV642.farc E488120F\nrom/auth_3d/EFFSTGPV710.farc C8FC43CB\nrom/auth_3d/EFFSTGPV724.farc 41FC0B93\nrom/auth_3d/EFFSTGPV725.farc 6D9EE458\nrom/auth_3d/EFFSTGPV726.farc D695C2C9\nrom/auth_3d/EFFSTGPV727.farc 0B1962B3\nrom/auth_3d/EFFSTGPV728.farc 6701B155\nrom/auth_3d/EFFSTGPV729.farc ECA237BB\nrom/auth_3d/EFFSTGPV730.farc EFFBCBC4\nrom/auth_3d/EFFSTGPV731.farc 620E1027\nrom/auth_3d/EFFSTGPV732.farc 66059D52\nrom/auth_3d/EFFSTGPV733.farc 5ACFC6F9\nrom/auth_3d/EFFSTGPV734.farc 6896719B\nrom/auth_3d/EFFSTGPV736.farc AB987FA9\nrom/auth_3d/EFFSTGPV737.farc 47461831\nrom/auth_3d/EFFSTGPV738.farc AB1D04B7\nrom/auth_3d/EFFSTGPV739.farc 92F6114C\nrom/auth_3d/EFFSTGPV740.farc B7D7A497\nrom/auth_3d/EFFSTGPV832.farc 7225B509\nrom/auth_3d/EFFSTGTST003.farc 02792A90\nrom/auth_3d/HAK.farc EDC204A8\nrom/auth_3d/ITMPV045.farc 766CF114\nrom/auth_3d/ITMPV060.farc 524E43D3\nrom/auth_3d/ITMPV084.farc E8A75380\nrom/auth_3d/ITMPV085.farc 18147358\nrom/auth_3d/ITMPV086.farc 5D916A9C\nrom/auth_3d/ITMPV088.farc AA2F99FA\nrom/auth_3d/ITMPV089.farc 8D879C00\nrom/auth_3d/ITMPV103.farc 75B4D149\nrom/auth_3d/ITMPV212.farc 8A8AF3A2\nrom/auth_3d/ITMPV218.farc 487F7FB8\nrom/auth_3d/ITMPV221.farc B054439E\nrom/auth_3d/ITMPV232.farc C98F818A\nrom/auth_3d/ITMPV233.farc 0302B8DD\nrom/auth_3d/ITMPV441.farc 68E2CD8A\nrom/auth_3d/ITMPV600.farc D785BF96\nrom/auth_3d/ITMPV602.farc 10F7CA15\nrom/auth_3d/ITMPV616.farc 4A6E050F\nrom/auth_3d/ITMPV618.farc D5FC3817\nrom/auth_3d/ITMPV619.farc 4EB891A9\nrom/auth_3d/ITMPV620.farc 51CB3A8F\nrom/auth_3d/ITMPV641.farc 809F2950\nrom/auth_3d/ITMPV725.farc 4A6CA3D9\nrom/auth_3d/ITMPV726.farc C3DDBD0D\nrom/auth_3d/ITMPV731.farc 6049B77C\nrom/auth_3d/ITMPV733.farc 6CECE044\nrom/auth_3d/ITMPV737.farc 80AA4AD0\nrom/auth_3d/KAI.farc 1294C976\nrom/auth_3d/LEN.farc AF0C0D09\nrom/auth_3d/LUK.farc 10639156\nrom/auth_3d/MEI.farc 449CE2C3\nrom/auth_3d/MIK.farc 8562956D\nrom/auth_3d/NER.farc E60D5926\nrom/auth_3d/RIN.farc DD3600C5\nrom/auth_3d/SAK.farc EE624919\nrom/ibl/pv025s20.ibl 6D59850A\nrom/ibl/aetback.ibl 4178467F\nrom/ibl/d2ns035.ibl F330EC0B\nrom/ibl/d2ns036.ibl 503302CF\nrom/ibl/d2ns037.ibl DD958334\nrom/ibl/d2ns038.ibl B7D4CF3F\nrom/ibl/d2ns039.ibl 13E036C5\nrom/ibl/d2ns040.ibl 9F9A769B\nrom/ibl/d2ns041.ibl 4C386AEE\nrom/ibl/d2ns042.ibl 165B260C\nrom/ibl/d2ns043.ibl 990C33FF\nrom/ibl/d2ns044.ibl CDFFED70\nrom/ibl/d2ns045.ibl 8F3ABF54\nrom/ibl/d2ns046.ibl 78082BAF\nrom/ibl/d2ns047.ibl 460BA1BA\nrom/ibl/d2ns048.ibl 19C78219\nrom/ibl/d2ns049.ibl 1E8E74DC\nrom/ibl/d2ns050.ibl 726E6414\nrom/ibl/d2ns051.ibl 063DA2A6\nrom/ibl/d2ns052.ibl BE924FBF\nrom/ibl/d2ns054.ibl BCD4D943\nrom/ibl/d2ns055.ibl F63FBB71\nrom/ibl/d2ns056.ibl 143B31E6\nrom/ibl/d2ns057.ibl A82BBA43\nrom/ibl/d2ns058.ibl DC84EACF\nrom/ibl/d2ns059.ibl 4614FECD\nrom/ibl/d2ns060.ibl 8B729A32\nrom/ibl/d2ns062.ibl BF4590EA\nrom/ibl/d2ns063.ibl 73DC13B7\nrom/ibl/d2ns064.ibl 9293C9B8\nrom/ibl/d2ns065.ibl 3480CA8F\nrom/ibl/d2ns066.ibl 8F3F7EAC\nrom/ibl/d2ns067.ibl 16A45151\nrom/ibl/d2ns068.ibl 385FF510\nrom/ibl/d2ns069.ibl 1F13E300\nrom/ibl/d2ns070.ibl 4D7AA345\nrom/ibl/d2ns071.ibl 4C548CCD\nrom/ibl/d2ns072.ibl 407CC1AA\nrom/ibl/d2ns074.ibl 30E5657A\nrom/ibl/d2ns075.ibl 632323E5\nrom/ibl/d2ns076.ibl 420FBF7D\nrom/ibl/d2ns077.ibl 1D181266\nrom/ibl/d2ns078.ibl 794307DE\nrom/ibl/d2ns079.ibl 40D2798D\nrom/ibl/d2ns080.ibl F5C2396A\nrom/ibl/d2ns081.ibl 45D03C55\nrom/ibl/d2ns082.ibl F4302F08\nrom/ibl/d2pv037s01.ibl 47E91BF2\nrom/ibl/d2pv037s02.ibl 8FC9A6F9\nrom/ibl/d2pv037s03.ibl E99ABDC9\nrom/ibl/d2pv038s01.ibl 893D99B7\nrom/ibl/d2pv039s01.ibl 290C3E68\nrom/ibl/d2pv039s02.ibl A36F52C5\nrom/ibl/d2pv039s03.ibl FB7E1912\nrom/ibl/d2pv040s01.ibl 5CF3D134\nrom/ibl/d2pv041s01.ibl 195D505E\nrom/ibl/d2pv042s02.ibl 3954FBFF\nrom/ibl/d2pv042s03.ibl AD17327F\nrom/ibl/d2pv042s06.ibl 3A571E2D\nrom/ibl/d2pv043s01.ibl DBBF7280\nrom/ibl/d2pv044s01.ibl ED1A7DD6\nrom/ibl/d2pv044s02.ibl 393237A2\nrom/ibl/d2pv044s03.ibl 722A185E\nrom/ibl/d2pv046s02.ibl E8119D7A\nrom/ibl/d2pv046s03.ibl CCB57F82\nrom/ibl/d2pv046s04.ibl 1455877E\nrom/ibl/d2pv046s05.ibl E40F87BC\nrom/ibl/d2pv046s06.ibl 4AC87827\nrom/ibl/d2pv047s01.ibl 42A0A909\nrom/ibl/d2pv047s02.ibl FF2D1487\nrom/ibl/d2pv047s03.ibl 98543059\nrom/ibl/d2pv047s04.ibl 6C11F2A4\nrom/ibl/d2pv047s05.ibl 80355BA9\nrom/ibl/d2pv048s01.ibl B7AAD285\nrom/ibl/d2pv050s01.ibl C4028165\nrom/ibl/d2pv051s01.ibl EA8D7AE0\nrom/ibl/d2pv051s02.ibl AC8759BB\nrom/ibl/d2pv051s03.ibl 957F396E\nrom/ibl/d2pv051s04.ibl 1BFA82AB\nrom/ibl/d2pv051s05.ibl 6307A52A\nrom/ibl/d2pv053s01.ibl 0C8C252C\nrom/ibl/d2pv053s02.ibl 7593B731\nrom/ibl/d2pv053s03.ibl EBF1C978\nrom/ibl/d2pv053s05.ibl 012EDF2B\nrom/ibl/d2pv053s06.ibl 60598563\nrom/ibl/d2pv053s09.ibl 33D2AB84\nrom/ibl/d2pv053s10.ibl 5A432033\nrom/ibl/d2pv053s15.ibl F694F8B5\nrom/ibl/d2pv055s01.ibl DAEF0705\nrom/ibl/d2pv055s02.ibl ED5B320A\nrom/ibl/d2ns053.ibl 965B88E1\nrom/ibl/d2ns073.ibl 7AAA540B\nrom/ibl/d2pv042s01.ibl 9C0E853D\nrom/ibl/d2pv047s06.ibl 2F671EDC\nrom/ibl/d2pv057s01.ibl 336753A6\nrom/ibl/d2pv065s02.ibl 27F66309\nrom/ibl/ns008.ibl CC2BAF9B\nrom/ibl/ns030.ibl 030F6C33\nrom/ibl/ns099.ibl 3C1D8783\nrom/ibl/ns119.ibl 8B8ABCA1\nrom/ibl/pv001s04.ibl DAE1B0E2\nrom/ibl/pv005s01.ibl D0B4F7F1\nrom/ibl/pv008s07.ibl 96E03307\nrom/ibl/pv013s04.ibl 347A0377\nrom/ibl/pv020s01.ibl DF1E296C\nrom/ibl/pv025s02.ibl A0A33A61\nrom/ibl/d2pv058s01.ibl 745B16AC\nrom/ibl/d2pv058s02.ibl 79C2D427\nrom/ibl/d2pv060s01.ibl BF3B4E9D\nrom/ibl/d2pv061s01.ibl B87F0802\nrom/ibl/d2pv061s02.ibl D0F1EC1A\nrom/ibl/d2pv062s01.ibl CBCB9363\nrom/ibl/d2pv063s01.ibl BF601DC1\nrom/ibl/d2pv063s02.ibl 11D2555B\nrom/ibl/d2pv063s03.ibl A0B090EA\nrom/ibl/d2pv063s04.ibl A4C02632\nrom/ibl/d2pv063s09.ibl 24AD05CC\nrom/ibl/d2pv063s10.ibl 98EEA714\nrom/ibl/d2pv063s11.ibl AF288BEB\nrom/ibl/d2pv063s12.ibl 384ACE2D\nrom/ibl/d2pv063s13.ibl 0D6EA06E\nrom/ibl/d2pv064s01.ibl F5247AC6\nrom/ibl/d2pv064s02.ibl 354B70F7\nrom/ibl/d2pv065s01.ibl 62536453\nrom/ibl/d2pv065s03.ibl BF4BA866\nrom/ibl/d2pv065s04.ibl 23668E45\nrom/ibl/d2pv065s05.ibl 0EF19CBA\nrom/ibl/d2pv065s06.ibl EB0D126B\nrom/ibl/d2pv065s07.ibl 8190189D\nrom/ibl/d2pv065s08.ibl 7A4CE838\nrom/ibl/d2pv066s01.ibl 95200790\nrom/ibl/d2pv208s01.ibl F0275461\nrom/ibl/d2pv212s01.ibl E5FA61ED\nrom/ibl/d2pv213s01.ibl A9A348FA\nrom/ibl/d2pv214s01.ibl B6C93B6A\nrom/ibl/ns001.ibl 01B5C60C\nrom/ibl/ns002.ibl F59E8432\nrom/ibl/ns003.ibl 7C67340A\nrom/ibl/ns004.ibl 5B14D6DF\nrom/ibl/ns005.ibl B8FEE450\nrom/ibl/ns006.ibl 803D2422\nrom/ibl/ns007.ibl F8A9F675\nrom/ibl/ns009.ibl A38117AD\nrom/ibl/ns010.ibl 8EE513AD\nrom/ibl/ns011.ibl 64786486\nrom/ibl/ns012.ibl CC03E057\nrom/ibl/ns013.ibl 8501C64E\nrom/ibl/ns014.ibl EAB24C2A\nrom/ibl/ns015.ibl 0EAE8CF0\nrom/ibl/ns016.ibl FE8A5E0F\nrom/ibl/ns017.ibl 886A1757\nrom/ibl/ns018.ibl 60B983FD\nrom/ibl/ns019.ibl 2320B965\nrom/ibl/ns020.ibl B79C214C\nrom/ibl/ns021.ibl 4D8CD897\nrom/ibl/ns022.ibl 1ACD1D49\nrom/ibl/ns023.ibl 3F2EFB94\nrom/ibl/ns024.ibl 0C74DB6C\nrom/ibl/ns025.ibl 7358CDF9\nrom/ibl/ns026.ibl F2413E03\nrom/ibl/ns029.ibl 70C6D602\nrom/ibl/ns031.ibl 61A7993C\nrom/ibl/ns032.ibl B3E244EE\nrom/ibl/ns033.ibl 3579EEEF\nrom/ibl/ns034.ibl 08E6C1E1\nrom/ibl/ns083.ibl 56E2BB24\nrom/ibl/ns084.ibl D34EE900\nrom/ibl/ns085.ibl 8E59CC9C\nrom/ibl/ns087.ibl 09A6730E\nrom/ibl/ns088.ibl E3F29B3D\nrom/ibl/ns089.ibl EF6064AA\nrom/ibl/ns090.ibl 37BD9F05\nrom/ibl/ns091.ibl E3058650\nrom/ibl/ns092.ibl 7A47728D\nrom/ibl/ns093.ibl BB9FA2EB\nrom/ibl/ns094.ibl 2661DF5B\nrom/ibl/ns095.ibl 9BAAC5CD\nrom/ibl/ns096.ibl F0EC7919\nrom/ibl/ns097.ibl D21DF408\nrom/ibl/ns098.ibl E4EB21C1\nrom/ibl/ns100.ibl B37E1F0B\nrom/ibl/ns101.ibl 0A2E9C90\nrom/ibl/ns102.ibl 7C829BD5\nrom/ibl/ns103.ibl A8B6BF1E\nrom/ibl/ns104.ibl DA68D279\nrom/ibl/ns105.ibl EF617C6D\nrom/ibl/ns106.ibl DDF925EB\nrom/ibl/ns107.ibl 39141DF9\nrom/ibl/ns108.ibl C30D1834\nrom/ibl/ns109.ibl 8AB9F507\nrom/ibl/ns110.ibl 4EA3EA35\nrom/ibl/ns111.ibl D968D94E\nrom/ibl/ns112.ibl B831D089\nrom/ibl/ns113.ibl E91B47D3\nrom/ibl/ns114.ibl 56100E59\nrom/ibl/ns115.ibl 63CA6447\nrom/ibl/ns116.ibl B9F9E318\nrom/ibl/ns117.ibl 98532190\nrom/ibl/ns118.ibl 7F7DFB12\nrom/ibl/ns120.ibl EEC99B9B\nrom/ibl/ns121.ibl 9B3D6BAC\nrom/ibl/ns122.ibl CF23AFBB\nrom/ibl/ns123.ibl A45C4951\nrom/ibl/ns124.ibl CB440E2D\nrom/ibl/ns125.ibl 1E625601\nrom/ibl/ns126.ibl ED08ECA0\nrom/ibl/ns221.ibl 4769E1B4\nrom/ibl/ns249.ibl 03E17F63\nrom/ibl/ns257.ibl CD7EC128\nrom/ibl/ns263.ibl 977C7E76\nrom/ibl/ns266.ibl 39386172\nrom/ibl/ns267.ibl 59CAAB75\nrom/ibl/ns272.ibl B44A688E\nrom/ibl/ns292.ibl CAC6CD31\nrom/ibl/pv001s01.ibl 691FC482\nrom/ibl/pv001s02.ibl 1EB98615\nrom/ibl/pv001s03.ibl FCC5E524\nrom/ibl/pv001s05.ibl FAB3AA48\nrom/ibl/pv001s06.ibl 88D5BDDC\nrom/ibl/pv001s07.ibl 10274D6F\nrom/ibl/pv003s01.ibl 5D026EF1\nrom/ibl/pv003s02.ibl CC463063\nrom/ibl/pv003s03.ibl A0BCE0E4\nrom/ibl/pv003s04.ibl 7C4369C9\nrom/ibl/pv003s05.ibl 76A99791\nrom/ibl/pv003s06.ibl 69969579\nrom/ibl/pv003s07.ibl 637C6B21\nrom/ibl/pv003s08.ibl 00BF6269\nrom/ibl/pv003s09.ibl F4006D99\nrom/ibl/pv004s01.ibl 3DE21683\nrom/ibl/pv004s02.ibl 6D22FE25\nrom/ibl/pv004s05.ibl EE84E6EF\nrom/ibl/pv004s06.ibl 8334906B\nrom/ibl/pv004s07.ibl 7C5553B4\nrom/ibl/pv005s04.ibl 0028F5CE\nrom/ibl/pv005s06.ibl AFF2BDEF\nrom/ibl/pv006s02.ibl 510C0D80\nrom/ibl/pv007s01.ibl 760A7672\nrom/ibl/pv007s02.ibl F35207E1\nrom/ibl/pv007s03.ibl 3FDF0959\nrom/ibl/pv007s04.ibl 844A1925\nrom/ibl/pv007s05.ibl 529A3DBD\nrom/ibl/pv007s06.ibl 3F2A4B39\nrom/ibl/pv007s07.ibl 7CE33BA6\nrom/ibl/pv007s08.ibl AD6A31AF\nrom/ibl/pv007s09.ibl 3F2AE1EC\nrom/ibl/pv007s10.ibl 83C98266\nrom/ibl/pv007s11.ibl C8DC18B6\nrom/ibl/pv007s12.ibl DFBF4015\nrom/ibl/pv008s01.ibl ECBC7BC6\nrom/ibl/pv008s03.ibl D2716AD6\nrom/ibl/pv008s08.ibl 6A3851FF\nrom/ibl/pv008s09.ibl 802B7832\nrom/ibl/pv008s10.ibl DFEF4C40\nrom/ibl/pv009s02.ibl 0E3D9FD8\nrom/ibl/pv009s03.ibl 50DA5340\nrom/ibl/pv009s04.ibl 4ADDDE4F\nrom/ibl/pv009s05.ibl 5FC7BE5E\nrom/ibl/pv009s08.ibl 879DC276\nrom/ibl/pv009s09.ibl F2CAA75B\nrom/ibl/pv011s01.ibl 4F58605C\nrom/ibl/pv011s02.ibl 048984D6\nrom/ibl/pv011s03.ibl 5F8E8BCD\nrom/ibl/pv011s04.ibl 5FA0E001\nrom/ibl/pv011s06.ibl 626BD044\nrom/ibl/pv013s01.ibl 9AA582B2\nrom/ibl/pv013s02.ibl FF10FDF1\nrom/ibl/pv013s03.ibl C16D17BD\nrom/ibl/pv014s01.ibl F4F803EB\nrom/ibl/pv015s01.ibl AE0BD7CB\nrom/ibl/pv015s02.ibl 1E70B84F\nrom/ibl/pv015s03.ibl 6CAFCB4D\nrom/ibl/pv015s05.ibl FC0EFA3E\nrom/ibl/pv018s05.ibl FB7D9433\nrom/ibl/pv018s06.ibl 95B7ADBB\nrom/ibl/pv018s07.ibl 354528C3\nrom/ibl/pv018s08.ibl 01030A19\nrom/ibl/pv018s09.ibl DBA6297C\nrom/ibl/pv019s03.ibl 259690FA\nrom/ibl/pv019s04.ibl 77AEF5FD\nrom/ibl/pv019s08.ibl 92F00BE8\nrom/ibl/pv019s09.ibl 945EED0A\nrom/ibl/pv019s11.ibl 356C2F0E\nrom/ibl/pv019s13.ibl 510612DB\nrom/ibl/pv019s14.ibl E5F02D31\nrom/ibl/pv020s02.ibl 280E1826\nrom/ibl/pv020s03.ibl 7AFE08E0\nrom/ibl/pv024s01.ibl D605A2CA\nrom/ibl/pv024s02.ibl 86C54A6C\nrom/ibl/pv024s03.ibl CC3FA259\nrom/ibl/pv024s04.ibl 00412BCF\nrom/ibl/pv024s05.ibl CB5F6D91\nrom/ibl/pv024s06.ibl 659C3CDD\nrom/ibl/pv024s07.ibl 1C04C752\nrom/ibl/pv024s08.ibl C58C8FAE\nrom/ibl/pv024s09.ibl F5CCD7CC\nrom/ibl/pv024s10.ibl 843BBCEB\nrom/ibl/pv024s11.ibl 96E4C22E\nrom/ibl/pv024s12.ibl B5F22249\nrom/ibl/pv024s13.ibl 4EE6EBF9\nrom/ibl/pv024s14.ibl 5861B67E\nrom/ibl/pv025s01.ibl 170CA7C1\nrom/ibl/pv025s03.ibl 7712E975\nrom/ibl/pv025s04.ibl 9C87E303\nrom/ibl/pv025s05.ibl 90B7B631\nrom/ibl/pv025s06.ibl C4170889\nrom/ibl/pv025s07.ibl E0360BFF\nrom/ibl/pv025s08.ibl 38806C27\nrom/ibl/pv025s09.ibl 6A438782\nrom/ibl/pv025s10.ibl 525462EE\nrom/ibl/pv025s11.ibl DF707781\nrom/ibl/pv025s12.ibl 6D4DB340\nrom/ibl/pv025s13.ibl 349CB2EB\nrom/ibl/pv025s14.ibl 87361514\nrom/ibl/pv025s15.ibl 180284BF\nrom/ibl/pv025s16.ibl 09D05327\nrom/ibl/pv025s17.ibl 00BCDEC0\nrom/ibl/pv025s18.ibl AA60F7A2\nrom/ibl/pv025s19.ibl A30C7A45\nrom/ibl/pv025s21.ibl 2C89D977\nrom/ibl/pv025s22.ibl 6E5F1471\nrom/ibl/pv025s23.ibl 2E44CFA0\nrom/ibl/pv025s24.ibl 002F03A0\nrom/ibl/pv025s25.ibl 3335135B\nrom/ibl/pv025s26.ibl 23D10F5B\nrom/ibl/pv025s27.ibl 3CFBD290\nrom/ibl/pv028s01.ibl 7BAC5C4F\nrom/ibl/pv079s01.ibl E427BF7B\nrom/ibl/pv081s01.ibl 828BEBFE\nrom/ibl/pv081s02.ibl E60A00BF\nrom/ibl/pv081s03.ibl 85B8E15C\nrom/ibl/pv081s04.ibl CE4C30FF\nrom/ibl/pv081s05.ibl 19ED185F\nrom/ibl/pv081s06.ibl EB4AD6E4\nrom/ibl/pv081s07.ibl F93E8508\nrom/ibl/pv081s08.ibl 8353B828\nrom/ibl/pv081s10.ibl B8CD6269\nrom/ibl/pv081s11.ibl 578A3293\nrom/ibl/pv081s12.ibl 56DECB56\nrom/ibl/pv082s61.ibl 4F263D28\nrom/ibl/pv082s62.ibl 4F263D28\nrom/ibl/pv082s63.ibl 4F263D28\nrom/ibl/pv082s64.ibl 4F263D28\nrom/ibl/pv082s65.ibl 4F263D28\nrom/ibl/pv083s01.ibl C86AE535\nrom/ibl/pv083s02.ibl F1644446\nrom/ibl/pv083s03.ibl AB42A6B4\nrom/ibl/pv083s04.ibl 499B52FA\nrom/ibl/pv083s05.ibl EC532123\nrom/ibl/pv083s07.ibl D6CEDCBB\nrom/ibl/pv083s08.ibl 8EEDDB47\nrom/ibl/pv083s14.ibl B3458652\nrom/ibl/pv083s18.ibl 0EC2DE73\nrom/ibl/pv083s25.ibl 7C10B814\nrom/ibl/pv083s26.ibl D48DF4A6\nrom/ibl/pv083s27.ibl DFBF1CCB\nrom/ibl/pv083s28.ibl A568745D\nrom/ibl/pv084s01.ibl 4DDE4A21\nrom/ibl/pv085s01.ibl 18C33455\nrom/ibl/pv086s01.ibl A2F85F3F\nrom/ibl/pv086s02.ibl 8C878A5D\nrom/ibl/pv087s01.ibl F4EEA3D6\nrom/ibl/pv087s02.ibl C5B4AE8A\nrom/ibl/pv087s16.ibl A9B24BF8\nrom/ibl/pv087s17.ibl 2EA753ED\nrom/ibl/pv088s01.ibl 59DC3A3B\nrom/ibl/pv088s02.ibl C34EFE27\nrom/ibl/pv088s11.ibl E08D9A3B\nrom/ibl/pv088s12.ibl 466A850C\nrom/ibl/pv088s14.ibl D0D5BD23\nrom/ibl/pv089s02.ibl ED8AC0AE\nrom/ibl/pv089s03.ibl 47CD1D4C\nrom/ibl/pv089s05.ibl 91AFAF4C\nrom/ibl/pv090s01.ibl 95982749\nrom/ibl/pv090s02.ibl 9C939BAC\nrom/ibl/pv091s01.ibl A8C9AEFA\nrom/ibl/pv091s02.ibl CD538D96\nrom/ibl/pv091s03.ibl 7504E667\nrom/ibl/pv091s04.ibl E8801354\nrom/ibl/pv091s09.ibl 76DADCFB\nrom/ibl/pv091s10.ibl 6507CB84\nrom/ibl/pv091s13.ibl 69956DF7\nrom/ibl/pv091s14.ibl BB22205E\nrom/ibl/pv091s15.ibl 217FA3E0\nrom/ibl/pv092s01.ibl 57BFB9BF\nrom/ibl/pv092s02.ibl 1E0CCDF7\nrom/ibl/pv092s05.ibl 916042D8\nrom/ibl/pv092s09.ibl EEE38567\nrom/ibl/pv092s10.ibl 92ECE857\nrom/ibl/pv092s11.ibl 248A8732\nrom/ibl/pv092s12.ibl 7B88A581\nrom/ibl/pv094s01.ibl 6458303F\nrom/ibl/pv094s02.ibl F65A16D8\nrom/ibl/pv094s16.ibl 97A9DCD0\nrom/ibl/pv094s17.ibl 0215F42E\nrom/ibl/pv094s18.ibl 2A047020\nrom/ibl/pv096s01.ibl C40E40BC\nrom/ibl/pv097s01.ibl 0FF5B432\nrom/ibl/pv103s01.ibl DCD8A91D\nrom/ibl/pv104s01.ibl 5D38F454\nrom/ibl/pv104s02.ibl 8D0E6E82\nrom/ibl/pv104s03.ibl C2E3E730\nrom/ibl/pv104s04.ibl F6125D6F\nrom/ibl/pv218s01.ibl 61EDD513\nrom/ibl/pv218s03.ibl 127B5627\nrom/ibl/pv218s04.ibl 8BADBCBC\nrom/ibl/pv219s01.ibl FF372483\nrom/ibl/pv219s02.ibl BE70086B\nrom/ibl/pv219s03.ibl 76FCE3C1\nrom/ibl/pv219s04.ibl 200F0A53\nrom/ibl/pv219s05.ibl 0F204B9A\nrom/ibl/pv219s07.ibl BF4F72D0\nrom/ibl/pv219s08.ibl 309DE29C\nrom/ibl/pv219s09.ibl 84E9ACD5\nrom/ibl/pv219s10.ibl 78A8B2DC\nrom/ibl/pv219s11.ibl 160C7FA3\nrom/ibl/pv219s12.ibl 244AE1EB\nrom/ibl/pv219s13.ibl 2A0BA6F4\nrom/ibl/pv219s14.ibl 4E4BC50A\nrom/ibl/pv220s01.ibl DC9AE1F5\nrom/ibl/pv220s02.ibl 118A5FAE\nrom/ibl/pv221s03.ibl CE3D4245\nrom/ibl/pv221s04.ibl BBA303EB\nrom/ibl/pv221s05.ibl 657AC024\nrom/ibl/pv221s06.ibl DD618234\nrom/ibl/pv221s07.ibl E36112BA\nrom/ibl/pv221s08.ibl D549B691\nrom/ibl/pv221s09.ibl 8326FCE5\nrom/ibl/pv221s10.ibl DB73F806\nrom/ibl/pv221s11.ibl 63E7974D\nrom/ibl/pv221s14.ibl 8ED52513\nrom/ibl/pv222s01.ibl E207D031\nrom/ibl/pv222s02.ibl 0B7BBF27\nrom/ibl/pv223s01.ibl 9BF973A7\nrom/ibl/pv223s02.ibl 7C96DA2B\nrom/ibl/pv223s03.ibl 825C5BB3\nrom/ibl/pv223s04.ibl AA10C409\nrom/ibl/pv223s05.ibl 30DA4868\nrom/ibl/pv223s07.ibl AE61329E\nrom/ibl/pv223s08.ibl C9CD6BE8\nrom/ibl/pv223s09.ibl 98A1B156\nrom/ibl/pv223s10.ibl A52F6DD5\nrom/ibl/pv224s01.ibl 9ECF3055\nrom/ibl/pv224s02.ibl BC5B8562\nrom/ibl/pv224s03.ibl 182DF716\nrom/ibl/pv225s01.ibl B6F360EA\nrom/ibl/pv225s02.ibl 81AC64B0\nrom/ibl/pv225s03.ibl 808759EF\nrom/ibl/pv226s01.ibl 3AD23A1B\nrom/ibl/pv227s01.ibl BC61F210\nrom/ibl/pv228s01.ibl 6F36D651\nrom/ibl/pv228s02.ibl BF004C87\nrom/ibl/pv228s03.ibl FAC5F9BE\nrom/ibl/pv228s04.ibl C41C7F6A\nrom/ibl/pv231s01.ibl D84AD6E5\nrom/ibl/pv231s03.ibl E77AFF48\nrom/ibl/pv231s04.ibl 3822CF3D\nrom/ibl/pv231s05.ibl A62A85BF\nrom/ibl/pv231s06.ibl 0712E690\nrom/ibl/pv231s07.ibl F5327166\nrom/ibl/pv232s01.ibl B4DF48F9\nrom/ibl/pv232s02.ibl F5B47CFD\nrom/ibl/pv232s03.ibl BE143D53\nrom/ibl/pv233s01.ibl 3ACAD409\nrom/ibl/pv233s02.ibl 52CB897E\nrom/ibl/pv233s03.ibl 50F52948\nrom/ibl/pv233s04.ibl 6A2EA342\nrom/ibl/pv233s05.ibl C4C0FB15\nrom/ibl/pv233s06.ibl 921AC60F\nrom/ibl/pv233s07.ibl 62E850BC\nrom/ibl/pv233s08.ibl 358BEC4B\nrom/ibl/pv234s01.ibl 5F34ADE7\nrom/ibl/pv235s01.ibl 9021B69F\nrom/ibl/pv235s02.ibl C99827E1\nrom/ibl/pv235s03.ibl ED0ABC04\nrom/ibl/pv235s04.ibl 57B5634C\nrom/ibl/pv235s05.ibl 99B53E7E\nrom/ibl/pv235s06.ibl EF7E859A\nrom/ibl/pv235s07.ibl 01E24004\nrom/ibl/pv235s08.ibl 20507D21\nrom/ibl/pv235s09.ibl 6A1DE306\nrom/ibl/pv236s01.ibl B79CB1DC\nrom/ibl/pv236s02.ibl 45419B47\nrom/ibl/pv236s03.ibl 2680CD6D\nrom/ibl/pv236s04.ibl FCED6E13\nrom/ibl/pv236s05.ibl 5E7A48B6\nrom/ibl/pv236s06.ibl CD367E6F\nrom/ibl/pv236s07.ibl 44426A17\nrom/ibl/pv238s01.ibl 8D7237E7\nrom/ibl/pv240s01.ibl B1BB4C0A\nrom/ibl/pv240s02.ibl B9DE6304\nrom/ibl/pv240s03.ibl 41DF098A\nrom/ibl/pv241s01.ibl 74585D0F\nrom/ibl/pv241s02.ibl 458B5DB4\nrom/ibl/pv243s01.ibl 954B1198\nrom/ibl/pv244s01.ibl 9472F5DC\nrom/ibl/pv244s02.ibl 30775035\nrom/ibl/pv246s01.ibl FE47545F\nrom/ibl/pv248s01.ibl A63D038E\nrom/ibl/pv248s05.ibl DC926F80\nrom/ibl/pv250s01.ibl DEE405F6\nrom/ibl/pv251s01.ibl 6D7FE7CD\nrom/ibl/pv251s02.ibl D59C6244\nrom/ibl/pv251s03.ibl 16E93617\nrom/ibl/pv251s04.ibl B78B44B5\nrom/ibl/pv251s05.ibl 367990E1\nrom/ibl/pv251s07.ibl E4A2901F\nrom/ibl/pv253s01.ibl C038EC2B\nrom/ibl/pv253s02.ibl E532575C\nrom/ibl/pv253s03.ibl 4F1B3C4E\nrom/ibl/pv253s04.ibl AF2721B2\nrom/ibl/pv253s05.ibl 050E4AA0\nrom/ibl/pv253s06.ibl 2004F1D7\nrom/ibl/pv253s07.ibl 8A2D9AC5\nrom/ibl/pv253s08.ibl 3B0DCC6E\nrom/ibl/pv253s09.ibl 9124A77C\nrom/ibl/pv255s01.ibl 2A2AE1E2\nrom/ibl/pv257s01.ibl 905306A8\nrom/ibl/pv262s03.ibl 0A13E161\nrom/ibl/pv432s01.ibl 9D226B21\nrom/ibl/pv432s02.ibl 05D27EF0\nrom/ibl/pv432s03.ibl DB6CF1FD\nrom/ibl/pv433s01.ibl A171F2F3\nrom/ibl/pv433s03.ibl CB74ED7B\nrom/ibl/pv433s04.ibl 81079625\nrom/ibl/pv433s05.ibl CEDBF382\nrom/ibl/pv433s06.ibl 48443D8F\nrom/ibl/pv434s01.ibl 3BEAC906\nrom/ibl/pv435s01.ibl 2CEE71C4\nrom/ibl/pv435s02.ibl 0273E43C\nrom/ibl/pv435s03.ibl A0230396\nrom/ibl/pv435s04.ibl 45A96976\nrom/ibl/pv435s05.ibl 76690D7A\nrom/ibl/pv435s06.ibl 2A05EAFE\nrom/ibl/pv435s07.ibl E5013828\nrom/ibl/pv435s08.ibl CE9453CA\nrom/ibl/pv441s01.ibl 88D5E7CA\nrom/ibl/pv600s01.ibl 82617777\nrom/ibl/pv600s02.ibl 1C878BB5\nrom/ibl/pv600s03.ibl 1266BDBC\nrom/ibl/pv601s01.ibl 8B527E39\nrom/ibl/pv601s02.ibl 8831F008\nrom/ibl/pv601s03.ibl EACD0385\nrom/ibl/pv601s04.ibl BFCC04C5\nrom/ibl/pv602s01.ibl B5C21FE2\nrom/ibl/pv602s02.ibl 10B71262\nrom/ibl/pv602s03.ibl 3806149D\nrom/ibl/pv602s04.ibl 1D0A072B\nrom/ibl/pv603s01.ibl 3D3A4464\nrom/ibl/pv604s07.ibl 01F745D0\nrom/ibl/pv605s01.ibl 64B525BA\nrom/ibl/pv605s02.ibl 5B28E1B2\nrom/ibl/pv605s05.ibl 5218794A\nrom/ibl/pv607s01.ibl 29D10A4F\nrom/ibl/pv608s01.ibl E737060F\nrom/ibl/pv609s01.ibl 732AC7BC\nrom/ibl/pv609s03.ibl D4257930\nrom/ibl/pv610s02.ibl 597C61B5\nrom/ibl/pv611s01.ibl 83DF7917\nrom/ibl/pv612s01.ibl 9116DBD2\nrom/ibl/pv612s02.ibl B2FFE574\nrom/ibl/pv612s03.ibl 8714873C\nrom/ibl/pv612s04.ibl C72423EF\nrom/ibl/pv613s01.ibl 262148C0\nrom/ibl/pv613s02.ibl B6B71FDF\nrom/ibl/pv613s03.ibl BBB5A3EB\nrom/ibl/pv614s01.ibl DDFC7E94\nrom/ibl/pv614s05.ibl 4FD3CC59\nrom/ibl/pv615s01.ibl 51B28006\nrom/ibl/pv616s01.ibl 1DBAEA16\nrom/ibl/pv616s02.ibl 764EE2DE\nrom/ibl/pv616s03.ibl 3D2F0E16\nrom/ibl/pv617s01.ibl 3603F6BE\nrom/ibl/pv617s02.ibl 78D2DFA0\nrom/ibl/pv619s02.ibl 3627A9C0\nrom/ibl/pv619s03.ibl 6ADB5B66\nrom/ibl/pv619s04.ibl 96C6F4DF\nrom/ibl/pv620s01.ibl BFF56741\nrom/ibl/pv621s01.ibl A9C7FC11\nrom/ibl/pv622s01.ibl 9948A050\nrom/ibl/pv623s01.ibl 83336D5D\nrom/ibl/pv623s02.ibl 38232D43\nrom/ibl/pv625s01.ibl 55E55F68\nrom/ibl/pv625s03.ibl C18D6454\nrom/ibl/pv626s01.ibl 36DE8126\nrom/ibl/pv628s01.ibl A8B5873B\nrom/ibl/pv629s01.ibl C45F6B5F\nrom/ibl/pv630s01.ibl 133A2902\nrom/ibl/pv630s02.ibl 0056192A\nrom/ibl/pv630s03.ibl 26CC207C\nrom/ibl/pv630s04.ibl 253DFCE5\nrom/ibl/pv631s01.ibl F37A9DC1\nrom/ibl/pv637s01.ibl E5828779\nrom/ibl/pv637s02.ibl 16D7EECB\nrom/ibl/pv638s01.ibl 573DD586\nrom/ibl/pv638s02.ibl 84F72534\nrom/ibl/pv639s01.ibl CCA311FF\nrom/ibl/pv639s02.ibl 6A32EC1F\nrom/ibl/pv639s03.ibl B3284A7C\nrom/ibl/pv639s05.ibl B0C61271\nrom/ibl/pv640s01.ibl 133F84BB\nrom/ibl/pv640s02.ibl 6EDBA192\nrom/ibl/pv641s01.ibl 52C2E7FD\nrom/ibl/pv642s01.ibl 6187BE45\nrom/ibl/pv722s01.ibl 9FDC5C51\nrom/ibl/pv722s02.ibl 7078031B\nrom/ibl/pv723s01.ibl B4036EA7\nrom/ibl/pv725s01.ibl 36AD7EB8\nrom/ibl/pv725s02.ibl BC4490EA\nrom/ibl/pv727s02.ibl AD9D785A\nrom/ibl/pv728s03.ibl 1FA26273\nrom/ibl/pv729s01.ibl 56732274\nrom/ibl/pv729s03.ibl DF519FA9\nrom/ibl/pv732s01.ibl 986ED4C9\nrom/ibl/pv734s05.ibl 1C773267\nrom/ibl/pv736s01.ibl E23A07F0\nrom/ibl/pv737s01.ibl 49FFA7AC\nrom/ibl/pv737s02.ibl 78C02F78\nrom/ibl/pv738s01.ibl 38049734\nrom/ibl/pv739s01.ibl 51BD8906\nrom/ibl/selpvback.ibl 0D56ED9E\nrom/ibl/tst.ibl 9BEEB7F4\nrom/ibl/tst001.ibl 0039ACDB\nrom/ibl/tst002.ibl 743C9BF9\nrom/ibl/tst006.ibl 2B73D816\nrom/ibl/tst007.ibl 4CAFB5B2\nrom/ibl/tst008.ibl 6683F6D0\nrom/ibl/tst009.ibl 1B6BE303\nrom/ibl/tst010.ibl ADFC5F79\nrom/ibl/pv081s09.ibl 1DF3F015\nrom/ibl/pv083s24.ibl BEC8FFEC\nrom/ibl/pv089s01.ibl 8D048949\nrom/ibl/pv092s07.ibl 2698C5A1\nrom/ibl/pv218s02.ibl 6C734D80\nrom/ibl/pv220s03.ibl 21E1F90B\nrom/ibl/pv223s06.ibl E8D5C07D\nrom/ibl/pv231s02.ibl 155A68BE\nrom/ibl/pv234s02.ibl 55CB6435\nrom/ibl/pv239s01.ibl 7D121032\nrom/ibl/pv251s06.ibl 0FB25B5C\nrom/ibl/pv433s02.ibl CF20A228\nrom/ibl/pv600s04.ibl AE33D397\nrom/ibl/pv610s01.ibl 9FBB004E\nrom/ibl/pv619s01.ibl 35A1B1F8\nrom/ibl/pv630s05.ibl 25ADB8D6\nrom/ibl/pv726s01.ibl F6F6ACF3\nrom/light_param/face_d2ns035.txt 4954B23E\nrom/light_param/face_d2ns036.txt 32376B86\nrom/light_param/face_d2ns037.txt 32376B86\nrom/light_param/face_d2ns038.txt C4F0D8F6\nrom/light_param/face_d2ns039.txt F941342A\nrom/light_param/face_d2ns040.txt 4954B23E\nrom/light_param/face_d2ns041.txt C4F0D8F6\nrom/light_param/face_d2ns042.txt 4954B23E\nrom/light_param/face_d2ns043.txt C4F0D8F6\nrom/light_param/face_d2ns046.txt 32376B86\nrom/light_param/face_d2ns047.txt 4954B23E\nrom/light_param/face_d2ns048.txt 4954B23E\nrom/light_param/face_d2ns049.txt 32376B86\nrom/light_param/face_d2ns050.txt 4954B23E\nrom/light_param/face_d2ns051.txt C4F0D8F6\nrom/light_param/face_d2ns052.txt 74E55EE2\nrom/light_param/face_d2ns054.txt 4954B23E\nrom/light_param/face_d2ns055.txt F941342A\nrom/light_param/face_d2ns059.txt 4954B23E\nrom/light_param/face_d2ns060.txt 4954B23E\nrom/light_param/face_d2ns065.txt 74E55EE2\nrom/light_param/face_d2ns067.txt F7EF1A95\nrom/light_param/face_d2ns070.txt 74E55EE2\nrom/light_param/face_d2ns071.txt F941342A\nrom/light_param/face_d2ns072.txt 4954B23E\nrom/light_param/face_d2ns073.txt C4F0D8F6\nrom/light_param/face_d2ns079.txt C4F0D8F6\nrom/light_param/face_d2ns080.txt 74E55EE2\nrom/light_param/face_d2ns081.txt 4954B23E\nrom/light_param/face_d2ns082.txt C4F0D8F6\nrom/light_param/face_d2pv037s01.txt 4954B23E\nrom/light_param/face_d2pv038s01.txt 78B73586\nrom/light_param/face_d2pv043s01.txt 4954B23E\nrom/light_param/face_d2pv044s01.txt 32376B86\nrom/light_param/face_d2pv044s02.txt 4954B23E\nrom/light_param/face_d2pv046s03.txt 4954B23E\nrom/light_param/face_d2pv046s04.txt 4954B23E\nrom/light_param/face_d2pv046s05.txt F941342A\nrom/light_param/face_d2pv047s01.txt 4954B23E\nrom/light_param/face_d2pv047s02.txt 4954B23E\nrom/light_param/face_d2pv047s03.txt F941342A\nrom/light_param/face_d2pv047s04.txt F941342A\nrom/light_param/face_d2pv047s05.txt F941342A\nrom/light_param/face_d2pv051s01.txt 4954B23E\nrom/light_param/face_d2pv051s02.txt 4954B23E\nrom/light_param/face_d2pv051s03.txt 74E55EE2\nrom/light_param/face_d2pv051s04.txt 4954B23E\nrom/light_param/face_d2pv051s05.txt 4954B23E\nrom/light_param/face_d2pv057s01.txt F7EF1A95\nrom/light_param/face_d2pv060s01.txt F941342A\nrom/light_param/face_d2pv061s01.txt 74E55EE2\nrom/light_param/face_d2pv061s02.txt 4954B23E\nrom/light_param/face_d2pv063s11.txt 8222ED92\nrom/light_param/face_d2pv064s01.txt 32376B86\nrom/light_param/face_d2pv065s01.txt C4F0D8F6\nrom/light_param/face_d2pv065s02.txt 74E55EE2\nrom/light_param/face_d2pv065s03.txt 74E55EE2\nrom/light_param/face_d2pv065s04.txt 74E55EE2\nrom/light_param/face_d2pv065s06.txt C4F0D8F6\nrom/light_param/face_d2pv065s07.txt 74E55EE2\nrom/light_param/face_d2pv066s01.txt 74E55EE2\nrom/light_param/face_ns002.txt 4954B23E\nrom/light_param/face_ns003.txt 4954B23E\nrom/light_param/face_ns005.txt 4954B23E\nrom/light_param/face_ns013.txt 3126AB93\nrom/light_param/face_d2ns053.txt F941342A\nrom/light_param/face_d2pv039s03.txt C4F0D8F6\nrom/light_param/face_d2pv055s01.txt 74E55EE2\nrom/light_param/face_ns014.txt 4954B23E\nrom/light_param/face_ns120.txt CB9DFC3A\nrom/light_param/face_pv024s03.txt 74E55EE2\nrom/light_param/face_pv025s12.txt F41D92CE\nrom/light_param/face_pv083s05.txt 3978E7FB\nrom/light_param/face_pv092s09.txt 4954B23E\nrom/light_param/face_pv233s03.txt EC708E31\nrom/light_param/fog_d2ns036.txt 9EFBCC96\nrom/light_param/fog_d2ns058.txt E2C8A858\nrom/light_param/fog_d2ns080.txt DA510E7C\nrom/light_param/fog_d2pv047s01.txt 7C6F3887\nrom/light_param/fog_d2pv058s01.txt A2B2A6AE\nrom/light_param/face_ns020.txt 3F91CF1F\nrom/light_param/face_ns024.txt 6B3194F5\nrom/light_param/face_ns030.txt 36648A46\nrom/light_param/face_ns033.txt 4954B23E\nrom/light_param/face_ns084.txt 4954B23E\nrom/light_param/face_ns088.txt 4954B23E\nrom/light_param/face_ns098.txt F9F69735\nrom/light_param/face_ns099.txt 3978E7FB\nrom/light_param/face_ns101.txt EC581E7A\nrom/light_param/face_ns103.txt BF93014E\nrom/light_param/face_ns104.txt EC581E7A\nrom/light_param/face_ns105.txt EC581E7A\nrom/light_param/face_ns111.txt F941342A\nrom/light_param/face_ns112.txt 74E55EE2\nrom/light_param/face_ns115.txt 74E55EE2\nrom/light_param/face_ns116.txt 4954B23E\nrom/light_param/face_ns117.txt 4954B23E\nrom/light_param/face_ns123.txt 4954B23E\nrom/light_param/face_ns124.txt 4954B23E\nrom/light_param/face_ns125.txt BF93014E\nrom/light_param/face_ns249.txt 4954B23E\nrom/light_param/face_ns272.txt 3F91CF1F\nrom/light_param/face_pv004s05.txt 7EA4FEFA\nrom/light_param/face_pv004s07.txt 339902FD\nrom/light_param/face_pv007s07.txt C4F0D8F6\nrom/light_param/face_pv009s01.txt C4F0D8F6\nrom/light_param/face_pv009s02.txt 32376B86\nrom/light_param/face_pv009s04.txt 4954B23E\nrom/light_param/face_pv009s10.txt 32376B86\nrom/light_param/face_pv015s01.txt 32376B86\nrom/light_param/face_pv020s01.txt 32376B86\nrom/light_param/face_pv020s02.txt 32376B86\nrom/light_param/face_pv020s03.txt 32376B86\nrom/light_param/face_pv024s07.txt 34A81DEE\nrom/light_param/face_pv024s08.txt 32376B86\nrom/light_param/face_pv024s11.txt 74E55EE2\nrom/light_param/face_pv024s12.txt BFB5DBCD\nrom/light_param/face_pv024s13.txt A10F6766\nrom/light_param/face_pv024s14.txt 92AD589E\nrom/light_param/face_pv025s01.txt 85544DBB\nrom/light_param/face_pv025s02.txt AE7CADAE\nrom/light_param/face_pv025s03.txt 698796CD\nrom/light_param/face_pv025s04.txt 63D49220\nrom/light_param/face_pv025s06.txt 32376B86\nrom/light_param/face_pv025s07.txt 58278C60\nrom/light_param/face_pv025s08.txt 32376B86\nrom/light_param/face_pv025s09.txt B53BABD6\nrom/light_param/face_pv025s10.txt 4954B23E\nrom/light_param/face_pv025s11.txt BFE71ABB\nrom/light_param/face_pv025s14.txt E404C764\nrom/light_param/face_pv025s15.txt 32376B86\nrom/light_param/face_pv025s20.txt 32376B86\nrom/light_param/face_pv025s21.txt F41D92CE\nrom/light_param/face_pv025s22.txt 32376B86\nrom/light_param/face_pv025s23.txt 28448309\nrom/light_param/face_pv025s24.txt 74E55EE2\nrom/light_param/face_pv028s01.txt 3126AB93\nrom/light_param/face_pv081s02.txt 4954B23E\nrom/light_param/face_pv081s08.txt 4954B23E\nrom/light_param/face_pv082s61.txt 32376B86\nrom/light_param/face_pv082s62.txt 32376B86\nrom/light_param/face_pv082s63.txt 32376B86\nrom/light_param/face_pv082s64.txt 32376B86\nrom/light_param/face_pv082s65.txt 32376B86\nrom/light_param/face_pv083s04.txt 3978E7FB\nrom/light_param/face_pv083s07.txt 3978E7FB\nrom/light_param/face_pv083s18.txt EC581E7A\nrom/light_param/face_pv083s26.txt 3978E7FB\nrom/light_param/face_pv083s27.txt 3978E7FB\nrom/light_param/face_pv083s28.txt 3978E7FB\nrom/light_param/face_pv085s01.txt EC581E7A\nrom/light_param/face_pv086s01.txt BF93014E\nrom/light_param/face_pv086s02.txt F941342A\nrom/light_param/face_pv087s01.txt EC581E7A\nrom/light_param/face_pv087s02.txt EC581E7A\nrom/light_param/face_pv087s16.txt EC581E7A\nrom/light_param/face_pv087s17.txt EC581E7A\nrom/light_param/face_pv090s01.txt F941342A\nrom/light_param/face_pv090s02.txt F941342A\nrom/light_param/face_pv092s01.txt C4F0D8F6\nrom/light_param/face_pv092s02.txt F941342A\nrom/light_param/face_pv092s10.txt 4954B23E\nrom/light_param/face_pv092s11.txt 4954B23E\nrom/light_param/face_pv092s12.txt 74E55EE2\nrom/light_param/face_pv096s01.txt 4954B23E\nrom/light_param/face_pv096s09.txt 4954B23E\nrom/light_param/face_PV097s01.txt BF93014E\nrom/light_param/face_pv104s02.txt 25FEE193\nrom/light_param/face_pv218s03.txt 74E55EE2\nrom/light_param/face_pv218s04.txt 74E55EE2\nrom/light_param/face_pv220s01.txt C4F0D8F6\nrom/light_param/face_pv220s02.txt C4F0D8F6\nrom/light_param/face_pv232s01.txt 32376B86\nrom/light_param/face_pv232s02.txt 74E55EE2\nrom/light_param/face_pv232s03.txt 74E55EE2\nrom/light_param/face_pv233s01.txt EC708E31\nrom/light_param/face_pv233s02.txt 272C5D94\nrom/light_param/face_pv233s06.txt EC708E31\nrom/light_param/face_pv233s07.txt EC708E31\nrom/light_param/face_pv233s08.txt 4954B23E\nrom/light_param/face_pv236s07.txt EC581E7A\nrom/light_param/face_pv432s01.txt F941342A\nrom/light_param/face_pv432s03.txt F941342A\nrom/light_param/face_pv616s01.txt 6AE4FC9F\nrom/light_param/face_pv616s02.txt 6AE4FC9F\nrom/light_param/face_pv616s03.txt 6AE4FC9F\nrom/light_param/face_pv618s06.txt B79857BF\nrom/light_param/face_pv621s01.txt 6AE4FC9F\nrom/light_param/face_pv638s01.txt 6AE4FC9F\nrom/light_param/face_pv638s02.txt 6AE4FC9F\nrom/light_param/face_selpvback.txt 32376B86\nrom/light_param/face_stgns105.txt EC581E7A\nrom/light_param/face_tst.txt 32376B86\nrom/light_param/fog_d2ns035.txt 80A2537A\nrom/light_param/fog_d2ns037.txt 0C76633D\nrom/light_param/fog_d2ns040.txt 7A29FDB0\nrom/light_param/fog_d2ns041.txt F1FA5B55\nrom/light_param/fog_d2ns042.txt CC012757\nrom/light_param/fog_d2ns043.txt A02BEC50\nrom/light_param/fog_d2ns044.txt EABEDCEF\nrom/light_param/fog_d2ns045.txt 260DA633\nrom/light_param/fog_d2ns046.txt 4549FB71\nrom/light_param/fog_d2ns047.txt 19448185\nrom/light_param/fog_d2ns048.txt 64CDFB79\nrom/light_param/fog_d2ns049.txt 62C3A8BE\nrom/light_param/fog_d2ns050.txt E7FC1F34\nrom/light_param/fog_d2ns052.txt 2071B6A0\nrom/light_param/fog_d2ns053.txt 2ED5D727\nrom/light_param/fog_d2ns054.txt 7C6F3887\nrom/light_param/fog_d2ns056.txt 1FE6777B\nrom/light_param/fog_d2ns057.txt E17A2DA9\nrom/light_param/fog_d2ns059.txt 4341A309\nrom/light_param/fog_d2ns060.txt AD4B9A71\nrom/light_param/fog_d2ns062.txt BE510447\nrom/light_param/fog_d2ns063.txt DCCE96C5\nrom/light_param/fog_d2ns064.txt 06A421B5\nrom/light_param/fog_d2ns065.txt A00236B4\nrom/light_param/fog_d2ns066.txt F8F5BACB\nrom/light_param/fog_d2ns068.txt A2B2A6AE\nrom/light_param/fog_d2ns069.txt 48DA3FD6\nrom/light_param/fog_d2ns070.txt 3E837AC2\nrom/light_param/fog_d2ns071.txt 28622FE4\nrom/light_param/fog_d2ns072.txt C6E766F2\nrom/light_param/fog_d2ns073.txt 1FE8E4A4\nrom/light_param/fog_d2ns074.txt 27E7EDFF\nrom/light_param/fog_d2ns075.txt 612D7159\nrom/light_param/fog_d2ns076.txt 73515276\nrom/light_param/fog_d2ns079.txt E6CBAD5C\nrom/light_param/fog_d2ns081.txt 738D121C\nrom/light_param/fog_d2ns082.txt 4C1E47E4\nrom/light_param/fog_d2pv037s01.txt 7A29FDB0\nrom/light_param/fog_d2pv038s01.txt F1FA5B55\nrom/light_param/fog_d2pv039s01.txt CC012757\nrom/light_param/fog_d2pv039s02.txt E23F92A0\nrom/light_param/fog_d2pv039s03.txt A02BEC50\nrom/light_param/fog_d2pv040s01.txt EABEDCEF\nrom/light_param/fog_d2pv041s01.txt 260DA633\nrom/light_param/fog_d2pv042s01.txt 4549FB71\nrom/light_param/fog_d2pv042s02.txt D3F82A85\nrom/light_param/fog_d2pv042s06.txt 4549FB71\nrom/light_param/fog_d2pv043s01.txt 19448185\nrom/light_param/fog_d2pv044s02.txt 64CDFB79\nrom/light_param/fog_d2pv044s03.txt 0B740D10\nrom/light_param/fog_d2pv046s04.txt 425ABE5B\nrom/light_param/fog_d2pv047s02.txt 7C6F3887\nrom/light_param/fog_d2pv047s03.txt 2ED5D727\nrom/light_param/fog_d2pv047s04.txt 2ED5D727\nrom/light_param/fog_d2pv048s01.txt 1FE6777B\nrom/light_param/fog_d2pv050s01.txt E2C8A858\nrom/light_param/fog_d2pv051s01.txt D489F4DB\nrom/light_param/fog_d2pv051s02.txt 4341A309\nrom/light_param/fog_d2pv051s03.txt C52CC600\nrom/light_param/fog_d2pv051s04.txt AD4B9A71\nrom/light_param/fog_d2pv051s05.txt B3093C5E\nrom/light_param/fog_d2pv053s01.txt 73515276\nrom/light_param/fog_d2pv053s02.txt 73515276\nrom/light_param/fog_d2pv053s03.txt 014665C2\nrom/light_param/fog_d2pv053s15.txt 014665C2\nrom/light_param/fog_d2pv055s01.txt A00236B4\nrom/light_param/fog_d2pv055s02.txt 65B16338\nrom/light_param/fog_d2pv058s02.txt A2B2A6AE\nrom/light_param/fog_d2pv060s01.txt 28622FE4\nrom/light_param/fog_d2pv061s01.txt 66F67955\nrom/light_param/fog_d2pv061s02.txt C6E766F2\nrom/light_param/fog_d2pv062s01.txt EB4FF2B3\nrom/light_param/fog_d2pv063s01.txt 27E7EDFF\nrom/light_param/fog_d2pv063s02.txt 612D7159\nrom/light_param/fog_d2pv063s03.txt 73515276\nrom/light_param/fog_d2pv063s04.txt B3093C5E\nrom/light_param/fog_d2pv063s09.txt 27E7EDFF\nrom/light_param/fog_d2pv063s10.txt 27E7EDFF\nrom/light_param/fog_d2pv063s13.txt 27E7EDFF\nrom/light_param/fog_d2pv065s01.txt E6CBAD5C\nrom/light_param/fog_d2pv065s02.txt DA510E7C\nrom/light_param/fog_d2pv065s03.txt DA510E7C\nrom/light_param/fog_d2pv065s04.txt DA510E7C\nrom/light_param/fog_d2pv065s05.txt 37068FD7\nrom/light_param/fog_d2pv065s08.txt A1D73B6F\nrom/light_param/fog_d2pv066s01.txt 3E837AC2\nrom/light_param/fog_d2pv212s01.txt 87F98902\nrom/light_param/fog_d2pv213s01.txt 63FAFAC8\nrom/light_param/fog_d2pv214s01.txt 354BFD9C\nrom/light_param/fog_ns001.txt A5D1FBDA\nrom/light_param/fog_ns002.txt 15C18287\nrom/light_param/fog_ns003.txt 15C18287\nrom/light_param/fog_ns004.txt 2A96FD67\nrom/light_param/fog_ns005.txt 5A119437\nrom/light_param/fog_ns006.txt E4BE9E07\nrom/light_param/fog_ns007.txt BBC3794B\nrom/light_param/fog_ns009.txt F9920EB3\nrom/light_param/fog_ns010.txt F51FCA83\nrom/light_param/fog_ns011.txt 99375DD2\nrom/light_param/fog_ns012.txt 188F3467\nrom/light_param/fog_ns013.txt C9470B27\nrom/light_param/fog_ns015.txt 0A46E88B\nrom/light_param/fog_ns016.txt 2F08837D\nrom/light_param/fog_ns017.txt C135364D\nrom/light_param/fog_ns018.txt D1A1477D\nrom/light_param/fog_ns019.txt 02214CC3\nrom/light_param/fog_ns020.txt 7B658476\nrom/light_param/fog_ns021.txt 971FCF53\nrom/light_param/fog_ns022.txt 6AC99917\nrom/light_param/fog_ns023.txt 05E579B8\nrom/light_param/fog_ns025.txt A5D1FBDA\nrom/light_param/fog_ns029.txt 08D266CF\nrom/light_param/fog_ns030.txt B3093C5E\nrom/light_param/fog_ns031.txt 3BBCC150\nrom/light_param/fog_ns032.txt F06B94CA\nrom/light_param/fog_ns033.txt 8376F15E\nrom/light_param/fog_ns034.txt 15C18287\nrom/light_param/fog_ns083.txt 6DB0DB8D\nrom/light_param/fog_ns085.txt 354BFD9C\nrom/light_param/fog_ns086.txt 2A96FD67\nrom/light_param/fog_ns087.txt B5BC07C9\nrom/light_param/fog_ns088.txt 64CDFB79\nrom/light_param/fog_ns089.txt 87F98902\nrom/light_param/fog_ns090.txt 354BFD9C\nrom/light_param/fog_ns091.txt 63FAFAC8\nrom/light_param/fog_ns092.txt CB74A9E7\nrom/light_param/fog_ns093.txt D461D7B5\nrom/light_param/fog_ns094.txt EC81406F\nrom/light_param/fog_ns095.txt B3093C5E\nrom/light_param/fog_ns096.txt B3093C5E\nrom/light_param/fog_ns097.txt 829A181E\nrom/light_param/fog_ns098.txt B23FF877\nrom/light_param/fog_ns099.txt A72395BE\nrom/light_param/fog_ns100.txt 53B0793C\nrom/light_param/fog_ns101.txt AC22BFFB\nrom/light_param/fog_ns103.txt C198E9E7\nrom/light_param/fog_ns104.txt 3E6D2E8B\nrom/light_param/fog_ns105.txt D22F40B8\nrom/light_param/fog_ns106.txt E4AE8ADE\nrom/light_param/fog_ns107.txt F7EBA028\nrom/light_param/fog_ns108.txt 0935CE57\nrom/light_param/fog_ns109.txt 173CEF48\nrom/light_param/fog_ns110.txt DE7CF592\nrom/light_param/fog_ns111.txt 4EAEE1BD\nrom/light_param/fog_ns112.txt E12A3431\nrom/light_param/fog_ns113.txt 1EEEF240\nrom/light_param/fog_ns114.txt 11CFA4B4\nrom/light_param/fog_ns115.txt 15FF3E6D\nrom/light_param/fog_ns116.txt 425ABE5B\nrom/light_param/fog_ns117.txt 97B7F186\nrom/light_param/fog_ns120.txt DCC8D242\nrom/light_param/fog_ns121.txt F79A63F3\nrom/light_param/fog_ns123.txt 86D189B1\nrom/light_param/fog_ns124.txt D9064072\nrom/light_param/fog_ns126.txt 24D3EA8C\nrom/light_param/fog_ns221.txt 6539951B\nrom/light_param/fog_ns249.txt 2A96FD67\nrom/light_param/fog_ns257.txt C165DD2A\nrom/light_param/fog_ns263.txt 88680782\nrom/light_param/fog_ns272.txt 7B658476\nrom/light_param/fog_ns292.txt AE462596\nrom/light_param/fog_pv001s01.txt 971FCF53\nrom/light_param/fog_pv001s02.txt 971FCF53\nrom/light_param/fog_pv001s03.txt 6AC99917\nrom/light_param/fog_pv001s04.txt 6AC99917\nrom/light_param/fog_pv001s05.txt 05E579B8\nrom/light_param/fog_pv001s06.txt 05E579B8\nrom/light_param/fog_pv001s07.txt 05E579B8\nrom/light_param/fog_pv003s01.txt C165DD2A\nrom/light_param/fog_pv003s03.txt 9EFBCC96\nrom/light_param/fog_pv003s04.txt C165DD2A\nrom/light_param/fog_pv003s05.txt C165DD2A\nrom/light_param/fog_pv003s06.txt B6BE0720\nrom/light_param/fog_pv003s07.txt C165DD2A\nrom/light_param/fog_pv003s08.txt C165DD2A\nrom/light_param/fog_pv003s09.txt C165DD2A\nrom/light_param/fog_pv004s01.txt 4940EAE6\nrom/light_param/fog_pv004s02.txt 4940EAE6\nrom/light_param/fog_pv004s05.txt B0D60A1C\nrom/light_param/fog_pv004s06.txt 4940EAE6\nrom/light_param/fog_pv005s01.txt 08D266CF\nrom/light_param/fog_pv005s04.txt 08D266CF\nrom/light_param/fog_pv005s06.txt 08D266CF\nrom/light_param/fog_pv008s01.txt 775CB91E\nrom/light_param/fog_pv008s03.txt 781FA916\nrom/light_param/fog_pv008s10.txt 68301A00\nrom/light_param/fog_pv009s04.txt E73BBC5E\nrom/light_param/fog_pv011s01.txt 0C76633D\nrom/light_param/fog_pv011s02.txt A88EA466\nrom/light_param/fog_pv011s06.txt B6D8CC85\nrom/light_param/fog_pv013s02.txt E04CE66E\nrom/light_param/fog_pv013s03.txt E04CE66E\nrom/light_param/fog_pv013s04.txt E04CE66E\nrom/light_param/fog_pv015s01.txt B6924E93\nrom/light_param/fog_pv015s02.txt F9920EB3\nrom/light_param/fog_pv015s03.txt 4CE8B892\nrom/light_param/fog_pv015s05.txt 9ED78525\nrom/light_param/fog_pv020s01.txt 8376F15E\nrom/light_param/fog_pv020s02.txt 8376F15E\nrom/light_param/fog_pv020s03.txt 8376F15E\nrom/light_param/fog_pv024s03.txt B28AC568\nrom/light_param/fog_pv024s11.txt 68BB3F95\nrom/light_param/fog_pv024s13.txt 3ED8A2BE\nrom/light_param/fog_pv025s02.txt 76138CC3\nrom/light_param/fog_pv025s03.txt 11DDFBE1\nrom/light_param/fog_pv025s08.txt 629FC93F\nrom/light_param/fog_pv025s18.txt 47739975\nrom/light_param/fog_pv028s01.txt C9470B27\nrom/light_param/fog_pv079s01.txt 56C2A87C\nrom/light_param/fog_pv081s01.txt CB74A9E7\nrom/light_param/fog_pv081s02.txt 1A19FB72\nrom/light_param/fog_pv081s03.txt EC81406F\nrom/light_param/fog_pv081s06.txt E1142721\nrom/light_param/fog_pv081s09.txt D461D7B5\nrom/light_param/fog_pv082s61.txt 612D7159\nrom/light_param/fog_pv082s62.txt 612D7159\nrom/light_param/fog_pv082s63.txt 612D7159\nrom/light_param/fog_pv082s65.txt 612D7159\nrom/light_param/fog_pv083s01.txt 60D9EE70\nrom/light_param/fog_pv083s02.txt F3016AFB\nrom/light_param/fog_pv083s03.txt ECDC8637\nrom/light_param/fog_pv083s04.txt 65299130\nrom/light_param/fog_pv083s05.txt 27B0B0F0\nrom/light_param/fog_pv083s07.txt A72395BE\nrom/light_param/fog_pv083s08.txt 53B0793C\nrom/light_param/fog_pv083s14.txt ECDC8637\nrom/light_param/fog_pv083s18.txt A47578C6\nrom/light_param/fog_pv083s24.txt 53B0793C\nrom/light_param/fog_pv083s25.txt 53B0793C\nrom/light_param/fog_pv083s26.txt 829A181E\nrom/light_param/fog_pv083s27.txt 829A181E\nrom/light_param/fog_pv083s28.txt A72395BE\nrom/light_param/fog_pv084s01.txt BC1C8A10\nrom/light_param/fog_pv086s01.txt C198E9E7\nrom/light_param/fog_pv086s02.txt C198E9E7\nrom/light_param/fog_pv087s01.txt 3E6D2E8B\nrom/light_param/fog_pv087s02.txt D22F40B8\nrom/light_param/fog_pv087s16.txt A5F49AB2\nrom/light_param/fog_pv087s17.txt A5F49AB2\nrom/light_param/fog_pv088s01.txt E4AE8ADE\nrom/light_param/fog_pv088s02.txt 0935CE57\nrom/light_param/fog_pv088s11.txt F7EBA028\nrom/light_param/fog_pv088s12.txt F7EBA028\nrom/light_param/fog_pv088s14.txt F7EBA028\nrom/light_param/fog_pv089s01.txt FF1B31C5\nrom/light_param/fog_pv089s02.txt 9790153B\nrom/light_param/fog_pv089s03.txt DE7CF592\nrom/light_param/fog_pv089s05.txt 9790153B\nrom/light_param/fog_pv090s01.txt 4EAEE1BD\nrom/light_param/fog_pv091s04.txt 1EEEF240\nrom/light_param/fog_pv091s09.txt 1EEEF240\nrom/light_param/fog_pv091s10.txt 1EEEF240\nrom/light_param/fog_pv091s13.txt 11CFA4B4\nrom/light_param/fog_pv091s14.txt 123E7F47\nrom/light_param/fog_pv091s15.txt 1EEEF240\nrom/light_param/fog_pv092s09.txt FC31ABA7\nrom/light_param/fog_pv092s10.txt D3410096\nrom/light_param/fog_pv092s11.txt 517423C4\nrom/light_param/fog_pv092s12.txt D34690AF\nrom/light_param/fog_pv094s01.txt 51ABB18D\nrom/light_param/fog_pv094s02.txt C832FC03\nrom/light_param/fog_pv094s16.txt C832FC03\nrom/light_param/fog_pv094s17.txt C832FC03\nrom/light_param/fog_pv094s18.txt C832FC03\nrom/light_param/fog_pv096s01.txt D9064072\nrom/light_param/fog_pv103s01.txt 97B1B19C\nrom/light_param/fog_pv103s02.txt 3D1E04DF\nrom/light_param/fog_pv103s03.txt B2A80C02\nrom/light_param/fog_pv104s01.txt 41A74B27\nrom/light_param/fog_pv104s02.txt EA68E740\nrom/light_param/fog_pv104s03.txt 41A74B27\nrom/light_param/fog_pv104s04.txt 1A9F17C6\nrom/light_param/fog_pv218s01.txt ECC874ED\nrom/light_param/fog_pv218s02.txt ECC874ED\nrom/light_param/fog_pv218s03.txt 906992A1\nrom/light_param/fog_pv218s04.txt 906992A1\nrom/light_param/fog_pv219s01.txt 4EA02874\nrom/light_param/fog_pv219s02.txt 372E30DB\nrom/light_param/fog_pv219s03.txt 593A6A3D\nrom/light_param/fog_pv219s04.txt BE1919F5\nrom/light_param/fog_pv219s05.txt 76C20DC1\nrom/light_param/fog_pv219s08.txt 006E601F\nrom/light_param/fog_pv219s09.txt 5F8F6F1A\nrom/light_param/fog_pv219s10.txt 4EA02874\nrom/light_param/fog_pv219s11.txt 1D687DAC\nrom/light_param/fog_pv219s12.txt 5F8F6F1A\nrom/light_param/fog_pv219s13.txt 006E601F\nrom/light_param/fog_pv219s14.txt 372E30DB\nrom/light_param/fog_pv220s01.txt B3093C5E\nrom/light_param/fog_pv220s03.txt 06A421B5\nrom/light_param/fog_pv221s03.txt A25966AC\nrom/light_param/fog_pv221s04.txt A25966AC\nrom/light_param/fog_pv221s05.txt A25966AC\nrom/light_param/fog_pv221s06.txt A25966AC\nrom/light_param/fog_pv221s07.txt F626C42F\nrom/light_param/fog_pv221s08.txt F626C42F\nrom/light_param/fog_pv221s09.txt F626C42F\nrom/light_param/fog_pv221s11.txt F626C42F\nrom/light_param/fog_pv221s14.txt F626C42F\nrom/light_param/fog_pv222s01.txt 99549F51\nrom/light_param/fog_pv222s02.txt 73D73DF5\nrom/light_param/fog_pv223s01.txt 5262D86F\nrom/light_param/fog_pv223s02.txt 5DB91F48\nrom/light_param/fog_pv223s03.txt 5DB91F48\nrom/light_param/fog_pv223s04.txt 93B690C5\nrom/light_param/fog_pv223s05.txt FF1B31C5\nrom/light_param/fog_pv223s07.txt 3F1FC84D\nrom/light_param/fog_pv223s09.txt 3F1FC84D\nrom/light_param/fog_pv223s10.txt 3F1FC84D\nrom/light_param/fog_pv224s01.txt 3814C17B\nrom/light_param/fog_pv224s02.txt 7F6B2A67\nrom/light_param/fog_pv224s03.txt 7F6B2A67\nrom/light_param/fog_pv225s01.txt 664AE47D\nrom/light_param/fog_pv225s03.txt 083390AF\nrom/light_param/fog_pv226s01.txt 944C30C4\nrom/light_param/fog_pv227s01.txt F3936806\nrom/light_param/fog_pv228s02.txt 030631FB\nrom/light_param/fog_pv231s01.txt 04E4D532\nrom/light_param/fog_pv231s02.txt FBA98B41\nrom/light_param/fog_pv231s03.txt 3CCABE14\nrom/light_param/fog_pv231s04.txt EA117190\nrom/light_param/fog_pv231s05.txt 00DF806D\nrom/light_param/fog_pv231s06.txt 9D4088A3\nrom/light_param/fog_pv231s07.txt 1FF9696B\nrom/light_param/fog_pv232s01.txt FA8934D3\nrom/light_param/fog_pv232s02.txt A00236B4\nrom/light_param/fog_pv232s03.txt 871F3662\nrom/light_param/fog_pv233s01.txt 2B6FFF9A\nrom/light_param/fog_pv233s02.txt A16150B4\nrom/light_param/fog_pv233s04.txt C135364D\nrom/light_param/fog_pv233s05.txt 0476F900\nrom/light_param/fog_pv233s06.txt CFDE4BC6\nrom/light_param/fog_pv233s07.txt 54C2A537\nrom/light_param/fog_pv233s08.txt 69396342\nrom/light_param/fog_pv234s01.txt E11141E0\nrom/light_param/fog_pv234s02.txt E11141E0\nrom/light_param/fog_pv236s01.txt 8A0FB847\nrom/light_param/fog_pv236s02.txt D91456A1\nrom/light_param/fog_pv236s03.txt A9E134E2\nrom/light_param/fog_pv236s04.txt 5309DD68\nrom/light_param/fog_pv236s05.txt 0935CE57\nrom/light_param/fog_pv236s06.txt 0935CE57\nrom/light_param/fog_pv236s07.txt D22F40B8\nrom/light_param/fog_pv238s01.txt 574491DD\nrom/light_param/fog_pv239s01.txt 6850F898\nrom/light_param/fog_pv240s03.txt 22841C7C\nrom/light_param/fog_pv241s01.txt B67C072F\nrom/light_param/fog_pv241s02.txt A1BF3CE0\nrom/light_param/fog_pv243s01.txt 34293887\nrom/light_param/fog_pv244s01.txt FDA02678\nrom/light_param/fog_pv249s01.txt A9186801\nrom/light_param/fog_pv253s01.txt E4DB0F82\nrom/light_param/fog_pv253s02.txt 49748921\nrom/light_param/fog_pv253s03.txt 49748921\nrom/light_param/fog_pv253s04.txt 49748921\nrom/light_param/fog_pv253s05.txt 49748921\nrom/light_param/fog_pv253s06.txt 49748921\nrom/light_param/fog_pv253s07.txt 49748921\nrom/light_param/fog_pv253s08.txt 49748921\nrom/light_param/fog_pv253s09.txt 49748921\nrom/light_param/fog_pv257s01.txt BE727026\nrom/light_param/fog_ns014.txt A29D604B\nrom/light_param/fog_ns084.txt AAED72CA\nrom/light_param/fog_ns102.txt BC1C8A10\nrom/light_param/fog_ns122.txt C832FC03\nrom/light_param/fog_pv003s02.txt 9EFBCC96\nrom/light_param/fog_pv008s07.txt 775CB91E\nrom/light_param/fog_pv024s04.txt B59EDE97\nrom/light_param/fog_pv082s64.txt 612D7159\nrom/light_param/fog_pv085s01.txt 90B65C41\nrom/light_param/fog_pv090s02.txt E12A3431\nrom/light_param/fog_pv096s09.txt 7D06FBB1\nrom/light_param/fog_pv219s07.txt 07EB6D14\nrom/light_param/fog_pv221s10.txt F626C42F\nrom/light_param/fog_pv225s02.txt 32F7754D\nrom/light_param/fog_pv233s03.txt CFDE4BC6\nrom/light_param/fog_pv260s01.txt 0EA1FC60\nrom/light_param/fog_pv261s01.txt F4B56DAB\nrom/light_param/fog_pv261s02.txt 0BF1021A\nrom/light_param/fog_pv262s02.txt AF704C6C\nrom/light_param/fog_pv262s03.txt 4A5ACE3B\nrom/light_param/fog_pv262s04.txt 8DB48BFC\nrom/light_param/fog_pv262s05.txt 5C84512B\nrom/light_param/fog_pv262s08.txt 24FF8415\nrom/light_param/fog_pv262s12.txt 8EAE3C46\nrom/light_param/fog_pv432s01.txt 4EAEE1BD\nrom/light_param/fog_pv432s03.txt 4EAEE1BD\nrom/light_param/fog_pv433s02.txt 0103A3A2\nrom/light_param/fog_pv433s03.txt DB3AF5F3\nrom/light_param/fog_pv433s04.txt C7C90309\nrom/light_param/fog_pv433s05.txt 3B1E6D55\nrom/light_param/fog_pv434s01.txt 22908AB3\nrom/light_param/fog_pv435s05.txt 70720CA4\nrom/light_param/fog_pv435s08.txt 6B9063FE\nrom/light_param/fog_pv600s01.txt 05AAF8CC\nrom/light_param/fog_pv600s02.txt 9A7D8A11\nrom/light_param/fog_pv600s03.txt 640EFFB8\nrom/light_param/fog_pv600s04.txt E8C2724E\nrom/light_param/fog_pv601s01.txt CC2CF6F9\nrom/light_param/fog_pv601s02.txt 52246462\nrom/light_param/fog_pv601s03.txt FAAF0E16\nrom/light_param/fog_pv601s04.txt D39D660B\nrom/light_param/fog_pv602s01.txt 6F296DCB\nrom/light_param/fog_pv602s03.txt 32D0BABC\nrom/light_param/fog_pv603s01.txt 31ADD70F\nrom/light_param/fog_pv604s02.txt 7DFE97BC\nrom/light_param/fog_pv605s01.txt 702E04AA\nrom/light_param/fog_pv607s01.txt 7C98D253\nrom/light_param/fog_pv611s01.txt 83120E57\nrom/light_param/fog_pv613s01.txt D3A587B2\nrom/light_param/fog_pv613s02.txt 4495F58A\nrom/light_param/fog_pv613s03.txt 724F1AF1\nrom/light_param/fog_pv614s05.txt 66026DE8\nrom/light_param/fog_pv615s01.txt 4FC6E6C7\nrom/light_param/fog_pv616s01.txt 7C98D253\nrom/light_param/fog_pv616s02.txt 182FB826\nrom/light_param/fog_pv617s02.txt 4BB836ED\nrom/light_param/fog_pv618s01.txt 478C77AC\nrom/light_param/fog_pv618s02.txt F0575D77\nrom/light_param/fog_pv618s03.txt 478C77AC\nrom/light_param/fog_pv618s05.txt 478C77AC\nrom/light_param/fog_pv619s02.txt 9E3984BA\nrom/light_param/fog_pv619s03.txt 778C13F9\nrom/light_param/fog_pv619s04.txt 756CE00B\nrom/light_param/fog_pv622s01.txt BC019593\nrom/light_param/fog_pv623s02.txt 91538729\nrom/light_param/fog_pv625s03.txt 7934889C\nrom/light_param/fog_pv628s01.txt 329306D1\nrom/light_param/fog_pv637s01.txt 4AC3BFF3\nrom/light_param/fog_pv637s02.txt 1DD2FAC2\nrom/light_param/fog_pv638s01.txt 98519900\nrom/light_param/fog_pv639s01.txt B50E5BAD\nrom/light_param/fog_pv639s02.txt 9737CB7D\nrom/light_param/fog_pv639s03.txt AB37945E\nrom/light_param/fog_pv639s06.txt CA69D151\nrom/light_param/fog_pv727s01.txt 2CE64BF2\nrom/light_param/fog_pv728s01.txt 77FDB9DF\nrom/light_param/fog_pv728s03.txt A9B3EBCE\nrom/light_param/fog_pv728s04.txt 2DE83A69\nrom/light_param/fog_pv729s01.txt D2BBF8BD\nrom/light_param/fog_pv731s01.txt 4A1B364D\nrom/light_param/fog_pv732s01.txt 0252ABFC\nrom/light_param/fog_pv734s01.txt C40C199E\nrom/light_param/fog_pv734s02.txt F36A602A\nrom/light_param/fog_pv736s01.txt 6321C3A5\nrom/light_param/fog_pv738s01.txt 03EBACDD\nrom/light_param/fog_pv738s02.txt AA8DC2B4\nrom/light_param/fog_pv740s02.txt 3282C398\nrom/light_param/fog_pv740s04.txt F5495D17\nrom/light_param/fog_pv832s01.txt 88F3D327\nrom/light_param/fog_selpvback.txt 806DDF0F\nrom/light_param/fog_stgns105.txt D22F40B8\nrom/light_param/fog_tst.txt 806DDF0F\nrom/light_param/glow_aetback.txt 7CCACFA9\nrom/light_param/glow_d2ns035.txt CF0852A3\nrom/light_param/glow_d2ns036.txt 25473B51\nrom/light_param/glow_d2ns039.txt 7AB9D5C0\nrom/light_param/glow_d2ns040.txt B6602592\nrom/light_param/glow_d2ns041.txt D77DE296\nrom/light_param/glow_d2ns042.txt 979BE3B5\nrom/light_param/glow_d2ns043.txt 293E05F0\nrom/light_param/glow_d2ns044.txt 67397301\nrom/light_param/glow_d2ns045.txt 9F97FA5A\nrom/light_param/glow_d2ns046.txt E6CB2ED6\nrom/light_param/glow_d2ns047.txt 545A4A6A\nrom/light_param/glow_d2ns048.txt 21616BF5\nrom/light_param/glow_d2ns049.txt 3D19AF29\nrom/light_param/glow_d2ns051.txt 86EED18D\nrom/light_param/glow_d2ns052.txt 08B8C6F5\nrom/light_param/glow_d2ns053.txt 545A4A6A\nrom/light_param/glow_d2ns054.txt 8F0E8604\nrom/light_param/glow_d2ns055.txt 1472930B\nrom/light_param/glow_d2ns057.txt 65225E68\nrom/light_param/glow_d2ns058.txt E0AFC7E9\nrom/light_param/glow_d2ns059.txt 8096CEC5\nrom/light_param/glow_d2ns060.txt 8096CEC5\nrom/light_param/glow_d2ns062.txt 1C60BCCC\nrom/light_param/glow_d2ns063.txt 6E4F3D1B\nrom/light_param/glow_d2ns064.txt 26FF9072\nrom/light_param/glow_d2ns065.txt 545A4A6A\nrom/light_param/glow_d2ns066.txt 81FEA04C\nrom/light_param/glow_d2ns067.txt 42ED6779\nrom/light_param/glow_d2ns068.txt 40A6C646\nrom/light_param/glow_d2ns069.txt 44ECB53C\nrom/light_param/glow_d2ns070.txt 1D146B29\nrom/light_param/glow_d2ns071.txt D40BF8A8\nrom/light_param/glow_d2ns072.txt 8FF86BAB\nrom/light_param/glow_d2ns073.txt 0B381F43\nrom/light_param/glow_d2ns075.txt 49895D44\nrom/light_param/glow_d2ns076.txt 3CF51348\nrom/light_param/glow_d2ns077.txt 2D291DEE\nrom/light_param/glow_d2ns078.txt 4C4AB6D9\nrom/light_param/glow_d2ns079.txt AB29E57B\nrom/light_param/glow_d2ns081.txt 860904C9\nrom/light_param/glow_d2ns082.txt 5352CE55\nrom/light_param/glow_d2pv037s01.txt B6602592\nrom/light_param/glow_d2pv037s02.txt B6602592\nrom/light_param/glow_d2pv037s03.txt B6602592\nrom/light_param/glow_d2pv038s01.txt 3A26418E\nrom/light_param/glow_d2pv039s01.txt 979BE3B5\nrom/light_param/glow_d2pv039s02.txt 979BE3B5\nrom/light_param/glow_d2pv039s03.txt 293E05F0\nrom/light_param/glow_d2pv040s01.txt 67397301\nrom/light_param/glow_d2pv041s01.txt 9F97FA5A\nrom/light_param/glow_d2pv043s01.txt 545A4A6A\nrom/light_param/glow_d2pv044s01.txt 3D19AF29\nrom/light_param/glow_d2pv044s02.txt 21616BF5\nrom/light_param/glow_d2pv044s03.txt 669A9C14\nrom/light_param/glow_d2pv046s04.txt 825ADB5C\nrom/light_param/glow_d2pv046s05.txt A7972052\nrom/light_param/glow_d2pv047s01.txt 8F0E8604\nrom/light_param/glow_d2pv047s02.txt 8F0E8604\nrom/light_param/glow_d2pv047s03.txt 545A4A6A\nrom/light_param/glow_d2pv047s04.txt 545A4A6A\nrom/light_param/glow_d2pv047s05.txt 1472930B\nrom/light_param/glow_d2pv048s01.txt 20E4B960\nrom/light_param/glow_d2pv050s01.txt E0AFC7E9\nrom/light_param/glow_d2pv051s01.txt 8096CEC5\nrom/light_param/glow_d2pv051s02.txt 8096CEC5\nrom/light_param/glow_d2pv051s03.txt 8096CEC5\nrom/light_param/glow_d2pv051s05.txt DD6D008A\nrom/light_param/glow_d2pv053s01.txt 2F70889E\nrom/light_param/glow_d2pv053s02.txt A97BBF76\nrom/light_param/glow_d2pv053s03.txt 91DBE829\nrom/light_param/glow_d2pv053s04.txt 91B4FEF5\nrom/light_param/glow_d2pv053s05.txt 2CAAD88B\nrom/light_param/glow_d2pv053s07.txt E6CB2ED6\nrom/light_param/glow_d2pv053s10.txt 67EE4BF1\nrom/light_param/glow_d2pv053s15.txt 253B3229\nrom/light_param/glow_d2pv055s01.txt 545A4A6A\nrom/light_param/glow_d2pv055s02.txt F41FEDD0\nrom/light_param/glow_d2pv057s01.txt 42ED6779\nrom/light_param/glow_d2pv058s01.txt 40A6C646\nrom/light_param/glow_d2pv058s02.txt 40A6C646\nrom/light_param/glow_d2pv060s01.txt D40BF8A8\nrom/light_param/glow_d2pv061s01.txt 8096CEC5\nrom/light_param/glow_d2pv062s01.txt 674DB376\nrom/light_param/glow_d2pv063s01.txt 25681560\nrom/light_param/glow_d2pv063s02.txt 49895D44\nrom/light_param/glow_d2pv063s03.txt 3CF51348\nrom/light_param/glow_d2pv063s04.txt 2D291DEE\nrom/light_param/glow_d2pv063s09.txt 25681560\nrom/light_param/glow_d2pv063s10.txt B2844CB3\nrom/light_param/glow_d2pv063s11.txt BACBF54A\nrom/light_param/glow_d2pv063s12.txt C20822AF\nrom/light_param/glow_d2pv063s13.txt B2844CB3\nrom/light_param/glow_d2pv064s01.txt 4C4AB6D9\nrom/light_param/glow_d2pv064s02.txt 4C4AB6D9\nrom/light_param/glow_d2pv065s01.txt 623676FA\nrom/light_param/glow_d2pv065s02.txt 979BE3B5\nrom/light_param/glow_d2pv065s03.txt 979BE3B5\nrom/light_param/glow_d2pv065s04.txt 979BE3B5\nrom/light_param/glow_d2pv065s05.txt 3B5AFB7B\nrom/light_param/glow_d2pv065s07.txt 979BE3B5\nrom/light_param/glow_d2pv065s08.txt E5B54B0A\nrom/light_param/glow_d2pv066s01.txt 1D146B29\nrom/light_param/glow_d2pv208s01.txt 858EC2E2\nrom/light_param/glow_d2pv212s01.txt 8079BE46\nrom/light_param/glow_d2pv213s01.txt 545A4A6A\nrom/light_param/glow_d2pv214s01.txt 1D146B29\nrom/light_param/glow_ns001.txt 08CED474\nrom/light_param/glow_ns002.txt 55EB05E6\nrom/light_param/glow_ns003.txt 2AAD8867\nrom/light_param/glow_ns004.txt 597036D3\nrom/light_param/glow_ns005.txt 597036D3\nrom/light_param/glow_ns006.txt 734E4F12\nrom/light_param/glow_ns007.txt 56A87A5F\nrom/light_param/glow_ns008.txt E7FCAF81\nrom/light_param/glow_ns009.txt D9756692\nrom/light_param/glow_ns010.txt 71830BB9\nrom/light_param/glow_ns012.txt 3D7F3565\nrom/light_param/glow_ns013.txt DE721C8E\nrom/light_param/glow_ns014.txt 597036D3\nrom/light_param/glow_ns015.txt 597036D3\nrom/light_param/glow_ns016.txt F41FEDD0\nrom/light_param/glow_ns017.txt 08CED474\nrom/light_param/glow_ns018.txt 08CED474\nrom/light_param/glow_ns019.txt 08CED474\nrom/light_param/glow_ns020.txt 99095D70\nrom/light_param/glow_ns021.txt 8AF0849B\nrom/light_param/glow_ns022.txt 8AF0849B\nrom/light_param/glow_ns023.txt 8AF0849B\nrom/light_param/glow_ns024.txt BADD2F3B\nrom/light_param/glow_ns025.txt 08CED474\nrom/light_param/glow_ns026.txt 517E8F25\nrom/light_param/glow_ns029.txt 5608DFEE\nrom/light_param/glow_ns030.txt D3FFBE4F\nrom/light_param/glow_ns032.txt 597036D3\nrom/light_param/glow_ns033.txt 103E1790\nrom/light_param/glow_ns034.txt 659AF753\nrom/light_param/glow_ns083.txt 3D7F3565\nrom/light_param/glow_ns084.txt 597036D3\nrom/light_param/glow_ns085.txt 1D146B29\nrom/light_param/glow_ns086.txt 597036D3\nrom/light_param/glow_ns087.txt 6986E4D5\nrom/light_param/glow_ns088.txt 21616BF5\nrom/light_param/glow_ns089.txt 164442FA\nrom/light_param/glow_ns090.txt 1D146B29\nrom/light_param/glow_ns091.txt 545A4A6A\nrom/light_param/glow_ns093.txt 66ED59AC\nrom/light_param/glow_ns095.txt 2CBBC66E\nrom/light_param/glow_ns096.txt 2CBBC66E\nrom/light_param/glow_ns097.txt 07C2D937\nrom/light_param/glow_ns098.txt 80039D79\nrom/light_param/glow_ns101.txt CF265F65\nrom/light_param/glow_ns102.txt CF265F65\nrom/light_param/glow_ns103.txt 2FF9022E\nrom/light_param/glow_ns104.txt 85721F88\nrom/light_param/glow_ns105.txt 85721F88\nrom/light_param/glow_ns106.txt 10CB908D\nrom/light_param/glow_ns107.txt 6DB029CC\nrom/light_param/glow_ns108.txt 7A175D31\nrom/light_param/glow_ns109.txt 4F77EDA7\nrom/light_param/glow_ns111.txt 72F84BE8\nrom/light_param/glow_ns112.txt E6CB2ED6\nrom/light_param/glow_ns113.txt 6F8F98EF\nrom/light_param/glow_ns114.txt 26A7871E\nrom/light_param/glow_ns115.txt 08B8C6F5\nrom/light_param/glow_ns116.txt 825ADB5C\nrom/light_param/glow_ns117.txt 825ADB5C\nrom/light_param/glow_ns118.txt 1472930B\nrom/light_param/glow_ns121.txt 979BE3B5\nrom/light_param/glow_ns122.txt 9557F62C\nrom/light_param/glow_ns123.txt 72BD3EBF\nrom/light_param/glow_ns124.txt EED4F5CE\nrom/light_param/glow_ns125.txt FFA13A7E\nrom/light_param/glow_ns126.txt 2B61A28E\nrom/light_param/glow_ns221.txt FBDAE8B1\nrom/light_param/glow_ns223.txt 2C0BEC0A\nrom/light_param/glow_ns249.txt 597036D3\nrom/light_param/glow_ns257.txt 81DF38D0\nrom/light_param/glow_ns263.txt 110A48E9\nrom/light_param/glow_ns266.txt 0816B1A1\nrom/light_param/glow_ns272.txt 99095D70\nrom/light_param/glow_ns292.txt 8ACC8318\nrom/light_param/glow_pv001s01.txt 8AF0849B\nrom/light_param/glow_pv001s02.txt 8AF0849B\nrom/light_param/glow_pv001s03.txt 8AF0849B\nrom/light_param/fog_pv259s01.txt 283ABA83\nrom/light_param/fog_pv435s01.txt BDA6F228\nrom/light_param/fog_pv608s01.txt E0AAC3B0\nrom/light_param/fog_pv621s01.txt 4F1B2AA4\nrom/light_param/fog_pv729s03.txt BD431557\nrom/light_param/glow_d2ns037.txt 40EFA566\nrom/light_param/glow_d2ns056.txt 20E4B960\nrom/light_param/glow_d2ns074.txt 25681560\nrom/light_param/glow_d2pv042s02.txt 5352CE55\nrom/light_param/glow_d2pv051s04.txt 8096CEC5\nrom/light_param/glow_d2pv061s02.txt 8FF86BAB\nrom/light_param/glow_d2pv065s06.txt 8041F635\nrom/light_param/glow_ns011.txt 919DFF88\nrom/light_param/glow_ns031.txt 5653C79A\nrom/light_param/glow_ns099.txt F33C6D0B\nrom/light_param/glow_pv001s05.txt 8AF0849B\nrom/light_param/glow_pv001s06.txt 8AF0849B\nrom/light_param/glow_pv001s07.txt 8AF0849B\nrom/light_param/glow_pv003s01.txt 81DF38D0\nrom/light_param/glow_pv003s02.txt 81DF38D0\nrom/light_param/glow_pv003s03.txt 81DF38D0\nrom/light_param/glow_pv003s04.txt 81DF38D0\nrom/light_param/glow_pv003s05.txt 81DF38D0\nrom/light_param/glow_pv003s06.txt 81DF38D0\nrom/light_param/glow_pv003s07.txt 81DF38D0\nrom/light_param/glow_pv003s08.txt 81DF38D0\nrom/light_param/glow_pv003s09.txt 81DF38D0\nrom/light_param/glow_pv004s01.txt D40BF8A8\nrom/light_param/glow_pv004s02.txt D40BF8A8\nrom/light_param/glow_pv004s03.txt 26B24575\nrom/light_param/glow_pv004s04.txt 26B24575\nrom/light_param/glow_pv004s06.txt 7B2D0B41\nrom/light_param/glow_pv004s07.txt 7B2D0B41\nrom/light_param/glow_pv005s01.txt 5608DFEE\nrom/light_param/glow_pv005s04.txt 5608DFEE\nrom/light_param/glow_pv005s06.txt 4EBB437D\nrom/light_param/glow_pv007s01.txt F95E2B8D\nrom/light_param/glow_pv007s03.txt F95E2B8D\nrom/light_param/glow_pv007s05.txt 734423F8\nrom/light_param/glow_pv007s06.txt F95E2B8D\nrom/light_param/glow_pv007s08.txt F95E2B8D\nrom/light_param/glow_pv007s09.txt F95E2B8D\nrom/light_param/glow_pv007s11.txt 07AF6690\nrom/light_param/glow_pv007s12.txt 3107C13E\nrom/light_param/glow_pv008s01.txt CF145265\nrom/light_param/glow_pv008s03.txt FD7C833B\nrom/light_param/glow_pv008s07.txt CF145265\nrom/light_param/glow_pv008s10.txt 7F589994\nrom/light_param/glow_pv009s01.txt E6CB2ED6\nrom/light_param/glow_pv009s02.txt 58081E93\nrom/light_param/glow_pv009s03.txt 67EE4BF1\nrom/light_param/glow_pv009s04.txt 67EE4BF1\nrom/light_param/glow_pv009s05.txt C8DB3B76\nrom/light_param/glow_pv009s06.txt 67EE4BF1\nrom/light_param/glow_pv009s08.txt 67EE4BF1\nrom/light_param/glow_pv009s09.txt 67EE4BF1\nrom/light_param/glow_pv009s10.txt FDEFAA8E\nrom/light_param/glow_pv011s01.txt 40EFA566\nrom/light_param/glow_pv011s02.txt 204CF596\nrom/light_param/glow_pv011s03.txt A97BBF76\nrom/light_param/glow_pv011s04.txt A97BBF76\nrom/light_param/glow_pv011s06.txt 46B5204C\nrom/light_param/glow_pv013s01.txt AF850F95\nrom/light_param/glow_pv013s03.txt 2FD4BD57\nrom/light_param/glow_pv013s04.txt A6E3F7B7\nrom/light_param/glow_pv015s01.txt 4023CE41\nrom/light_param/glow_pv015s05.txt 4023CE41\nrom/light_param/glow_pv019s01.txt 8599CB3E\nrom/light_param/glow_pv019s02.txt C8DB3B76\nrom/light_param/glow_pv019s03.txt D0EF6DF8\nrom/light_param/glow_pv019s04.txt 58081E93\nrom/light_param/glow_pv019s07.txt 67EE4BF1\nrom/light_param/glow_pv019s08.txt 58081E93\nrom/light_param/glow_pv019s11.txt 58081E93\nrom/light_param/glow_pv019s13.txt 67EE4BF1\nrom/light_param/glow_pv019s14.txt EAD10591\nrom/light_param/glow_pv020s01.txt 103E1790\nrom/light_param/glow_pv020s02.txt 103E1790\nrom/light_param/glow_pv020s03.txt 103E1790\nrom/light_param/glow_pv024s02.txt B05658DA\nrom/light_param/glow_pv024s03.txt CEAE9F27\nrom/light_param/glow_pv024s04.txt 22F8BBD8\nrom/light_param/glow_pv024s05.txt FA335059\nrom/light_param/glow_pv024s06.txt ACEB6FE3\nrom/light_param/glow_pv024s07.txt 85BD1D48\nrom/light_param/glow_pv024s08.txt 0B6098EB\nrom/light_param/glow_pv024s09.txt 8F6F660A\nrom/light_param/glow_pv024s10.txt B711781D\nrom/light_param/glow_pv024s11.txt 04C5ED9B\nrom/light_param/glow_pv024s12.txt 9862727E\nrom/light_param/glow_pv024s13.txt BC4B98C5\nrom/light_param/glow_pv024s14.txt D660EB52\nrom/light_param/glow_pv025s01.txt 278F3095\nrom/light_param/glow_pv025s02.txt C22204A5\nrom/light_param/glow_pv025s03.txt F75909C7\nrom/light_param/glow_pv025s05.txt F19D8903\nrom/light_param/glow_pv025s06.txt ACFB6A49\nrom/light_param/glow_pv025s07.txt 497BB868\nrom/light_param/glow_pv025s08.txt 6FD640B4\nrom/light_param/glow_pv025s09.txt 6F7AE641\nrom/light_param/glow_pv025s10.txt 29ADC5F1\nrom/light_param/glow_pv025s11.txt 4E14359F\nrom/light_param/glow_pv025s12.txt 2306B450\nrom/light_param/glow_pv025s13.txt AB280D90\nrom/light_param/glow_pv025s14.txt EF60CB91\nrom/light_param/glow_pv025s15.txt EF517B32\nrom/light_param/glow_pv025s16.txt 484A6F74\nrom/light_param/glow_pv025s17.txt 6EA745F3\nrom/light_param/glow_pv025s18.txt C5F0FDA8\nrom/light_param/glow_pv025s19.txt 265B2258\nrom/light_param/glow_pv025s20.txt BE11D086\nrom/light_param/glow_pv025s22.txt FED42CFC\nrom/light_param/glow_pv025s23.txt 94511B3F\nrom/light_param/glow_pv025s24.txt CD1C4254\nrom/light_param/glow_pv025s27.txt 359B5D7E\nrom/light_param/glow_pv028s01.txt DE721C8E\nrom/light_param/glow_pv079s01.txt C62AB0AE\nrom/light_param/glow_pv081s01.txt 407751A0\nrom/light_param/glow_pv081s02.txt 76EF128F\nrom/light_param/glow_pv081s05.txt 46111585\nrom/light_param/glow_pv081s06.txt 1378C705\nrom/light_param/glow_pv081s07.txt 9C43A332\nrom/light_param/glow_pv081s09.txt 1378C705\nrom/light_param/glow_pv081s10.txt 1378C705\nrom/light_param/glow_pv081s11.txt E6CB2ED6\nrom/light_param/glow_pv082s61.txt 03F0EBC6\nrom/light_param/glow_pv082s62.txt 03F0EBC6\nrom/light_param/glow_pv082s64.txt 03F0EBC6\nrom/light_param/glow_pv082s65.txt 03F0EBC6\nrom/light_param/glow_pv083s01.txt 32C243A5\nrom/light_param/glow_pv083s02.txt 39DED465\nrom/light_param/glow_pv083s03.txt 468916EF\nrom/light_param/glow_pv083s04.txt 07C2D937\nrom/light_param/glow_pv083s05.txt 942321C9\nrom/light_param/glow_pv083s07.txt 919FFBB6\nrom/light_param/glow_pv083s14.txt 4FC34D4F\nrom/light_param/glow_pv083s15.txt 4B5D22E4\nrom/light_param/glow_pv083s18.txt 7FF06EE6\nrom/light_param/glow_pv083s26.txt 40BCDB0C\nrom/light_param/glow_pv083s27.txt 07C2D937\nrom/light_param/glow_pv083s28.txt F33C6D0B\nrom/light_param/glow_pv084s01.txt CF265F65\nrom/light_param/glow_pv085s01.txt CF265F65\nrom/light_param/glow_pv086s02.txt 2FF9022E\nrom/light_param/glow_pv087s01.txt 85721F88\nrom/light_param/glow_pv087s02.txt 85721F88\nrom/light_param/glow_pv087s16.txt 85721F88\nrom/light_param/glow_pv087s17.txt 85721F88\nrom/light_param/glow_pv088s01.txt 10CB908D\nrom/light_param/glow_pv088s02.txt 7A175D31\nrom/light_param/glow_pv088s11.txt DB803A43\nrom/light_param/glow_pv088s12.txt 6DB029CC\nrom/light_param/glow_pv088s14.txt 6DB029CC\nrom/light_param/glow_pv089s01.txt 4F77EDA7\nrom/light_param/glow_pv089s03.txt 292A0DB4\nrom/light_param/glow_pv090s01.txt 72F84BE8\nrom/light_param/glow_pv090s02.txt E6CB2ED6\nrom/light_param/glow_pv091s01.txt 590D0BF6\nrom/light_param/glow_pv091s02.txt 67EE4BF1\nrom/light_param/glow_pv091s04.txt 6F8F98EF\nrom/light_param/glow_pv091s09.txt 6F8F98EF\nrom/light_param/glow_pv091s10.txt 6F8F98EF\nrom/light_param/glow_pv091s13.txt 26A7871E\nrom/light_param/glow_pv091s14.txt 26A7871E\nrom/light_param/glow_pv091s15.txt 6F8F98EF\nrom/light_param/glow_pv092s01.txt 86EED18D\nrom/light_param/glow_pv092s02.txt 552E9D8F\nrom/light_param/glow_pv092s03.txt 979BE3B5\nrom/light_param/glow_pv092s05.txt 979BE3B5\nrom/light_param/glow_pv092s07.txt B9F69914\nrom/light_param/glow_pv092s08.txt 8664BC84\nrom/light_param/glow_pv092s09.txt 825ADB5C\nrom/light_param/glow_pv092s10.txt 48FD8AA1\nrom/light_param/glow_pv092s11.txt 825ADB5C\nrom/light_param/glow_pv092s12.txt 08B8C6F5\nrom/light_param/glow_pv094s02.txt 9557F62C\nrom/light_param/glow_pv094s16.txt 9557F62C\nrom/light_param/glow_pv094s17.txt 9557F62C\nrom/light_param/glow_pv094s18.txt 9557F62C\nrom/light_param/glow_pv096s01.txt EED4F5CE\nrom/light_param/glow_pv096s09.txt 83BE2E15\nrom/light_param/glow_PV097s01.txt FFA13A7E\nrom/light_param/glow_pv103s01.txt 797F0584\nrom/light_param/glow_pv103s02.txt B0EA8DD1\nrom/light_param/glow_pv103s03.txt 35F93D1C\nrom/light_param/glow_pv104s01.txt C243B71D\nrom/light_param/glow_pv104s02.txt 634370B3\nrom/light_param/glow_pv104s03.txt CAD0EB9B\nrom/light_param/glow_pv104s04.txt 35FDDB5F\nrom/light_param/glow_pv218s01.txt CCF1867A\nrom/light_param/glow_pv218s02.txt CCF1867A\nrom/light_param/glow_pv218s04.txt 1D146B29\nrom/light_param/glow_pv219s01.txt 8096CEC5\nrom/light_param/glow_pv219s02.txt 01B3ABE2\nrom/light_param/glow_pv219s04.txt E6CB2ED6\nrom/light_param/glow_pv219s05.txt 0E2BE323\nrom/light_param/glow_pv219s07.txt E6CB2ED6\nrom/light_param/glow_pv219s08.txt E6CB2ED6\nrom/light_param/glow_pv219s09.txt 68760330\nrom/light_param/glow_pv219s10.txt 8096CEC5\nrom/light_param/glow_pv219s11.txt 68760330\nrom/light_param/glow_pv219s12.txt 26F2FE9F\nrom/light_param/glow_pv219s13.txt E6CB2ED6\nrom/light_param/glow_pv219s14.txt 01B3ABE2\nrom/light_param/glow_pv220s01.txt 67EE4BF1\nrom/light_param/glow_pv220s02.txt 67EE4BF1\nrom/light_param/glow_pv220s03.txt 26FF9072\nrom/light_param/glow_pv221s04.txt 08550B1E\nrom/light_param/glow_pv221s05.txt 08550B1E\nrom/light_param/glow_pv221s06.txt 08550B1E\nrom/light_param/glow_pv221s07.txt 08550B1E\nrom/light_param/glow_pv221s08.txt 08550B1E\nrom/light_param/glow_pv221s09.txt 08550B1E\nrom/light_param/glow_pv221s10.txt 08550B1E\nrom/light_param/glow_pv221s11.txt 08550B1E\nrom/light_param/glow_pv221s14.txt 08550B1E\nrom/light_param/glow_pv222s01.txt 0ADFE1F9\nrom/light_param/glow_pv222s02.txt FAB5F6E6\nrom/light_param/glow_pv223s01.txt 545A4A6A\nrom/light_param/glow_pv223s02.txt 3428E7A7\nrom/light_param/glow_pv223s03.txt 1BCC87B4\nrom/light_param/glow_pv223s04.txt C1A0EAEE\nrom/light_param/glow_pv223s05.txt C1A0EAEE\nrom/light_param/glow_pv223s08.txt 2CBBC66E\nrom/light_param/glow_pv223s09.txt 1472930B\nrom/light_param/glow_pv223s10.txt A511AD88\nrom/light_param/glow_pv224s01.txt E6CB2ED6\nrom/light_param/glow_pv224s02.txt 120A8C43\nrom/light_param/glow_pv224s03.txt 120A8C43\nrom/light_param/glow_pv225s01.txt 0CD6439A\nrom/light_param/glow_pv225s02.txt 802711F8\nrom/light_param/glow_pv225s03.txt 1C9D8B48\nrom/light_param/glow_pv226s01.txt 164442FA\nrom/light_param/glow_pv227s01.txt DD6D008A\nrom/light_param/glow_pv228s01.txt 0DF220B2\nrom/light_param/glow_pv228s02.txt 51FBFE43\nrom/light_param/glow_pv228s03.txt 6FFC6436\nrom/light_param/glow_pv228s04.txt F5623766\nrom/light_param/glow_pv231s01.txt 6E831D89\nrom/light_param/glow_pv231s03.txt 6E831D89\nrom/light_param/glow_pv231s04.txt 6E831D89\nrom/light_param/glow_pv231s05.txt 6E831D89\nrom/light_param/glow_pv231s06.txt 6E831D89\nrom/light_param/glow_pv231s07.txt 6E831D89\nrom/light_param/glow_pv232s01.txt EED90111\nrom/light_param/glow_pv232s02.txt 4C4AB6D9\nrom/light_param/glow_pv232s03.txt 7D994E36\nrom/light_param/glow_pv233s01.txt 1E6A0EF5\nrom/light_param/glow_pv233s03.txt 1E6A0EF5\nrom/light_param/glow_pv233s04.txt B6B79BAE\nrom/light_param/glow_pv233s06.txt 1E6A0EF5\nrom/light_param/glow_pv233s07.txt 1E6A0EF5\nrom/light_param/glow_pv233s08.txt 3F9C4613\nrom/light_param/glow_pv234s01.txt 67EE4BF1\nrom/light_param/glow_pv234s02.txt 67EE4BF1\nrom/light_param/glow_pv235s02.txt E9935327\nrom/light_param/glow_pv235s03.txt FA2D2013\nrom/light_param/glow_pv235s04.txt DD6D008A\nrom/light_param/glow_pv235s05.txt 1472930B\nrom/light_param/glow_pv235s06.txt 275B83ED\nrom/light_param/glow_pv235s07.txt 60A419C7\nrom/light_param/glow_pv235s09.txt D40BF8A8\nrom/light_param/glow_pv236s01.txt 86E7BC10\nrom/light_param/glow_pv236s02.txt DB6937E3\nrom/light_param/glow_pv236s03.txt 979BE3B5\nrom/light_param/glow_pv236s04.txt 10CB908D\nrom/light_param/glow_pv236s05.txt 5DA8D52F\nrom/light_param/glow_pv236s06.txt 7A175D31\nrom/light_param/glow_pv236s07.txt 85721F88\nrom/light_param/glow_pv238s01.txt 8B44AF92\nrom/light_param/glow_pv239s01.txt 86E5F7AE\nrom/light_param/glow_pv001s04.txt 8AF0849B\nrom/light_param/glow_pv004s05.txt 7B2D0B41\nrom/light_param/glow_pv008s08.txt 4CD87617\nrom/light_param/glow_pv013s02.txt 2FD4BD57\nrom/light_param/glow_pv024s01.txt 3F22136F\nrom/light_param/glow_pv025s04.txt BEAC9A3F\nrom/light_param/glow_pv025s21.txt 71D76220\nrom/light_param/glow_pv082s63.txt 03F0EBC6\nrom/light_param/glow_pv086s01.txt 2FF9022E\nrom/light_param/glow_pv091s03.txt 67EE4BF1\nrom/light_param/glow_pv094s01.txt 979BE3B5\nrom/light_param/glow_pv218s03.txt 1D146B29\nrom/light_param/glow_pv221s03.txt 08550B1E\nrom/light_param/glow_pv223s07.txt 1472930B\nrom/light_param/glow_pv231s02.txt 6E831D89\nrom/light_param/fog_d2pv065s07.txt DA510E7C\nrom/light_param/fog_pv240s01.txt 22841C7C\nrom/light_param/glow_ns120.txt 2361B703\nrom/light_param/glow_pv235s01.txt 60A419C7\nrom/light_param/light_ns017.txt 759AEFA3\nrom/light_param/glow_pv240s02.txt E71487C1\nrom/light_param/glow_pv240s03.txt E71487C1\nrom/light_param/glow_pv241s01.txt A1E1A178\nrom/light_param/glow_pv241s02.txt 9FAF0F62\nrom/light_param/glow_pv242s01.txt D44796F2\nrom/light_param/glow_pv243s01.txt 03F0EBC6\nrom/light_param/glow_pv247s01.txt A51F63DF\nrom/light_param/glow_pv247s02.txt 01BD98B0\nrom/light_param/glow_pv249s01.txt E522F8B7\nrom/light_param/glow_pv250s01.txt 83F91C5E\nrom/light_param/glow_pv253s01.txt 97F7B348\nrom/light_param/glow_pv253s02.txt 97F7B348\nrom/light_param/glow_pv253s03.txt 97F7B348\nrom/light_param/glow_pv253s04.txt 97F7B348\nrom/light_param/glow_pv253s05.txt FA2FB791\nrom/light_param/glow_pv253s06.txt 97F7B348\nrom/light_param/glow_pv253s08.txt 97F7B348\nrom/light_param/glow_pv253s09.txt 97F7B348\nrom/light_param/glow_pv257s01.txt B50A0188\nrom/light_param/glow_pv259s01.txt F298EADA\nrom/light_param/glow_pv260s01.txt 28C38FB4\nrom/light_param/glow_pv261s01.txt 8A6B0737\nrom/light_param/glow_pv261s02.txt 8CC2FE94\nrom/light_param/glow_pv262s01.txt DB8EF195\nrom/light_param/glow_pv262s02.txt BBC5EA9F\nrom/light_param/glow_pv262s03.txt 55EA1341\nrom/light_param/glow_pv262s04.txt 858E13DD\nrom/light_param/glow_pv262s05.txt 1097E035\nrom/light_param/glow_pv262s06.txt E1171481\nrom/light_param/glow_pv262s07.txt A2A8E8F5\nrom/light_param/glow_pv262s08.txt FB01B27D\nrom/light_param/glow_pv262s11.txt E547FBE5\nrom/light_param/glow_pv432s01.txt 1472930B\nrom/light_param/glow_pv432s03.txt 1472930B\nrom/light_param/glow_pv433s01.txt FE6C7300\nrom/light_param/glow_pv433s02.txt CC39A5A1\nrom/light_param/glow_pv433s03.txt A1E1A178\nrom/light_param/glow_pv433s04.txt CC39A5A1\nrom/light_param/glow_pv433s05.txt CC39A5A1\nrom/light_param/glow_pv433s06.txt 185058D6\nrom/light_param/glow_pv434s01.txt 03F0EBC6\nrom/light_param/glow_pv435s01.txt 7E18FC67\nrom/light_param/glow_pv435s02.txt 4667AA29\nrom/light_param/glow_pv435s03.txt C555EB70\nrom/light_param/glow_pv435s04.txt F6B78B72\nrom/light_param/glow_pv435s05.txt 0E4A80BB\nrom/light_param/glow_pv435s06.txt 2C0BEC0A\nrom/light_param/glow_pv435s07.txt 86E5F7AE\nrom/light_param/glow_pv600s01.txt C7EB8415\nrom/light_param/glow_pv600s02.txt 979BE3B5\nrom/light_param/glow_pv600s03.txt 081847C7\nrom/light_param/glow_pv600s04.txt 96DBAB51\nrom/light_param/glow_pv601s01.txt 9E096F91\nrom/light_param/glow_pv601s02.txt 039877B0\nrom/light_param/glow_pv601s03.txt 3A664673\nrom/light_param/glow_pv601s04.txt A1B96D3F\nrom/light_param/glow_pv602s01.txt F6B78B72\nrom/light_param/glow_pv602s02.txt 67EE4BF1\nrom/light_param/glow_pv602s03.txt 67EE4BF1\nrom/light_param/glow_pv602s04.txt 4859BF68\nrom/light_param/glow_pv603s01.txt B79BCCD8\nrom/light_param/glow_pv604s01.txt F0EBBA68\nrom/light_param/glow_pv604s02.txt FBC2899B\nrom/light_param/glow_pv604s06.txt 5DE5A485\nrom/light_param/glow_pv605s01.txt D918A090\nrom/light_param/glow_pv605s02.txt 50AE9055\nrom/light_param/glow_pv605s03.txt DD9AA912\nrom/light_param/glow_pv605s05.txt 50AE9055\nrom/light_param/glow_pv607s01.txt 0F643210\nrom/light_param/glow_pv608s01.txt A3160D36\nrom/light_param/glow_pv610s01.txt CBFC29DF\nrom/light_param/glow_pv611s01.txt D55DEAEF\nrom/light_param/glow_pv613s01.txt 780EC51B\nrom/light_param/glow_pv613s02.txt B9EC3E48\nrom/light_param/glow_pv614s01.txt E71487C1\nrom/light_param/glow_pv615s01.txt A7D0592C\nrom/light_param/glow_pv616s01.txt 68A23778\nrom/light_param/glow_pv616s02.txt DD9AA912\nrom/light_param/glow_pv616s03.txt 4EE4A666\nrom/light_param/glow_pv617s01.txt 432F066A\nrom/light_param/glow_pv618s01.txt 2E714436\nrom/light_param/glow_pv618s02.txt 2C0BEC0A\nrom/light_param/glow_pv618s03.txt 2E714436\nrom/light_param/glow_pv618s04.txt 2C0BEC0A\nrom/light_param/glow_pv618s05.txt 2C0BEC0A\nrom/light_param/glow_pv618s06.txt 2C0BEC0A\nrom/light_param/glow_pv619s01.txt 82FF44C8\nrom/light_param/glow_pv619s03.txt A7303B3C\nrom/light_param/glow_pv619s04.txt E9C16772\nrom/light_param/glow_pv620s01.txt 77CA361B\nrom/light_param/glow_pv621s01.txt 75885C0F\nrom/light_param/glow_pv622s01.txt 7CE412DE\nrom/light_param/glow_pv623s01.txt 8D43EF04\nrom/light_param/glow_pv623s02.txt 24B94FEE\nrom/light_param/glow_pv623s03.txt DFFE4054\nrom/light_param/glow_pv624s01.txt 29ACF2AB\nrom/light_param/glow_pv625s03.txt 705B294D\nrom/light_param/glow_pv625s04.txt 943DFBC9\nrom/light_param/glow_pv625s05.txt F3C53FD1\nrom/light_param/glow_pv626s01.txt 1D18F495\nrom/light_param/glow_pv627s01.txt FE7DF610\nrom/light_param/glow_pv627s02.txt E71487C1\nrom/light_param/glow_pv627s03.txt 14ABBEB5\nrom/light_param/glow_pv628s01.txt 41D18B6B\nrom/light_param/glow_pv629s01.txt 9746FB1D\nrom/light_param/glow_pv631s01.txt FAEF3140\nrom/light_param/glow_pv637s01.txt 97F7B348\nrom/light_param/glow_pv637s02.txt B8ECD4AF\nrom/light_param/glow_pv638s01.txt 5D53B186\nrom/light_param/glow_pv638s02.txt 927F99DA\nrom/light_param/glow_pv639s03.txt 029FBAF5\nrom/light_param/glow_pv639s04.txt E71487C1\nrom/light_param/glow_pv641s01.txt E3FC7C0D\nrom/light_param/glow_pv642s01.txt 078FDB03\nrom/light_param/glow_pv710s04.txt 387D60D5\nrom/light_param/glow_pv723s01.txt 12C0D7A0\nrom/light_param/glow_pv723s02.txt 4187AF60\nrom/light_param/glow_pv726s01.txt 0CBBF826\nrom/light_param/glow_pv727s01.txt 9E932657\nrom/light_param/glow_pv727s02.txt AE1D51CD\nrom/light_param/glow_pv727s03.txt 6CECBBFA\nrom/light_param/glow_pv728s01.txt 47F1AFC2\nrom/light_param/glow_pv728s03.txt 7761369D\nrom/light_param/glow_pv728s04.txt 417B361D\nrom/light_param/glow_pv729s01.txt FCCF02C8\nrom/light_param/glow_pv729s03.txt FFC53534\nrom/light_param/glow_pv730s01.txt 38B40B49\nrom/light_param/glow_pv730s02.txt D937E095\nrom/light_param/glow_pv731s02.txt A848ED95\nrom/light_param/glow_pv732s01.txt 55384823\nrom/light_param/glow_pv734s01.txt 743F0902\nrom/light_param/glow_pv734s02.txt 795C79A0\nrom/light_param/glow_pv734s04.txt E9ED0219\nrom/light_param/glow_pv734s05.txt 869B474C\nrom/light_param/glow_pv736s01.txt D937E095\nrom/light_param/glow_pv736s02.txt 3485647C\nrom/light_param/glow_pv738s01.txt 060652BC\nrom/light_param/glow_pv739s01.txt 34DEA988\nrom/light_param/glow_pv740s01.txt 5504C316\nrom/light_param/glow_pv740s02.txt BDCF8F8F\nrom/light_param/glow_pv740s03.txt 6D471E6D\nrom/light_param/glow_pv740s04.txt C1C63142\nrom/light_param/glow_pv740s05.txt F99DF359\nrom/light_param/glow_pv832s01.txt 3A224A54\nrom/light_param/glow_stgns105.txt 85721F88\nrom/light_param/glow_tst.txt D5BAB724\nrom/light_param/glow_tst002.txt AE1D51CD\nrom/light_param/light_aetback.txt D97122DE\nrom/light_param/light_d2ns035.txt 15B85F7E\nrom/light_param/light_d2ns036.txt E5533ACC\nrom/light_param/light_d2ns037.txt 730BE619\nrom/light_param/light_d2ns039.txt BA75FC0E\nrom/light_param/light_d2ns040.txt F35B2854\nrom/light_param/light_d2ns042.txt FC0FBA5B\nrom/light_param/light_d2ns043.txt CF4C1A69\nrom/light_param/light_d2ns044.txt 2178507C\nrom/light_param/light_d2ns045.txt 9B18A3B4\nrom/light_param/light_d2ns046.txt DC3FECBD\nrom/light_param/light_d2ns047.txt 2B944338\nrom/light_param/light_d2ns048.txt B82B9494\nrom/light_param/light_d2ns053.txt 91ABC262\nrom/light_param/light_d2ns054.txt E8FD0400\nrom/light_param/light_d2ns055.txt 50049067\nrom/light_param/light_d2ns056.txt 8EC82D64\nrom/light_param/light_d2ns057.txt 82CB5F06\nrom/light_param/light_d2ns058.txt C3040909\nrom/light_param/light_d2ns059.txt C958DF67\nrom/light_param/light_d2ns060.txt 1E9A56F6\nrom/light_param/light_d2ns062.txt BF639F57\nrom/light_param/light_d2ns063.txt 1D77619F\nrom/light_param/light_d2ns066.txt 3587A2A3\nrom/light_param/light_d2ns067.txt A889EACD\nrom/light_param/light_d2ns068.txt 3CA35B4D\nrom/light_param/light_d2ns069.txt 7960ABC0\nrom/light_param/light_d2ns071.txt 81B0EBC2\nrom/light_param/light_d2ns073.txt 945C2DD8\nrom/light_param/light_d2ns075.txt 89DCDB77\nrom/light_param/light_d2ns076.txt F366B8A5\nrom/light_param/light_d2ns077.txt 81735BD0\nrom/light_param/light_d2ns078.txt DF4F8186\nrom/light_param/light_d2ns079.txt 55CF6927\nrom/light_param/light_d2ns081.txt 68150916\nrom/light_param/light_d2ns082.txt E8D47EB8\nrom/light_param/light_d2pv037s01.txt F35B2854\nrom/light_param/light_d2pv039s01.txt FC0FBA5B\nrom/light_param/light_d2pv039s02.txt FC0FBA5B\nrom/light_param/light_d2pv039s03.txt CF4C1A69\nrom/light_param/light_d2pv040s01.txt 2178507C\nrom/light_param/light_d2pv041s01.txt 9B18A3B4\nrom/light_param/light_d2pv042s01.txt A6D5D469\nrom/light_param/light_d2pv042s02.txt 650B6AE4\nrom/light_param/light_d2pv043s01.txt FBE181A4\nrom/light_param/light_d2pv044s01.txt 31301976\nrom/light_param/light_d2pv044s02.txt B82B9494\nrom/light_param/light_d2pv044s03.txt CF8978E8\nrom/light_param/light_d2pv047s01.txt E8FD0400\nrom/light_param/light_d2pv047s02.txt E8FD0400\nrom/light_param/light_d2pv047s03.txt 91ABC262\nrom/light_param/light_d2pv047s04.txt 7B75067D\nrom/light_param/light_d2pv047s05.txt 50049067\nrom/light_param/light_d2pv048s01.txt 8EC82D64\nrom/light_param/light_d2pv050s01.txt E60DD448\nrom/light_param/light_d2pv051s01.txt 20A16AC3\nrom/light_param/light_d2pv051s02.txt 767D5F55\nrom/light_param/light_d2pv051s03.txt 0922A41B\nrom/light_param/light_d2pv051s04.txt 25F3653C\nrom/light_param/light_d2pv053s01.txt 85E85D27\nrom/light_param/light_d2pv053s02.txt 92EADA40\nrom/light_param/light_d2pv053s03.txt 160A35ED\nrom/light_param/light_d2pv053s04.txt 455C5059\nrom/light_param/light_d2pv053s05.txt D645D2EE\nrom/light_param/light_d2pv053s06.txt 3A0387EA\nrom/light_param/light_d2pv053s10.txt 8561FDE7\nrom/light_param/light_d2pv058s01.txt 3CA35B4D\nrom/light_param/light_d2pv058s02.txt 3CA35B4D\nrom/light_param/light_d2pv060s01.txt 81B0EBC2\nrom/light_param/light_d2pv061s01.txt 5D050DC3\nrom/light_param/light_d2pv062s01.txt DA516867\nrom/light_param/light_d2pv063s01.txt FC05F792\nrom/light_param/light_d2pv063s09.txt 15A8ADC7\nrom/light_param/light_d2pv063s11.txt B07A8D82\nrom/light_param/light_d2pv063s12.txt 36B9253C\nrom/light_param/light_d2pv064s02.txt 1FD957D4\nrom/light_param/light_d2pv065s01.txt 55CF6927\nrom/light_param/light_d2pv065s05.txt 45651D59\nrom/light_param/light_d2pv065s06.txt A4D693DC\nrom/light_param/light_d2pv208s01.txt 5E2D09A0\nrom/light_param/light_d2pv212s01.txt D5083538\nrom/light_param/light_ns001.txt B882FA66\nrom/light_param/light_ns002.txt 29F9B7BF\nrom/light_param/light_ns005.txt E12C833E\nrom/light_param/light_ns006.txt AB5FC82C\nrom/light_param/light_ns007.txt E32CD56E\nrom/light_param/light_ns008.txt DA988B86\nrom/light_param/light_ns009.txt 13254912\nrom/light_param/light_ns010.txt 3F195457\nrom/light_param/light_ns011.txt 1BCEDFD7\nrom/light_param/light_ns012.txt A5FDE2D8\nrom/light_param/light_ns013.txt F581714A\nrom/light_param/light_ns024.txt 98A60494\nrom/light_param/light_ns025.txt 8DFEE399\nrom/light_param/light_ns031.txt CE79592A\nrom/light_param/light_ns032.txt D3E8B59B\nrom/light_param/light_ns083.txt A5FDE2D8\nrom/light_param/light_ns084.txt 268E9C5D\nrom/light_param/light_ns087.txt 60B8DC34\nrom/light_param/light_ns088.txt B82B9494\nrom/light_param/light_ns089.txt D5083538\nrom/light_param/light_ns090.txt 7C009BA2\nrom/light_param/light_ns093.txt DBD3EDFB\nrom/light_param/light_ns095.txt 7272CE34\nrom/light_param/light_ns096.txt 7272CE34\nrom/light_param/light_ns097.txt 2BB51610\nrom/light_param/light_ns098.txt DE64B7B1\nrom/light_param/light_ns099.txt 1DCF624F\nrom/light_param/light_ns100.txt 022FB194\nrom/light_param/glow_pv240s01.txt E71487C1\nrom/light_param/glow_pv253s07.txt 97F7B348\nrom/light_param/glow_pv262s12.txt 83F9C109\nrom/light_param/glow_pv435s08.txt F6B78B72\nrom/light_param/glow_pv604s07.txt ADEDC7C8\nrom/light_param/glow_pv617s02.txt B6C224AE\nrom/light_param/glow_pv625s01.txt 9432392E\nrom/light_param/glow_pv639s06.txt E71487C1\nrom/light_param/glow_pv731s01.txt C6C2617A\nrom/light_param/glow_selpvback.txt D5BAB724\nrom/light_param/light_d2ns049.txt 31301976\nrom/light_param/light_d2ns074.txt 89DCDB77\nrom/light_param/light_d2pv042s06.txt A6D5D469\nrom/light_param/light_d2pv051s05.txt E684B97F\nrom/light_param/light_d2pv064s01.txt DF4F8186\nrom/light_param/light_ns102.txt B7EF611A\nrom/light_param/light_ns103.txt 832E76E4\nrom/light_param/light_ns104.txt BBDF831E\nrom/light_param/light_ns105.txt 2BA42F73\nrom/light_param/light_ns106.txt 6ABE9DEA\nrom/light_param/light_ns107.txt A856DFEE\nrom/light_param/light_ns108.txt 14C0BACD\nrom/light_param/light_ns109.txt FE8C1B98\nrom/light_param/light_ns110.txt CD4B668D\nrom/light_param/light_ns111.txt E3CF0A5C\nrom/light_param/light_ns112.txt 82336249\nrom/light_param/light_ns114.txt DE36F6CC\nrom/light_param/light_ns116.txt A58D8657\nrom/light_param/light_ns117.txt 2A9F127A\nrom/light_param/light_ns118.txt 41FC8227\nrom/light_param/light_ns119.txt CB753736\nrom/light_param/light_ns120.txt 48CDCDA1\nrom/light_param/light_ns122.txt A4604AC7\nrom/light_param/light_ns123.txt B0E5FB31\nrom/light_param/light_ns124.txt CF1F7B8D\nrom/light_param/light_ns125.txt 2F7F44F8\nrom/light_param/light_ns126.txt 5BDF1B2B\nrom/light_param/light_ns221.txt F270AF4D\nrom/light_param/light_ns223.txt 0C84BE75\nrom/light_param/light_ns249.txt E12C833E\nrom/light_param/light_ns257.txt 00FA0BCE\nrom/light_param/light_ns263.txt 590DE343\nrom/light_param/light_ns266.txt 3BD3AE83\nrom/light_param/light_ns292.txt 4F92F5DB\nrom/light_param/light_pv003s01.txt 00FA0BCE\nrom/light_param/light_pv003s02.txt 00FA0BCE\nrom/light_param/light_pv003s03.txt 00FA0BCE\nrom/light_param/light_pv003s04.txt 00FA0BCE\nrom/light_param/light_pv003s05.txt 00FA0BCE\nrom/light_param/light_pv003s07.txt 00FA0BCE\nrom/light_param/light_pv003s08.txt 00FA0BCE\nrom/light_param/light_pv003s09.txt 7A25FDBC\nrom/light_param/light_pv004s05.txt B455CA9B\nrom/light_param/light_pv004s07.txt 8A7ED6B6\nrom/light_param/light_pv007s07.txt 8A01E8A3\nrom/light_param/light_pv007s10.txt C044E882\nrom/light_param/light_pv007s11.txt 5A55E8E9\nrom/light_param/light_pv007s12.txt 95686F11\nrom/light_param/light_pv008s01.txt 7F8CF682\nrom/light_param/light_pv008s03.txt DE2BA916\nrom/light_param/light_pv008s07.txt 218FF576\nrom/light_param/light_pv008s08.txt 4C26E89F\nrom/light_param/light_pv008s09.txt F76CE7F4\nrom/light_param/light_pv008s10.txt CAC4CF4A\nrom/light_param/light_pv009s01.txt D973098D\nrom/light_param/light_pv009s03.txt C9E73C21\nrom/light_param/light_pv009s04.txt 4DDDBE28\nrom/light_param/light_pv009s05.txt DC3C6EFD\nrom/light_param/light_pv009s06.txt E8DFFBBC\nrom/light_param/light_pv009s08.txt B2035A71\nrom/light_param/light_pv009s10.txt 5624B9CC\nrom/light_param/light_pv011s01.txt 37ECE940\nrom/light_param/light_pv011s02.txt 37ECE940\nrom/light_param/light_pv011s06.txt 37ECE940\nrom/light_param/light_pv013s01.txt E5998FAF\nrom/light_param/light_pv013s02.txt E5998FAF\nrom/light_param/light_pv013s03.txt E5998FAF\nrom/light_param/light_pv013s04.txt E5998FAF\nrom/light_param/light_pv015s01.txt 86609832\nrom/light_param/light_pv015s02.txt 1AFA8812\nrom/light_param/light_pv015s03.txt 33544282\nrom/light_param/light_pv018s01.txt EA9F5D64\nrom/light_param/light_pv018s02.txt 8135D09D\nrom/light_param/light_pv018s03.txt EA9F5D64\nrom/light_param/light_pv018s04.txt E2A1ECBA\nrom/light_param/light_pv018s05.txt 73F4BF1E\nrom/light_param/light_pv018s06.txt BDFBB843\nrom/light_param/light_pv018s07.txt 11FD9E8F\nrom/light_param/light_pv018s08.txt AFFFB14D\nrom/light_param/light_pv018s09.txt DB0F4203\nrom/light_param/light_pv019s01.txt F6456C50\nrom/light_param/light_pv019s04.txt E5D10A9C\nrom/light_param/light_pv019s07.txt C3F52114\nrom/light_param/light_pv019s08.txt B13E2EC7\nrom/light_param/light_pv019s13.txt C1E616F5\nrom/light_param/light_pv024s01.txt 8E7618E4\nrom/light_param/light_pv024s02.txt CBB24DAC\nrom/light_param/light_pv024s04.txt 9B04755D\nrom/light_param/light_pv024s05.txt C6992EAB\nrom/light_param/light_pv024s06.txt E29DC9DA\nrom/light_param/light_pv024s07.txt 6B755E1A\nrom/light_param/light_pv024s08.txt F9B11E15\nrom/light_param/light_pv024s09.txt EAB231C1\nrom/light_param/light_pv024s10.txt 1D25BF5D\nrom/light_param/light_pv024s11.txt DE140F7A\nrom/light_param/light_pv024s12.txt 6D5A3A1C\nrom/light_param/light_pv024s13.txt BE99CD56\nrom/light_param/light_pv024s14.txt 6FE11862\nrom/light_param/light_pv025s01.txt 32E08368\nrom/light_param/light_pv025s02.txt EF8F5F4E\nrom/light_param/light_pv025s03.txt C65FD26C\nrom/light_param/light_pv025s04.txt 0F13AA21\nrom/light_param/light_pv025s05.txt 6F57DC4D\nrom/light_param/light_pv025s07.txt AB99703E\nrom/light_param/light_pv025s08.txt E0185D2C\nrom/light_param/light_pv025s09.txt AA385D38\nrom/light_param/light_pv025s10.txt DA61C28D\nrom/light_param/light_pv025s11.txt 2743BBDF\nrom/light_param/light_pv025s12.txt 696CCF0D\nrom/light_param/light_pv025s13.txt 9D31602B\nrom/light_param/light_pv025s14.txt D143B41C\nrom/light_param/light_pv025s15.txt 9D31602B\nrom/light_param/light_pv025s16.txt 3784C6F1\nrom/light_param/light_pv025s17.txt 9D31602B\nrom/light_param/light_pv025s18.txt 58F408EB\nrom/light_param/light_pv025s19.txt B36DE240\nrom/light_param/light_pv025s20.txt BAC30BF2\nrom/light_param/light_pv025s21.txt BBBEA4EC\nrom/light_param/light_pv025s22.txt D7DF8FD5\nrom/light_param/light_pv025s24.txt FF211B02\nrom/light_param/light_pv025s27.txt 5130F163\nrom/light_param/light_pv028s01.txt F581714A\nrom/light_param/light_pv079s01.txt 844B3FE4\nrom/light_param/light_pv081s01.txt 995EF7C9\nrom/light_param/light_pv081s06.txt 57C46D9A\nrom/light_param/light_pv081s09.txt D003D5DB\nrom/light_param/light_pv081s10.txt 0C455742\nrom/light_param/light_pv081s11.txt F4E5CC92\nrom/light_param/light_pv081s12.txt E7BB3C37\nrom/light_param/light_pv082s61.txt A50DC64B\nrom/light_param/light_pv082s62.txt A50DC64B\nrom/light_param/light_pv082s63.txt A50DC64B\nrom/light_param/light_pv082s64.txt A50DC64B\nrom/light_param/light_pv082s65.txt A50DC64B\nrom/light_param/light_pv083s01.txt C43523CE\nrom/light_param/light_pv083s03.txt 6C69D429\nrom/light_param/light_pv083s04.txt 29F07390\nrom/light_param/light_pv083s05.txt B205AEA2\nrom/light_param/light_pv083s07.txt 2E0F14D6\nrom/light_param/light_pv083s08.txt 7B8E8CA1\nrom/light_param/light_pv083s14.txt E70C7166\nrom/light_param/light_pv083s15.txt 29016A21\nrom/light_param/light_pv083s18.txt 655C68E2\nrom/light_param/light_pv083s24.txt 7B8E8CA1\nrom/light_param/light_pv083s25.txt 7B8E8CA1\nrom/light_param/light_pv083s26.txt B79778B3\nrom/light_param/light_pv083s27.txt 863B3F35\nrom/light_param/light_pv083s28.txt 70E1A38F\nrom/light_param/light_pv084s01.txt B7EF611A\nrom/light_param/light_pv085s01.txt 1B283412\nrom/light_param/light_pv086s01.txt 832E76E4\nrom/light_param/light_pv087s01.txt BBDF831E\nrom/light_param/light_pv087s02.txt 2BA42F73\nrom/light_param/light_pv087s16.txt BBDF831E\nrom/light_param/light_pv087s17.txt 2BA42F73\nrom/light_param/light_pv088s01.txt 6ABE9DEA\nrom/light_param/light_pv088s02.txt 1E445F38\nrom/light_param/light_pv088s11.txt B6DC1A4D\nrom/light_param/light_pv088s12.txt A856DFEE\nrom/light_param/light_pv088s14.txt 339B4533\nrom/light_param/light_pv089s01.txt FE8C1B98\nrom/light_param/light_pv089s02.txt 3B740327\nrom/light_param/light_pv089s03.txt CD4B668D\nrom/light_param/light_pv089s05.txt 3B740327\nrom/light_param/light_pv090s01.txt E3CF0A5C\nrom/light_param/light_pv090s02.txt 82336249\nrom/light_param/light_pv091s01.txt C7B68F67\nrom/light_param/light_pv091s14.txt DE36F6CC\nrom/light_param/light_pv092s01.txt 467042BF\nrom/light_param/light_pv092s02.txt F16CA678\nrom/light_param/light_pv092s03.txt A1546980\nrom/light_param/light_pv092s05.txt 033F2E99\nrom/light_param/light_pv092s07.txt AD4D840F\nrom/light_param/light_pv092s09.txt 79F1E92F\nrom/light_param/light_pv092s10.txt 7549ADFA\nrom/light_param/light_pv092s11.txt 4BEC4C91\nrom/light_param/light_pv092s12.txt 9FED3EAF\nrom/light_param/light_pv094s01.txt CF4DFE30\nrom/light_param/light_pv094s02.txt A4604AC7\nrom/light_param/light_pv094s16.txt A4604AC7\nrom/light_param/light_pv094s17.txt A4604AC7\nrom/light_param/light_pv094s18.txt A4604AC7\nrom/light_param/light_pv096s01.txt CF1F7B8D\nrom/light_param/light_PV097s01.txt 2F7F44F8\nrom/light_param/light_pv103s01.txt 2738F7E3\nrom/light_param/light_pv103s02.txt DD898352\nrom/light_param/light_pv103s03.txt 2177D2BA\nrom/light_param/light_pv104s01.txt EA5AA209\nrom/light_param/light_pv104s02.txt B769A68C\nrom/light_param/light_pv104s04.txt CD130211\nrom/light_param/light_pv218s01.txt 996BEC4C\nrom/light_param/light_pv218s02.txt 996BEC4C\nrom/light_param/light_pv218s04.txt 894A863C\nrom/light_param/light_pv219s01.txt 38084ED0\nrom/light_param/light_pv219s02.txt 1F3BFC4E\nrom/light_param/light_pv219s04.txt 3FBDECF4\nrom/light_param/light_pv219s05.txt D83FC140\nrom/light_param/light_pv219s07.txt DCEAF0AF\nrom/light_param/light_pv219s08.txt DCEAF0AF\nrom/light_param/light_pv219s10.txt 08ACC8CC\nrom/light_param/light_pv219s11.txt 2509EE5E\nrom/light_param/light_pv219s12.txt E805FEA1\nrom/light_param/light_pv219s13.txt 2D36E5F0\nrom/light_param/light_pv219s14.txt BD0F9D9F\nrom/light_param/light_pv220s01.txt 52A76A97\nrom/light_param/light_pv220s02.txt 52A76A97\nrom/light_param/light_pv221s03.txt D824021E\nrom/light_param/light_pv221s04.txt D824021E\nrom/light_param/light_pv221s05.txt D824021E\nrom/light_param/light_pv221s06.txt D824021E\nrom/light_param/light_pv221s07.txt 4D839A59\nrom/light_param/light_pv221s08.txt 4D839A59\nrom/light_param/light_pv221s09.txt 8B55D7ED\nrom/light_param/light_pv221s10.txt A3265127\nrom/light_param/light_pv221s11.txt 4D839A59\nrom/light_param/light_pv222s01.txt D3AF9162\nrom/light_param/light_pv222s02.txt 41214A0C\nrom/light_param/light_pv223s01.txt CA790620\nrom/light_param/light_pv223s02.txt 15C2F85E\nrom/light_param/light_pv223s03.txt F9614B16\nrom/light_param/light_pv223s04.txt 4D9E18A3\nrom/light_param/light_pv223s05.txt 9BDCA7BF\nrom/light_param/light_pv223s07.txt 0E777AD4\nrom/light_param/light_pv223s09.txt AC68E0E0\nrom/light_param/light_pv223s10.txt 1AFE0B87\nrom/light_param/light_pv224s01.txt A3C17A35\nrom/light_param/light_pv224s02.txt 5687FC42\nrom/light_param/light_pv224s03.txt 960C16A8\nrom/light_param/light_pv225.farc 15D3132C\nrom/light_param/light_pv225s01.txt 90374CB2\nrom/light_param/light_pv225s02.txt 30157C6D\nrom/light_param/light_pv226s01.txt A6C6CD41\nrom/light_param/light_pv227s01.txt 0A082C30\nrom/light_param/light_pv228s01.txt E523E843\nrom/light_param/light_pv228s02.txt E523E843\nrom/light_param/light_pv228s04.txt E523E843\nrom/light_param/light_pv231s01.txt 819537FD\nrom/light_param/light_pv231s02.txt 23A2EA6F\nrom/light_param/light_pv231s03.txt 23A2EA6F\nrom/light_param/light_pv231s04.txt 23A2EA6F\nrom/light_param/light_pv231s05.txt 23A2EA6F\nrom/light_param/light_pv231s06.txt 819537FD\nrom/light_param/light_pv231s07.txt 23A2EA6F\nrom/light_param/light_pv232s01.txt EC1870C8\nrom/light_param/light_pv232s02.txt DF4F8186\nrom/light_param/light_pv232s03.txt E04FBC2D\nrom/light_param/light_pv233s01.txt 883A49C8\nrom/light_param/light_pv233s03.txt 5CAC524E\nrom/light_param/light_pv233s04.txt 7CE6E436\nrom/light_param/light_pv233s05.txt CBB40603\nrom/light_param/light_pv233s06.txt 10A6F79B\nrom/light_param/light_pv233s07.txt 5CAC524E\nrom/light_param/light_pv233s08.txt 45DCA5F1\nrom/light_param/light_pv235s01.txt B2353204\nrom/light_param/light_pv235s02.txt 5C984FD2\nrom/light_param/light_pv235s03.txt AA481C42\nrom/light_param/light_pv235s04.txt AB34247D\nrom/light_param/light_pv235s06.txt C02D9C0F\nrom/light_param/light_pv235s07.txt B2353204\nrom/light_param/light_pv235s10.txt B2353204\nrom/light_param/light_pv236s01.txt BA701E38\nrom/light_param/light_pv236s02.txt 2DE38E1C\nrom/light_param/light_pv236s04.txt 6ABE9DEA\nrom/light_param/light_ns101.txt 1B283412\nrom/light_param/light_ns121.txt CF4DFE30\nrom/light_param/light_pv003s06.txt 00FA0BCE\nrom/light_param/light_pv009s02.txt 8E4F4A74\nrom/light_param/light_pv015s05.txt 86609832\nrom/light_param/light_pv024s03.txt 9AAFEACA\nrom/light_param/light_pv025s06.txt B782F419\nrom/light_param/light_pv025s23.txt 38AE5DCC\nrom/light_param/light_pv083s02.txt 061173F4\nrom/light_param/light_pv086s02.txt 832E76E4\nrom/light_param/light_pv091s13.txt DE36F6CC\nrom/light_param/light_pv096s09.txt C3282E5A\nrom/light_param/light_pv219s09.txt 2509EE5E\nrom/light_param/light_pv221s14.txt 4D839A59\nrom/light_param/light_pv225s03.txt 5219FC5A\nrom/light_param/light_pv233s02.txt A1636426\nrom/light_param/light_pv236s05.txt 3D596F5A\nrom/light_param/light_pv249.farc 6DAEB58A\nrom/light_param/light_pv259.farc 3A0466BA\nrom/light_param/light_pv432s01.txt 3EF815BE\nrom/light_param/light_pv601s03.txt 814A74CD\nrom/light_param/light_pv611s01.txt B39F8479\nrom/light_param/light_pv619s01.txt 5DDD7C4F\nrom/light_param/light_pv629s01.txt 45BCB1F2\nrom/light_param/light_pv710s04.txt 1CB1AA16\nrom/light_param/light_pv728s04.txt 564609F2\nrom/light_param/light_pv736s01.txt 45ED2C45\nrom/light_param/light_tst.txt A50DC64B\nrom/light_param/wind_pv009s04.txt C7E97D72\nrom/light_param/light_pv236s06.txt 14C0BACD\nrom/light_param/light_pv236s07.txt 2BA42F73\nrom/light_param/light_pv238s01.txt 2D086F7A\nrom/light_param/light_pv240s01.txt 653C612E\nrom/light_param/light_pv240s02.txt 653C612E\nrom/light_param/light_pv240s03.txt 58AF187D\nrom/light_param/light_pv241s01.txt AA0BDFE5\nrom/light_param/light_pv241s02.txt 6D5A0067\nrom/light_param/light_pv242s01.txt 9CEA6FF5\nrom/light_param/light_pv243.farc BD13A837\nrom/light_param/light_pv243s01.txt 9277A430\nrom/light_param/light_pv246s01.txt 5B279C36\nrom/light_param/light_pv247.farc 68CBE534\nrom/light_param/light_pv247s01.txt A2E203D2\nrom/light_param/light_pv247s02.txt 21A5D525\nrom/light_param/light_pv248.farc 18CC44CB\nrom/light_param/light_pv249s01.txt 0B0BA5A1\nrom/light_param/light_pv250s01.txt 20F91E06\nrom/light_param/light_pv251.farc 53E38825\nrom/light_param/light_pv253.farc B3C16557\nrom/light_param/light_pv253s01.txt 95672BA7\nrom/light_param/light_pv253s02.txt 5A43DB7D\nrom/light_param/light_pv253s03.txt DBDE2999\nrom/light_param/light_pv253s04.txt EC1643C3\nrom/light_param/light_pv253s05.txt 59BCCB42\nrom/light_param/light_pv253s06.txt CA675D56\nrom/light_param/light_pv253s07.txt 11DA51D0\nrom/light_param/light_pv253s08.txt 47365807\nrom/light_param/light_pv253s09.txt 3099E0D9\nrom/light_param/light_pv255.farc 2A59C9DF\nrom/light_param/light_pv257.farc 23B8B584\nrom/light_param/light_pv257s01.txt ECFD410D\nrom/light_param/light_pv259s01.txt B9E335E0\nrom/light_param/light_pv259_old.farc 6016B443\nrom/light_param/light_pv260.farc D9FC2AFC\nrom/light_param/light_pv260s01.txt C3077983\nrom/light_param/light_pv261.farc 613D2A53\nrom/light_param/light_pv261s01.txt 0834B0FD\nrom/light_param/light_pv261s02.txt FE86DDB0\nrom/light_param/light_pv262.farc DDC5E607\nrom/light_param/light_pv262s01.txt D5CF6B79\nrom/light_param/light_pv262s02.txt AF2B3B66\nrom/light_param/light_pv262s03.txt 12871789\nrom/light_param/light_pv262s04.txt C878429C\nrom/light_param/light_pv262s05.txt 2AEB9A10\nrom/light_param/light_pv262s08.txt 1EFC5C6B\nrom/light_param/light_pv262s11.txt CE359570\nrom/light_param/light_pv262s12.txt 9D8CFCFD\nrom/light_param/light_pv432s03.txt 3EF815BE\nrom/light_param/light_pv433s01.txt 5B2C4813\nrom/light_param/light_pv433s02.txt CF7FD54B\nrom/light_param/light_pv433s03.txt 2E1F8DD6\nrom/light_param/light_pv433s04.txt 249F1201\nrom/light_param/light_pv433s05.txt 8CE9F45C\nrom/light_param/light_pv433s06.txt 25E19761\nrom/light_param/light_pv434s01.txt 73D287D1\nrom/light_param/light_pv435s08.txt E4D9BF15\nrom/light_param/light_pv441s01.txt AC8A96CA\nrom/light_param/light_pv600s01.txt C9829F87\nrom/light_param/light_pv600s02.txt A69D16A7\nrom/light_param/light_pv600s03.txt 78253547\nrom/light_param/light_pv600s04.txt 2996BDE1\nrom/light_param/light_pv601s01.txt 538AC606\nrom/light_param/light_pv601s02.txt 451BB430\nrom/light_param/light_pv601s04.txt 1C638D13\nrom/light_param/light_pv602s01.txt 6A8AC850\nrom/light_param/light_pv602s02.txt 80AA95C9\nrom/light_param/light_pv602s03.txt 8B5A8618\nrom/light_param/light_pv602s04.txt E838A659\nrom/light_param/light_pv603s01.txt DA77CEAD\nrom/light_param/light_pv604s02.txt D7E0BFB3\nrom/light_param/light_pv604s04.txt 4819C0B2\nrom/light_param/light_pv604s05.txt AD212AA0\nrom/light_param/light_pv604s06.txt EFA06B99\nrom/light_param/light_pv604s07.txt 90425ED4\nrom/light_param/light_pv605s01.txt 98A6A1F3\nrom/light_param/light_pv605s02.txt A0881CD3\nrom/light_param/light_pv605s05.txt C7A926EC\nrom/light_param/light_pv607s01.txt CEF1B277\nrom/light_param/light_pv610s01.txt 1AC4D936\nrom/light_param/light_pv612s01.txt 38074868\nrom/light_param/light_pv613s01.txt D0AC92A0\nrom/light_param/light_pv613s02.txt 8957DD2C\nrom/light_param/light_pv613s03.txt A7BC78A2\nrom/light_param/light_pv614s01.txt 0A9D42E0\nrom/light_param/light_pv615s01.txt BFF9DFF3\nrom/light_param/light_pv616s01.txt 2FCB01FA\nrom/light_param/light_pv616s02.txt 367732C0\nrom/light_param/light_pv616s03.txt 3CDCEE1F\nrom/light_param/light_pv617s01.txt 6A7AC177\nrom/light_param/light_pv617s02.txt 24F8D8EE\nrom/light_param/light_pv618s01.txt 32BF48FE\nrom/light_param/light_pv618s02.txt 38849A36\nrom/light_param/light_pv618s03.txt 32BF48FE\nrom/light_param/light_pv618s04.txt 15BC0AC8\nrom/light_param/light_pv618s05.txt C611E580\nrom/light_param/light_pv619s02.txt 8C3FA444\nrom/light_param/light_pv619s03.txt 37249108\nrom/light_param/light_pv619s04.txt D68FEB53\nrom/light_param/light_pv620s01.txt 0EB8361F\nrom/light_param/light_pv621s01.txt 2352065C\nrom/light_param/light_pv622s01.txt F839B087\nrom/light_param/light_pv623s01.txt CAF3B48E\nrom/light_param/light_pv623s03.txt DEB2A3E3\nrom/light_param/light_pv624s01.txt C740810B\nrom/light_param/light_pv625s01.txt 122F5EA1\nrom/light_param/light_pv625s03.txt 949F2EB5\nrom/light_param/light_pv626s01.txt 79D90960\nrom/light_param/light_pv627s01.txt D86C6C82\nrom/light_param/light_pv627s02.txt D3BDA31C\nrom/light_param/light_pv627s03.txt 503F62D3\nrom/light_param/light_pv628s01.txt 69FA7CB7\nrom/light_param/light_pv630s01.txt C4FCD73D\nrom/light_param/light_pv630s03.txt D88F0008\nrom/light_param/light_pv631s01.txt 9EF90BF4\nrom/light_param/light_pv637s01.txt E7216FF2\nrom/light_param/light_pv637s02.txt 08F5AE4C\nrom/light_param/light_pv638s01.txt D9B94E8A\nrom/light_param/light_pv638s02.txt F977C3F6\nrom/light_param/light_pv639s01.txt E996B036\nrom/light_param/light_pv639s02.txt 37F0BE4D\nrom/light_param/light_pv639s03.txt 8A2D8714\nrom/light_param/light_pv639s04.txt DC077308\nrom/light_param/light_pv639s06.txt D7F2907B\nrom/light_param/light_pv642s01.txt C8B6B395\nrom/light_param/light_pv710s01.txt E18790A8\nrom/light_param/light_pv710s02.txt E287744B\nrom/light_param/light_pv710s03.txt 3E85D07F\nrom/light_param/light_pv722.farc 7B5BECAC\nrom/light_param/light_pv723.farc 65E6B547\nrom/light_param/light_pv723s01.txt A69EC7F9\nrom/light_param/light_pv723s02.txt B216ED1C\nrom/light_param/light_pv724s01.txt 1D11C969\nrom/light_param/light_pv724s04.txt B3536D96\nrom/light_param/light_pv724s05.txt 1DFC5560\nrom/light_param/light_pv725.farc 5F9813A7\nrom/light_param/light_pv726.farc 9751F138\nrom/light_param/light_pv726s01.txt 526BA390\nrom/light_param/light_pv727.farc 40344803\nrom/light_param/light_pv727s01.txt EBF1D63D\nrom/light_param/light_pv727s02.txt D91D79DC\nrom/light_param/light_pv728.farc BF8C256A\nrom/light_param/light_pv728s01.txt 7588C344\nrom/light_param/light_pv728s03.txt 7BE95C0C\nrom/light_param/light_pv729.farc 9C8AF095\nrom/light_param/light_pv729s01.txt 9423F386\nrom/light_param/light_pv729s03.txt DCA52979\nrom/light_param/light_pv730s01.txt 84C7CE16\nrom/light_param/light_pv730s02.txt E4915FD0\nrom/light_param/light_pv731.farc ACAABAB9\nrom/light_param/light_pv731s02.txt F30A42B0\nrom/light_param/light_pv732.farc 8C434087\nrom/light_param/light_pv732s01.txt 8FD3DEF7\nrom/light_param/light_pv733.farc 36E83C91\nrom/light_param/light_pv734.farc 56832524\nrom/light_param/light_pv734s01.txt 7808C221\nrom/light_param/light_pv734s02.txt 22036688\nrom/light_param/light_pv734s04.txt 4E9A164B\nrom/light_param/light_pv734s05.txt 15D368D1\nrom/light_param/light_pv736.farc 0F802CB9\nrom/light_param/light_pv736s02.txt 2B9767C9\nrom/light_param/light_pv737.farc 81134C4A\nrom/light_param/light_pv738.farc B49950D5\nrom/light_param/light_pv738s01.txt F5822F31\nrom/light_param/light_pv739.farc E939D2ED\nrom/light_param/light_pv739s01.txt 38858C0A\nrom/light_param/light_pv740.farc 10FE35E4\nrom/light_param/light_pv740s01.txt F3DCA288\nrom/light_param/light_pv740s02.txt 1BE69CC5\nrom/light_param/light_pv740s03.txt 94BE8DD1\nrom/light_param/light_pv740s04.txt 1633971C\nrom/light_param/light_pv740s05.txt D8AA0A0E\nrom/light_param/light_pv832.farc 75B0AC7D\nrom/light_param/light_pv832s01.txt F0D62BDB\nrom/light_param/light_selpvback.txt A50DC64B\nrom/light_param/light_stgns105.txt 2BA42F73\nrom/light_param/wind_ns221.txt FB9BFC6A\nrom/light_param/wind_pv003s01.txt 79CDA669\nrom/light_param/wind_pv003s03.txt 79CDA669\nrom/light_param/wind_pv003s04.txt 79CDA669\nrom/light_param/wind_pv003s05.txt 79CDA669\nrom/light_param/wind_pv003s07.txt 726663C2\nrom/light_param/wind_pv003s08.txt 79CDA669\nrom/light_param/wind_pv003s09.txt 79CDA669\nrom/light_param/wind_pv008s01.txt ECF2F934\nrom/light_param/wind_pv008s03.txt F8CBE464\nrom/light_param/wind_pv008s07.txt ECF2F934\nrom/light_param/wind_pv008s08.txt 8F75D710\nrom/light_param/wind_pv008s10.txt F8CBE464\nrom/light_param/wind_pv009s01.txt 49967F2C\nrom/light_param/wind_pv009s02.txt E5604EE2\nrom/light_param/wind_pv009s03.txt 782D8407\nrom/light_param/wind_pv009s05.txt 27AC5046\nrom/light_param/wind_pv009s08.txt 6AC3C4EE\nrom/light_param/wind_pv009s10.txt F6D068A8\nrom/light_param/wind_pv024s06.txt 8766DF11\nrom/light_param/wind_pv024s07.txt 990E3799\nrom/light_param/wind_pv024s11.txt 8766DF11\nrom/light_param/wind_pv211_d2ns048.txt 5F684B06\nrom/light_param/wind_pv262s02.txt 14D64E99\nrom/light_param/wind_pv262s11.txt 9F35BCFE\nrom/light_param/wind_pv262s12.txt 9F35BCFE\nrom/light_param/wind_pv601s03.txt B10BBEF0\nrom/light_param/wind_pv604s01.txt 138446A9\nrom/light_param/wind_pv604s02.txt 138446A9\nrom/light_param/wind_pv604s03.txt BE797ADD\nrom/light_param/wind_pv604s05.txt 138446A9\nrom/light_param/wind_pv612s01.txt FB9BFC6A\nrom/light_param/wind_pv612s02.txt FB9BFC6A\nrom/light_param/wind_pv612s04.txt FB9BFC6A\nrom/light_param/wind_pv613s01.txt 9B3F63C4\nrom/light_param/wind_pv639s01_clone1.txt 6815807D\nrom/light_param/wind_pv722s01.txt BE7C3575\nrom/light_param/wind_pv723s02_clone.txt 34AF0BAD\nrom/light_param/wind_pv732s02_clone1.txt 6D0A32C7\nrom/light_param/wind_pv732s03.txt 4ED77038\nrom/light_param/wind_selpvback.txt ECC8CF40\nrom/light_param/wind_tst.txt ECC8CF40\nrom/objset/cmnitm1001.farc 3AC0BECC\nrom/objset/cmnitm1002.farc A6077F93\nrom/objset/cmnitm1003.farc 7A28B33C\nrom/objset/cmnitm1004.farc 20D722E2\nrom/objset/cmnitm1005.farc 615AB983\nrom/objset/cmnitm1006.farc 3F2C160D\nrom/objset/cmnitm1007.farc EFD85F7D\nrom/objset/cmnitm1008.farc D8CB821E\nrom/objset/cmnitm1009.farc 02FCDDD9\nrom/objset/cmnitm1010.farc 2385110A\nrom/objset/cmnitm1011.farc 1AECF5B0\nrom/objset/cmnitm1012.farc 00E300E5\nrom/objset/cmnitm1013.farc D65B47CC\nrom/objset/cmnitm1014.farc 9CBAB236\nrom/objset/cmnitm1015.farc 9B56A0A1\nrom/objset/cmnitm1016.farc 0B886C08\nrom/objset/cmnitm1017.farc 9DFF7B70\nrom/objset/cmnitm1019.farc 0D7E0D5B\nrom/objset/cmnitm1020.farc 54039999\nrom/objset/cmnitm1021.farc 3340EA5F\nrom/objset/cmnitm1022.farc 6C90769D\nrom/objset/cmnitm1023.farc 4F3ECA7E\nrom/objset/cmnitm1024.farc 77497753\nrom/objset/cmnitm1025.farc D6913A7E\nrom/objset/cmnitm1026.farc A87AA2D9\nrom/objset/cmnitm1027.farc 63721CB3\nrom/objset/cmnitm1028.farc F2AE600F\nrom/objset/cmnitm1029.farc FB1614E7\nrom/objset/cmnitm1030.farc 4A2C6087\nrom/objset/cmnitm1031.farc C8AD6C3D\nrom/objset/cmnitm1032.farc 1C5E6B5B\nrom/objset/cmnitm1033.farc 5E660193\nrom/objset/cmnitm1034.farc 91EE6871\nrom/objset/cmnitm1035.farc 6E097297\nrom/objset/cmnitm1037.farc 432F43D3\nrom/objset/cmnitm1038.farc 9B088A14\nrom/objset/cmnitm1039.farc 6B3790C7\nrom/objset/cmnitm1040.farc 93661D0D\nrom/objset/cmnitm1041.farc 55F073D3\nrom/objset/cmnitm1042.farc 3F39FFB7\nrom/objset/cmnitm1043.farc 4A88D580\nrom/objset/cmnitm1044.farc EAFD3380\nrom/objset/cmnitm1047.farc 359AB27A\nrom/objset/cmnitm1048.farc 43C32086\nrom/objset/cmnitm1049.farc 86215CB2\nrom/objset/cmnitm1050.farc 071844B8\nrom/objset/cmnitm1051.farc 1AC53204\nrom/objset/cmnitm1101.farc DDD49B20\nrom/objset/cmnitm1104.farc BA4BA418\nrom/objset/cmnitm1105.farc B7601BF8\nrom/objset/cmnitm1106.farc E5E2F40A\nrom/objset/cmnitm1108.farc 8460D428\nrom/objset/cmnitm1109.farc B4353542\nrom/objset/cmnitm1201.farc 111541BE\nrom/objset/cmnitm1202.farc E5E90343\nrom/objset/cmnitm1203.farc 0CACEA19\nrom/objset/cmnitm1204.farc 53DD2FA4\nrom/objset/cmnitm1205.farc 034AB281\nrom/objset/cmnitm1206.farc 2936650A\nrom/objset/cmnitm1207.farc 72496A6E\nrom/objset/cmnitm1208.farc 5BBC56C6\nrom/objset/cmnitm1209.farc E85D9F3B\nrom/objset/cmnitm1210.farc F6CCA36B\nrom/objset/cmnitm1211.farc EA0DDE97\nrom/objset/cmnitm1212.farc 8E044E02\nrom/objset/cmnitm1213.farc 28D44CBC\nrom/objset/cmnitm1214.farc E0D8D76B\nrom/objset/cmnitm1215.farc C3B75AA1\nrom/objset/cmnitm1018.farc E4AE8A2C\nrom/objset/cmnitm1036.farc 4EBE663D\nrom/objset/cmnitm1107.farc 675692DA\nrom/objset/cmnitm1216.farc 3C66F284\nrom/objset/cmnitm1236.farc CA0C7EF3\nrom/objset/cmnitm1254.farc 8A7EB92B\nrom/objset/cmnitm1272.farc A85DBC06\nrom/objset/cmnitm1311.farc A65BDD11\nrom/objset/cmnitm1415.farc A7707D47\nrom/objset/cmnitm1514.farc 1EBE9DCA\nrom/objset/cmnitm1616.farc B8CC2C32\nrom/objset/dbg.farc F376D064\nrom/objset/effchrpv262hak002.farc A0DDE552\nrom/objset/effchrpv262mik101.farc D96DC801\nrom/objset/effchrpv441mik001.farc 7DA190A1\nrom/objset/cmnitm1217.farc 2AABEC0A\nrom/objset/cmnitm1218.farc 13D727E3\nrom/objset/cmnitm1219.farc 89D99C97\nrom/objset/cmnitm1220.farc 5640A175\nrom/objset/cmnitm1221.farc DA100ACC\nrom/objset/cmnitm1222.farc 7E76B02D\nrom/objset/cmnitm1223.farc 5A381833\nrom/objset/cmnitm1224.farc E3629B78\nrom/objset/cmnitm1227.farc 18A74243\nrom/objset/cmnitm1228.farc 81E59BE0\nrom/objset/cmnitm1229.farc 6217E310\nrom/objset/cmnitm1230.farc 070914F5\nrom/objset/cmnitm1231.farc BB8F5692\nrom/objset/cmnitm1232.farc 21C3DA13\nrom/objset/cmnitm1233.farc B6099D6F\nrom/objset/cmnitm1234.farc 7A935AD7\nrom/objset/cmnitm1235.farc 55B79AEA\nrom/objset/cmnitm1237.farc 40A2CCDC\nrom/objset/cmnitm1238.farc 444E30D5\nrom/objset/cmnitm1239.farc A94BCECA\nrom/objset/cmnitm1240.farc 28E56B29\nrom/objset/cmnitm1241.farc BF924E89\nrom/objset/cmnitm1242.farc 24A311CC\nrom/objset/cmnitm1243.farc FED89551\nrom/objset/cmnitm1244.farc 05B6BE75\nrom/objset/cmnitm1245.farc CE0909A6\nrom/objset/cmnitm1246.farc BBBC6EC5\nrom/objset/cmnitm1247.farc 4DC95176\nrom/objset/cmnitm1248.farc C13B86F8\nrom/objset/cmnitm1249.farc 65E9E12A\nrom/objset/cmnitm1250.farc 5C781BEB\nrom/objset/cmnitm1251.farc C62DB7D4\nrom/objset/cmnitm1252.farc A81392C7\nrom/objset/cmnitm1253.farc A64F1325\nrom/objset/cmnitm1255.farc B08C0493\nrom/objset/cmnitm1256.farc C683756B\nrom/objset/cmnitm1257.farc 4D09AF81\nrom/objset/cmnitm1258.farc B1EC5690\nrom/objset/cmnitm1259.farc 540BC3F3\nrom/objset/cmnitm1260.farc 94A98CAF\nrom/objset/cmnitm1261.farc 2C5D1570\nrom/objset/cmnitm1262.farc B45B57CA\nrom/objset/cmnitm1263.farc 188ECF42\nrom/objset/cmnitm1264.farc 3EED4A12\nrom/objset/cmnitm1265.farc 7ACFFF38\nrom/objset/cmnitm1266.farc 30907A47\nrom/objset/cmnitm1267.farc 4AB0809B\nrom/objset/cmnitm1268.farc EB4C2831\nrom/objset/cmnitm1269.farc 52EB41F1\nrom/objset/cmnitm1270.farc 6A315A12\nrom/objset/cmnitm1271.farc E516B38B\nrom/objset/cmnitm1273.farc AA76218A\nrom/objset/cmnitm1274.farc F2C32681\nrom/objset/cmnitm1275.farc ED4EE41C\nrom/objset/cmnitm1276.farc 40DD00A6\nrom/objset/cmnitm1277.farc 7A51A8EA\nrom/objset/cmnitm1278.farc 981DB11F\nrom/objset/cmnitm1279.farc 808BE5CD\nrom/objset/cmnitm1301.farc FE0C9979\nrom/objset/cmnitm1302.farc CC82D092\nrom/objset/cmnitm1303.farc AE2535C2\nrom/objset/cmnitm1304.farc F96E58B9\nrom/objset/cmnitm1305.farc 6243AA63\nrom/objset/cmnitm1306.farc 70D54CE4\nrom/objset/cmnitm1307.farc AABC7641\nrom/objset/cmnitm1308.farc ECA070A3\nrom/objset/cmnitm1309.farc AE4122D1\nrom/objset/cmnitm1310.farc 4FE94DA1\nrom/objset/cmnitm1312.farc 8ADC7432\nrom/objset/cmnitm1313.farc 42CB29BA\nrom/objset/cmnitm1314.farc FE4D1EA4\nrom/objset/cmnitm1315.farc 1C2076F8\nrom/objset/cmnitm1316.farc BF5281D3\nrom/objset/cmnitm1317.farc 9DD09325\nrom/objset/cmnitm1318.farc 99695CEE\nrom/objset/cmnitm1401.farc 59F930AC\nrom/objset/cmnitm1402.farc 22CBB752\nrom/objset/cmnitm1403.farc CBEAC88D\nrom/objset/cmnitm1404.farc E703BDF4\nrom/objset/cmnitm1405.farc 97B1E35D\nrom/objset/cmnitm1406.farc EAE07758\nrom/objset/cmnitm1411.farc 67CA815D\nrom/objset/cmnitm1412.farc 9D0A7EB2\nrom/objset/cmnitm1413.farc D232EEBE\nrom/objset/cmnitm1414.farc 8EA5A955\nrom/objset/cmnitm1416.farc 1055AEDE\nrom/objset/cmnitm1417.farc D3B1475F\nrom/objset/cmnitm1418.farc FA36A129\nrom/objset/cmnitm1419.farc 246ED6CF\nrom/objset/cmnitm1501.farc FDCE2D12\nrom/objset/cmnitm1502.farc EF557EED\nrom/objset/cmnitm1503.farc D065C7FF\nrom/objset/cmnitm1504.farc 5598AE5C\nrom/objset/cmnitm1505.farc D10B864A\nrom/objset/cmnitm1506.farc 2DB72A94\nrom/objset/cmnitm1507.farc 7BFA2D98\nrom/objset/cmnitm1508.farc 24C51B85\nrom/objset/cmnitm1509.farc 3705C7DB\nrom/objset/cmnitm1510.farc ADF4454E\nrom/objset/cmnitm1511.farc 08BEAA89\nrom/objset/cmnitm1512.farc 04200F8F\nrom/objset/cmnitm1513.farc FBF2A16C\nrom/objset/cmnitm1515.farc 576F1EFB\nrom/objset/cmnitm1516.farc 10FEB048\nrom/objset/cmnitm1601.farc 515CBE96\nrom/objset/cmnitm1602.farc 7BE856B8\nrom/objset/cmnitm1603.farc 063C5107\nrom/objset/cmnitm1604.farc 44D50BF4\nrom/objset/cmnitm1605.farc EC9F76D5\nrom/objset/cmnitm1606.farc ABA1FB91\nrom/objset/cmnitm1607.farc 42B18271\nrom/objset/cmnitm1608.farc DC5064D0\nrom/objset/cmnitm1609.farc 8F2DD783\nrom/objset/cmnitm1610.farc 49FAF91E\nrom/objset/cmnitm1611.farc EF26FD9E\nrom/objset/cmnitm1612.farc 62E15386\nrom/objset/cmnitm1613.farc BD4B964D\nrom/objset/cmnitm1614.farc 4B7F9E11\nrom/objset/cmnitm1615.farc DD5AD6C4\nrom/objset/cmnitm1617.farc 0B37905C\nrom/objset/cmnitm1618.farc 8B0DBA9B\nrom/objset/cmnitm1619.farc 46DC5FC5\nrom/objset/cmnitm1620.farc 6F2DF164\nrom/objset/cmnitm1621.farc 9A798FBF\nrom/objset/cmnitm1625.farc A82D1E8D\nrom/objset/cmnitm1626.farc EDBD89A9\nrom/objset/cmnitm1627.farc 75217551\nrom/objset/cmnitm1701.farc C949B0E7\nrom/objset/cmnitm1702.farc 2A3B65B4\nrom/objset/cmnitm1703.farc E3320CB4\nrom/objset/cmnitm1704.farc 551272C3\nrom/objset/cmnitm1705.farc 07319614\nrom/objset/cmnitm1706.farc B59C118C\nrom/objset/cmnitm1707.farc 8C261D0A\nrom/objset/cmnitm1708.farc 89F9E1E5\nrom/objset/effchrpv243hak001.farc 1A793F03\nrom/objset/effchrpv243kai001.farc 4ECD73B1\nrom/objset/effchrpv243len001.farc 315DA955\nrom/objset/effchrpv243luk001.farc 78F0D856\nrom/objset/effchrpv243mei001.farc 558B9A9C\nrom/objset/effchrpv243mik001.farc 66872E88\nrom/objset/effchrpv243ner001.farc 366920CB\nrom/objset/effchrpv243rin001.farc 88B1C2AB\nrom/objset/effchrpv243sak001.farc 50E5CE31\nrom/objset/effchrpv243tet001.farc 09EACCFB\nrom/objset/effchrpv244kai001.farc AE51B863\nrom/objset/effchrpv244kai002.farc 4D0B7512\nrom/objset/effchrpv244len001.farc C9E7F92E\nrom/objset/effchrpv244len002.farc 48E76BE2\nrom/objset/effchrpv262hak001.farc BC51ADD2\nrom/objset/effchrpv262kai001.farc E014F491\nrom/objset/effchrpv262kai002.farc 567AA70B\nrom/objset/effchrpv262kai100.farc D4B763F4\nrom/objset/effchrpv262kai101.farc 5E21AA8B\nrom/objset/effchrpv262len001.farc 5C0093FB\nrom/objset/effchrpv262len002.farc 7B900638\nrom/objset/effchrpv262luk001.farc D9EDD24A\nrom/objset/effchrpv262luk002.farc 14FAC933\nrom/objset/effchrpv262mei001.farc 96795824\nrom/objset/effchrpv262mei002.farc D6B8F084\nrom/objset/effchrpv262mei100.farc E8511F3C\nrom/objset/effchrpv262mei101.farc AD5E60E1\nrom/objset/effchrpv262mik001.farc 58A6A988\nrom/objset/effchrpv262mik002.farc 0F7EDB34\nrom/objset/effchrpv262mik100.farc A5C88FF4\nrom/objset/effchrpv262ner001.farc FE86B4E2\nrom/objset/effchrpv262ner002.farc 811AE0D8\nrom/objset/effchrpv262rin001.farc 27990A84\nrom/objset/effchrpv262rin002.farc 5B457713\nrom/objset/effchrpv262rin100.farc 76EC2370\nrom/objset/effchrpv262rin101.farc CBCA04F6\nrom/objset/effchrpv262sak001.farc 784DB625\nrom/objset/effchrpv262sak002.farc A3C40232\nrom/objset/effchrpv262tet001.farc 983EDDB2\nrom/objset/effchrpv262tet002.farc 64205C99\nrom/objset/effchrpv441hak001.farc 037918BC\nrom/objset/effchrpv441kai001.farc E7D93FD3\nrom/objset/effchrpv441len001.farc 0CFBD83F\nrom/objset/effchrpv441luk001.farc 8558E4DA\nrom/objset/effchrpv441mei001.farc F718786C\nrom/objset/effchrpv441ner001.farc A04B2E61\nrom/objset/effchrpv441rin001.farc 8B224B96\nrom/objset/effchrpv441sak001.farc 18B0FAD5\nrom/objset/effchrpv441tet001.farc 4B3DA725\nrom/objset/effchrpv602hak001.farc 8734508E\nrom/objset/effchrpv602kai001.farc 6A6A6932\nrom/objset/effchrpv602len001.farc 81C2F68D\nrom/objset/effchrpv602luk001.farc 33A06B54\nrom/objset/effchrpv602mei001.farc B61A21E4\nrom/objset/effchrpv602mik001.farc A8911AE6\nrom/objset/effchrpv602ner001.farc E9ACC794\nrom/objset/effchrpv602rin001.farc 15E98149\nrom/objset/effchrpv602sak001.farc 94FA2D61\nrom/objset/effchrpv602tet001.farc EB6DC0A8\nrom/objset/effchrpv605hak001.farc 3ADA0CE0\nrom/objset/effchrpv605len001.farc 8D912870\nrom/objset/effchrpv605luk001.farc 834B6969\nrom/objset/effchrpv605mei001.farc 2044ACBE\nrom/objset/effchrpv605mik001.farc 5B30A7CD\nrom/objset/effchrpv605ner001.farc DF22D055\nrom/objset/effchrpv605rin001.farc 0C5E887F\nrom/objset/effchrpv605sak001.farc 3ED4FD5E\nrom/objset/effchrpv605tet001.farc FE84E378\nrom/objset/effchrpv609kai001.farc 57A2D53C\nrom/objset/effchrpv609len001.farc CDBF1EB7\nrom/objset/effchrpv609len003.farc 761CEA91\nrom/objset/effchrpv609luk001.farc 10E90735\nrom/objset/effchrpv609luk004.farc 6038124D\nrom/objset/effchrpv609mei001.farc A16C4B33\nrom/objset/effchrpv609mik001.farc B869EEC0\nrom/objset/effchrpv609mik003.farc 54057A67\nrom/objset/effchrpv609mik004.farc 2FBD045E\nrom/objset/effchrpv609rin001.farc CF54B796\nrom/objset/effchrpv609rin002.farc 5DF4A7B5\nrom/objset/effchrpv609sak001.farc 374D5C73\nrom/objset/effchrpv612hak001.farc 8A6FBF1D\nrom/objset/effchrpv612hak002.farc 137AE842\nrom/objset/effchrpv612kai001.farc 6A5CF9F7\nrom/objset/effchrpv612kai002.farc 9A58ECBC\nrom/objset/effchrpv612len001.farc 95CF1A21\nrom/objset/effchrpv612len002.farc 0A6BA5ED\nrom/objset/effchrpv612luk001.farc 8C468557\nrom/objset/effchrpv612luk002.farc CD731D20\nrom/objset/effchrpv612mei001.farc 1349A72A\nrom/objset/effchrpv612mei002.farc D271BCF0\nrom/objset/effchrpv612mik002.farc 9FC11599\nrom/objset/effchrpv612ner001.farc 3BC1E810\nrom/objset/effchrpv612ner002.farc 77C05610\nrom/objset/effchrpv612rin001.farc C6C2AD81\nrom/objset/effchrpv612rin002.farc 609C91D3\nrom/objset/effchrpv612sak001.farc D43DD672\nrom/objset/effchrpv612sak002.farc 87F3153B\nrom/objset/effchrpv612tet001.farc D5B4807D\nrom/objset/effchrpv612tet002.farc 30801E6B\nrom/objset/effchrpv614kai001.farc 72CF1709\nrom/objset/effchrpv614kai002.farc 4120C2E5\nrom/objset/effchrpv614kai003.farc A0261331\nrom/objset/effchrpv614kai004.farc AA178E95\nrom/objset/effchrpv614kai005.farc 7D9BD162\nrom/objset/effchrpv614kai006.farc A4C67462\nrom/objset/effchrpv614kai008.farc B7AAFE26\nrom/objset/effchrpv614kai009.farc 05210761\nrom/objset/effchrpv614kai010.farc 7FF67129\nrom/objset/effchrpv614len001.farc 13A483C6\nrom/objset/effchrpv614len002.farc 7F5EF8F8\nrom/objset/effchrpv614len003.farc BF4756AF\nrom/objset/effchrpv614len004.farc FC7A74AB\nrom/objset/effchrpv614len005.farc CF497CF7\nrom/objset/effchrpv614len006.farc A38548E7\nrom/objset/effchrpv614len007.farc DCD5E6FB\nrom/objset/effchrpv614len008.farc 0D6AE9F2\nrom/objset/effchrpv614len009.farc 3A9780B8\nrom/objset/effchrpv614len010.farc C92CD693\nrom/objset/effchrpv614luk001.farc AB5A9EA1\nrom/objset/effchrpv614luk002.farc 3506293B\nrom/objset/effchrpv614luk004.farc F86DC096\nrom/objset/effchrpv614luk005.farc FD87DC36\nrom/objset/effchrpv614luk006.farc 097160C3\nrom/objset/effchrpv614luk007.farc 92179BC5\nrom/objset/effchrpv614luk008.farc 34AEAABF\nrom/objset/effchrpv614luk009.farc A642A4D2\nrom/objset/effchrpv614luk010.farc EE96C201\nrom/objset/effchrpv614mei001.farc 0F115BAF\nrom/objset/effchrpv614mei002.farc 12048ECC\nrom/objset/effchrpv614mei003.farc 4A5FB097\nrom/objset/effchrpv614mei004.farc 274183C3\nrom/objset/effchrpv614mei005.farc 49767333\nrom/objset/effchrpv614mei006.farc E4389306\nrom/objset/effchrpv614mei007.farc 697FD2BD\nrom/objset/effchrpv614mei008.farc 8E0E500A\nrom/objset/effchrpv614mei010.farc 2C400D99\nrom/objset/effchrpv614mik001.farc 95280F2D\nrom/objset/effchrpv614mik002.farc 323AA4CE\nrom/objset/effchrpv614mik003.farc 2B2A25D6\nrom/objset/effchrpv614mik004.farc 4FB900C4\nrom/objset/effchrpv614mik005.farc CDFE8E8F\nrom/objset/effchrpv614mik006.farc 16F57493\nrom/objset/effchrpv614mik007.farc 90F2D76B\nrom/objset/effchrpv614mik008.farc 537C0611\nrom/objset/effchrpv614mik009.farc A18F2A89\nrom/objset/effchrpv614mik010.farc 6486DCA7\nrom/objset/effchrpv614rin001.farc 009C7DC3\nrom/objset/effchrpv614rin002.farc F1D5F30E\nrom/objset/effchrpv614rin003.farc 2F0C9CBC\nrom/objset/effchrpv614rin004.farc F20557F9\nrom/objset/effchrpv614rin006.farc 88106AC2\nrom/objset/effchrpv614rin007.farc 29311150\nrom/objset/effchrpv614rin008.farc 2FAA9390\nrom/objset/effchrpv614rin009.farc 5ABC3980\nrom/objset/effchrpv614rin010.farc BF6221E5\nrom/objset/effchrpv614sak001.farc 02F75919\nrom/objset/effchrpv614sak002.farc 92952A2D\nrom/objset/effchrpv614sak003.farc FA3FBD43\nrom/objset/effchrpv614sak004.farc 6B21A752\nrom/objset/effchrpv614sak005.farc 640C36B0\nrom/objset/effchrpv614sak006.farc A904CFD6\nrom/objset/effchrpv614sak007.farc 81372F74\nrom/objset/effchrpv614sak008.farc 0E1BCFB2\nrom/objset/effchrpv614sak009.farc AFAA6998\nrom/objset/effchrpv614sak010.farc C2CBA5E2\nrom/objset/effchrpv617hak001.farc CE2CDE6D\nrom/objset/effchrpv617kai001.farc 4A1ED1B7\nrom/objset/effchrpv617len001.farc 52458EF3\nrom/objset/effchrpv617luk001.farc 53ED3F49\nrom/objset/effchrpv617mei001.farc 98F82D18\nrom/objset/effchrpv617mik001.farc DA78DB0A\nrom/objset/effchrpv617ner001.farc 8CA5E6A7\nrom/objset/effchrpv617rin001.farc 451DA6F0\nrom/objset/effchrpv617sak001.farc 5EE035E3\nrom/objset/effchrpv617tet001.farc 03B5778F\nrom/objset/effchrpv624ext001.farc 676CC5BC\nrom/objset/effchrpv624ext002.farc 3CDA00AE\nrom/objset/effchrpv624hak001.farc F48088BF\nrom/objset/effchrpv624hak002.farc 1F816D9A\nrom/objset/effchrpv624kai001.farc 6F4A2BE6\nrom/objset/effchrpv624len001.farc 1F0E7C4B\nrom/objset/effchrpv624len002.farc 24CA7804\nrom/objset/effchrpv624luk001.farc 64897A7C\nrom/objset/effchrpv624luk002.farc B04C168F\nrom/objset/effchrpv624mei001.farc 5F1DC511\nrom/objset/effchrpv624mei002.farc 8FA52C05\nrom/objset/effchrpv624mik001.farc 31F948C5\nrom/objset/effchrpv624mik002.farc 6A140653\nrom/objset/effchrpv624ner001.farc B69BAEE5\nrom/objset/effchrpv624ner002.farc 45C95512\nrom/objset/effchrpv624rin001.farc 15EE1E27\nrom/objset/effchrpv624rin002.farc 65195CD6\nrom/objset/effchrpv624sak001.farc 5C9EC9F4\nrom/objset/effchrpv624sak002.farc F204B8D1\nrom/objset/effchrpv624tet001.farc 7A323647\nrom/objset/effchrpv630hak001.farc 67469B20\nrom/objset/effchrpv630hak002.farc 70C7F7E8\nrom/objset/effchrpv630kai001.farc 9E7B2E77\nrom/objset/effchrpv630kai002.farc 9333F3A5\nrom/objset/effchrpv630len001.farc 0A76EC9C\nrom/objset/effchrpv630len002.farc C3664D1E\nrom/objset/effchrpv630luk001.farc 25D1285E\nrom/objset/effchrpv630luk002.farc 42C1100E\nrom/objset/effchrpv630mei001.farc 951ABC4B\nrom/objset/effchrpv630mei002.farc 9FB81856\nrom/objset/effchrpv630mik001.farc B32F3CBA\nrom/objset/effchrpv630mik002.farc D6DEAB36\nrom/objset/effchrpv630ner001.farc 8781EB2E\nrom/objset/effchrpv630ner002.farc 9A7A2111\nrom/objset/effchrpv630rin001.farc F4481ADA\nrom/objset/effchrpv630sak001.farc 58ED01F0\nrom/objset/effchrpv630sak002.farc FD903EAD\nrom/objset/effchrpv630tet001.farc DE30C453\nrom/objset/effchrpv630tet002.farc 24A112C7\nrom/objset/effchrpv637kai005.farc D2128625\nrom/objset/effchrpv637len002.farc 779FED05\nrom/objset/effchrpv637luk003.farc 3C0AC7DE\nrom/objset/effchrpv637mei004.farc A16C192A\nrom/objset/effchrpv637mik001.farc A1039A8A\nrom/objset/effchrpv637mik002.farc 0F9A30D2\nrom/objset/effchrpv637mik003.farc 833884B2\nrom/objset/effchrpv637mik004.farc 1C04ADE1\nrom/objset/effchrpv637mik005.farc D82A5B9B\nrom/objset/effchrpv637rin001.farc ABC75930\nrom/objset/effchrpv641hak002.farc 45C4DA41\nrom/objset/effchrpv641kai002.farc 41734855\nrom/objset/effchrpv641kai003.farc 278F2A45\nrom/objset/effchrpv641len002.farc 951F5D2C\nrom/objset/effchrpv641len003.farc 772E1D5C\nrom/objset/effchrpv641luk002.farc 7C0ADBA9\nrom/objset/effchrpv641luk003.farc DDC929A6\nrom/objset/effchrpv641mei002.farc 97A8D7A2\nrom/objset/effchrpv641mei003.farc BDCA84CE\nrom/objset/effchrpv641mik001.farc 1045F858\nrom/objset/effchrpv641mik002.farc 7491482F\nrom/objset/effchrpv641mik003.farc 02692CEC\nrom/objset/effchrpv641ner002.farc 9CAE03D9\nrom/objset/effchrpv641ner003.farc 40FA199E\nrom/objset/effchrpv641rin002.farc 6C8D2C80\nrom/objset/effchrpv641rin003.farc BAFF7ADA\nrom/objset/effchrpv641sak003.farc FA8D559D\nrom/objset/effchrpv641tet002.farc 8ADF16D6\nrom/objset/effchrpv641tet003.farc 3677BD9A\nrom/objset/effchrpv722hak100.farc C6F909B8\nrom/objset/effchrpv722kai100.farc 0806B0DF\nrom/objset/effchrpv722len100.farc FB524797\nrom/objset/effchrpv722luk100.farc F2EE887D\nrom/objset/effchrpv722mei100.farc 6C46C972\nrom/objset/effchrpv722mik100.farc 4B76E590\nrom/objset/effchrpv722ner100.farc 7E876D18\nrom/objset/effchrpv722rin100.farc 05744ED5\nrom/objset/effchrpv722sak100.farc 048CA810\nrom/objset/effchrpv722tet100.farc 7E36FA58\nrom/objset/effchrpv725hak001.farc C4978C54\nrom/objset/effchrpv725kai001.farc D9182FB1\nrom/objset/effchrpv725luk001.farc 8B6A1FD2\nrom/objset/effchrpv725mei001.farc 9137B20F\nrom/objset/effchrpv725mik001.farc 681F1D30\nrom/objset/effchrpv725ner001.farc 6F51D0E1\nrom/objset/effchrpv725rin001.farc 3C7B30CF\nrom/objset/effchrpv725sak001.farc 16D6152C\nrom/objset/effchrpv725tet001.farc F0B74EB5\nrom/objset/effchrpv726hak001.farc 2ADC9F3A\nrom/objset/effchrpv726hak002.farc 24241A1A\nrom/objset/effchrpv726kai001.farc 82C55624\nrom/objset/effchrpv726kai002.farc BE2A352C\nrom/objset/effchrpv726len001.farc 2A580FA9\nrom/objset/effchrpv726len002.farc 96184D35\nrom/objset/effchrpv726luk001.farc 7017CAD9\nrom/objset/effchrpv726luk002.farc 1746D993\nrom/objset/effchrpv726mei002.farc 0EAAE961\nrom/objset/effchrpv726mik001.farc E249879A\nrom/objset/effchrpv726mik002.farc E426AE6F\nrom/objset/effchrpv726ner001.farc 5E87F657\nrom/objset/effchrpv726ner002.farc 4E94E43A\nrom/objset/effchrpv726rin001.farc B9414D7E\nrom/objset/effchrpv726rin002.farc BE4DC07C\nrom/objset/effchrpv726sak001.farc B4DCF240\nrom/objset/effchrpv726sak002.farc 6CE59D41\nrom/objset/effchrpv726tet001.farc 843AB9CE\nrom/objset/effchrpv726tet002.farc 01403723\nrom/objset/effchrpv730hak001.farc DEB2BF72\nrom/objset/effchrpv730hak002.farc 5CC4B888\nrom/objset/effchrpv730kai001.farc A43C7FE8\nrom/objset/effchrpv730kai002.farc D9BD0C39\nrom/objset/effchrpv730len002.farc ABAEBE87\nrom/objset/effchrpv730luk001.farc 689F5626\nrom/objset/effchrpv730luk002.farc 66D9ED6C\nrom/objset/effchrpv730mei001.farc 1DBDDEFE\nrom/objset/effchrpv730mei002.farc E847B080\nrom/objset/effchrpv730mik001.farc 289FC989\nrom/objset/effchrpv730mik002.farc 7039991F\nrom/objset/effchrpv730ner001.farc 8FF21EE9\nrom/objset/effchrpv730ner002.farc 50487E8F\nrom/objset/effchrpv730rin001.farc 8A8A3B66\nrom/objset/effchrpv730rin002.farc 07C3ED7F\nrom/objset/effchrpv730sak001.farc 2F7AAEDA\nrom/objset/effchrpv730sak002.farc 6354F0CE\nrom/objset/effchrpv730tet001.farc 1B9D7C2A\nrom/objset/effchrpv730tet002.farc 5B619583\nrom/objset/effchrpv609mik002.farc 2BAAE390\nrom/objset/effchrpv612mik001.farc 86924F29\nrom/objset/effchrpv614kai007.farc 936673A1\nrom/objset/effchrpv614luk003.farc 5954D613\nrom/objset/effchrpv614mei009.farc 77D5BAD4\nrom/objset/effchrpv614rin005.farc 38941A4A\nrom/objset/effchrpv614tet009.farc D69F12B0\nrom/objset/effchrpv624kai002.farc 4B943137\nrom/objset/effchrpv624tet002.farc AD0957BB\nrom/objset/effchrpv630rin002.farc 472E512F\nrom/objset/effchrpv641hak003.farc D62CA92B\nrom/objset/effchrpv641sak002.farc 1EA78917\nrom/objset/effchrpv725len001.farc 6B144014\nrom/objset/effchrpv726mei001.farc E9397C3C\nrom/objset/effchrpv730len001.farc B049406E\nrom/objset/effchrpv737hak002.farc 36029459\nrom/objset/effchrpv737kai001.farc D3ADFA6C\nrom/objset/effchrpv737kai002.farc 517F27AA\nrom/objset/effchrpv737len001.farc C7D0600E\nrom/objset/effchrpv737len002.farc 719619B6\nrom/objset/effchrpv737luk001.farc 5F98A594\nrom/objset/effchrpv737luk002.farc 0CFC44B4\nrom/objset/effchrpv737mei001.farc CBF77D60\nrom/objset/effchrpv737mei002.farc 451DD0D2\nrom/objset/effchrpv737mik001.farc 63275B4E\nrom/objset/effchrpv737mik002.farc B792E98D\nrom/objset/effchrpv737ner001.farc 5F8234E6\nrom/objset/effchrpv737ner002.farc 38C7AB7E\nrom/objset/effchrpv737rin001.farc BA86F7B3\nrom/objset/effchrpv737rin002.farc 5CD0C584\nrom/objset/effchrpv737sak002.farc DB412E4A\nrom/objset/effchrpv737tet001.farc 3ED3C6D7\nrom/objset/effchrpv737tet002.farc E25020B1\nrom/objset/effchrpv739hak100.farc 5BA244D5\nrom/objset/effchrpv739kai100.farc A6893363\nrom/objset/effchrpv739len100.farc 35B46735\nrom/objset/effchrpv739luk100.farc 8B1D51AF\nrom/objset/effchrpv739mei100.farc A2318941\nrom/objset/effchrpv739mik100.farc 0577D485\nrom/objset/effchrpv739ner100.farc 064C83E4\nrom/objset/effchrpv739rin100.farc 33EC6A82\nrom/objset/effchrpv739sak100.farc 051B4C4F\nrom/objset/effchrpv739tet100.farc 599CC0D7\nrom/objset/effcmn.farc EB35DB87\nrom/objset/effmodulemik149.farc 89A211A0\nrom/objset/hakitm000.farc 350B067C\nrom/objset/hakitm002.farc 0A96B23D\nrom/objset/hakitm003.farc BC77DEDC\nrom/objset/hakitm004.farc 158EE201\nrom/objset/hakitm301.farc 54E9F69B\nrom/objset/hakitm302.farc 20280872\nrom/objset/hakitm304.farc 46928FA6\nrom/objset/hakitm500.farc 0A0D7B29\nrom/objset/hakitm501.farc 4CBFFCBA\nrom/objset/hakitm502.farc 631126BF\nrom/objset/hakitm700.farc DA1DF09B\nrom/objset/hakitm725.farc 2ED374B2\nrom/objset/hnditm000.farc 555D606B\nrom/objset/hnditm001.farc 809F60A5\nrom/objset/hnditm002.farc 6A98C76B\nrom/objset/hnditm003.farc 96EBC8ED\nrom/objset/hnditm004.farc B17B0E6D\nrom/objset/hnditm005.farc 1528B2F3\nrom/objset/hnditm007.farc 55F8F2F1\nrom/objset/hnditm008.farc 708A3D7A\nrom/objset/hnditm009.farc 35775C04\nrom/objset/hnditm010.farc 64893EDA\nrom/objset/hnditm011.farc 7C5B8E3A\nrom/objset/hnditm012.farc 7146CFCD\nrom/objset/hnditm013.farc 7E842062\nrom/objset/hnditm014.farc 8886A343\nrom/objset/hnditm015.farc 89D58557\nrom/objset/hnditm016.farc 602A548D\nrom/objset/hnditm017.farc 3E1F916E\nrom/objset/hnditm018.farc C8C01703\nrom/objset/hnditm019.farc 0551B7D0\nrom/objset/hnditm020.farc F73CFED9\nrom/objset/hnditm021.farc 0E4EB221\nrom/objset/hnditm022.farc 5A6C94B2\nrom/objset/hnditm023.farc 092ED5F4\nrom/objset/hnditm025.farc E31F230D\nrom/objset/hnditm026.farc 785482B7\nrom/objset/hnditm027.farc 2037D2B2\nrom/objset/hnditm028.farc 086C2D26\nrom/objset/hnditm029.farc B4E03DC9\nrom/objset/hnditm030.farc 0A604020\nrom/objset/hnditm031.farc 285E95DD\nrom/objset/hnditm035.farc DFB97546\nrom/objset/hnditm036.farc FDBEF3F2\nrom/objset/hnditm054.farc 6238DBEE\nrom/objset/hnditm056.farc EEE32777\nrom/objset/hnditm057.farc ECAC14B7\nrom/objset/hnditm058.farc B19D9733\nrom/objset/hnditm300.farc 1E7DC0E7\nrom/objset/hnditm301.farc E3D4A24A\nrom/objset/hnditm302.farc A8E297A2\nrom/objset/hnditm303.farc B69A1E58\nrom/objset/hnditm400.farc BABAFE3F\nrom/objset/hnditm401.farc E5303B18\nrom/objset/hnditm402.farc 066E5D63\nrom/objset/hnditm403.farc EB682A36\nrom/objset/hnditm404.farc C477EBC9\nrom/objset/hnditm405.farc 92947F2F\nrom/objset/hnditm406.farc 271424C5\nrom/objset/hnditm500.farc 15236AED\nrom/objset/hnditm501.farc 55B595B7\nrom/objset/hnditm502.farc D22C4F6D\nrom/objset/hnditm600.farc 007D71F5\nrom/objset/hnditm601.farc 9BA4CF55\nrom/objset/hnditm603.farc CCC3E33D\nrom/objset/hnditm604.farc 74F192E7\nrom/objset/hnditm605.farc 0CAD3503\nrom/objset/itmpv045.farc E4E8C7C0\nrom/objset/itmpv060.farc 2742BCC5\nrom/objset/itmpv086.farc 62305A31\nrom/objset/itmpv088.farc CABE0620\nrom/objset/itmpv089.farc 1B890A11\nrom/objset/itmpv103.farc CA683153\nrom/objset/itmpv212.farc E6290FD1\nrom/objset/itmpv218.farc 8BF86C25\nrom/objset/itmpv221.farc 471B7B9F\nrom/objset/itmpv232.farc F2D62436\nrom/objset/itmpv233.farc 5B056E18\nrom/objset/itmpv435.farc 7E875712\nrom/objset/itmpv441.farc 098EDCBF\nrom/objset/itmpv600.farc 4B10538B\nrom/objset/itmpv602.farc D53D2A52\nrom/objset/itmpv603.farc F3ACA41B\nrom/objset/itmpv607.farc BCCB37F5\nrom/objset/itmpv610.farc DEE7ED1C\nrom/objset/itmpv612.farc 95D04FCA\nrom/objset/itmpv618.farc B0EA3A00\nrom/objset/itmpv619.farc 16B8B29A\nrom/objset/itmpv620.farc 08BA08F2\nrom/objset/itmpv622.farc DB37FC7F\nrom/objset/itmpv630.farc 3F9E1892\nrom/objset/itmpv641.farc 1397313E\nrom/objset/itmpv725.farc B8C5476C\nrom/objset/itmpv726.farc 9D069AA2\nrom/objset/itmpv727.farc C74DBAC3\nrom/objset/itmpv731.farc 729D6D24\nrom/objset/itmpv733.farc D1DC7F43\nrom/objset/itmpv737.farc D96D5803\nrom/objset/kaiitm000.farc AD04DD42\nrom/objset/kaiitm001.farc 97503A68\nrom/objset/kaiitm002.farc 970B9183\nrom/objset/kaiitm003.farc 6BB55349\nrom/objset/kaiitm004.farc C5F2BCBC\nrom/objset/kaiitm006.farc BBE1E9A6\nrom/objset/kaiitm008.farc 53249631\nrom/objset/kaiitm009.farc 6C0C76E5\nrom/objset/kaiitm010.farc 84A571CF\nrom/objset/kaiitm011.farc E06B0823\nrom/objset/kaiitm012.farc F79DCADF\nrom/objset/kaiitm014.farc 92068332\nrom/objset/kaiitm015.farc 777D2BDB\nrom/objset/kaiitm016.farc F5D6EC9C\nrom/objset/kaiitm017.farc 4703AC68\nrom/objset/kaiitm018.farc 07EC8764\nrom/objset/kaiitm019.farc 8ADE5675\nrom/objset/kaiitm020.farc 3595AD75\nrom/objset/kaiitm022.farc 9085916A\nrom/objset/kaiitm023.farc 028BAF06\nrom/objset/kaiitm024.farc 0C3C759B\nrom/objset/kaiitm025.farc FF67F1D9\nrom/objset/kaiitm027.farc 9BDFEBEF\nrom/objset/kaiitm028.farc 18BC2ADE\nrom/objset/kaiitm029.farc A62FD3C0\nrom/objset/kaiitm030.farc D91F24A8\nrom/objset/kaiitm031.farc 3DD19EAA\nrom/objset/kaiitm032.farc 29C380DE\nrom/objset/kaiitm033.farc 324DD25D\nrom/objset/kaiitm034.farc 6060D1B9\nrom/objset/kaiitm036.farc D331BD8F\nrom/objset/kaiitm037.farc 0F27EA51\nrom/objset/kaiitm038.farc 88C49D15\nrom/objset/kaiitm041.farc EF5A819D\nrom/objset/kaiitm042.farc 156B06F0\nrom/objset/kaiitm301.farc 328DB040\nrom/objset/kaiitm304.farc CD19CB24\nrom/objset/kaiitm310.farc C3247618\nrom/objset/kaiitm311.farc ABF95FD8\nrom/objset/kaiitm315.farc DA1240B4\nrom/objset/kaiitm316.farc 223CBE7F\nrom/objset/kaiitm320.farc D69C3EE1\nrom/objset/kaiitm322.farc 49D9DD64\nrom/objset/kaiitm323.farc 2ACFC313\nrom/objset/kaiitm324.farc D747D475\nrom/objset/kaiitm325.farc EDC25B55\nrom/objset/kaiitm327.farc 5B3AAEFE\nrom/objset/kaiitm328.farc 7566E5DC\nrom/objset/kaiitm329.farc B2E30115\nrom/objset/kaiitm330.farc 5BBEEE45\nrom/objset/kaiitm331.farc 1D1F51F1\nrom/objset/kaiitm332.farc BFECD270\nrom/objset/kaiitm334.farc 1E2C3C4C\nrom/objset/kaiitm337.farc 4E3B76E5\nrom/objset/kaiitm341.farc 7C4AD92F\nrom/objset/kaiitm342.farc 9CB4C785\nrom/objset/kaiitm501.farc 5BC446C5\nrom/objset/kaiitm502.farc 4BF40691\nrom/objset/kaiitm503.farc 23F29F71\nrom/objset/kaiitm504.farc F51CB15E\nrom/objset/kaiitm505.farc 255BDDE2\nrom/objset/kaiitm506.farc D4F1592B\nrom/objset/kaiitm507.farc 2B02AE43\nrom/objset/kaiitm508.farc 12428A4B\nrom/objset/kaiitm509.farc 59288B2C\nrom/objset/kaiitm510.farc C22A451F\nrom/objset/kaiitm520.farc 4974F09E\nrom/objset/kaiitm522.farc 8FBCA7B5\nrom/objset/kaiitm523.farc 2AB73916\nrom/objset/kaiitm524.farc 0E68502A\nrom/objset/kaiitm527.farc 58EDBA2D\nrom/objset/kaiitm528.farc 546D2673\nrom/objset/kaiitm529.farc D7A6F699\nrom/objset/kaiitm532.farc 4584E91E\nrom/objset/kaiitm533.farc 9D5EBEC3\nrom/objset/kaiitm534.farc 4281B5BF\nrom/objset/kaiitm536.farc D9839A39\nrom/objset/kaiitm541.farc C86EE494\nrom/objset/kaiitm542.farc 4936ACAC\nrom/objset/kaiitm700.farc 4AC8F842\nrom/objset/kaiitm701.farc 49AE7D9E\nrom/objset/kaiitm702.farc 491BCD98\nrom/objset/kaiitm703.farc 4A0448BB\nrom/objset/kaiitm705.farc 537E1759\nrom/objset/kaiitm706.farc D7B2A52D\nrom/objset/kaiitm707.farc D4971344\nrom/objset/kaiitm725.farc A955F752\nrom/objset/kaiitm726.farc D241BF8A\nrom/objset/kaiitm727.farc 48DDFF75\nrom/objset/kaiitm728.farc 25094570\nrom/objset/kaiitm730.farc 58749A87\nrom/objset/kaiitm750.farc 6FCB444B\nrom/objset/kaiitm751.farc BD8F2969\nrom/objset/kaiitm775.farc 09473B99\nrom/objset/kaiitm809.farc 18A540B4\nrom/objset/kaiitm810.farc 54C9966D\nrom/objset/kaiitm815.farc 52BDEDA4\nrom/objset/kaiitm820.farc C49DF631\nrom/objset/kaiitm822.farc AB5130EC\nrom/objset/kaiitm824.farc 11188A57\nrom/objset/kaiitm827.farc 679FD178\nrom/objset/kaiitm828.farc CDF52575\nrom/objset/kaiitm829.farc CAA90712\nrom/objset/kaiitm831.farc 72DEDD37\nrom/objset/kaiitm832.farc E6B88CD5\nrom/objset/kaiitm834.farc 71FA5517\nrom/objset/kaiitm837.farc E512AC5A\nrom/objset/kaiitm842.farc 9D989CA3\nrom/objset/lenitm000.farc BC03D32B\nrom/objset/lenitm001.farc 88DF3A42\nrom/objset/lenitm002.farc ACA6D39F\nrom/objset/lenitm003.farc 9429A238\nrom/objset/lenitm004.farc 6C5E03B8\nrom/objset/lenitm005.farc F7486CFA\nrom/objset/lenitm006.farc 35E79F73\nrom/objset/lenitm007.farc 1DE6144A\nrom/objset/lenitm008.farc 69F64489\nrom/objset/lenitm009.farc 4041494D\nrom/objset/lenitm010.farc FD174831\nrom/objset/lenitm011.farc D97F5B5B\nrom/objset/lenitm012.farc 2F34C5BB\nrom/objset/lenitm013.farc C2D52F6E\nrom/objset/lenitm014.farc 4C2B8C6A\nrom/objset/lenitm015.farc EAC21180\nrom/objset/lenitm017.farc 01371E35\nrom/objset/lenitm018.farc 6C17E510\nrom/objset/lenitm019.farc 3796AD39\nrom/objset/lenitm021.farc F200613C\nrom/objset/lenitm022.farc 3CDFA92E\nrom/objset/lenitm023.farc 471373C1\nrom/objset/lenitm024.farc F1647B68\nrom/objset/lenitm025.farc 63DC2D1C\nrom/objset/lenitm026.farc E9903E49\nrom/objset/lenitm027.farc 97115B58\nrom/objset/lenitm028.farc 7A9E7B75\nrom/objset/lenitm029.farc 9D7BCB8E\nrom/objset/lenitm030.farc F7B7A81D\nrom/objset/lenitm031.farc 114FF252\nrom/objset/lenitm032.farc 95DFA68F\nrom/objset/lenitm033.farc D73D0313\nrom/objset/lenitm034.farc 7F94ED68\nrom/objset/lenitm036.farc D2CF6640\nrom/objset/lenitm037.farc CB81DFAA\nrom/objset/lenitm038.farc 00FE2812\nrom/objset/lenitm039.farc 701EC69A\nrom/objset/lenitm040.farc B7EA8D1E\nrom/objset/lenitm301.farc 77E5F4C2\nrom/objset/lenitm309.farc 796080B0\nrom/objset/lenitm310.farc 034AEC98\nrom/objset/lenitm311.farc 82CC93E2\nrom/objset/lenitm313.farc 7F955BF7\nrom/objset/lenitm315.farc 200FB180\nrom/objset/lenitm316.farc 476F5BDA\nrom/objset/lenitm321.farc 52771F8C\nrom/objset/lenitm322.farc 138C14EA\nrom/objset/lenitm324.farc B99F4DDD\nrom/objset/lenitm325.farc 0087DB02\nrom/objset/lenitm326.farc E145EB67\nrom/objset/effchrpv737sak001.farc 5C923267\nrom/objset/hakitm001.farc 07F49BAF\nrom/objset/hnditm006.farc FD6DF5C7\nrom/objset/hnditm024.farc 89CB58C2\nrom/objset/hnditm304.farc 10603C0C\nrom/objset/itmpv085.farc 0C7803BE\nrom/objset/itmpv616.farc A148FD31\nrom/objset/kaiitm005.farc 9D42AE25\nrom/objset/kaiitm026.farc D7CC7471\nrom/objset/kaiitm312.farc 594204EC\nrom/objset/kaiitm500.farc 58E2077A\nrom/objset/kaiitm531.farc 70098BBD\nrom/objset/kaiitm729.farc 655615E6\nrom/objset/kaiitm841.farc C25C11D1\nrom/objset/lenitm016.farc 264D17D5\nrom/objset/lenitm035.farc 5EA71C98\nrom/objset/lenitm328.farc B06C42A7\nrom/objset/lenitm329.farc 6E077406\nrom/objset/lenitm331.farc AE26F8E5\nrom/objset/lenitm332.farc 3EE207BE\nrom/objset/lenitm334.farc F2EB12C4\nrom/objset/lenitm336.farc 3CFB119A\nrom/objset/lenitm337.farc 4ED84AE9\nrom/objset/lenitm339.farc F5093A00\nrom/objset/lenitm340.farc 1485391B\nrom/objset/lenitm500.farc 69622C05\nrom/objset/lenitm501.farc DFB07B31\nrom/objset/lenitm502.farc 8594CA06\nrom/objset/lenitm503.farc 5F4DCECE\nrom/objset/lenitm504.farc 4EB9316F\nrom/objset/lenitm505.farc BB72F9E0\nrom/objset/lenitm506.farc BE7C48DC\nrom/objset/lenitm507.farc 221C1722\nrom/objset/lenitm509.farc D035EAF4\nrom/objset/lenitm511.farc C7BE590C\nrom/objset/lenitm519.farc 7C220BA9\nrom/objset/lenitm521.farc 604C2777\nrom/objset/lenitm522.farc 104377FF\nrom/objset/lenitm523.farc 36EEB6EF\nrom/objset/lenitm524.farc 387958DF\nrom/objset/lenitm525.farc A72D7061\nrom/objset/lenitm526.farc A894FE56\nrom/objset/lenitm528.farc ECBEEE33\nrom/objset/lenitm529.farc AB657049\nrom/objset/lenitm530.farc E48A97A9\nrom/objset/lenitm531.farc F6693D0D\nrom/objset/lenitm532.farc 2F7198CA\nrom/objset/lenitm533.farc 0938C256\nrom/objset/lenitm534.farc 27C09818\nrom/objset/lenitm535.farc F2B9C424\nrom/objset/lenitm537.farc 5A063B20\nrom/objset/lenitm538.farc 103ECF12\nrom/objset/lenitm540.farc 3A400C17\nrom/objset/lenitm542.farc 9E732010\nrom/objset/lenitm700.farc CFB96DEC\nrom/objset/lenitm701.farc 2475ADD2\nrom/objset/lenitm702.farc 8E054423\nrom/objset/lenitm703.farc F6D69189\nrom/objset/lenitm704.farc CCC93C27\nrom/objset/lenitm725.farc 2390F15F\nrom/objset/lenitm726.farc 7E4BEF83\nrom/objset/lenitm729.farc 062DFCAF\nrom/objset/lenitm770.farc 086E9CDF\nrom/objset/lenitm771.farc D0D59BB0\nrom/objset/lenitm775.farc 5D6223B1\nrom/objset/lenitm807.farc CCF6CBB6\nrom/objset/lenitm808.farc 4B40D638\nrom/objset/lenitm810.farc 5D2DCE27\nrom/objset/lenitm811.farc 377F97BB\nrom/objset/lenitm812.farc C92E0144\nrom/objset/lenitm814.farc 93C239A5\nrom/objset/lenitm815.farc A65D91F6\nrom/objset/lenitm819.farc D90082EE\nrom/objset/lenitm822.farc 74FFE9AC\nrom/objset/lenitm824.farc 90E7EEF8\nrom/objset/lenitm825.farc 6DED6625\nrom/objset/lenitm826.farc 98401898\nrom/objset/lenitm828.farc CA4F588D\nrom/objset/lenitm831.farc AB85F8AE\nrom/objset/lenitm832.farc 49A90D5F\nrom/objset/lenitm833.farc D8C432A2\nrom/objset/lenitm834.farc A06D636B\nrom/objset/lenitm836.farc 4DAC4BCD\nrom/objset/lenitm837.farc 21A0A402\nrom/objset/lenitm839.farc 87C923FA\nrom/objset/lenitm842.farc 76E14FAC\nrom/objset/lenitm997.farc 66EFCA85\nrom/objset/lukitm000.farc BDF09DE9\nrom/objset/lukitm001.farc F6ED6554\nrom/objset/lukitm002.farc 247BD515\nrom/objset/lukitm003.farc E6794AE1\nrom/objset/lukitm004.farc EEE5441B\nrom/objset/lukitm005.farc F80C8961\nrom/objset/lukitm006.farc 7FCCC616\nrom/objset/lukitm007.farc 8407D57E\nrom/objset/lukitm008.farc EE4C2109\nrom/objset/lukitm009.farc DA062526\nrom/objset/lukitm010.farc D8906EC8\nrom/objset/lukitm011.farc B0C68F45\nrom/objset/lukitm012.farc 7B6AC699\nrom/objset/lukitm013.farc D4C32B6F\nrom/objset/lukitm015.farc EFCB8709\nrom/objset/lukitm017.farc B6C6F0B7\nrom/objset/lukitm018.farc CE303EDD\nrom/objset/lukitm019.farc 523A2021\nrom/objset/lukitm020.farc CDDEE1E4\nrom/objset/lukitm021.farc D0F4CA55\nrom/objset/lukitm022.farc 9D9784C8\nrom/objset/lukitm023.farc BEEB40BF\nrom/objset/lukitm024.farc A0F39CA4\nrom/objset/lukitm025.farc 3DE3478B\nrom/objset/lukitm026.farc 78B71347\nrom/objset/lukitm027.farc 3F0F4618\nrom/objset/lukitm028.farc B5D94677\nrom/objset/lukitm029.farc 5AAA41A3\nrom/objset/lukitm030.farc D9CF25AF\nrom/objset/lukitm031.farc B867130D\nrom/objset/lukitm032.farc 604B18B4\nrom/objset/lukitm034.farc 9A34C501\nrom/objset/lukitm035.farc 4100E6CB\nrom/objset/lukitm036.farc 89FEF43D\nrom/objset/lukitm037.farc BCF6672E\nrom/objset/lukitm038.farc 0C616433\nrom/objset/lukitm039.farc 0F29E97A\nrom/objset/lukitm040.farc 04696E68\nrom/objset/lukitm041.farc 0E298622\nrom/objset/lukitm042.farc 9A0890B2\nrom/objset/lukitm301.farc 23A816B9\nrom/objset/lukitm304.farc 9C34BF40\nrom/objset/lukitm305.farc 1C40D169\nrom/objset/lukitm310.farc 4E62F733\nrom/objset/lukitm311.farc DCB3DAB9\nrom/objset/lukitm312.farc A834446D\nrom/objset/lukitm313.farc 3C8FA743\nrom/objset/lukitm314.farc 5EE0B177\nrom/objset/lukitm317.farc 1A521117\nrom/objset/lukitm320.farc 09074878\nrom/objset/lukitm324.farc CF80DC22\nrom/objset/lukitm325.farc B6921830\nrom/objset/lukitm326.farc BF7C9170\nrom/objset/lukitm328.farc E937C3C1\nrom/objset/lukitm329.farc 7EFF1451\nrom/objset/lukitm330.farc F4C9D657\nrom/objset/lukitm331.farc 9374D535\nrom/objset/lukitm332.farc AF45DC59\nrom/objset/lukitm334.farc 2DF95A42\nrom/objset/lukitm335.farc 1EBB0461\nrom/objset/lukitm336.farc 0D601C77\nrom/objset/lukitm337.farc D85779F7\nrom/objset/lukitm339.farc 9CC103B8\nrom/objset/lukitm341.farc 31775ECF\nrom/objset/lukitm342.farc DAABB698\nrom/objset/lukitm501.farc D87F7C55\nrom/objset/lukitm502.farc E7EC8885\nrom/objset/lukitm503.farc DB42E024\nrom/objset/lukitm504.farc F67DFA56\nrom/objset/lukitm505.farc FF987043\nrom/objset/lukitm506.farc CF024DF1\nrom/objset/lukitm507.farc 5D16B74F\nrom/objset/lukitm508.farc AE92AA21\nrom/objset/lukitm509.farc 1BE7223E\nrom/objset/lukitm510.farc 600283A6\nrom/objset/lukitm511.farc 47A421C8\nrom/objset/lukitm512.farc 2B1C9AEC\nrom/objset/lukitm513.farc D552DAAA\nrom/objset/lukitm514.farc 12BF68A8\nrom/objset/lukitm515.farc 9E368A0A\nrom/objset/lukitm516.farc 3A7B0E69\nrom/objset/lukitm517.farc 68C9F8EF\nrom/objset/lukitm526.farc ADA92811\nrom/objset/lukitm527.farc D748EA2C\nrom/objset/lukitm528.farc 67E61495\nrom/objset/lukitm529.farc E1AF243F\nrom/objset/lukitm530.farc 4E04FCB6\nrom/objset/lukitm531.farc 5CDF085F\nrom/objset/lukitm532.farc 183929D8\nrom/objset/lukitm533.farc 8073A922\nrom/objset/lukitm534.farc D589009B\nrom/objset/lukitm535.farc BF47D8D4\nrom/objset/lukitm536.farc 33835164\nrom/objset/lukitm537.farc 398DD10C\nrom/objset/lukitm538.farc 3906209F\nrom/objset/lukitm539.farc 83847DF8\nrom/objset/lukitm540.farc E3998099\nrom/objset/lukitm542.farc 0EF2EF73\nrom/objset/lukitm700.farc 97D96F27\nrom/objset/lukitm702.farc 847EF462\nrom/objset/lukitm703.farc 37E213D4\nrom/objset/lukitm704.farc 6357FAC6\nrom/objset/lukitm705.farc 1F9ABC7F\nrom/objset/lukitm706.farc 17987E5B\nrom/objset/lukitm725.farc C47B9C98\nrom/objset/lukitm726.farc 7C536EFA\nrom/objset/lukitm727.farc D50D3908\nrom/objset/lukitm810.farc 9CC6D237\nrom/objset/lukitm815.farc A3ED4FC0\nrom/objset/lukitm817.farc ECAD1390\nrom/objset/lukitm825.farc 930E9345\nrom/objset/lukitm829.farc FF25F3F2\nrom/objset/lukitm830.farc 27A08FDD\nrom/objset/lukitm833.farc 6C4AA5B9\nrom/objset/lukitm836.farc 0F3E366B\nrom/objset/lukitm837.farc 7125A734\nrom/objset/lukitm840.farc 5E5C0E80\nrom/objset/lukitm841.farc 990BB0B8\nrom/objset/meiitm000.farc 152C3041\nrom/objset/meiitm001.farc FFCC4CE0\nrom/objset/meiitm002.farc 0310CEFD\nrom/objset/meiitm003.farc 7DADEA34\nrom/objset/meiitm004.farc 7D1B14E7\nrom/objset/meiitm005.farc 9FF903B8\nrom/objset/meiitm006.farc D4059F06\nrom/objset/meiitm008.farc 615830AE\nrom/objset/meiitm009.farc 0792DF11\nrom/objset/meiitm010.farc 32BB37F5\nrom/objset/meiitm011.farc 5E24C453\nrom/objset/meiitm012.farc 3600FAE4\nrom/objset/meiitm013.farc B0645268\nrom/objset/meiitm014.farc 02634DE8\nrom/objset/meiitm015.farc B45A73E9\nrom/objset/meiitm017.farc 29F85162\nrom/objset/meiitm018.farc 3BD9484A\nrom/objset/meiitm019.farc 709066C2\nrom/objset/meiitm020.farc A374F662\nrom/objset/meiitm021.farc B3E70C4F\nrom/objset/meiitm022.farc AB4DE228\nrom/objset/meiitm023.farc 03486835\nrom/objset/meiitm024.farc 43447515\nrom/objset/meiitm025.farc 3BD3455B\nrom/objset/meiitm026.farc 63251238\nrom/objset/meiitm027.farc 779092B7\nrom/objset/meiitm028.farc A1E169CE\nrom/objset/meiitm029.farc 7D722CCA\nrom/objset/meiitm030.farc B1DDDA67\nrom/objset/meiitm031.farc 62B78DDF\nrom/objset/meiitm032.farc E18152E9\nrom/objset/meiitm033.farc 282973D0\nrom/objset/meiitm304.farc E98A4606\nrom/objset/meiitm305.farc FE6405DF\nrom/objset/meiitm309.farc 0007DD54\nrom/objset/meiitm311.farc C9AD02ED\nrom/objset/meiitm313.farc 15D8A8A8\nrom/objset/meiitm314.farc A0EE30ED\nrom/objset/meiitm320.farc 9AE96ECD\nrom/objset/meiitm321.farc 7403C427\nrom/objset/meiitm322.farc 5FE8B304\nrom/objset/meiitm323.farc 1499EDA0\nrom/objset/meiitm324.farc BB66C32A\nrom/objset/meiitm325.farc 92E4819A\nrom/objset/meiitm327.farc CA5295C5\nrom/objset/meiitm330.farc 181F9CC9\nrom/objset/meiitm331.farc 2FB9F6DF\nrom/objset/meiitm332.farc CCF8B84A\nrom/objset/meiitm333.farc EAAF1AD1\nrom/objset/meiitm501.farc FEEF8E6C\nrom/objset/meiitm502.farc A77983F5\nrom/objset/meiitm503.farc 31686271\nrom/objset/meiitm504.farc BB48AC19\nrom/objset/meiitm505.farc FA41751C\nrom/objset/meiitm506.farc 8B91A3D7\nrom/objset/meiitm507.farc 756E61D9\nrom/objset/meiitm508.farc 0618DB38\nrom/objset/meiitm509.farc 148289D5\nrom/objset/meiitm510.farc E927FD2C\nrom/objset/meiitm511.farc 6EBF8650\nrom/objset/meiitm512.farc 782978AE\nrom/objset/meiitm513.farc 6986E9B5\nrom/objset/meiitm514.farc C3E46A8A\nrom/objset/meiitm515.farc 3E2F8547\nrom/objset/meiitm521.farc A265F17B\nrom/objset/meiitm522.farc 9060D7D9\nrom/objset/meiitm524.farc 4D9E2B44\nrom/objset/meiitm525.farc 71972678\nrom/objset/meiitm526.farc 22F7F76C\nrom/objset/meiitm527.farc EEDB73D7\nrom/objset/meiitm528.farc C7DE0927\nrom/objset/meiitm529.farc 7EFE4BC2\nrom/objset/meiitm530.farc 63F20C67\nrom/objset/meiitm532.farc 0437A5AA\nrom/objset/meiitm533.farc 8053BA00\nrom/objset/meiitm700.farc CD5BD6ED\nrom/objset/meiitm701.farc 1A42A3F9\nrom/objset/meiitm702.farc FBC14CCD\nrom/objset/meiitm703.farc 0BF6C668\nrom/objset/meiitm704.farc D8B2B8C2\nrom/objset/meiitm705.farc 57219F39\nrom/objset/meiitm706.farc ED10DDC6\nrom/objset/meiitm707.farc 6F7577F1\nrom/objset/meiitm725.farc C031D3CD\nrom/objset/meiitm775.farc EA932205\nrom/objset/meiitm809.farc 699CB5A1\nrom/objset/meiitm816.farc B4CE2C1B\nrom/objset/meiitm820.farc 9282AF83\nrom/objset/meiitm821.farc C3FA51FD\nrom/objset/meiitm823.farc 5D84D0C1\nrom/objset/meiitm827.farc 280B138A\nrom/objset/meiitm828.farc CCE32500\nrom/objset/meiitm831.farc 857F0535\nrom/objset/meiitm833.farc 1FEF1109\nrom/objset/mikitm000.farc B71AFDBB\nrom/objset/mikitm001.farc 9228F624\nrom/objset/mikitm002.farc FDD0B7C9\nrom/objset/mikitm003.farc C92A9EFB\nrom/objset/mikitm004.farc 9017DCDF\nrom/objset/mikitm005.farc 51E47940\nrom/objset/mikitm007.farc 0CCDFD4C\nrom/objset/mikitm008.farc FBCE7E60\nrom/objset/mikitm009.farc 655BBD93\nrom/objset/mikitm010.farc A9229387\nrom/objset/mikitm011.farc 14074684\nrom/objset/mikitm012.farc B3764052\nrom/objset/mikitm013.farc A0EFADEF\nrom/objset/mikitm014.farc B09B3F64\nrom/objset/mikitm015.farc 85A19A41\nrom/objset/mikitm016.farc 351B7E5C\nrom/objset/mikitm017.farc A58F9A3C\nrom/objset/mikitm018.farc 369C1C2C\nrom/objset/mikitm019.farc 1E62E7D1\nrom/objset/mikitm020.farc 826FBC6A\nrom/objset/mikitm021.farc 4CE67E64\nrom/objset/mikitm022.farc D66941F4\nrom/objset/mikitm023.farc 4B094E80\nrom/objset/lenitm508.farc 21F6C7A6\nrom/objset/lenitm536.farc FCC5C5F1\nrom/objset/lenitm809.farc 420DDA61\nrom/objset/lenitm838.farc 1A64EF09\nrom/objset/lukitm014.farc FD7B8A61\nrom/objset/lukitm033.farc 75559748\nrom/objset/lukitm315.farc 47707E2A\nrom/objset/lukitm500.farc 817BA35F\nrom/objset/lukitm525.farc 64A86200\nrom/objset/lukitm701.farc E32C4CAC\nrom/objset/lukitm839.farc D1066CC8\nrom/objset/meiitm016.farc 03669C18\nrom/objset/meiitm301.farc 936DF84B\nrom/objset/meiitm500.farc FF610886\nrom/objset/meiitm523.farc E35A7E92\nrom/objset/meiitm709.farc 2D8B80ED\nrom/objset/effchrpv605kai001.farc 73787B50\nrom/objset/effchrpv737hak001.farc 1D5C1D6B\nrom/objset/lenitm327.farc E979D5FE\nrom/objset/mikitm006.farc 2507401E\nrom/objset/mikitm540.farc 92C76CD8\nrom/objset/rinitm331.farc 6540997A\nrom/objset/stgns005.farc F9433B22\nrom/objset/stgpv082s06.farc BE2D6D95\nrom/objset/stgpv236s02.farc D4114C25\nrom/objset/mikitm025.farc 47E1D494\nrom/objset/mikitm026.farc 4019E726\nrom/objset/mikitm027.farc 674B2DE3\nrom/objset/mikitm028.farc E6AFB421\nrom/objset/mikitm029.farc B38CCC2C\nrom/objset/mikitm030.farc A5191C41\nrom/objset/mikitm031.farc 0E087FEB\nrom/objset/mikitm032.farc C7068FBB\nrom/objset/mikitm033.farc 7F104DC5\nrom/objset/mikitm034.farc 1A8F2FB8\nrom/objset/mikitm035.farc 901C7388\nrom/objset/mikitm036.farc 0CE339AA\nrom/objset/mikitm037.farc 1623692D\nrom/objset/mikitm038.farc EC04A709\nrom/objset/mikitm039.farc 2E870378\nrom/objset/mikitm040.farc 161FFC3C\nrom/objset/mikitm041.farc F25F1C46\nrom/objset/mikitm043.farc 7637B8C0\nrom/objset/mikitm044.farc 4C0685AD\nrom/objset/mikitm045.farc B042F89E\nrom/objset/mikitm046.farc C557CF73\nrom/objset/mikitm047.farc F216F29C\nrom/objset/mikitm048.farc CF969F2F\nrom/objset/mikitm049.farc 51589758\nrom/objset/mikitm050.farc 59D5BA38\nrom/objset/mikitm051.farc F0F49016\nrom/objset/mikitm052.farc 803E572C\nrom/objset/mikitm053.farc 283BAE37\nrom/objset/mikitm054.farc C329463E\nrom/objset/mikitm055.farc D1393A6C\nrom/objset/mikitm056.farc 9608786D\nrom/objset/mikitm057.farc ECBB6736\nrom/objset/mikitm058.farc 48C7C088\nrom/objset/mikitm059.farc B4143A22\nrom/objset/mikitm061.farc 59E22D61\nrom/objset/mikitm063.farc 706E43C1\nrom/objset/mikitm064.farc 003AF401\nrom/objset/mikitm065.farc 4F6FC1CB\nrom/objset/mikitm066.farc 9B59EDAA\nrom/objset/mikitm067.farc 388DA036\nrom/objset/mikitm068.farc 633C9515\nrom/objset/mikitm069.farc 7AB49FDF\nrom/objset/mikitm070.farc DD742B58\nrom/objset/mikitm071.farc 08B83911\nrom/objset/mikitm072.farc 7AB9401B\nrom/objset/mikitm073.farc 8C63D6DF\nrom/objset/mikitm074.farc E6A9BB85\nrom/objset/mikitm075.farc AE875463\nrom/objset/mikitm076.farc C9F460A3\nrom/objset/mikitm077.farc E66946A0\nrom/objset/mikitm078.farc 58C67305\nrom/objset/mikitm080.farc C1F52281\nrom/objset/mikitm081.farc 0991FA67\nrom/objset/mikitm082.farc 348E41A3\nrom/objset/mikitm083.farc 2DAEFB73\nrom/objset/mikitm084.farc AE7A46CD\nrom/objset/mikitm085.farc 1B966DC8\nrom/objset/mikitm087.farc 7BC72333\nrom/objset/mikitm088.farc 90EF80B7\nrom/objset/mikitm089.farc F47E21F6\nrom/objset/mikitm090.farc 5E9552AC\nrom/objset/mikitm091.farc CC8EDC3F\nrom/objset/mikitm092.farc 2ED29B36\nrom/objset/mikitm093.farc E488D083\nrom/objset/mikitm094.farc 18833768\nrom/objset/mikitm095.farc 3237B0DA\nrom/objset/mikitm096.farc 1F56BD82\nrom/objset/mikitm097.farc 69B6344B\nrom/objset/mikitm099.farc 0DC873A6\nrom/objset/mikitm100.farc 0417A9B3\nrom/objset/mikitm101.farc EAC87B67\nrom/objset/mikitm102.farc 14499C9B\nrom/objset/mikitm103.farc 1367714B\nrom/objset/mikitm104.farc 4FDD9395\nrom/objset/mikitm105.farc F1510D44\nrom/objset/mikitm106.farc D087925B\nrom/objset/mikitm107.farc 2FF754E9\nrom/objset/mikitm108.farc 01E3AA2F\nrom/objset/mikitm109.farc 58C893DF\nrom/objset/mikitm110.farc F6923428\nrom/objset/mikitm111.farc C81E2163\nrom/objset/mikitm112.farc 9133A204\nrom/objset/mikitm113.farc 4251D22A\nrom/objset/mikitm114.farc 7C093DA4\nrom/objset/mikitm115.farc 9FD57660\nrom/objset/mikitm118.farc 87FF95A6\nrom/objset/mikitm119.farc 963B029E\nrom/objset/mikitm120.farc 5B542B86\nrom/objset/mikitm123.farc BDC18C5F\nrom/objset/mikitm124.farc 15A1B1C2\nrom/objset/mikitm125.farc B4B54995\nrom/objset/mikitm126.farc 2C9F3BFE\nrom/objset/mikitm127.farc 5A2875BC\nrom/objset/mikitm128.farc 5D62E680\nrom/objset/mikitm129.farc 88B9F242\nrom/objset/mikitm130.farc 31975093\nrom/objset/mikitm131.farc B86D5225\nrom/objset/mikitm132.farc 0F05AB90\nrom/objset/mikitm133.farc 6E9ED911\nrom/objset/mikitm134.farc D1B862F1\nrom/objset/mikitm135.farc 0FF38015\nrom/objset/mikitm136.farc 6CBE6C9A\nrom/objset/mikitm138.farc DD16E75E\nrom/objset/mikitm139.farc 6248E592\nrom/objset/mikitm140.farc 1F1DD7EA\nrom/objset/mikitm141.farc 52CC2B40\nrom/objset/mikitm142.farc A8C9E341\nrom/objset/mikitm143.farc DF2CAFDB\nrom/objset/mikitm144.farc C4177F84\nrom/objset/mikitm145.farc EEA103BC\nrom/objset/mikitm146.farc 84D8E7DC\nrom/objset/mikitm147.farc C4D62BCC\nrom/objset/mikitm148.farc 75EE6C0E\nrom/objset/mikitm149.farc 0982F214\nrom/objset/mikitm151.farc CB7EEC1D\nrom/objset/mikitm152.farc B8A195EF\nrom/objset/mikitm153.farc E3F54510\nrom/objset/mikitm155.farc 3755C58A\nrom/objset/mikitm156.farc 6D95CC9D\nrom/objset/mikitm160.farc AEFFE1BA\nrom/objset/mikitm162.farc D25E3EB3\nrom/objset/mikitm163.farc 65FF3A53\nrom/objset/mikitm164.farc CAD10AC6\nrom/objset/mikitm165.farc A1EB6A62\nrom/objset/mikitm166.farc 952A446E\nrom/objset/mikitm167.farc F3CCA6C8\nrom/objset/mikitm169.farc C0E50963\nrom/objset/mikitm170.farc F453B03E\nrom/objset/mikitm173.farc 74E50383\nrom/objset/mikitm301.farc 16006FAB\nrom/objset/mikitm302.farc 9ADB8498\nrom/objset/mikitm303.farc 1A2CCFD3\nrom/objset/mikitm304.farc 4138EF8E\nrom/objset/mikitm305.farc D19FE933\nrom/objset/mikitm306.farc 9B1F87DE\nrom/objset/mikitm308.farc D8A7D764\nrom/objset/mikitm311.farc 6D353D3B\nrom/objset/mikitm312.farc 91CEE3BB\nrom/objset/mikitm313.farc 0574E2C7\nrom/objset/mikitm314.farc B9B28BE4\nrom/objset/mikitm315.farc 0A1FF1F0\nrom/objset/mikitm316.farc 5C1C3BF8\nrom/objset/mikitm317.farc 605B222A\nrom/objset/mikitm318.farc 5FDE142F\nrom/objset/mikitm319.farc 745E3572\nrom/objset/mikitm321.farc 3F83F266\nrom/objset/mikitm322.farc 4993A479\nrom/objset/mikitm323.farc 0DABD6B9\nrom/objset/mikitm325.farc 4B65DF5A\nrom/objset/mikitm326.farc 8F8303BE\nrom/objset/mikitm327.farc 43E0896E\nrom/objset/mikitm329.farc D414FC41\nrom/objset/mikitm332.farc D387471C\nrom/objset/mikitm334.farc 9050E21B\nrom/objset/mikitm335.farc 4EC0A18C\nrom/objset/mikitm336.farc 4E152ABC\nrom/objset/mikitm337.farc 952F96D1\nrom/objset/mikitm338.farc C3B61A9A\nrom/objset/mikitm339.farc AEEDD735\nrom/objset/mikitm340.farc 46A0703C\nrom/objset/mikitm341.farc 03F51231\nrom/objset/mikitm342.farc 9D2950DF\nrom/objset/mikitm343.farc 58F97A14\nrom/objset/mikitm345.farc 3F64CE5C\nrom/objset/mikitm349.farc 4CADE578\nrom/objset/mikitm350.farc 911621E6\nrom/objset/mikitm353.farc 6C2CAE41\nrom/objset/mikitm357.farc A5EB9D25\nrom/objset/mikitm360.farc A29AD23E\nrom/objset/mikitm361.farc 46174A6A\nrom/objset/mikitm364.farc 696E7B3C\nrom/objset/mikitm365.farc 94F48D45\nrom/objset/mikitm366.farc 0F9EB996\nrom/objset/mikitm368.farc 06067408\nrom/objset/mikitm369.farc 6E524598\nrom/objset/mikitm370.farc 559015D7\nrom/objset/mikitm371.farc 70700CB6\nrom/objset/mikitm372.farc 732BC0FC\nrom/objset/mikitm373.farc A46F17AA\nrom/objset/mikitm374.farc F60788E5\nrom/objset/mikitm375.farc 989E6BC2\nrom/objset/mikitm376.farc DA8026AC\nrom/objset/mikitm377.farc AE0F9205\nrom/objset/mikitm379.farc A510D4B0\nrom/objset/mikitm380.farc EAD562F9\nrom/objset/mikitm381.farc 54C9A61D\nrom/objset/mikitm382.farc D0081913\nrom/objset/mikitm384.farc 73F2DE50\nrom/objset/mikitm387.farc 811087EF\nrom/objset/mikitm388.farc 1F94CB80\nrom/objset/mikitm389.farc D71976AB\nrom/objset/mikitm392.farc E721925A\nrom/objset/mikitm393.farc BB091700\nrom/objset/mikitm394.farc E85E51DF\nrom/objset/mikitm395.farc 76ED6E8C\nrom/objset/mikitm396.farc CC1CEA25\nrom/objset/mikitm397.farc 7F895B22\nrom/objset/mikitm398.farc 129677CA\nrom/objset/mikitm399.farc 285BD9E4\nrom/objset/mikitm400.farc 4A0CE6A1\nrom/objset/mikitm401.farc 93B8F0FE\nrom/objset/mikitm402.farc 5040A113\nrom/objset/mikitm404.farc 25926846\nrom/objset/mikitm405.farc 0A78FE20\nrom/objset/mikitm410.farc D897A840\nrom/objset/mikitm411.farc 943AA5C8\nrom/objset/mikitm412.farc C7ECCC38\nrom/objset/mikitm413.farc 6B0C9C77\nrom/objset/mikitm414.farc AC428A9A\nrom/objset/mikitm415.farc 4950F297\nrom/objset/mikitm416.farc F73271F0\nrom/objset/mikitm418.farc 1D1078B4\nrom/objset/mikitm419.farc 9A62D4AA\nrom/objset/mikitm420.farc 47792C02\nrom/objset/mikitm423.farc F45B0A39\nrom/objset/mikitm424.farc 6BD8C0FB\nrom/objset/mikitm427.farc 3443E8F0\nrom/objset/mikitm428.farc 7D49F95B\nrom/objset/mikitm429.farc 56504321\nrom/objset/mikitm431.farc 28138E7C\nrom/objset/mikitm432.farc 0BA33D05\nrom/objset/mikitm434.farc DBE7B9AD\nrom/objset/mikitm435.farc 15C88414\nrom/objset/mikitm436.farc 80335E80\nrom/objset/mikitm437.farc E53660D1\nrom/objset/mikitm438.farc B43DDBE8\nrom/objset/mikitm439.farc B68177D3\nrom/objset/mikitm441.farc 91626E81\nrom/objset/mikitm443.farc DEA5908C\nrom/objset/mikitm444.farc C05DBB9E\nrom/objset/mikitm445.farc E72B5FB1\nrom/objset/mikitm446.farc ACD8DEA4\nrom/objset/mikitm447.farc 70860107\nrom/objset/mikitm448.farc DDC6E471\nrom/objset/mikitm449.farc 8D235998\nrom/objset/mikitm450.farc AE9C2BEF\nrom/objset/mikitm451.farc 37679019\nrom/objset/mikitm455.farc DB3BB0A0\nrom/objset/mikitm460.farc B02E5457\nrom/objset/mikitm462.farc 95BB60A6\nrom/objset/mikitm463.farc 7018F8BA\nrom/objset/mikitm464.farc 9603679A\nrom/objset/mikitm466.farc 94C57E60\nrom/objset/mikitm467.farc 2E2301CD\nrom/objset/mikitm469.farc 73FBB644\nrom/objset/mikitm470.farc 669E4CD7\nrom/objset/mikitm473.farc C62C3172\nrom/objset/mikitm500.farc 09CF1D97\nrom/objset/mikitm501.farc 2D92DA28\nrom/objset/mikitm502.farc A3869AD1\nrom/objset/mikitm503.farc F931993B\nrom/objset/mikitm504.farc 5F6558E2\nrom/objset/mikitm505.farc 1060C24E\nrom/objset/mikitm506.farc 91A1A468\nrom/objset/mikitm507.farc 57B4B228\nrom/objset/mikitm509.farc A4BB2AB2\nrom/objset/mikitm520.farc 8D22E624\nrom/objset/mikitm522.farc 4165CC00\nrom/objset/mikitm524.farc 71E03CCF\nrom/objset/mikitm525.farc 327D9BFA\nrom/objset/mikitm526.farc F52F8CCE\nrom/objset/mikitm527.farc 9B74CAB7\nrom/objset/mikitm528.farc 05BC6291\nrom/objset/mikitm530.farc 8655753F\nrom/objset/mikitm531.farc 1A8088CC\nrom/objset/mikitm532.farc 1BEE70AC\nrom/objset/mikitm533.farc 9E44215F\nrom/objset/mikitm534.farc 0924C91B\nrom/objset/mikitm536.farc 0812A009\nrom/objset/mikitm537.farc 0CA04FF4\nrom/objset/mikitm538.farc 03584362\nrom/objset/mikitm539.farc BD9DB0AB\nrom/objset/mikitm541.farc FF57B581\nrom/objset/mikitm542.farc 34C3F5C9\nrom/objset/mikitm543.farc 856E3FF0\nrom/objset/mikitm544.farc B7F02E6E\nrom/objset/mikitm545.farc 49763991\nrom/objset/mikitm546.farc D1996B5C\nrom/objset/mikitm547.farc F0B1D868\nrom/objset/mikitm548.farc B5130814\nrom/objset/mikitm549.farc E8C882BE\nrom/objset/mikitm550.farc 53613BA8\nrom/objset/mikitm551.farc 48EE91AB\nrom/objset/mikitm552.farc 1475F7CE\nrom/objset/mikitm553.farc BF1DD1C8\nrom/objset/mikitm554.farc CD492A4B\nrom/objset/mikitm555.farc 6915ECE3\nrom/objset/mikitm556.farc CBC3172A\nrom/objset/mikitm557.farc EDE8DA31\nrom/objset/mikitm024.farc FA8B29CE\nrom/objset/mikitm042.farc 65FB603E\nrom/objset/mikitm060.farc 149ED2D9\nrom/objset/mikitm079.farc 9D725FAD\nrom/objset/mikitm098.farc EE0C1683\nrom/objset/mikitm116.farc C08ACC09\nrom/objset/mikitm137.farc A10CFDDB\nrom/objset/mikitm158.farc F30CB8D4\nrom/objset/mikitm310.farc 071AA5FD\nrom/objset/mikitm333.farc F6F0CE03\nrom/objset/mikitm363.farc D6AF368B\nrom/objset/mikitm383.farc 4D039E70\nrom/objset/mikitm409.farc 6D3EB314\nrom/objset/mikitm433.farc D37F7288\nrom/objset/mikitm458.farc 53B4266F\nrom/objset/mikitm508.farc 8523A13B\nrom/objset/mikitm559.farc 6BCDE904\nrom/objset/mikitm560.farc 72FAE8C7\nrom/objset/mikitm593.farc 4616915F\nrom/objset/mikitm594.farc 58F3898B\nrom/objset/mikitm595.farc 9E645555\nrom/objset/mikitm596.farc A4EF49E6\nrom/objset/mikitm597.farc 6D2429E1\nrom/objset/mikitm598.farc F11754DA\nrom/objset/mikitm599.farc 265F1550\nrom/objset/mikitm600.farc 2A4ED93D\nrom/objset/mikitm601.farc 7BB60107\nrom/objset/mikitm602.farc E9662AF6\nrom/objset/mikitm603.farc 6E500446\nrom/objset/mikitm604.farc 27DEE52A\nrom/objset/mikitm605.farc 3AB954C1\nrom/objset/mikitm606.farc 46AE2171\nrom/objset/mikitm607.farc A4FD9318\nrom/objset/mikitm609.farc A2C2F074\nrom/objset/mikitm610.farc 443219A6\nrom/objset/mikitm611.farc 05C03047\nrom/objset/mikitm612.farc B3CCBDEE\nrom/objset/mikitm613.farc 6669C8CA\nrom/objset/mikitm614.farc A7070249\nrom/objset/mikitm615.farc 24C1CB80\nrom/objset/mikitm616.farc 2973A69B\nrom/objset/mikitm617.farc AB68CC80\nrom/objset/mikitm618.farc 125F3398\nrom/objset/mikitm619.farc 7862642B\nrom/objset/mikitm620.farc CA2C7BC7\nrom/objset/mikitm621.farc A850CF16\nrom/objset/mikitm623.farc 4D94C7C2\nrom/objset/mikitm624.farc 35251573\nrom/objset/mikitm625.farc 2BB26977\nrom/objset/mikitm626.farc 0E1B2C48\nrom/objset/mikitm628.farc 1E0DE9B1\nrom/objset/mikitm630.farc 7C5A521D\nrom/objset/mikitm631.farc 2DE3A24C\nrom/objset/mikitm632.farc 1247AA5F\nrom/objset/mikitm633.farc 57B2E169\nrom/objset/mikitm634.farc 5B4D67C1\nrom/objset/mikitm635.farc D0E44734\nrom/objset/mikitm636.farc 4DCA1214\nrom/objset/mikitm637.farc DB19812B\nrom/objset/mikitm638.farc 78C359A3\nrom/objset/mikitm639.farc 9FD36630\nrom/objset/mikitm640.farc BD05BC10\nrom/objset/mikitm641.farc 34972A17\nrom/objset/mikitm642.farc 9754D491\nrom/objset/mikitm643.farc 5EF742F6\nrom/objset/mikitm644.farc 4D7E11B0\nrom/objset/mikitm645.farc 422CE108\nrom/objset/mikitm647.farc AA623120\nrom/objset/mikitm648.farc 29C18BC8\nrom/objset/mikitm649.farc ECB342F3\nrom/objset/mikitm651.farc 7FFD7668\nrom/objset/mikitm652.farc D160DB6E\nrom/objset/mikitm653.farc 7DB80864\nrom/objset/mikitm655.farc 48DE5866\nrom/objset/mikitm656.farc FE344BB2\nrom/objset/mikitm658.farc F1D20094\nrom/objset/mikitm660.farc 0043F524\nrom/objset/mikitm662.farc 8D9FA2FF\nrom/objset/mikitm663.farc E90C628F\nrom/objset/mikitm664.farc 2CF8D22B\nrom/objset/mikitm665.farc 33D8BD9E\nrom/objset/mikitm667.farc 8E34273A\nrom/objset/mikitm669.farc 61662789\nrom/objset/mikitm670.farc 1CE515EC\nrom/objset/mikitm700.farc 6F4B7693\nrom/objset/mikitm701.farc 430FC56F\nrom/objset/mikitm702.farc 924C79B3\nrom/objset/mikitm703.farc 9E777CE7\nrom/objset/mikitm704.farc 45A3B4AB\nrom/objset/mikitm705.farc AAAD819D\nrom/objset/mikitm706.farc 04952BEB\nrom/objset/mikitm707.farc 8690BEB5\nrom/objset/mikitm708.farc 337CB546\nrom/objset/mikitm709.farc 3DF5E995\nrom/objset/mikitm710.farc 1D19E08B\nrom/objset/mikitm711.farc 8401DFC1\nrom/objset/mikitm712.farc 3D47BE3B\nrom/objset/mikitm713.farc 1F14A684\nrom/objset/mikitm714.farc 37F746CA\nrom/objset/mikitm715.farc 4452A815\nrom/objset/mikitm716.farc 089EE724\nrom/objset/mikitm718.farc E7D2D960\nrom/objset/mikitm719.farc CD36FD26\nrom/objset/mikitm720.farc DCD1C228\nrom/objset/mikitm721.farc D1C0EAD4\nrom/objset/mikitm722.farc C293777C\nrom/objset/mikitm723.farc 62F60662\nrom/objset/mikitm724.farc 51DA502C\nrom/objset/mikitm725.farc 85176F44\nrom/objset/mikitm726.farc B410CB1D\nrom/objset/mikitm727.farc BBC3CA9F\nrom/objset/mikitm728.farc 598DEC85\nrom/objset/mikitm729.farc 8E9C28DB\nrom/objset/mikitm730.farc ED7347FF\nrom/objset/mikitm740.farc 81499AD7\nrom/objset/mikitm741.farc 6491BCD6\nrom/objset/mikitm742.farc 246E149E\nrom/objset/mikitm743.farc B2B1652A\nrom/objset/mikitm745.farc 26519FC5\nrom/objset/mikitm746.farc 55CE74EC\nrom/objset/mikitm747.farc D792862D\nrom/objset/mikitm748.farc 24F6738E\nrom/objset/mikitm749.farc 2B7E3BE8\nrom/objset/mikitm750.farc E7C52899\nrom/objset/mikitm751.farc DD40DBBC\nrom/objset/mikitm752.farc 2FA84B1F\nrom/objset/mikitm770.farc F63CAD54\nrom/objset/mikitm771.farc 285FC6C2\nrom/objset/mikitm772.farc 4EB3D5ED\nrom/objset/mikitm773.farc 9D37278D\nrom/objset/mikitm775.farc 4CB11BE9\nrom/objset/mikitm776.farc CA91EE7E\nrom/objset/mikitm777.farc AE484F0F\nrom/objset/mikitm778.farc 08033A19\nrom/objset/mikitm779.farc 65E21C97\nrom/objset/mikitm781.farc FBB9A967\nrom/objset/mikitm782.farc 0F398C30\nrom/objset/mikitm783.farc 501A478D\nrom/objset/mikitm784.farc AC783F47\nrom/objset/mikitm790.farc 92CE9F3F\nrom/objset/mikitm791.farc 04A7E7D7\nrom/objset/mikitm804.farc 3E1CDB7F\nrom/objset/mikitm833.farc 33871CDE\nrom/objset/mikitm834.farc BA392F88\nrom/objset/mikitm835.farc 24B975E8\nrom/objset/mikitm836.farc 5EEE900F\nrom/objset/mikitm837.farc 6A929893\nrom/objset/mikitm838.farc 4EE73D1D\nrom/objset/mikitm839.farc C8ADA16F\nrom/objset/mikitm840.farc 8C476ABC\nrom/objset/mikitm841.farc C57F9C19\nrom/objset/mikitm842.farc 95641DEB\nrom/objset/mikitm851.farc 3AECB942\nrom/objset/mikitm852.farc DE326E4F\nrom/objset/mikitm856.farc D80AA0D5\nrom/objset/mikitm857.farc DF2B675B\nrom/objset/mikitm863.farc 02DCFADB\nrom/objset/mikitm865.farc 4B216772\nrom/objset/mikitm866.farc B5EE20CE\nrom/objset/mikitm868.farc C5D6C3E3\nrom/objset/mikitm869.farc 0D600A54\nrom/objset/mikitm873.farc 665A2873\nrom/objset/mikitm874.farc 29B0037B\nrom/objset/mikitm876.farc 7B7860ED\nrom/objset/mikitm878.farc D905214C\nrom/objset/mikitm879.farc AF5CF234\nrom/objset/mikitm880.farc BD25E12A\nrom/objset/mikitm882.farc 2D5C44EC\nrom/objset/mikitm884.farc 84AE3F8B\nrom/objset/mikitm893.farc 732FB880\nrom/objset/mikitm894.farc 3D68729F\nrom/objset/mikitm895.farc DE59D2B2\nrom/objset/mikitm896.farc 40BF261D\nrom/objset/mikitm897.farc F02579CD\nrom/objset/mikitm899.farc E0AC15A8\nrom/objset/mikitm900.farc D844244E\nrom/objset/mikitm901.farc BBF01633\nrom/objset/mikitm902.farc 79313676\nrom/objset/mikitm904.farc 73ACF530\nrom/objset/mikitm905.farc 59CD1E41\nrom/objset/mikitm910.farc C786A361\nrom/objset/mikitm913.farc 88C84963\nrom/objset/mikitm914.farc DC02F2CC\nrom/objset/mikitm915.farc A72FFA2E\nrom/objset/mikitm916.farc 6D439E9C\nrom/objset/mikitm917.farc 0E00402F\nrom/objset/mikitm924.farc AB92DC71\nrom/objset/mikitm926.farc F0A8FF49\nrom/objset/mikitm927.farc 2DCEBA22\nrom/objset/mikitm928.farc 1399C69A\nrom/objset/mikitm931.farc E788325F\nrom/objset/mikitm932.farc 321ED787\nrom/objset/mikitm933.farc 18CAF8EA\nrom/objset/mikitm934.farc F1958BCA\nrom/objset/mikitm935.farc 065E870F\nrom/objset/mikitm936.farc E1E69ADD\nrom/objset/mikitm937.farc 8E3A3AF2\nrom/objset/mikitm938.farc E5D89E28\nrom/objset/mikitm939.farc B62594EC\nrom/objset/mikitm940.farc 4066820C\nrom/objset/mikitm941.farc D2FA9161\nrom/objset/mikitm942.farc DDD270BB\nrom/objset/mikitm943.farc 32D5A0F2\nrom/objset/mikitm945.farc 493A57ED\nrom/objset/mikitm946.farc 12C99809\nrom/objset/mikitm947.farc 142B0E72\nrom/objset/mikitm948.farc 95580409\nrom/objset/mikitm949.farc 53BA6727\nrom/objset/mikitm951.farc 610977BF\nrom/objset/mikitm956.farc E4917E44\nrom/objset/mikitm958.farc BE5C881B\nrom/objset/mikitm962.farc 3AD277AA\nrom/objset/mikitm963.farc 839AE1FB\nrom/objset/mikitm965.farc 0F77BE8A\nrom/objset/mikitm966.farc 26E126FC\nrom/objset/mikitm967.farc 65499467\nrom/objset/mikitm970.farc AFCECA41\nrom/objset/mikitm973.farc 8007F3CA\nrom/objset/mikitm997.farc 8F55F15C\nrom/objset/mikitm998.farc 0FF31604\nrom/objset/neritm000.farc B2521BF0\nrom/objset/neritm001.farc 98BD582B\nrom/objset/neritm002.farc 099AC413\nrom/objset/neritm003.farc A09AF96C\nrom/objset/neritm004.farc 3B12B64A\nrom/objset/neritm301.farc 99F68089\nrom/objset/neritm302.farc 1BBEE36F\nrom/objset/neritm500.farc 35915FF1\nrom/objset/neritm501.farc 4D7EA659\nrom/objset/obj_db.bin E445FB3A\nrom/objset/rinitm000.farc 1CE0BA13\nrom/objset/rinitm001.farc 8EF3C634\nrom/objset/rinitm002.farc 25CF3A26\nrom/objset/rinitm003.farc CE11B8D4\nrom/objset/rinitm004.farc A545AED9\nrom/objset/rinitm005.farc 1A8289E9\nrom/objset/rinitm006.farc 25770111\nrom/objset/rinitm008.farc 7C10142E\nrom/objset/rinitm009.farc 4498EA1A\nrom/objset/rinitm010.farc E8B9BB8C\nrom/objset/rinitm011.farc C553C65C\nrom/objset/rinitm012.farc 6B635934\nrom/objset/rinitm013.farc CBCC58A8\nrom/objset/rinitm014.farc 1E34D443\nrom/objset/rinitm015.farc 2EC776FB\nrom/objset/rinitm016.farc 9DD6C751\nrom/objset/rinitm017.farc 00B4CC05\nrom/objset/rinitm018.farc 045B3AB0\nrom/objset/rinitm019.farc BD448D91\nrom/objset/rinitm020.farc 9491A5BE\nrom/objset/rinitm021.farc A5AB6C2C\nrom/objset/rinitm022.farc BB933C22\nrom/objset/rinitm023.farc 76CB3914\nrom/objset/rinitm024.farc 4D94208A\nrom/objset/rinitm026.farc A125FD8F\nrom/objset/rinitm027.farc 086E8CDC\nrom/objset/rinitm028.farc B0433515\nrom/objset/rinitm029.farc 25B9792F\nrom/objset/rinitm030.farc 68CDB199\nrom/objset/rinitm031.farc 31CC787B\nrom/objset/rinitm032.farc 6B537AE2\nrom/objset/rinitm033.farc 64D24FBD\nrom/objset/rinitm034.farc 882BDBD1\nrom/objset/rinitm035.farc 53610E4A\nrom/objset/rinitm036.farc FFA195E5\nrom/objset/rinitm037.farc 73CE4AC3\nrom/objset/rinitm038.farc 81586E09\nrom/objset/rinitm039.farc 82DB878B\nrom/objset/rinitm040.farc E360C83B\nrom/objset/rinitm041.farc F2BB0DB4\nrom/objset/rinitm043.farc 3CF6C350\nrom/objset/rinitm045.farc C0868F84\nrom/objset/rinitm046.farc 5F5119DD\nrom/objset/rinitm047.farc 7C846571\nrom/objset/rinitm048.farc 815EDA6D\nrom/objset/rinitm301.farc 55B5F00F\nrom/objset/rinitm304.farc F70E650A\nrom/objset/rinitm309.farc A0A84AD1\nrom/objset/rinitm311.farc 4B6C0436\nrom/objset/rinitm312.farc 79792C3A\nrom/objset/rinitm313.farc 191D2241\nrom/objset/rinitm314.farc 6FF3D9D3\nrom/objset/rinitm315.farc E47D2F58\nrom/objset/rinitm316.farc A3E3E8A4\nrom/objset/rinitm320.farc 781BEAF5\nrom/objset/rinitm326.farc A3EC3C94\nrom/objset/rinitm329.farc B34CEAA8\nrom/objset/rinitm330.farc 27AA7F45\nrom/objset/rinitm333.farc 36142224\nrom/objset/rinitm334.farc C4C11667\nrom/objset/rinitm336.farc 5AF2510C\nrom/objset/rinitm337.farc 9D0993A4\nrom/objset/rinitm339.farc A30B3C83\nrom/objset/rinitm340.farc C9251B61\nrom/objset/rinitm343.farc 3832E2B7\nrom/objset/rinitm346.farc F80A12D3\nrom/objset/rinitm347.farc 98C3313E\nrom/objset/rinitm348.farc 600A61E4\nrom/objset/rinitm500.farc 14438C2C\nrom/objset/rinitm501.farc 3AE32A2B\nrom/objset/rinitm502.farc 56B4E20F\nrom/objset/rinitm503.farc A69F6657\nrom/objset/rinitm504.farc B4D9E880\nrom/objset/rinitm505.farc 9B4AAE98\nrom/objset/rinitm506.farc 67BFFFED\nrom/objset/mikitm558.farc FC3AD288\nrom/objset/mikitm608.farc BBB8CCEB\nrom/objset/mikitm627.farc 2615E3CF\nrom/objset/mikitm646.farc 3269FCC8\nrom/objset/mikitm673.farc 8A6921B4\nrom/objset/mikitm717.farc 25706199\nrom/objset/mikitm744.farc C4C6D7E0\nrom/objset/mikitm780.farc 4AFDD1BD\nrom/objset/mikitm843.farc 7F9422BB\nrom/objset/mikitm892.farc FB733C73\nrom/objset/mikitm919.farc 412067BB\nrom/objset/mikitm944.farc 5CD005A9\nrom/objset/mikitm999.farc 4983B4A8\nrom/objset/rinitm007.farc 1FDB6829\nrom/objset/rinitm025.farc CA540957\nrom/objset/rinitm044.farc 328B5A0E\nrom/objset/rinitm508.farc 3380255A\nrom/objset/rinitm509.farc 6996CDB4\nrom/objset/rinitm510.farc 58706165\nrom/objset/rinitm511.farc 3273E6E7\nrom/objset/rinitm512.farc A5F62E40\nrom/objset/rinitm513.farc D3A5CF60\nrom/objset/rinitm514.farc FAAF3BBE\nrom/objset/rinitm515.farc C38EC5FF\nrom/objset/rinitm516.farc D76A9E9D\nrom/objset/rinitm517.farc F5BD5DCF\nrom/objset/rinitm518.farc 4C02B1F8\nrom/objset/rinitm519.farc E2F0A509\nrom/objset/rinitm520.farc 9166D7B2\nrom/objset/rinitm526.farc C27F4366\nrom/objset/rinitm527.farc 3ACBE2E1\nrom/objset/rinitm528.farc DC9A6A20\nrom/objset/rinitm529.farc C2DE1675\nrom/objset/rinitm531.farc EF24A005\nrom/objset/rinitm532.farc 427C9835\nrom/objset/rinitm533.farc B0F0EBF4\nrom/objset/rinitm534.farc 2BA6EEA2\nrom/objset/rinitm535.farc A0C8D1D2\nrom/objset/rinitm536.farc 44DEC7A3\nrom/objset/rinitm537.farc 3FF5BEC1\nrom/objset/rinitm538.farc FB4407B6\nrom/objset/rinitm539.farc 0180FB00\nrom/objset/rinitm540.farc 344E1613\nrom/objset/rinitm541.farc 11703356\nrom/objset/rinitm543.farc 993D68F7\nrom/objset/rinitm544.farc 4F973C32\nrom/objset/rinitm545.farc DDF6BEDD\nrom/objset/rinitm547.farc E69EF14A\nrom/objset/rinitm548.farc 17412A63\nrom/objset/rinitm550.farc C64AC124\nrom/objset/rinitm701.farc 51433086\nrom/objset/rinitm702.farc 38BCEF81\nrom/objset/rinitm703.farc 48C373D8\nrom/objset/rinitm704.farc 26B92109\nrom/objset/rinitm705.farc 39E445FA\nrom/objset/rinitm706.farc 0EAD22ED\nrom/objset/rinitm707.farc E4233961\nrom/objset/rinitm708.farc 076335B3\nrom/objset/rinitm709.farc 8DEB87D9\nrom/objset/rinitm710.farc D416B464\nrom/objset/rinitm711.farc A4A60504\nrom/objset/rinitm712.farc E66A0BE9\nrom/objset/rinitm713.farc 90B357B3\nrom/objset/rinitm714.farc BD14B675\nrom/objset/rinitm715.farc 8F5D8D0C\nrom/objset/rinitm716.farc 9C1D997F\nrom/objset/rinitm717.farc ABA563EB\nrom/objset/rinitm719.farc D89C5C3D\nrom/objset/rinitm720.farc 6999DC14\nrom/objset/rinitm721.farc 5648C4A6\nrom/objset/rinitm725.farc F0DCA04B\nrom/objset/rinitm726.farc CD0464DC\nrom/objset/rinitm750.farc ACCBC303\nrom/objset/rinitm770.farc C70ED662\nrom/objset/rinitm771.farc DCB94ED0\nrom/objset/rinitm775.farc 9A80B5E7\nrom/objset/rinitm776.farc 224B9E1D\nrom/objset/rinitm777.farc FCE2D252\nrom/objset/rinitm810.farc BF52DF52\nrom/objset/rinitm811.farc 8788B336\nrom/objset/rinitm814.farc 36B881BF\nrom/objset/rinitm815.farc 0CF0A778\nrom/objset/rinitm816.farc CA1A5E50\nrom/objset/rinitm817.farc ABFCE4D8\nrom/objset/rinitm829.farc 4D29D6FA\nrom/objset/rinitm831.farc BF1CC690\nrom/objset/rinitm836.farc F9B9D38B\nrom/objset/rinitm837.farc D9C5A3FA\nrom/objset/rinitm838.farc 4CA16471\nrom/objset/rinitm839.farc 5BD047F8\nrom/objset/rinitm840.farc 908CE3E0\nrom/objset/rinitm843.farc 32ED10C0\nrom/objset/rinitm844.farc 14EC1FF0\nrom/objset/rinitm845.farc 00CC6D8D\nrom/objset/rinitm846.farc C3ACD73A\nrom/objset/rinitm848.farc 2E57C456\nrom/objset/rinitm850.farc B0582774\nrom/objset/rinitm997.farc C8404EE8\nrom/objset/rinitm998.farc EFBEA440\nrom/objset/rinitm999.farc 1878C802\nrom/objset/sakitm000.farc F4408539\nrom/objset/sakitm002.farc A88270E6\nrom/objset/sakitm003.farc AC794199\nrom/objset/sakitm005.farc 76BF43A9\nrom/objset/sakitm301.farc A20D3D0F\nrom/objset/sakitm302.farc 67A42192\nrom/objset/sakitm303.farc 7E6B0AFC\nrom/objset/sakitm305.farc 1BDD5E83\nrom/objset/sakitm500.farc FC7E29DA\nrom/objset/sakitm501.farc B294F6B3\nrom/objset/sakitm700.farc 49E97891\nrom/objset/sakitm701.farc 73A2D211\nrom/objset/sakitm775.farc BAE39E35\nrom/objset/selcmn.farc 6C00B17E\nrom/objset/stgd2ns035.farc 192E7574\nrom/objset/stgd2ns036.farc C2A4EA77\nrom/objset/stgd2ns037.farc B6223EAE\nrom/objset/stgd2ns038.farc 6354DE96\nrom/objset/stgd2ns040.farc B803364A\nrom/objset/stgd2ns041.farc F4391C78\nrom/objset/stgd2ns042.farc D77D64BE\nrom/objset/stgd2ns043.farc FC31239E\nrom/objset/stgd2ns044.farc 8FE28DF7\nrom/objset/stgd2ns045.farc 74826230\nrom/objset/stgd2ns046.farc 7B05D485\nrom/objset/stgd2ns047.farc B7651613\nrom/objset/stgd2ns048.farc 6EC72C6F\nrom/objset/stgd2ns049.farc 7ABB1CA6\nrom/objset/stgd2ns050.farc C6ACF03F\nrom/objset/stgd2ns051.farc 02ECEE08\nrom/objset/stgd2ns052.farc 108EE903\nrom/objset/stgd2ns053.farc 778CB975\nrom/objset/stgd2ns054.farc F802E54A\nrom/objset/stgd2ns055.farc 4C1E9780\nrom/objset/stgd2ns056.farc C0DDBADD\nrom/objset/stgd2ns058.farc 782FEB2E\nrom/objset/stgd2ns059.farc B661D221\nrom/objset/stgd2ns060.farc D19481E8\nrom/objset/stgd2ns061.farc 6507C843\nrom/objset/stgd2ns062.farc 26AB1742\nrom/objset/stgd2ns063.farc 144F61D1\nrom/objset/stgd2ns064.farc A1E07BF3\nrom/objset/stgd2ns065.farc 0CEFC703\nrom/objset/stgd2ns066.farc E93F0FA5\nrom/objset/stgd2ns067.farc F4F36FA4\nrom/objset/stgd2ns068.farc 857A072E\nrom/objset/stgd2ns069.farc 26E6A104\nrom/objset/stgd2ns070.farc 2D1BB5CE\nrom/objset/stgd2ns071.farc AFF194B1\nrom/objset/stgd2ns072.farc 393A6D91\nrom/objset/stgd2ns073.farc 54B39A54\nrom/objset/stgd2ns074.farc CA461E37\nrom/objset/stgd2ns076.farc 1C9278DF\nrom/objset/stgd2ns077.farc 57CDB479\nrom/objset/stgd2ns078.farc 8737EDED\nrom/objset/stgd2ns079.farc 196E017B\nrom/objset/stgd2ns080.farc ED587020\nrom/objset/stgd2ns081.farc F2316A87\nrom/objset/stgd2ns082.farc C55471C9\nrom/objset/stgd2pv037.farc DF6A193B\nrom/objset/stgd2pv037s01.farc 3690E013\nrom/objset/stgd2pv037s02.farc 63E5AEE7\nrom/objset/stgd2pv037s03.farc BC73DAF5\nrom/objset/stgd2pv038.farc 2FFE01D9\nrom/objset/stgd2pv038s01.farc C62AFB2C\nrom/objset/stgd2pv039.farc 162DA7D9\nrom/objset/stgd2pv039s01.farc C176212B\nrom/objset/stgd2pv039s02.farc 37601119\nrom/objset/stgd2pv039s03.farc 5A442439\nrom/objset/stgd2pv040s01.farc E0ED60F2\nrom/objset/stgd2pv041.farc 796290A3\nrom/objset/stgd2pv041s01.farc 4304487D\nrom/objset/stgd2pv042.farc BC8C4561\nrom/objset/stgd2pv042s01.farc 0F562225\nrom/objset/stgd2pv042s02.farc 52E7CABA\nrom/objset/stgd2pv042s03.farc 69385D4A\nrom/objset/stgd2pv042s04.farc 1FA30703\nrom/objset/stgd2pv042s05.farc 316C5756\nrom/objset/stgd2pv042s06.farc 594CDB29\nrom/objset/stgd2pv042s07.farc 6B0944CF\nrom/objset/stgd2pv042s08.farc 9507950A\nrom/objset/stgd2pv042s09.farc 9962FC3F\nrom/objset/stgd2pv042s10.farc D09F1AEE\nrom/objset/stgd2pv043.farc 9C2210D4\nrom/objset/stgd2pv043s01.farc ADC105B6\nrom/objset/stgd2pv044s01.farc 11F30596\nrom/objset/stgd2pv044s02.farc AEF86750\nrom/objset/stgd2pv044s03.farc CD7451AE\nrom/objset/stgd2pv045.farc B1035DCF\nrom/objset/stgd2pv045s01.farc 2DAAE3B7\nrom/objset/stgd2pv046.farc 0252EA42\nrom/objset/stgd2pv046s01.farc 86DFC96D\nrom/objset/stgd2pv046s02.farc F7343FA3\nrom/objset/stgd2pv046s03.farc 801A0C09\nrom/objset/stgd2pv046s04.farc 828F389D\nrom/objset/stgd2pv046s05.farc 12BD8CE7\nrom/objset/stgd2pv046s06.farc C40A36E0\nrom/objset/stgd2pv047.farc 69FF5869\nrom/objset/stgd2pv047s01.farc 578165BD\nrom/objset/stgd2pv047s02.farc 1C47D717\nrom/objset/stgd2pv047s03.farc D2A7E36B\nrom/objset/stgd2pv047s04.farc 7185A48C\nrom/objset/stgd2pv047s06.farc 884267CD\nrom/objset/stgd2pv048.farc DA31FF6F\nrom/objset/stgd2pv048s01.farc D091EED4\nrom/objset/stgd2pv048s02.farc 3C00E521\nrom/objset/stgd2pv048s03.farc 06A14ED5\nrom/objset/stgd2pv050.farc 0E24AAA4\nrom/objset/stgd2pv050s01.farc F4484287\nrom/objset/stgd2pv051.farc AF63F638\nrom/objset/stgd2pv051s01.farc 9860F37E\nrom/objset/stgd2pv051s02.farc 12ACF80D\nrom/objset/stgd2pv051s03.farc C8DB7769\nrom/objset/stgd2pv051s04.farc EC8976FA\nrom/objset/stgd2pv051s05.farc BD7728F8\nrom/objset/stgd2pv052.farc A7C391ED\nrom/objset/stgd2pv052s01.farc 8350FBDA\nrom/objset/stgd2pv053.farc 9D69353D\nrom/objset/stgd2pv053s02.farc 1F1A3812\nrom/objset/stgd2pv053s03.farc C1D27418\nrom/objset/stgd2pv053s04.farc A62E350D\nrom/objset/stgd2pv053s05.farc 5A9327AC\nrom/objset/stgd2pv053s06.farc 42EA6B6B\nrom/objset/stgd2pv053s07.farc 1D8D8B1D\nrom/objset/stgd2pv053s08.farc 3E512365\nrom/objset/stgd2pv053s09.farc AD35FC25\nrom/objset/stgd2pv053s10.farc D340BE87\nrom/objset/stgd2pv053s11.farc E0970649\nrom/objset/stgd2pv053s12.farc 1B5F4413\nrom/objset/stgd2pv053s13.farc A31883FE\nrom/objset/stgd2pv053s14.farc EB0B3B6C\nrom/objset/stgd2pv053s15.farc 4F2A89C8\nrom/objset/stgd2pv055.farc 90900533\nrom/objset/stgd2pv055s01.farc 52DFC25D\nrom/objset/stgd2pv055s02.farc ABD50611\nrom/objset/stgd2pv056s01.farc 5B5BCB0A\nrom/objset/stgd2pv057.farc BC848743\nrom/objset/stgd2pv057s01.farc 21015E53\nrom/objset/stgd2pv058.farc A21EBEE7\nrom/objset/stgd2pv058s01.farc 90ACD9B9\nrom/objset/stgd2pv058s02.farc 2AB4379C\nrom/objset/stgd2pv060.farc 0B47096A\nrom/objset/stgd2pv060s01.farc 4A8E52A6\nrom/objset/stgd2pv061.farc 8ECB5EA9\nrom/objset/stgd2pv061s01.farc 6143E33A\nrom/objset/stgd2pv061s02.farc 76091D7D\nrom/objset/stgd2pv062.farc 8F695143\nrom/objset/stgd2pv062s01.farc 027CFAA0\nrom/objset/stgd2pv063.farc CC98434A\nrom/objset/stgd2pv063s01.farc B7937063\nrom/objset/stgd2pv063s02.farc 12CBC12E\nrom/objset/stgd2pv063s03.farc AC5BBC2B\nrom/objset/stgd2pv063s05.farc 92677306\nrom/objset/stgd2pv063s06.farc 5A365509\nrom/objset/stgd2pv063s07.farc 5204B987\nrom/objset/stgd2pv063s08.farc DE01BFF1\nrom/objset/stgd2pv063s09.farc EDE51263\nrom/objset/stgd2pv063s10.farc E2DB5378\nrom/objset/stgd2pv063s11.farc E9FF96E4\nrom/objset/stgd2pv063s12.farc F7D0763C\nrom/objset/stgd2pv063s13.farc D99CF534\nrom/objset/stgd2pv064.farc CFC4D04A\nrom/objset/stgd2pv064s01.farc 9D3E5508\nrom/objset/stgd2pv064s02.farc 2D4869EB\nrom/objset/stgd2pv065.farc 56054511\nrom/objset/stgd2pv065s01.farc 1929C59F\nrom/objset/stgd2pv065s02.farc 5DCDD44C\nrom/objset/stgd2pv065s03.farc D37F5858\nrom/objset/stgd2pv065s04.farc A8FF53C9\nrom/objset/stgd2pv065s06.farc 5031426F\nrom/objset/stgd2pv065s07.farc E0FF8121\nrom/objset/stgd2pv065s08.farc 63E68070\nrom/objset/stgd2pv066.farc A23CC0CE\nrom/objset/stgd2pv066s01.farc E2B855C0\nrom/objset/stgd2pv208.farc 070EE827\nrom/objset/stgd2pv208s01.farc ECBE7E9C\nrom/objset/stgd2pv212.farc A5CA8F17\nrom/objset/stgd2pv212s01.farc 97072FFD\nrom/objset/stgd2pv213.farc A9332CE5\nrom/objset/stgd2pv213s01.farc 3DFC5286\nrom/objset/stgd2pv214.farc 7DE72A09\nrom/objset/stgd2pv214s01.farc CD36227F\nrom/objset/stgns001.farc 73EFFE7A\nrom/objset/stgns002.farc 29739158\nrom/objset/stgns003.farc DB5C8621\nrom/objset/stgns004.farc 5B06483B\nrom/objset/stgns006.farc D44E3887\nrom/objset/stgns007.farc D8D98DC4\nrom/objset/stgns008.farc 5D382574\nrom/objset/stgns009.farc D13F40A9\nrom/objset/stgns010.farc 58B6A548\nrom/objset/stgns011.farc 2928F893\nrom/objset/stgns012.farc 9F972D06\nrom/objset/stgns013.farc 3EA04FA7\nrom/objset/stgns014.farc D337F3E3\nrom/objset/stgns015.farc B4DFDB6A\nrom/objset/stgns016.farc 4C31DD9B\nrom/objset/stgns017.farc 0EF68401\nrom/objset/stgns018.farc EB32FCE2\nrom/objset/stgns019.farc A346BFA1\nrom/objset/stgns020.farc E47F3C35\nrom/objset/stgns021.farc 0D063125\nrom/objset/stgns022.farc 7D6D7392\nrom/objset/rinitm507.farc CE40F900\nrom/objset/rinitm530.farc 01459399\nrom/objset/rinitm700.farc 5ED9D417\nrom/objset/rinitm718.farc 095354BF\nrom/objset/rinitm826.farc 49AB3C2C\nrom/objset/sakitm001.farc F082F642\nrom/objset/stgd2ns039.farc 943DF5B0\nrom/objset/stgd2ns057.farc F1A347A9\nrom/objset/stgd2ns075.farc F4D2EBF0\nrom/objset/stgd2pv040.farc 15FCCDD6\nrom/objset/stgd2pv044.farc 8E9A8894\nrom/objset/stgd2pv047s05.farc 880A2F90\nrom/objset/stgd2pv053s01.farc FDD48050\nrom/objset/stgd2pv056.farc FC144AFF\nrom/objset/stgd2pv063s04.farc 66011330\nrom/objset/stgd2pv065s05.farc 510CED24\nrom/objset/stgns024.farc A684597E\nrom/objset/stgns025.farc 8C482FA9\nrom/objset/stgns026.farc A12F59ED\nrom/objset/stgns027.farc C5E801A6\nrom/objset/stgns028.farc 9ACADB79\nrom/objset/stgns029.farc 7A24AAE9\nrom/objset/stgns030.farc BF8B7CB9\nrom/objset/stgns031.farc F4069CF6\nrom/objset/stgns032.farc 1AE2EFBB\nrom/objset/stgns033.farc 07862A2E\nrom/objset/stgns034.farc BB12D554\nrom/objset/stgns083.farc FDDF12F9\nrom/objset/stgns084.farc 271BD899\nrom/objset/stgns085.farc C0EE1418\nrom/objset/stgns086.farc 9347AF5E\nrom/objset/stgns087.farc 895B9479\nrom/objset/stgns088.farc 8C5D579F\nrom/objset/stgns090.farc 883A442F\nrom/objset/stgns091.farc 7DC1A43F\nrom/objset/stgns092.farc B02C7186\nrom/objset/stgns093.farc 14746DF1\nrom/objset/stgns094.farc EAB3A7BB\nrom/objset/stgns095.farc 576EE392\nrom/objset/stgns096.farc 976A7766\nrom/objset/stgns097.farc C42CC276\nrom/objset/stgns098.farc 31CBA5C9\nrom/objset/stgns099.farc 8ACB21EA\nrom/objset/stgns100.farc F2FCBE3A\nrom/objset/stgns101.farc C450796E\nrom/objset/stgns102.farc 600E45A6\nrom/objset/stgns103.farc 13CF066A\nrom/objset/stgns104.farc 7E991874\nrom/objset/stgns105.farc DF4870C5\nrom/objset/stgns106.farc 66AB1F98\nrom/objset/stgns108.farc 9A27F58D\nrom/objset/stgns109.farc 91CF3488\nrom/objset/stgns110.farc 3CB15441\nrom/objset/stgns111.farc ECE121F6\nrom/objset/stgns112.farc D6790738\nrom/objset/stgns113.farc DF5CAB3B\nrom/objset/stgns114.farc E2209BF9\nrom/objset/stgns115.farc 4322C430\nrom/objset/stgns116.farc 8E8231BD\nrom/objset/stgns117.farc E272C107\nrom/objset/stgns118.farc 9A7CF904\nrom/objset/stgns119.farc DF7CB28B\nrom/objset/stgns120.farc 07912045\nrom/objset/stgns121.farc 2E12A7C2\nrom/objset/stgns122.farc 26310387\nrom/objset/stgns123.farc DEFABFA5\nrom/objset/stgns124.farc 8E3CFA46\nrom/objset/stgns126.farc 7986F9FF\nrom/objset/stgns210.farc D0EE4193\nrom/objset/stgns221.farc DEDFAB1E\nrom/objset/stgns223.farc 343CF37B\nrom/objset/stgns249.farc 4838F241\nrom/objset/stgns257.farc 8302D3CE\nrom/objset/stgns263.farc 6844F88A\nrom/objset/stgns266.farc C08898D5\nrom/objset/stgns267.farc DFD31347\nrom/objset/stgns272.farc 62B18556\nrom/objset/stgns292.farc AF2B51C6\nrom/objset/stgpv001.farc EBF2C5B7\nrom/objset/stgpv001s01.farc 0FE4EB4F\nrom/objset/stgpv001s02.farc FD3469FC\nrom/objset/stgpv001s03.farc 9722374D\nrom/objset/stgpv001s04.farc C3F75754\nrom/objset/stgpv001s05.farc CB19F4AF\nrom/objset/stgpv001s07.farc F5A70622\nrom/objset/stgpv003.farc DDDF3CEB\nrom/objset/stgpv003s01.farc EDD9B3C6\nrom/objset/stgpv003s02.farc F69C199C\nrom/objset/stgpv003s03.farc 1FA74B5A\nrom/objset/stgpv003s04.farc 58F7DB04\nrom/objset/stgpv003s05.farc 6FF6E7DC\nrom/objset/stgpv003s06.farc A2F3C633\nrom/objset/stgpv003s07.farc 01B9C494\nrom/objset/stgpv003s08.farc BCB5AC25\nrom/objset/stgpv003s09.farc 6D0C1711\nrom/objset/stgpv004.farc 1DA326F9\nrom/objset/stgpv004s01.farc 48F57E1D\nrom/objset/stgpv004s02.farc CB29B914\nrom/objset/stgpv004s03.farc D40D2772\nrom/objset/stgpv004s04.farc 4B79D864\nrom/objset/stgpv004s06.farc F69D15D8\nrom/objset/stgpv004s07.farc 4DCDB6D9\nrom/objset/stgpv005.farc AE6D1261\nrom/objset/stgpv005s01.farc 45CC64F2\nrom/objset/stgpv005s02.farc 0E965C02\nrom/objset/stgpv005s03.farc 3852E18C\nrom/objset/stgpv005s04.farc 023C5B2A\nrom/objset/stgpv005s05.farc 41B3D0C2\nrom/objset/stgpv005s06.farc 245501C1\nrom/objset/stgpv006.farc 92CF117C\nrom/objset/stgpv006s01.farc 876341E5\nrom/objset/stgpv006s02.farc 45946A4C\nrom/objset/stgpv007.farc 967AA88E\nrom/objset/stgpv007s01.farc 2581CABD\nrom/objset/stgpv007s02.farc 78A5E978\nrom/objset/stgpv007s03.farc 3F908B3F\nrom/objset/stgpv007s05.farc E75A9D06\nrom/objset/stgpv007s06.farc 430A1778\nrom/objset/stgpv007s07.farc 8DFB74C8\nrom/objset/stgpv007s08.farc C1AD54C9\nrom/objset/stgpv007s09.farc 4C37785B\nrom/objset/stgpv007s10.farc E684E3BF\nrom/objset/stgpv007s11.farc 6A66CE42\nrom/objset/stgpv007s12.farc 8DB69FE0\nrom/objset/stgpv008.farc A1A26D7C\nrom/objset/stgpv008s01.farc 6C4EFB5B\nrom/objset/stgpv008s02.farc 61E5E8D0\nrom/objset/stgpv008s03.farc 83ABB89E\nrom/objset/stgpv008s04.farc A3F92CC5\nrom/objset/stgpv008s05.farc 1402146F\nrom/objset/stgpv008s06.farc 4035E52A\nrom/objset/stgpv008s07.farc 9A3DE83D\nrom/objset/stgpv008s09.farc 46A7F163\nrom/objset/stgpv008s10.farc C9A532C7\nrom/objset/stgpv009.farc 9EBC77A1\nrom/objset/stgpv009s01.farc 49415531\nrom/objset/stgpv009s02.farc F2685E17\nrom/objset/stgpv009s03.farc 12FAC66C\nrom/objset/stgpv009s04.farc 316817F0\nrom/objset/stgpv009s05.farc 8CD2C417\nrom/objset/stgpv009s06.farc CA224973\nrom/objset/stgpv009s07.farc CDE0594D\nrom/objset/stgpv009s08.farc 0A3DB351\nrom/objset/stgpv009s09.farc E90A7F95\nrom/objset/stgpv009s10.farc 0EC1D0A8\nrom/objset/stgpv011.farc 29494693\nrom/objset/stgpv011s01.farc 3A6BD311\nrom/objset/stgpv011s02.farc A8012ECA\nrom/objset/stgpv011s04.farc B4AC6EF1\nrom/objset/stgpv011s05.farc C443174C\nrom/objset/stgpv011s06.farc 1FC609F7\nrom/objset/stgpv012.farc A0418F37\nrom/objset/stgpv012s01.farc B2CB13CD\nrom/objset/stgpv013.farc 13282652\nrom/objset/stgpv013s01.farc A5F5C46F\nrom/objset/stgpv013s02.farc 7D261DEA\nrom/objset/stgpv013s03.farc 9E9346DA\nrom/objset/stgpv013s04.farc 4957BD7C\nrom/objset/stgpv014.farc B85CF8A1\nrom/objset/stgpv014s01.farc 6AADEFC3\nrom/objset/stgpv015.farc D7A88233\nrom/objset/stgpv015s01.farc 9D70F347\nrom/objset/stgpv015s02.farc 74BA51BF\nrom/objset/stgpv015s03.farc E94673B3\nrom/objset/stgpv015s05.farc DDA6FF50\nrom/objset/stgpv015s06.farc 23BC306A\nrom/objset/stgpv018.farc 7086F28E\nrom/objset/stgpv018s01.farc 5F4784EF\nrom/objset/stgpv018s02.farc 39F59A99\nrom/objset/stgpv018s03.farc A7611176\nrom/objset/stgpv018s04.farc FD195A55\nrom/objset/stgpv018s05.farc 0FF20572\nrom/objset/stgpv018s06.farc 882BF896\nrom/objset/stgpv018s07.farc 33A31B09\nrom/objset/stgpv018s08.farc 8D431390\nrom/objset/stgpv018s09.farc 99142B14\nrom/objset/stgpv019.farc AD680973\nrom/objset/stgpv019s01.farc E9AE7B5F\nrom/objset/stgpv019s02.farc 35A75F25\nrom/objset/stgpv019s03.farc E549256B\nrom/objset/stgpv019s05.farc DD68DDA5\nrom/objset/stgpv019s06.farc F2EDDA03\nrom/objset/stgpv019s07.farc 3CFBB806\nrom/objset/stgpv019s08.farc 2122B2EE\nrom/objset/stgpv019s09.farc 4DF1EBEC\nrom/objset/stgpv019s10.farc A61D0E4F\nrom/objset/stgpv019s11.farc 3B51BF46\nrom/objset/stgpv019s12.farc 50574425\nrom/objset/stgpv019s13.farc AA0B25EA\nrom/objset/stgpv019s14.farc DE4FD4C5\nrom/objset/stgpv020.farc 029320AA\nrom/objset/stgpv020s01.farc 569AFC50\nrom/objset/stgpv020s02.farc 55363F06\nrom/objset/stgpv020s03.farc 5B80EB80\nrom/objset/stgpv022.farc D981A69E\nrom/objset/stgpv022s01.farc F86203A8\nrom/objset/stgpv024s01.farc 14AF99EE\nrom/objset/stgpv024s02.farc D8287422\nrom/objset/stgpv024s03.farc 217B373E\nrom/objset/stgpv024s04.farc A2984D8D\nrom/objset/stgpv024s05.farc 86EE91DA\nrom/objset/stgpv024s06.farc 0632E285\nrom/objset/stgpv024s07.farc E343899E\nrom/objset/stgpv024s08.farc 62DB9D2B\nrom/objset/stgpv024s09.farc AE7EF34E\nrom/objset/stgpv024s10.farc 413976E7\nrom/objset/stgpv024s11.farc 09F00655\nrom/objset/stgpv024s12.farc F0A4E1F5\nrom/objset/stgpv024s13.farc 4FD6707E\nrom/objset/stgpv024s14.farc E1516EE9\nrom/objset/stgpv025.farc AD4EA59D\nrom/objset/stgpv025s01.farc 96FE5889\nrom/objset/stgpv025s03.farc B29C886A\nrom/objset/stgpv025s04.farc 9289D8C9\nrom/objset/stgpv025s05.farc DEE9930C\nrom/objset/stgpv025s06.farc FA8BD2E6\nrom/objset/stgpv025s07.farc A497ABC3\nrom/objset/stgpv025s08.farc 4990AE3D\nrom/objset/stgpv025s09.farc BBF2320D\nrom/objset/stgpv025s10.farc 6C550C6A\nrom/objset/stgpv025s11.farc 7FA3A3CE\nrom/objset/stgpv025s12.farc C08C1E3D\nrom/objset/stgpv025s13.farc 6CA49377\nrom/objset/stgpv025s14.farc C0DFE306\nrom/objset/stgpv025s15.farc 0F7856C1\nrom/objset/stgpv025s16.farc 7E78E16D\nrom/objset/stgpv025s17.farc 151ABB5A\nrom/objset/stgpv025s18.farc A9F9DEED\nrom/objset/stgpv025s20.farc 2A0100D8\nrom/objset/stgpv025s21.farc E777345C\nrom/objset/stgpv025s22.farc A462C04A\nrom/objset/stgpv025s23.farc BA7FC070\nrom/objset/stgpv025s24.farc F8B57620\nrom/objset/stgpv025s25.farc ACC34D9C\nrom/objset/stgpv025s26.farc 97968573\nrom/objset/stgpv025s27.farc 4A9151D6\nrom/objset/stgpv028.farc 6FB06A5E\nrom/objset/stgpv028s01.farc 2C9CF20D\nrom/objset/stgpv067.farc DDA50BB4\nrom/objset/stgpv067s01.farc B71B0643\nrom/objset/stgpv079.farc 8DA2EB92\nrom/objset/stgpv079s01.farc 15C7E440\nrom/objset/stgpv081.farc E28A4535\nrom/objset/stgpv081s01.farc 78B7F9A1\nrom/objset/stgpv081s03.farc 188C3CB7\nrom/objset/stgpv081s04.farc 9E89978B\nrom/objset/stgpv081s05.farc 8C420931\nrom/objset/stgpv081s06.farc 16BD8E96\nrom/objset/stgpv081s07.farc 09B48724\nrom/objset/stgpv081s08.farc 3183CEBE\nrom/objset/stgpv081s09.farc 17A2A95D\nrom/objset/stgpv081s10.farc DEB2B466\nrom/objset/stgpv081s11.farc A7F15B15\nrom/objset/stgpv081s12.farc 4B50C00E\nrom/objset/stgpv082.farc 5FC14B81\nrom/objset/stgpv082s01.farc 67C75C62\nrom/objset/stgpv082s02.farc 2129E0FD\nrom/objset/stgpv082s03.farc 140F7A7A\nrom/objset/stgpv082s04.farc 266C4B6F\nrom/objset/stgpv082s05.farc 8780E911\nrom/objset/stgpv082s07.farc E9D550CE\nrom/objset/stgpv082s10.farc A3FC1F77\nrom/objset/stgpv082s11.farc B56FBB94\nrom/objset/stgpv082s12.farc FE047BA3\nrom/objset/stgpv082s21.farc 60A7E352\nrom/objset/stgpv082s22.farc 96795893\nrom/objset/stgpv082s23.farc 2F63AF5D\nrom/objset/stgpv082s24.farc D626C28F\nrom/objset/stgpv082s27.farc 48391A00\nrom/objset/stgpv082s28.farc 3C35FCF5\nrom/objset/stgpv082s29.farc 4CF1F94A\nrom/objset/stgpv082s41.farc 57AAED20\nrom/objset/stgpv082s42.farc D03781D5\nrom/objset/stgpv082s51.farc 0D5A1236\nrom/objset/stgpv082s52.farc 5298C00F\nrom/objset/stgpv082s53.farc B2A5E65D\nrom/objset/stgns023.farc 4FCAD8FF\nrom/objset/stgns089.farc A8E44D91\nrom/objset/stgns107.farc F21BD4FF\nrom/objset/stgns125.farc D04B0FAA\nrom/objset/stgpv001s06.farc D55815E2\nrom/objset/stgpv004s05.farc 3B6EE581\nrom/objset/stgpv007s04.farc 38BA2388\nrom/objset/stgpv008s08.farc 31481898\nrom/objset/stgpv011s03.farc 2B17D991\nrom/objset/stgpv015s04.farc 7B54AEB2\nrom/objset/stgpv019s04.farc C5F5B04D\nrom/objset/stgpv024.farc CE896299\nrom/objset/stgpv025s02.farc B718F0DA\nrom/objset/stgpv025s19.farc AF500F13\nrom/objset/stgpv081s02.farc 0D09B08C\nrom/objset/stgpv082s55.farc 9EB1DD14\nrom/objset/stgpv082s61.farc 87F1450C\nrom/objset/stgpv083.farc A3549EA4\nrom/objset/stgpv083s01.farc F34755D4\nrom/objset/stgpv083s02.farc 0D146F33\nrom/objset/stgpv083s03.farc 766E7855\nrom/objset/stgpv083s04.farc 94E75C03\nrom/objset/stgpv083s05.farc ACE36A9A\nrom/objset/stgpv083s06.farc 45481EFE\nrom/objset/stgpv083s07.farc 4F7ECEEC\nrom/objset/stgpv083s08.farc 596906BF\nrom/objset/stgpv083s09.farc C3C03641\nrom/objset/stgpv083s10.farc 55F2CA0E\nrom/objset/stgpv083s11.farc E5A6AFA2\nrom/objset/stgpv083s12.farc 8C53B2BD\nrom/objset/stgpv083s13.farc 169216A0\nrom/objset/stgpv083s15.farc 282CF4CE\nrom/objset/stgpv083s16.farc 4EB6C353\nrom/objset/stgpv083s17.farc 8B088318\nrom/objset/stgpv083s18.farc 6BB35252\nrom/objset/stgpv083s19.farc 046A6A43\nrom/objset/stgpv083s20.farc B2472113\nrom/objset/stgpv083s21.farc 987DD224\nrom/objset/stgpv083s22.farc 44E590D8\nrom/objset/stgpv083s23.farc A5AD552A\nrom/objset/stgpv083s24.farc 34D4BC71\nrom/objset/stgpv083s25.farc D65C215E\nrom/objset/stgpv083s26.farc 5C166AB8\nrom/objset/stgpv083s27.farc CD691D7E\nrom/objset/stgpv083s28.farc CDF17BB1\nrom/objset/stgpv084.farc A391A09C\nrom/objset/stgpv084s01.farc BDD27F44\nrom/objset/stgpv085s01.farc 8E34F4AB\nrom/objset/stgpv086.farc F0BB0EB6\nrom/objset/stgpv086s01.farc 930A0EAD\nrom/objset/stgpv086s02.farc F70B177C\nrom/objset/stgpv087.farc DC76C888\nrom/objset/stgpv087s01.farc 0BD3BF01\nrom/objset/stgpv087s02.farc 9B4167CE\nrom/objset/stgpv087s03.farc 3871740F\nrom/objset/stgpv087s04.farc C44F85DE\nrom/objset/stgpv087s05.farc 2B91F1A8\nrom/objset/stgpv087s06.farc 21BBF314\nrom/objset/stgpv087s07.farc E67AA90D\nrom/objset/stgpv087s08.farc 89EAC56A\nrom/objset/stgpv087s09.farc 1A704605\nrom/objset/stgpv087s10.farc A1D7FAAA\nrom/objset/stgpv087s11.farc 5DDDAA01\nrom/objset/stgpv087s13.farc 627D5297\nrom/objset/stgpv087s14.farc 27DB066E\nrom/objset/stgpv087s15.farc 0A1A3EE8\nrom/objset/stgpv087s16.farc B2BD27DF\nrom/objset/stgpv087s17.farc 79D2D0CC\nrom/objset/stgpv088.farc AE611093\nrom/objset/stgpv088s01.farc 38D58245\nrom/objset/stgpv088s02.farc 250276F4\nrom/objset/stgpv088s03.farc 5B763B19\nrom/objset/stgpv088s04.farc 7C8A5158\nrom/objset/stgpv088s05.farc 32AC5615\nrom/objset/stgpv088s06.farc F12691A4\nrom/objset/stgpv088s07.farc D4FC411C\nrom/objset/stgpv088s08.farc 2EE09285\nrom/objset/stgpv088s09.farc 15267007\nrom/objset/stgpv088s10.farc 0DE3D3EE\nrom/objset/stgpv088s12.farc 14E9F0EA\nrom/objset/stgpv088s13.farc 37C20FA9\nrom/objset/stgpv088s14.farc 1994BBBB\nrom/objset/stgpv089.farc ECE8FD21\nrom/objset/stgpv089s01.farc 9E26DD4C\nrom/objset/stgpv089s02.farc C98E4169\nrom/objset/stgpv089s03.farc DC483DC0\nrom/objset/stgpv089s04.farc 0303C129\nrom/objset/stgpv089s05.farc 19E0D04D\nrom/objset/stgpv090.farc 4C60DACA\nrom/objset/stgpv090s01.farc C86D177B\nrom/objset/stgpv090s02.farc 6D597282\nrom/objset/stgpv091.farc 018EE225\nrom/objset/stgpv091s01.farc 4E5361CB\nrom/objset/stgpv091s02.farc D5D4EFDE\nrom/objset/stgpv091s03.farc FAB590C0\nrom/objset/stgpv091s05.farc 2C7FFD4E\nrom/objset/stgpv091s06.farc A0966630\nrom/objset/stgpv091s07.farc 22E3F0B4\nrom/objset/stgpv091s08.farc AF4F59AD\nrom/objset/stgpv091s09.farc 9AD1FEF7\nrom/objset/stgpv091s10.farc C7DE3F3F\nrom/objset/stgpv091s11.farc 329EAA7A\nrom/objset/stgpv091s12.farc EDDC038E\nrom/objset/stgpv091s13.farc 9D5074FC\nrom/objset/stgpv091s14.farc FE6E698D\nrom/objset/stgpv092.farc 9FA47105\nrom/objset/stgpv092s01.farc 7CCB0256\nrom/objset/stgpv092s02.farc 5D3C2353\nrom/objset/stgpv092s03.farc 3F7E1DAA\nrom/objset/stgpv092s04.farc 36BA4951\nrom/objset/stgpv092s05.farc 4791FF19\nrom/objset/stgpv092s07.farc 2A430550\nrom/objset/stgpv092s08.farc 5DE4A184\nrom/objset/stgpv092s09.farc A8344A11\nrom/objset/stgpv092s10.farc 36DBD025\nrom/objset/stgpv092s11.farc 4B8391D9\nrom/objset/stgpv092s12.farc 5737C3E6\nrom/objset/stgpv093.farc 7E691E78\nrom/objset/stgpv093s01.farc D78E9A20\nrom/objset/stgpv094.farc 11C27E49\nrom/objset/stgpv094s01.farc 8CA15851\nrom/objset/stgpv094s02.farc BBAC66BE\nrom/objset/stgpv094s03.farc 6BA6F110\nrom/objset/stgpv094s04.farc 0200A32B\nrom/objset/stgpv094s05.farc 8DE7E8C7\nrom/objset/stgpv094s06.farc 6E540B78\nrom/objset/stgpv094s07.farc 70DF9799\nrom/objset/stgpv094s09.farc 47BD74DE\nrom/objset/stgpv094s10.farc 3AE3BCF0\nrom/objset/stgpv094s11.farc 091D30BC\nrom/objset/stgpv094s12.farc 30F3B729\nrom/objset/stgpv094s13.farc DAAD9701\nrom/objset/stgpv094s14.farc 13B586D9\nrom/objset/stgpv094s15.farc C709B99D\nrom/objset/stgpv094s16.farc DF975A46\nrom/objset/stgpv094s17.farc CE74F9DE\nrom/objset/stgpv094s18.farc BCEBFFDA\nrom/objset/stgpv094s19.farc 735103DA\nrom/objset/stgpv094s20.farc 5AEE0018\nrom/objset/stgpv095.farc 96082727\nrom/objset/stgpv095s02.farc A7C97F96\nrom/objset/stgpv096.farc AF432F1D\nrom/objset/stgpv096s01.farc 61C95D3B\nrom/objset/stgpv096s03.farc 4C9E8AAF\nrom/objset/stgpv096s04.farc 38298F35\nrom/objset/stgpv096s05.farc 528434A1\nrom/objset/stgpv096s06.farc 61AA32A0\nrom/objset/stgpv096s07.farc EF302965\nrom/objset/stgpv096s08.farc 3A71860A\nrom/objset/stgpv096s09.farc 281DFB5A\nrom/objset/stgpv097.farc 2D493896\nrom/objset/stgpv097s01.farc B376F787\nrom/objset/stgpv103.farc A20BF7B5\nrom/objset/stgpv103s01.farc 7DD23A95\nrom/objset/stgpv103s02.farc 43A3873B\nrom/objset/stgpv103s03.farc 1F408085\nrom/objset/stgpv104.farc B83F1A3D\nrom/objset/stgpv104s01.farc 841CA9E5\nrom/objset/stgpv104s02.farc 0510390B\nrom/objset/stgpv104s04.farc BDAA27D7\nrom/objset/stgpv218.farc B0F7E81F\nrom/objset/stgpv218s01.farc 9A245EBA\nrom/objset/stgpv218s02.farc 6ED03836\nrom/objset/stgpv218s03.farc 8A4B3A1A\nrom/objset/stgpv218s04.farc 3D8AA481\nrom/objset/stgpv219.farc 614AD732\nrom/objset/stgpv219s01.farc 9B633EDD\nrom/objset/stgpv219s02.farc 5FD797AE\nrom/objset/stgpv219s03.farc 92D19D10\nrom/objset/stgpv219s04.farc 6C931898\nrom/objset/stgpv219s05.farc CCA7D2C2\nrom/objset/stgpv219s07.farc 8F20B8D7\nrom/objset/stgpv219s08.farc D92F59F8\nrom/objset/stgpv219s09.farc 47593985\nrom/objset/stgpv219s10.farc 5B7FD750\nrom/objset/stgpv219s12.farc B25B7A2C\nrom/objset/stgpv219s13.farc EB5847A0\nrom/objset/stgpv219s14.farc 642E6E4F\nrom/objset/stgpv220.farc B2E20500\nrom/objset/stgpv220s01.farc 9441A959\nrom/objset/stgpv220s02.farc D728D4F3\nrom/objset/stgpv220s03.farc 3BFC02C4\nrom/objset/stgpv221.farc 0FD00FF7\nrom/objset/stgpv221s01.farc 61BF8CF9\nrom/objset/stgpv221s02.farc F8D4BE6E\nrom/objset/stgpv221s03.farc 752C6DF4\nrom/objset/stgpv221s04.farc 86B9DD2B\nrom/objset/stgpv221s05.farc 7463C9C8\nrom/objset/stgpv221s06.farc C716DF30\nrom/objset/stgpv221s07.farc 8EFCBB6D\nrom/objset/stgpv221s08.farc A0A776F8\nrom/objset/stgpv221s10.farc 72F624A0\nrom/objset/stgpv221s11.farc 82E8BD82\nrom/objset/stgpv221s12.farc BFB9C189\nrom/objset/stgpv221s14.farc F1ED4365\nrom/objset/stgpv222.farc 690DF608\nrom/objset/stgpv222s01.farc CFFF240F\nrom/objset/stgpv222s02.farc CED33175\nrom/objset/stgpv223.farc 2EB588E4\nrom/objset/stgpv223s01.farc 403AA958\nrom/objset/stgpv223s02.farc 0FF4A78F\nrom/objset/stgpv223s03.farc A9AEDD81\nrom/objset/stgpv223s04.farc FA4DB857\nrom/objset/stgpv223s05.farc 79A436EF\nrom/objset/stgpv223s06.farc E09FD6D4\nrom/objset/stgpv223s07.farc 3BD180D9\nrom/objset/stgpv223s08.farc 2AC4712A\nrom/objset/stgpv223s10.farc 48FAD9DB\nrom/objset/stgpv224.farc 96AF6C49\nrom/objset/stgpv224s01.farc 412E0D56\nrom/objset/stgpv224s02.farc 17BC0525\nrom/objset/stgpv224s03.farc 6D000A42\nrom/objset/stgpv224s04.farc 3899F51B\nrom/objset/stgpv225.farc 422B9651\nrom/objset/stgpv225s01.farc 84D391BA\nrom/objset/stgpv225s02.farc 9CB01FB7\nrom/objset/stgpv225s03.farc 520DACEE\nrom/objset/stgpv226.farc E1F0E028\nrom/objset/stgpv226s01.farc A033F805\nrom/objset/stgpv227.farc 5C270E53\nrom/objset/stgpv227s01.farc E4D52DFD\nrom/objset/stgpv228.farc 82F681F9\nrom/objset/stgpv228s01.farc 0CCE35A9\nrom/objset/stgpv228s02.farc 50576918\nrom/objset/stgpv228s04.farc 64669F50\nrom/objset/stgpv231.farc BF0FEF19\nrom/objset/stgpv231s01.farc DC726698\nrom/objset/stgpv231s02.farc 82712A68\nrom/objset/stgpv231s03.farc 078CDF4B\nrom/objset/stgpv231s04.farc 0A9CD94E\nrom/objset/stgpv231s05.farc 24FC27BD\nrom/objset/stgpv231s06.farc 2790BE61\nrom/objset/stgpv231s07.farc 05D197DB\nrom/objset/stgpv232.farc B883855C\nrom/objset/stgpv232s01.farc 24BE73EE\nrom/objset/stgpv232s02.farc F77CBAD2\nrom/objset/stgpv232s03.farc 90784CBE\nrom/objset/stgpv233.farc 26CC4838\nrom/objset/stgpv233s01.farc 4C1837A8\nrom/objset/stgpv233s02.farc 7161A703\nrom/objset/stgpv233s04.farc 5D8B1D97\nrom/objset/stgpv233s05.farc 41F2DF2D\nrom/objset/stgpv233s06.farc 789C3CCA\nrom/objset/stgpv233s07.farc 94C0B432\nrom/objset/stgpv233s08.farc B904DD8F\nrom/objset/stgpv234.farc 80B190F6\nrom/objset/stgpv234s01.farc B26DA687\nrom/objset/stgpv234s02.farc 347FB783\nrom/objset/stgpv235.farc 6ECD940E\nrom/objset/stgpv235s01.farc 048928EF\nrom/objset/stgpv235s02.farc 6591F112\nrom/objset/stgpv235s06.farc B4411CAD\nrom/objset/stgpv235s07.farc 3D0485BE\nrom/objset/stgpv235s08.farc 3B735CE9\nrom/objset/stgpv236.farc 15EF72FB\nrom/objset/stgpv236s01.farc 75794A55\nrom/objset/stgpv236s03.farc E2C33611\nrom/objset/stgpv236s04.farc 68FE7FE8\nrom/objset/stgpv236s05.farc C5637520\nrom/objset/stgpv236s06.farc 721490C0\nrom/objset/stgpv236s07.farc 5F3740ED\nrom/objset/stgpv238.farc ACCBC1F3\nrom/objset/stgpv238s01.farc D5FB5B46\nrom/objset/stgpv239.farc 04B609CC\nrom/objset/stgpv239s01.farc D11A433F\nrom/objset/stgpv240.farc 4712F822\nrom/objset/stgpv240s01.farc CED51C46\nrom/objset/stgpv240s02.farc A006678B\nrom/objset/stgpv240s03.farc 52378BDD\nrom/objset/stgpv241.farc 9EC40C93\nrom/objset/stgpv241s01.farc 36DCEE0E\nrom/objset/stgpv241s02.farc 626DF33A\nrom/objset/stgpv241s03.farc DC2762D7\nrom/objset/stgpv082s54.farc C21EE95E\nrom/objset/stgpv083s14.farc 3074AE33\nrom/objset/stgpv085.farc 3B72BA85\nrom/objset/stgpv087s12.farc B71CC499\nrom/objset/stgpv088s11.farc 37518A10\nrom/objset/stgpv091s04.farc F85FB3AE\nrom/objset/stgpv092s06.farc 8CC7DE3E\nrom/objset/stgpv094s08.farc 7C6F9349\nrom/objset/stgpv096s02.farc E4895988\nrom/objset/stgpv104s03.farc 805F3C9D\nrom/objset/stgpv219s11.farc 9C77E7BC\nrom/objset/stgpv221s09.farc 47FCBBB4\nrom/objset/stgpv223s09.farc 019453BC\nrom/objset/stgpv228s03.farc 24B82FD0\nrom/objset/stgpv233s03.farc 9D2A3C3D\nrom/objset/stgpv242.farc 817FCBE0\nrom/objset/stgpv242s01.farc 8C59CE72\nrom/objset/stgpv243.farc 0C291F38\nrom/objset/stgpv243hrc.farc 950A0962\nrom/objset/stgpv243s01.farc 99BCABFB\nrom/objset/stgpv243s02.farc 351FED71\nrom/objset/stgpv243s04.farc E26BE3AE\nrom/objset/stgpv243s05.farc E201FACF\nrom/objset/stgpv243s08.farc 6C941C49\nrom/objset/stgpv244.farc 7470CB2A\nrom/objset/stgpv244s01.farc 174CD654\nrom/objset/stgpv244s02.farc B8EECF39\nrom/objset/stgpv246.farc C4FC0338\nrom/objset/stgpv246s01.farc 7C642F5C\nrom/objset/stgpv247.farc FDA02199\nrom/objset/stgpv247s01.farc 8500E68D\nrom/objset/stgpv248.farc D9F4F099\nrom/objset/stgpv248s02.farc 37C0677E\nrom/objset/stgpv248s03.farc F16DD404\nrom/objset/stgpv248s04.farc E24A692C\nrom/objset/stgpv248s05.farc F7D3A09A\nrom/objset/stgpv249.farc 57767856\nrom/objset/stgpv249s01.farc 93051CE5\nrom/objset/stgpv250.farc 98CC1938\nrom/objset/stgpv250s01.farc FA289B43\nrom/objset/stgpv251.farc 3599E849\nrom/objset/stgpv251s01.farc 17813E66\nrom/objset/stgpv251s02.farc CAAFF8BD\nrom/objset/stgpv251s03.farc 9B96CDDE\nrom/objset/stgpv251s04.farc D1ED45D7\nrom/objset/stgpv251s05.farc 3D1EF987\nrom/objset/stgpv251s06.farc 808A3DD5\nrom/objset/stgpv251s07.farc 07788E2A\nrom/objset/stgpv253.farc 0AB566E9\nrom/objset/stgpv253hrc.farc 8AF3BB25\nrom/objset/stgpv253s01.farc DD628ABD\nrom/objset/stgpv253s02.farc DF0309DE\nrom/objset/stgpv253s03.farc CF86EE7A\nrom/objset/stgpv253s04.farc 844D4F54\nrom/objset/stgpv253s05.farc 1E19F868\nrom/objset/stgpv253s06.farc 27D60F3B\nrom/objset/stgpv253s07.farc DA92E6DA\nrom/objset/stgpv253s08.farc 16A31706\nrom/objset/stgpv253s09.farc 1F08EB2F\nrom/objset/stgpv255.farc 88C775A0\nrom/objset/stgpv255hrc.farc 3C3EBBD1\nrom/objset/stgpv255s01.farc 89612465\nrom/objset/stgpv257.farc 666EA6C6\nrom/objset/stgpv257s01.farc CAA1D231\nrom/objset/stgpv259s01.farc 393221FE\nrom/objset/stgpv260.farc 8DF11578\nrom/objset/stgpv260s01.farc B65F9CAF\nrom/objset/stgpv261.farc 3B8F49AC\nrom/objset/stgpv261hrc.farc 920030BC\nrom/objset/stgpv261s01.farc 3D41618E\nrom/objset/stgpv261s02.farc BC43A10F\nrom/objset/stgpv262.farc D9B87FDC\nrom/objset/stgpv262hrc.farc 4A97C01F\nrom/objset/stgpv262s01.farc 78AE10EC\nrom/objset/stgpv262s02.farc A715CA68\nrom/objset/stgpv262s03.farc 0D420C74\nrom/objset/stgpv262s04.farc 7E4483A4\nrom/objset/stgpv262s05.farc F51B9B39\nrom/objset/stgpv262s06.farc 39F0592C\nrom/objset/stgpv262s07.farc 510747B6\nrom/objset/stgpv262s09.farc 172D8ED1\nrom/objset/stgpv262s10.farc 6519D9D7\nrom/objset/stgpv262s11.farc CD3DFC6B\nrom/objset/stgpv262s12.farc 80F1EE2C\nrom/objset/stgpv262s13.farc B5FC81A2\nrom/objset/stgpv432.farc 9AF0E224\nrom/objset/stgpv432hrc.farc 4ED38649\nrom/objset/stgpv432s01.farc 7AAE5FA0\nrom/objset/stgpv432s02.farc B4FB55D1\nrom/objset/stgpv432s03.farc A7DAE049\nrom/objset/stgpv433.farc 238AEEFF\nrom/objset/stgpv433hrc.farc 74C72299\nrom/objset/stgpv433s01.farc 48C4DAF9\nrom/objset/stgpv433s02.farc 40E77A38\nrom/objset/stgpv433s03.farc 627C20F6\nrom/objset/stgpv433s04.farc 31B1E42F\nrom/objset/stgpv433s06.farc 4B50C4D6\nrom/objset/stgpv434.farc 2DCA8E33\nrom/objset/stgpv434hrc.farc 2D2C2916\nrom/objset/stgpv434s01.farc CB461532\nrom/objset/stgpv435.farc E2172782\nrom/objset/stgpv435hrc.farc 9F411703\nrom/objset/stgpv435s01.farc 94655AF5\nrom/objset/stgpv435s02.farc 473F7F98\nrom/objset/stgpv435s03.farc E6B19297\nrom/objset/stgpv435s04.farc FC5295AB\nrom/objset/stgpv435s05.farc 2B161381\nrom/objset/stgpv435s06.farc F904788B\nrom/objset/stgpv435s07.farc 6AF35D0C\nrom/objset/stgpv435s08.farc 9701FBBD\nrom/objset/stgpv441.farc 07BFAFD8\nrom/objset/stgpv441s01.farc 3C336321\nrom/objset/stgpv600hrc.farc B6459E31\nrom/objset/stgpv600s01.farc 35AC4CA7\nrom/objset/stgpv600s02.farc 82D85A32\nrom/objset/stgpv600s03.farc 4CB27C12\nrom/objset/stgpv600s04.farc F2EABB9E\nrom/objset/stgpv601.farc 96C81CB8\nrom/objset/stgpv601hrc.farc 3803B707\nrom/objset/stgpv601s01.farc 1D3AD2BF\nrom/objset/stgpv601s02.farc 4DC4924C\nrom/objset/stgpv601s03.farc 1D346705\nrom/objset/stgpv601s04.farc F8A5DC9A\nrom/objset/stgpv602.farc 64887D19\nrom/objset/stgpv602hrc.farc BA919573\nrom/objset/stgpv602s01.farc 2C7DFC6A\nrom/objset/stgpv602s02.farc 7FDF92BB\nrom/objset/stgpv602s03.farc 46AD7224\nrom/objset/stgpv603.farc 5A61DF90\nrom/objset/stgpv603s01.farc 992622E1\nrom/objset/stgpv604.farc C2410CA6\nrom/objset/stgpv604s01.farc E3FAF3E0\nrom/objset/stgpv604s02.farc 991C23E3\nrom/objset/stgpv604s03.farc CF7264DC\nrom/objset/stgpv604s04.farc BE102077\nrom/objset/stgpv604s05.farc D839924D\nrom/objset/stgpv604s07.farc A9C9FBDF\nrom/objset/stgpv605.farc D05F1A62\nrom/objset/stgpv605s01.farc 3EA05211\nrom/objset/stgpv605s02.farc 2FB0189F\nrom/objset/stgpv605s03.farc DD7C370D\nrom/objset/stgpv605s04.farc 6913D6FA\nrom/objset/stgpv605s05.farc 1D46DF64\nrom/objset/stgpv607.farc 4B4AC09C\nrom/objset/stgpv607hrc.farc 60054582\nrom/objset/stgpv608.farc 4986621E\nrom/objset/stgpv608hrc.farc 6C6B3A9D\nrom/objset/stgpv608s01.farc C5AEBB5F\nrom/objset/stgpv609.farc 12CF11D6\nrom/objset/stgpv609hrc.farc 4774C11D\nrom/objset/stgpv609s01.farc 6A82B12E\nrom/objset/stgpv609s02.farc 9631FF53\nrom/objset/stgpv609s03.farc D6597FA1\nrom/objset/stgpv610.farc AD4506D4\nrom/objset/stgpv610s01.farc 2F082C46\nrom/objset/stgpv610s02.farc 5D09CFFD\nrom/objset/stgpv610s03.farc 09BA15A1\nrom/objset/stgpv611.farc C62D6FB1\nrom/objset/stgpv611s01.farc 165B9CD0\nrom/objset/stgpv612.farc 150E314D\nrom/objset/stgpv612hrc.farc 41731EDB\nrom/objset/stgpv612s01.farc 37FA723B\nrom/objset/stgpv612s03.farc 1A1F1337\nrom/objset/stgpv612s04.farc 85D5437E\nrom/objset/stgpv613.farc 91DD5156\nrom/objset/stgpv613hrc.farc F34515A7\nrom/objset/stgpv613s01.farc 308CC486\nrom/objset/stgpv613s02.farc 4D3CB881\nrom/objset/stgpv613s03.farc FEEA5773\nrom/objset/stgpv614.farc AD44D044\nrom/objset/stgpv614hrc.farc 8D587D4A\nrom/objset/stgpv614s01.farc 2DAE1AFE\nrom/objset/stgpv614s02.farc D2CFF316\nrom/objset/stgpv614s03.farc 01066417\nrom/objset/stgpv614s04.farc 06F3A59F\nrom/objset/stgpv614s05.farc 14126D13\nrom/objset/stgpv614s06.farc BD315EEE\nrom/objset/stgpv615.farc 3F0FE1FA\nrom/objset/stgpv615s01.farc 6A215A76\nrom/objset/stgpv616.farc 438CDBF0\nrom/objset/stgpv616s01.farc 328B77ED\nrom/objset/stgpv616s02.farc A623F607\nrom/objset/stgpv616s03.farc D67C7F66\nrom/objset/stgpv617.farc 8DBB570E\nrom/objset/stgpv617hrc.farc 1A3EFCF3\nrom/objset/stgpv617s01.farc 09B52782\nrom/objset/stgpv617s02.farc BF0C36CA\nrom/objset/stgpv617s03.farc 101C211A\nrom/objset/stgpv617s04.farc 30F65AC6\nrom/objset/stgpv618.farc B95D7FC2\nrom/objset/stgpv618s01.farc 6479FDEA\nrom/objset/stgpv618s02.farc D7396598\nrom/objset/stgpv618s03.farc 755EAA86\nrom/objset/stgpv618s04.farc 22751984\nrom/objset/stgpv618s05.farc 8012D69A\nrom/objset/stgpv619.farc 8CF9F5F5\nrom/objset/stgpv619s01.farc 80F7B129\nrom/objset/stgpv619s02.farc 6998F423\nrom/objset/stgpv619s03.farc EAB7F601\nrom/objset/stgpv619s04.farc EB4ABF38\nrom/objset/stgpv620.farc 44C8FC9D\nrom/objset/stgpv620s01.farc 056B3595\nrom/objset/stgpv621.farc E9690906\nrom/objset/stgpv621s01.farc 517A5A10\nrom/objset/stgpv622.farc 4FFC0634\nrom/objset/stgpv622hrc.farc 4E956CB6\nrom/objset/stgpv622s01.farc 16AFC7D4\nrom/objset/stgpv623.farc 05BBFFF1\nrom/objset/stgpv623hrc.farc D7DABADA\nrom/objset/stgpv623s01.farc 617B25D5\nrom/objset/stgpv623s02.farc 12996043\nrom/objset/stgpv623s03.farc 14F6C0A1\nrom/objset/stgpv624s01.farc C680EFDF\nrom/objset/stgpv624s02.farc A05D9717\nrom/objset/stgpv625.farc C153FA5E\nrom/objset/stgpv625hrc.farc 38E4EFC5\nrom/objset/stgpv625s01.farc C780B0A9\nrom/objset/stgpv625s02.farc E38C5B44\nrom/objset/stgpv625s03.farc AA3F0C3E\nrom/objset/stgpv625s04.farc DDF3A127\nrom/objset/stgpv625s05.farc 08366732\nrom/objset/stgpv626.farc D39FC1FC\nrom/objset/stgpv626s01.farc E74218E4\nrom/objset/stgpv626s02.farc D17EA453\nrom/objset/stgpv627.farc 458C1D17\nrom/objset/stgpv627s01.farc 4E3F9EB6\nrom/objset/stgpv627s02.farc 0E065857\nrom/objset/stgpv627s03.farc 1F5F8B2E\nrom/objset/stgpv628.farc 93649855\nrom/objset/stgpv628s01.farc C3BBFC3A\nrom/objset/stgpv628s02.farc 145F2308\nrom/objset/stgpv629.farc AC36EAF2\nrom/objset/stgpv629s01.farc 25E82286\nrom/objset/stgpv630.farc D4D21AB5\nrom/objset/stgpv630hrc.farc C4B622F6\nrom/objset/stgpv630s01.farc 1A57C691\nrom/objset/stgpv630s02.farc 7EC3245A\nrom/objset/stgpv630s03.farc DCC57C8E\nrom/objset/stgpv630s04.farc DCCD13DE\nrom/objset/stgpv630s05.farc CC15C745\nrom/objset/stgpv631.farc 2B2C5ED9\nrom/objset/stgpv631s01.farc 557CC7BA\nrom/objset/stgpv631s02.farc 5F1C063A\nrom/objset/stgpv637.farc C2D00193\nrom/objset/stgpv637hrc.farc F4F06B38\nrom/objset/stgpv637s01.farc C9E44B61\nrom/objset/stgpv638.farc BB2D7F0D\nrom/objset/stgpv638s01.farc 4F1854B9\nrom/objset/stgpv638s02.farc 20681E61\nrom/objset/stgpv639.farc 5D53F5EC\nrom/objset/stgpv639hrc.farc 9B931037\nrom/objset/stgpv639s01.farc 75E076B2\nrom/objset/stgpv639s02.farc 13B7FFBE\nrom/objset/stgpv639s03.farc F077B1CA\nrom/objset/stgpv639s04.farc 69B6EF42\nrom/objset/stgpv639s05.farc 60D7E060\nrom/objset/stgpv639s06.farc D27E95D0\nrom/objset/stgpv640.farc B8886FD2\nrom/objset/stgpv640hrc.farc 82BEF2D0\nrom/objset/stgpv640s01.farc 33088DC1\nrom/objset/stgpv640s02.farc A8125B6F\nrom/objset/stgpv641.farc 091ABDBA\nrom/objset/stgpv641hrc.farc A32EE0D9\nrom/objset/stgpv642.farc C24DA152\nrom/objset/stgpv642hrc.farc AB88F674\nrom/objset/stgpv642s01.farc F7CF314E\nrom/objset/stgpv642s02.farc 1686DB3F\nrom/objset/stgpv642s03.farc 86E8F40F\nrom/objset/stgpv642s04.farc 7242F2E0\nrom/objset/stgpv710.farc E2A19A98\nrom/objset/stgpv710hrc.farc 5A4494BF\nrom/objset/stgpv710s01.farc 61EC9BA2\nrom/objset/stgpv710s02.farc 37897009\nrom/objset/stgpv710s03.farc EE6FDCF4\nrom/objset/stgpv710s04.farc FA63D3C3\nrom/objset/stgpv722.farc 90BF4B87\nrom/objset/stgpv722s01.farc 62729687\nrom/objset/stgpv723.farc D8568046\nrom/objset/stgpv723s01.farc 230CEF9B\nrom/objset/stgpv723s02.farc BD56709A\nrom/objset/stgpv241s04.farc DF46AF91\nrom/objset/stgpv248s01.farc 3A86FBF1\nrom/objset/stgpv251s08.farc BC4EF310\nrom/objset/stgpv259.farc 214B1EE4\nrom/objset/stgpv262s08.farc 528BFEEC\nrom/objset/stgpv433s05.farc 93BD1B31\nrom/objset/stgpv600.farc E5F5E545\nrom/objset/stgpv602s04.farc 36B92245\nrom/objset/stgpv607s01.farc 61E8B23C\nrom/objset/stgpv612s02.farc 2F6BE588\nrom/objset/stgpv615hrc.farc D0E3BC6F\nrom/objset/stgpv618s06.farc 5E1462F3\nrom/objset/stgpv624.farc 4234FFA1\nrom/objset/stgpv628hrc.farc 511DA91D\nrom/objset/stgpv637s02.farc E5F5D33A\nrom/objset/stgpv641s01.farc 6670E2B1\nrom/objset/stgpv724.farc 187AECCA\nrom/objset/stgpv727hrc.farc 647DA044\nrom/objset/stgpv731s03.farc 282B2D80\nrom/objset/stgpv736.farc C8EB0A8B\nrom/objset/stgpv740s03.farc DE2DA0F8\nrom/objset/stgpv724hrc.farc 893FFFBF\nrom/objset/stgpv724s01.farc 3AECB5C5\nrom/objset/stgpv724s02.farc 8F4A2BFF\nrom/objset/stgpv724s03.farc FD01A35D\nrom/objset/stgpv724s04.farc A4AFEB3C\nrom/objset/stgpv724s05.farc D0523DCF\nrom/objset/stgpv725.farc F3E323EE\nrom/objset/stgpv725hrc.farc AD79F954\nrom/objset/stgpv725s01.farc 73451BA9\nrom/objset/stgpv725s02.farc 2243F4E9\nrom/objset/stgpv725s03.farc E57AAB27\nrom/objset/stgpv725s04.farc 0F449245\nrom/objset/stgpv726.farc 58D66E3B\nrom/objset/stgpv726hrc.farc DBB246BE\nrom/objset/stgpv726s01.farc A1D8823B\nrom/objset/stgpv727.farc D3FA57A7\nrom/objset/stgpv727s01.farc 45975746\nrom/objset/stgpv728.farc B84D9BE8\nrom/objset/stgpv728s01.farc E0CF56B8\nrom/objset/stgpv728s03.farc BEBA316A\nrom/objset/stgpv728s04.farc 4B2C848E\nrom/objset/stgpv729.farc 04F9BF08\nrom/objset/stgpv729hrc.farc EDBB0721\nrom/objset/stgpv729s01.farc 661B7041\nrom/objset/stgpv729s03.farc DAD9DBD1\nrom/objset/stgpv730.farc 670817E4\nrom/objset/stgpv730hrc.farc 21ACF89E\nrom/objset/stgpv730s01.farc 68DF9598\nrom/objset/stgpv730s02.farc A6D83322\nrom/objset/stgpv731.farc 98CCD4B3\nrom/objset/stgpv731s01.farc 54FFBD44\nrom/objset/stgpv731s02.farc 37345393\nrom/objset/stgpv732.farc E532676B\nrom/objset/stgpv732hrc.farc FE51FCDC\nrom/objset/stgpv732s01.farc 29D6CB49\nrom/objset/stgpv732s02.farc CD3BB463\nrom/objset/stgpv732s03.farc C1AD5442\nrom/objset/stgpv733.farc 8B3D5A32\nrom/objset/stgpv733hrc.farc A173BEB5\nrom/objset/stgpv733s01.farc 662360B5\nrom/objset/stgpv733s02.farc 45D6D7AD\nrom/objset/stgpv733s03.farc 31C93118\nrom/objset/stgpv733s04.farc 4D798069\nrom/objset/stgpv733s05.farc 8208FE83\nrom/objset/stgpv734.farc FBD8DCF9\nrom/objset/stgpv734s01.farc 43DB9322\nrom/objset/stgpv734s02.farc 42786730\nrom/objset/stgpv734s04.farc FFA59366\nrom/objset/stgpv734s05.farc 1DDCF9BA\nrom/objset/stgpv736hrc.farc A4751A79\nrom/objset/stgpv736s01.farc F07DA220\nrom/objset/stgpv736s02.farc 4B0C74DF\nrom/objset/stgpv737.farc 086046A5\nrom/objset/stgpv737hrc.farc 85336A38\nrom/objset/stgpv737s01.farc 892878F4\nrom/objset/stgpv737s02.farc 0837A799\nrom/objset/stgpv738.farc 5644AE84\nrom/objset/stgpv738hrc.farc 19C48FF9\nrom/objset/stgpv738s01.farc CBC78A80\nrom/objset/stgpv738s02.farc B7B1D12B\nrom/objset/stgpv739.farc 3852BE48\nrom/objset/stgpv739hrc.farc 9AC568BC\nrom/objset/stgpv739s01.farc CC99C379\nrom/objset/stgpv740.farc 63866FE4\nrom/objset/stgpv740s01.farc EF8C6D77\nrom/objset/stgpv740s02.farc F17836A3\nrom/objset/stgpv740s04.farc 79070A0C\nrom/objset/stgpv740s05.farc E436D275\nrom/objset/stgpv832.farc 1F471E6F\nrom/objset/stgpv832s01.farc 04323691\nrom/objset/stgtst.farc 13D3DD97\nrom/objset/stgtst001.farc 738E3F47\nrom/objset/stgtst002.farc 038372CB\nrom/objset/stgtst003.farc 23CCF07C\nrom/objset/stgtst004.farc 0ACDF94C\nrom/objset/stgtst005.farc 92A73550\nrom/objset/stgtst006.farc 9B919C6E\nrom/objset/stgtst007.farc A375642C\nrom/objset/stgtst008.farc 08A12951\nrom/objset/stgtst009.farc A6F31112\nrom/objset/stgtst010.farc A8B713F7\nrom/objset/tetitm000.farc 850B51A6\nrom/objset/tetitm001.farc 0F01B480\nrom/objset/tetitm002.farc 3B4B9AC6\nrom/objset/tetitm003.farc 9DC7A41F\nrom/objset/tetitm301.farc 437D4CE9\nrom/objset/tetitm303.farc 6895AFC0\nrom/objset/tetitm500.farc CDBEE21C\nrom/objset/tetitm502.farc D2DC77B2\nrom/objset/tetitm503.farc 29E193B8\nrom/objset/tetitm700.farc 73B8A7DB\nrom/objset/tex_db.bin DA00A0FE\nrom/osage_play_data/lukitm022_joha_outer_22__divskn.farc D7E69092\nrom/osage_play_data/mikitm032_joha_outer_32__divskn.farc 5E5EDFD8\nrom/osage_play_data/mikitm546_atam_atama_46__divskn.farc 3498E4B1\nrom/osage_play_data/hakitm001_joha_outer_01__divskn.farc 64AEFF71\nrom/osage_play_data/hakitm002_joha_outer_02__divskn.farc 71AE9692\nrom/osage_play_data/hakitm003_joha_outer_03__divskn.farc 3607899C\nrom/osage_play_data/hakitm004_joha_outer_04__divskn.farc 5C629601\nrom/osage_play_data/hakitm500_atam_atama_00__divskn.farc 974DC87A\nrom/osage_play_data/hakitm501_atam_atama_01__divskn.farc D2CBB816\nrom/osage_play_data/hakitm502_atam_atama_02__divskn.farc AAFC6244\nrom/osage_play_data/hakitm700_atam_zujo_00__divskn.farc 034F53B8\nrom/osage_play_data/kaiitm001_joha_outer_01__divskn.farc CF61EE4D\nrom/osage_play_data/kaiitm002_joha_outer_02__divskn.farc 0F4CEB52\nrom/osage_play_data/kaiitm003_joha_outer_03__divskn.farc DC79AC9B\nrom/osage_play_data/kaiitm004_joha_outer_04__divskn.farc 144B7C17\nrom/osage_play_data/kaiitm008_joha_outer_08__divskn.farc 43B24B1F\nrom/osage_play_data/kaiitm009_joha_outer_09__divskn.farc 4EEF9EDE\nrom/osage_play_data/kaiitm010_joha_outer_10__divskn.farc 5BC902D6\nrom/osage_play_data/kaiitm011_joha_outer_11__divskn.farc 45447E2A\nrom/osage_play_data/kaiitm012_joha_outer_12__divskn.farc 65140DBF\nrom/osage_play_data/kaiitm015_joha_outer_15__divskn.farc F3268750\nrom/osage_play_data/kaiitm016_joha_outer_16__divskn.farc C1F8F59B\nrom/osage_play_data/kaiitm018_joha_outer_18__divskn.farc 4B312420\nrom/osage_play_data/kaiitm019_joha_outer_19__divskn.farc 08727917\nrom/osage_play_data/kaiitm020_joha_outer_20__divskn.farc 0F216CB9\nrom/osage_play_data/kaiitm022_joha_outer_22__divskn.farc 17BB3CB8\nrom/osage_play_data/kaiitm024_joha_outer_24__divskn.farc 71F86E86\nrom/osage_play_data/kaiitm027_joha_outer_27__divskn.farc 4E9C4EC6\nrom/osage_play_data/kaiitm028_joha_outer_28__divskn.farc 149BB47A\nrom/osage_play_data/kaiitm029_joha_outer_29__divskn.farc EE4D9633\nrom/osage_play_data/kaiitm030_joha_outer_30__divskn.farc 948F8761\nrom/osage_play_data/kaiitm031_joha_outer_31__divskn.farc B834DCBD\nrom/osage_play_data/kaiitm032_joha_outer_32__divskn.farc 68F29348\nrom/osage_play_data/kaiitm033_joha_outer_33__divskn.farc C4F75DCF\nrom/osage_play_data/kaiitm034_joha_outer_34__divskn.farc 307E29B8\nrom/osage_play_data/kaiitm036_joha_outer_36__divskn.farc AB9E0049\nrom/osage_play_data/kaiitm041_joha_outer_41__divskn.farc 9D4A3EEB\nrom/osage_play_data/kaiitm042_joha_outer_42__divskn.farc E821B5C9\nrom/osage_play_data/kaiitm500_atam_atama_00__divskn.farc 61FFD070\nrom/osage_play_data/kaiitm502_atam_atama_02__divskn.farc 85C85453\nrom/osage_play_data/kaiitm503_atam_atama_03__divskn.farc 194280CB\nrom/osage_play_data/kaiitm504_atam_atama_04__divskn.farc 7C148EBC\nrom/osage_play_data/kaiitm505_atam_atama_05__divskn.farc 9AAA1DE4\nrom/osage_play_data/kaiitm506_atam_atama_06__divskn.farc EBEF609D\nrom/osage_play_data/kaiitm507_atam_atama_07__divskn.farc 3B51590A\nrom/osage_play_data/kaiitm508_atam_atama_08__divskn.farc 2486990E\nrom/osage_play_data/kaiitm509_atam_atama_09__divskn.farc 8B972A3C\nrom/osage_play_data/kaiitm510_atam_atama_10__divskn.farc 145F7482\nrom/osage_play_data/kaiitm520_atam_atama_20__divskn.farc 7550BF43\nrom/osage_play_data/kaiitm522_atam_atama_22__divskn.farc FEC3EC71\nrom/osage_play_data/kaiitm523_atam_atama_23__divskn.farc 690AA4EA\nrom/osage_play_data/kaiitm527_atam_atama_27__divskn.farc 6E724AA5\nrom/osage_play_data/kaiitm528_atam_atama_28__divskn.farc 20AC855E\nrom/osage_play_data/kaiitm529_atam_atama_29__divskn.farc E5299721\nrom/osage_play_data/kaiitm531_atam_atama_31__divskn.farc 7E19DAF7\nrom/osage_play_data/kaiitm532_atam_atama_32__divskn.farc E3E763FA\nrom/osage_play_data/kaiitm533_atam_atama_33__divskn.farc 67B70CC3\nrom/osage_play_data/kaiitm534_atam_atama_34__divskn.farc 6A4F180A\nrom/osage_play_data/kaiitm536_atam_atama_36__divskn.farc 9C80A5B5\nrom/osage_play_data/kaiitm541_atam_atama_41__divskn.farc CF0D893A\nrom/osage_play_data/kaiitm542_atam_atama_42__divskn.farc D750CCCC\nrom/osage_play_data/kaiitm701_atam_zujo_01__divskn.farc 8C98294F\nrom/osage_play_data/kaiitm705_atam_zujo_05__divskn.farc 51EE6584\nrom/osage_play_data/kaiitm750_joha_neck_50__divskn.farc 83146C6E\nrom/osage_play_data/kaiitm751_joha_neck_51__divskn.farc AA5F1674\nrom/osage_play_data/kaiitm775_joha_ushiro_75__divskn.farc BDFF3443\nrom/osage_play_data/lenitm001_joha_outer_01__divskn.farc 1B50547F\nrom/osage_play_data/lenitm002_joha_outer_02__divskn.farc BA22379E\nrom/osage_play_data/lenitm003_joha_outer_03__divskn.farc 831A6143\nrom/osage_play_data/lenitm004_joha_outer_04__divskn.farc B8E4D760\nrom/osage_play_data/lenitm005_joha_outer_05__divskn.farc FF86DC43\nrom/osage_play_data/lenitm007_joha_outer_07__divskn.farc FD324705\nrom/osage_play_data/lenitm008_joha_outer_08__divskn.farc 3778AD15\nrom/osage_play_data/lenitm009_joha_outer_09__divskn.farc 0E9DED8E\nrom/osage_play_data/lenitm010_joha_outer_10__divskn.farc 7925001B\nrom/osage_play_data/kaiitm006_joha_outer_06__divskn.farc 6B159016\nrom/osage_play_data/kaiitm025_joha_outer_25__divskn.farc DE17F460\nrom/osage_play_data/kaiitm501_atam_atama_01__divskn.farc 02FB87B2\nrom/osage_play_data/kaiitm524_atam_atama_24__divskn.farc DE956A3E\nrom/osage_play_data/kaiitm706_atam_zujo_06__divskn.farc 913EA944\nrom/osage_play_data/lenitm011_joha_outer_11__divskn.farc 2A7E6421\nrom/osage_play_data/lenitm025_joha_outer_25__divskn.farc 95D04766\nrom/osage_play_data/lenitm040_joha_outer_40__divskn.farc 6234792C\nrom/osage_play_data/lenitm522_atam_atama_22__divskn.farc FF4C4623\nrom/osage_play_data/lenitm536_atam_atama_36__divskn.farc 253D84D2\nrom/osage_play_data/lukitm008_joha_outer_08__divskn.farc 3D3AC86A\nrom/osage_play_data/lenitm012_joha_outer_12__divskn.farc 500A29DA\nrom/osage_play_data/lenitm013_joha_outer_13__divskn.farc A80701F9\nrom/osage_play_data/lenitm014_joha_outer_14__divskn.farc DB459114\nrom/osage_play_data/lenitm015_joha_outer_15__divskn.farc BFF3FAA7\nrom/osage_play_data/lenitm016_joha_outer_16__divskn.farc CB0E6533\nrom/osage_play_data/lenitm017_joha_outer_17__divskn.farc 6720F16A\nrom/osage_play_data/lenitm018_joha_outer_18__divskn.farc 27A42D7F\nrom/osage_play_data/lenitm019_joha_outer_19__divskn.farc 2DDC5D5A\nrom/osage_play_data/lenitm021_joha_outer_21__divskn.farc 4ED1C934\nrom/osage_play_data/lenitm022_joha_outer_22__divskn.farc F6FB0707\nrom/osage_play_data/lenitm023_joha_outer_23__divskn.farc 03EE190F\nrom/osage_play_data/lenitm024_joha_outer_24__divskn.farc C2990A92\nrom/osage_play_data/lenitm026_joha_outer_26__divskn.farc 220DD19C\nrom/osage_play_data/lenitm027_joha_outer_27__divskn.farc EC7B11B9\nrom/osage_play_data/lenitm028_joha_outer_28__divskn.farc 435C0675\nrom/osage_play_data/lenitm029_joha_outer_29__divskn.farc CF311AED\nrom/osage_play_data/lenitm030_joha_outer_30__divskn.farc 386BD654\nrom/osage_play_data/lenitm031_joha_outer_31__divskn.farc 5E6463AC\nrom/osage_play_data/lenitm032_joha_outer_32__divskn.farc 711D2859\nrom/osage_play_data/lenitm033_joha_outer_33__divskn.farc 15575657\nrom/osage_play_data/lenitm034_joha_outer_34__divskn.farc 57131694\nrom/osage_play_data/lenitm035_joha_outer_35__divskn.farc 57211AA5\nrom/osage_play_data/lenitm036_joha_outer_36__divskn.farc 4513DE58\nrom/osage_play_data/lenitm038_joha_outer_38__divskn.farc 4FD59F2D\nrom/osage_play_data/lenitm500_atam_atama_00__divskn.farc AA447887\nrom/osage_play_data/lenitm501_atam_atama_01__divskn.farc E5B2F460\nrom/osage_play_data/lenitm502_atam_atama_02__divskn.farc 324622B1\nrom/osage_play_data/lenitm503_atam_atama_03__divskn.farc D99263F3\nrom/osage_play_data/lenitm504_atam_atama_04__divskn.farc 4BA676F4\nrom/osage_play_data/lenitm505_atam_atama_05__divskn.farc 71590B5C\nrom/osage_play_data/lenitm506_atam_atama_06__divskn.farc B8E35CF2\nrom/osage_play_data/lenitm508_atam_atama_08__divskn.farc DA1DA3A3\nrom/osage_play_data/lenitm509_atam_atama_09__divskn.farc BAD3485E\nrom/osage_play_data/lenitm511_atam_atama_11__divskn.farc 958AECEB\nrom/osage_play_data/lenitm519_atam_atama_19__divskn.farc 5067DAA4\nrom/osage_play_data/lenitm521_atam_atama_21__divskn.farc 9B7D56A7\nrom/osage_play_data/lenitm523_atam_atama_23__divskn.farc 57E11D55\nrom/osage_play_data/lenitm524_atam_atama_24__divskn.farc A38AF304\nrom/osage_play_data/lenitm525_atam_atama_25__divskn.farc AB1BF7F8\nrom/osage_play_data/lenitm526_atam_atama_26__divskn.farc 797D9806\nrom/osage_play_data/lenitm528_atam_atama_28__divskn.farc F230740B\nrom/osage_play_data/lenitm529_atam_atama_29__divskn.farc 42E070B6\nrom/osage_play_data/lenitm530_atam_atama_30__divskn.farc 9DF5C72C\nrom/osage_play_data/lenitm531_atam_atama_31__divskn.farc 517ADA9F\nrom/osage_play_data/lenitm532_atam_atama_32__divskn.farc A3679EE8\nrom/osage_play_data/lenitm533_atam_atama_33__divskn.farc B1460C49\nrom/osage_play_data/lenitm534_atam_atama_34__divskn.farc 56EFC33A\nrom/osage_play_data/lenitm535_atam_atama_35__divskn.farc CC492770\nrom/osage_play_data/lenitm537_atam_atama_37__divskn.farc 9FD5E3FD\nrom/osage_play_data/lenitm538_atam_atama_38__divskn.farc 5AA01BB7\nrom/osage_play_data/lenitm540_atam_atama_40__divskn.farc 8001863C\nrom/osage_play_data/lenitm700_atam_zujo_00__divskn.farc E4EBE2A4\nrom/osage_play_data/lenitm775_joha_ushiro_75__divskn.farc C931DE39\nrom/osage_play_data/lukitm001_joha_outer_01_zzc__divskn.farc 9EC00EBF\nrom/osage_play_data/lukitm002_joha_outer_02__divskn.farc 27451C7D\nrom/osage_play_data/lukitm003_joha_outer_03__divskn.farc 89FECDF1\nrom/osage_play_data/lukitm004_joha_outer_04__divskn.farc 576075CA\nrom/osage_play_data/lukitm005_joha_outer_05__divskn.farc 0E79BD88\nrom/osage_play_data/lukitm006_joha_outer_06__divskn.farc 80E7D2C1\nrom/osage_play_data/lukitm007_joha_outer_07__divskn.farc 20E3C626\nrom/osage_play_data/lukitm009_joha_outer_09__divskn.farc D1F2D067\nrom/osage_play_data/lukitm010_joha_outer_10__divskn.farc D1978128\nrom/osage_play_data/lukitm011_joha_outer_11__divskn.farc 41F10151\nrom/osage_play_data/lukitm012_joha_outer_12__divskn.farc 52DB825D\nrom/osage_play_data/lukitm013_joha_outer_13__divskn.farc F5AB4873\nrom/osage_play_data/lukitm014_joha_outer_14__divskn.farc 3312B4FE\nrom/osage_play_data/lukitm015_joha_outer_15__divskn.farc 48599601\nrom/osage_play_data/lukitm017_joha_outer_17_zzc__divskn.farc A36F194B\nrom/osage_play_data/lukitm018_joha_outer_18__divskn.farc 90D2A4F8\nrom/osage_play_data/lukitm019_joha_outer_19__divskn.farc 1FF5B626\nrom/osage_play_data/lukitm020_joha_outer_20__divskn.farc A7D8D876\nrom/osage_play_data/lukitm021_joha_outer_21__divskn.farc 66C72D30\nrom/osage_play_data/lukitm023_joha_outer_23__divskn.farc A640EAA3\nrom/osage_play_data/lukitm024_joha_outer_24__divskn.farc 8CC3E344\nrom/osage_play_data/lukitm025_joha_outer_25__divskn.farc 082E866D\nrom/osage_play_data/lukitm026_joha_outer_26__divskn.farc 61226C12\nrom/osage_play_data/lukitm027_joha_outer_27__divskn.farc A31B5E9E\nrom/osage_play_data/lukitm028_joha_outer_28__divskn.farc ADE33F01\nrom/osage_play_data/lukitm029_joha_outer_29__divskn.farc F26ABE41\nrom/osage_play_data/lukitm030_joha_outer_30__divskn.farc 9186E7D3\nrom/osage_play_data/lukitm031_joha_outer_31__divskn.farc 898DF20F\nrom/osage_play_data/lukitm032_joha_outer_32__divskn.farc 6CFF0097\nrom/osage_play_data/lukitm033_joha_outer_33__divskn.farc A0620DC1\nrom/osage_play_data/lukitm034_joha_outer_34__divskn.farc 9C1C718A\nrom/osage_play_data/lukitm036_joha_outer_36__divskn.farc 289EB73C\nrom/osage_play_data/lukitm037_joha_outer_37__divskn.farc 3C46660A\nrom/osage_play_data/lukitm038_joha_outer_38__divskn.farc B7C279FF\nrom/osage_play_data/lukitm039_joha_outer_39__divskn.farc AB39B9F8\nrom/osage_play_data/lukitm040_joha_outer_40__divskn.farc CD3A4673\nrom/osage_play_data/lukitm042_joha_outer_42__divskn.farc B6067176\nrom/osage_play_data/lukitm311_ude_hand_11__divskn.farc F30F7C07\nrom/osage_play_data/lukitm500_atam_atama_00__divskn.farc B93882CD\nrom/osage_play_data/lukitm501_atam_atama_01__divskn.farc 22E19FD4\nrom/osage_play_data/lukitm502_atam_atama_02__divskn.farc 0EFD4EF1\nrom/osage_play_data/lukitm503_atam_atama_03__divskn.farc A428D8AC\nrom/osage_play_data/lukitm504_atam_atama_04__divskn.farc 502FF1E8\nrom/osage_play_data/lukitm506_atam_atama_06__divskn.farc ABA03C37\nrom/osage_play_data/lukitm507_atam_atama_07__divskn.farc B4B910BB\nrom/osage_play_data/lukitm508_atam_atama_08__divskn.farc 5B4878EF\nrom/osage_play_data/lukitm509_atam_atama_09__divskn.farc 23ECEFBA\nrom/osage_play_data/lukitm510_atam_atama_10__divskn.farc D7F48472\nrom/osage_play_data/lukitm511_atam_atama_11__divskn.farc 5EC35074\nrom/osage_play_data/lukitm512_atam_atama_12__divskn.farc F9C0BD3A\nrom/osage_play_data/lukitm513_atam_atama_13__divskn.farc AD85B2D9\nrom/osage_play_data/lukitm514_atam_atama_14__divskn.farc 5DC53DBC\nrom/osage_play_data/lukitm515_atam_atama_15__divskn.farc B77BC644\nrom/osage_play_data/lukitm516_atam_atama_16__divskn.farc 78F796C8\nrom/osage_play_data/lukitm517_atam_atama_17__divskn.farc 1334B801\nrom/osage_play_data/lukitm526_atam_atama_26__divskn.farc 10701210\nrom/osage_play_data/lukitm527_atam_atama_27__divskn.farc 510BAE78\nrom/osage_play_data/lukitm528_atam_atama_28__divskn.farc F0CE548A\nrom/osage_play_data/lukitm529_atam_atama_29__divskn.farc 735912DC\nrom/osage_play_data/lukitm530_atam_atama_30__divskn.farc F61681E8\nrom/osage_play_data/lukitm531_atam_atama_31__divskn.farc 17CB5F4F\nrom/osage_play_data/lukitm532_atam_atama_32__divskn.farc 3692483B\nrom/osage_play_data/lukitm533_atam_atama_33__divskn.farc 87BE804A\nrom/osage_play_data/lukitm534_atam_atama_34__divskn.farc 029E700A\nrom/osage_play_data/lukitm535_atam_atama_35__divskn.farc F533A71C\nrom/osage_play_data/lukitm536_atam_atama_36__divskn.farc 4B0FFF58\nrom/osage_play_data/lukitm537_atam_atama_37__divskn.farc E9150E91\nrom/osage_play_data/lukitm539_atam_atama_39__divskn.farc B47F2386\nrom/osage_play_data/lukitm540_atam_atama_40__divskn.farc 4982FCCE\nrom/osage_play_data/lukitm542_atam_atama_42__divskn.farc 6D5E6886\nrom/osage_play_data/lukitm700_atam_zujo_00__divskn.farc 20CF1FA6\nrom/osage_play_data/lukitm702_atam_zujo_02__divskn.farc 049F536F\nrom/osage_play_data/lukitm703_atam_zujo_03__divskn.farc B581C99C\nrom/osage_play_data/lukitm705_atam_zujo_05__divskn.farc 4291C268\nrom/osage_play_data/meiitm001_joha_outer_01__divskn.farc 26448548\nrom/osage_play_data/meiitm002_joha_outer_02__divskn.farc FAC58C8F\nrom/osage_play_data/meiitm003_joha_outer_03__divskn.farc 1AE37773\nrom/osage_play_data/meiitm004_joha_outer_04__divskn.farc 1C4323D9\nrom/osage_play_data/meiitm005_joha_outer_05__divskn.farc E8061B41\nrom/osage_play_data/meiitm008_joha_outer_08__divskn.farc 2EE259D7\nrom/osage_play_data/meiitm009_joha_outer_09__divskn.farc B70281DB\nrom/osage_play_data/meiitm010_joha_outer_10__divskn.farc 00CF376D\nrom/osage_play_data/meiitm011_joha_outer_11__divskn.farc 9341CE80\nrom/osage_play_data/meiitm012_joha_outer_12__divskn.farc A903C356\nrom/osage_play_data/meiitm013_joha_outer_13__divskn.farc 1D9EE80A\nrom/osage_play_data/meiitm014_joha_outer_14__divskn.farc 7F707696\nrom/osage_play_data/meiitm015_joha_outer_15__divskn.farc 97AD5888\nrom/osage_play_data/meiitm016_joha_outer_16__divskn.farc B785D526\nrom/osage_play_data/meiitm017_joha_outer_17_zzc__divskn.farc 214A6C72\nrom/osage_play_data/meiitm018_joha_outer_18__divskn.farc BABB429A\nrom/osage_play_data/meiitm019_joha_outer_19__divskn.farc 18FF17BD\nrom/osage_play_data/meiitm021_joha_outer_21__divskn.farc 63D2B778\nrom/osage_play_data/meiitm022_joha_outer_22__divskn.farc 03284D3C\nrom/osage_play_data/meiitm023_joha_outer_23__divskn.farc E8E2284E\nrom/osage_play_data/meiitm024_joha_outer_24__divskn.farc 535209FD\nrom/osage_play_data/meiitm025_joha_outer_25__divskn.farc EBE5FD42\nrom/osage_play_data/meiitm026_joha_outer_26__divskn.farc C82F0BBC\nrom/osage_play_data/meiitm027_joha_outer_27__divskn.farc 47A83F07\nrom/osage_play_data/meiitm028_joha_outer_28__divskn.farc D7AFA076\nrom/osage_play_data/meiitm029_joha_outer_29__divskn.farc 955328A5\nrom/osage_play_data/meiitm030_joha_outer_30__divskn.farc 818A75C0\nrom/osage_play_data/meiitm032_joha_outer_32__divskn.farc 2B2610AE\nrom/osage_play_data/meiitm033_joha_outer_33__divskn.farc 93416601\nrom/osage_play_data/meiitm501_atam_atama_01__divskn.farc A01F8116\nrom/osage_play_data/meiitm502_atam_atama_02__divskn.farc 93811BBD\nrom/osage_play_data/meiitm503_atam_atama_03__divskn.farc 315CE597\nrom/osage_play_data/meiitm504_atam_atama_04__divskn.farc 607B7750\nrom/osage_play_data/meiitm505_atam_atama_05__divskn.farc 73CD4DDD\nrom/osage_play_data/meiitm506_atam_atama_06__divskn.farc E5391999\nrom/osage_play_data/meiitm507_atam_atama_07__divskn.farc 6CBA2C59\nrom/osage_play_data/meiitm508_atam_atama_08__divskn.farc CB11E181\nrom/osage_play_data/meiitm509_atam_atama_09__divskn.farc 3DE95A18\nrom/osage_play_data/meiitm510_atam_atama_10__divskn.farc 8838128F\nrom/osage_play_data/meiitm511_atam_atama_11__divskn.farc D2494F49\nrom/osage_play_data/meiitm512_atam_atama_12__divskn.farc 91D4BFE1\nrom/osage_play_data/meiitm514_atam_atama_14__divskn.farc 6AED8734\nrom/osage_play_data/meiitm515_atam_atama_15__divskn.farc 10950E6F\nrom/osage_play_data/meiitm521_atam_atama_21__divskn.farc F64FB0B2\nrom/osage_play_data/meiitm522_atam_atama_22__divskn.farc 013464C0\nrom/osage_play_data/meiitm523_atam_atama_23__divskn.farc B2BDDAA8\nrom/osage_play_data/meiitm524_atam_atama_24__divskn.farc B482DCA9\nrom/osage_play_data/meiitm525_atam_atama_25__divskn.farc 127ABE78\nrom/osage_play_data/meiitm526_atam_atama_26__divskn.farc 26B9C99B\nrom/osage_play_data/meiitm527_atam_atama_27__divskn.farc 16A53B64\nrom/osage_play_data/meiitm528_atam_atama_28__divskn.farc F2DEB01D\nrom/osage_play_data/meiitm529_atam_atama_29__divskn.farc D481FA1F\nrom/osage_play_data/meiitm530_atam_atama_30__divskn.farc C4DAC604\nrom/osage_play_data/meiitm533_atam_atama_33__divskn.farc EA0C50A6\nrom/osage_play_data/meiitm700_atam_zujo_00__divskn.farc 5FAFFE8A\nrom/osage_play_data/meiitm701_atam_zujo_01__divskn.farc 8EB2F430\nrom/osage_play_data/meiitm702_atam_zujo_02__divskn.farc 996F7E3A\nrom/osage_play_data/meiitm704_atam_zujo_04__divskn.farc EAE3B369\nrom/osage_play_data/meiitm705_atam_zujo_05__divskn.farc 9761AFEB\nrom/osage_play_data/meiitm709_atam_zujo_09__divskn.farc F8E140C9\nrom/osage_play_data/meiitm775_joha_ushiro_75__divskn.farc 5BBFA38C\nrom/osage_play_data/mikitm001_joha_outer_01__divskn.farc 8AA0BD3B\nrom/osage_play_data/mikitm002_joha_outer_02__divskn.farc 1C51ADDA\nrom/osage_play_data/mikitm003_joha_outer_03__divskn.farc E345AE9F\nrom/osage_play_data/mikitm004_joha_outer_04__divskn.farc 1A3B7FFA\nrom/osage_play_data/mikitm006_joha_outer_06__divskn.farc 9FBA6840\nrom/osage_play_data/mikitm007_joha_outer_07__divskn.farc CD3BA417\nrom/osage_play_data/mikitm008_joha_outer_08__divskn.farc 9EBC93E6\nrom/osage_play_data/mikitm009_joha_outer_09__divskn.farc 4C5E3BC9\nrom/osage_play_data/mikitm010_joha_outer_10__divskn.farc A8990329\nrom/osage_play_data/mikitm011_joha_outer_11__divskn.farc 01E4F878\nrom/osage_play_data/mikitm012_joha_outer_12__divskn.farc 01C1C04C\nrom/osage_play_data/mikitm013_joha_outer_13__divskn.farc 33B25816\nrom/osage_play_data/mikitm014_joha_outer_14__divskn.farc 098B18D7\nrom/osage_play_data/mikitm015_joha_outer_15__divskn.farc 1EB35AC8\nrom/osage_play_data/mikitm016_joha_outer_16__divskn.farc 0FA1EF0B\nrom/osage_play_data/mikitm017_joha_outer_17__divskn.farc 85008DF8\nrom/osage_play_data/mikitm019_joha_outer_19__divskn.farc 1EC5C7F4\nrom/osage_play_data/mikitm020_joha_outer_20__divskn.farc 1B8D0328\nrom/osage_play_data/mikitm021_joha_outer_21__divskn.farc B27EE29D\nrom/osage_play_data/mikitm022_joha_outer_22_zzc__divskn.farc 831FC1B8\nrom/osage_play_data/mikitm023_joha_outer_23__divskn.farc 0159AD1F\nrom/osage_play_data/mikitm024_joha_outer_24__divskn.farc F61DAC00\nrom/osage_play_data/mikitm025_joha_outer_25__divskn.farc 6F831948\nrom/osage_play_data/mikitm026_joha_outer_26__divskn.farc 05F1DF6C\nrom/osage_play_data/mikitm027_joha_outer_27__divskn.farc 16E99A66\nrom/osage_play_data/mikitm029_joha_outer_29__divskn.farc 7BC24413\nrom/osage_play_data/mikitm030_joha_outer_30__divskn.farc 8C98CBE8\nrom/osage_play_data/mikitm031_joha_outer_31__divskn.farc C2AC4C60\nrom/osage_play_data/mikitm038_joha_outer_38__divskn.farc AF1A36BA\nrom/osage_play_data/mikitm040_joha_outer_40__divskn.farc 45B5D69B\nrom/osage_play_data/mikitm041_joha_outer_41__divskn.farc 9C88D37E\nrom/osage_play_data/mikitm042_joha_outer_42__divskn.farc 57413F5E\nrom/osage_play_data/mikitm043_joha_outer_43__divskn.farc E54EF068\nrom/osage_play_data/mikitm044_joha_outer_44__divskn.farc 0E387407\nrom/osage_play_data/mikitm045_joha_outer_45__divskn.farc 57A8D472\nrom/osage_play_data/mikitm046_joha_outer_46__divskn.farc C8DC72F5\nrom/osage_play_data/mikitm047_joha_outer_47__divskn.farc 98E98AD7\nrom/osage_play_data/mikitm048_joha_outer_48__divskn.farc E275A656\nrom/osage_play_data/mikitm049_joha_outer_49__divskn.farc 9984E42E\nrom/osage_play_data/mikitm050_joha_outer_50__divskn.farc 1A199C59\nrom/osage_play_data/lukitm035_joha_outer_35__divskn.farc 61AE0C7D\nrom/osage_play_data/lukitm505_atam_atama_05__divskn.farc A1E3DC27\nrom/osage_play_data/lukitm525_atam_atama_25__divskn.farc 74A84CF1\nrom/osage_play_data/lukitm538_atam_atama_38__divskn.farc 51D834DD\nrom/osage_play_data/meiitm006_joha_outer_06__divskn.farc FD057958\nrom/osage_play_data/meiitm020_joha_outer_20__divskn.farc AE0A0557\nrom/osage_play_data/meiitm500_atam_atama_00__divskn.farc D5A33305\nrom/osage_play_data/meiitm513_atam_atama_13__divskn.farc 6EAA0661\nrom/osage_play_data/meiitm532_atam_atama_32__divskn.farc B092B134\nrom/osage_play_data/mikitm005_joha_outer_05__divskn.farc 652574DB\nrom/osage_play_data/mikitm018_joha_outer_18__divskn.farc 86DBB4E8\nrom/osage_play_data/mikitm052_joha_outer_52__divskn.farc 5B5E678F\nrom/osage_play_data/mikitm053_joha_outer_53__divskn.farc 868CA7C4\nrom/osage_play_data/mikitm054_joha_outer_54__divskn.farc 877477C0\nrom/osage_play_data/mikitm055_joha_outer_55__divskn.farc 75042FD0\nrom/osage_play_data/mikitm056_joha_outer_56__divskn.farc 0F4B4CDA\nrom/osage_play_data/mikitm057_joha_outer_57__divskn.farc 2758996C\nrom/osage_play_data/mikitm058_joha_outer_58__divskn.farc 3EF56380\nrom/osage_play_data/mikitm059_joha_outer_59__divskn.farc 5B9261A4\nrom/osage_play_data/mikitm060_joha_outer_60__divskn.farc 2611B024\nrom/osage_play_data/mikitm061_joha_outer_61__divskn.farc 67AE1670\nrom/osage_play_data/mikitm063_joha_outer_63__divskn.farc 0476390A\nrom/osage_play_data/mikitm064_joha_outer_64__divskn.farc 249613F5\nrom/osage_play_data/mikitm066_joha_outer_66__divskn.farc C7B3CCD2\nrom/osage_play_data/mikitm067_joha_outer_67__divskn.farc 25CD8AAC\nrom/osage_play_data/mikitm068_joha_outer_68__divskn.farc 49755D54\nrom/osage_play_data/mikitm069_joha_outer_69__divskn.farc 9B8B27BD\nrom/osage_play_data/mikitm070_joha_outer_70__divskn.farc ECF8248C\nrom/osage_play_data/mikitm071_joha_outer_71__divskn.farc D21C7CB1\nrom/osage_play_data/mikitm072_joha_outer_72__divskn.farc 00EE13D9\nrom/osage_play_data/mikitm073_joha_outer_73__divskn.farc E8DE271C\nrom/osage_play_data/mikitm074_joha_outer_74__divskn.farc AA2AC555\nrom/osage_play_data/mikitm075_joha_outer_75__divskn.farc 4EFB3558\nrom/osage_play_data/mikitm076_joha_outer_76__divskn.farc 001EF92D\nrom/osage_play_data/mikitm077_joha_outer_77__divskn.farc 1907316D\nrom/osage_play_data/mikitm079_joha_outer_79__divskn.farc 93DE36C9\nrom/osage_play_data/mikitm080_joha_outer_80__divskn.farc 78696628\nrom/osage_play_data/mikitm081_joha_outer_81__divskn.farc CCB13F20\nrom/osage_play_data/mikitm082_joha_outer_82__divskn.farc 23439E59\nrom/osage_play_data/mikitm083_joha_outer_83__divskn.farc 20FEFA06\nrom/osage_play_data/mikitm084_joha_outer_84__divskn.farc FF6B41CB\nrom/osage_play_data/mikitm085_joha_outer_85__divskn.farc DA1BF7D5\nrom/osage_play_data/mikitm087_joha_outer_87__divskn.farc 351D4947\nrom/osage_play_data/mikitm088_joha_outer_88__divskn.farc 52068901\nrom/osage_play_data/mikitm089_joha_outer_89__divskn.farc 962B382B\nrom/osage_play_data/mikitm090_joha_outer_90__divskn.farc C8B1C14E\nrom/osage_play_data/mikitm091_joha_outer_91__divskn.farc 1BFFCA25\nrom/osage_play_data/mikitm093_joha_outer_93__divskn.farc 2809A570\nrom/osage_play_data/mikitm094_joha_outer_94__divskn.farc F36C9D1A\nrom/osage_play_data/mikitm095_joha_outer_95__divskn.farc 85F95FC6\nrom/osage_play_data/mikitm096_joha_outer_96__divskn.farc 0971AF0C\nrom/osage_play_data/mikitm097_joha_outer_97__divskn.farc 9C8B69A3\nrom/osage_play_data/mikitm098_joha_outer_98__divskn.farc 5D84105E\nrom/osage_play_data/mikitm099_joha_outer_99__divskn.farc 08F3AE2E\nrom/osage_play_data/mikitm100_joha_outer_100__divskn.farc 5096F736\nrom/osage_play_data/mikitm101_joha_outer_101__divskn.farc 07E4FA05\nrom/osage_play_data/mikitm102_joha_outer_102__divskn.farc 8E0625D1\nrom/osage_play_data/mikitm103_joha_outer_103__divskn.farc 82048ED0\nrom/osage_play_data/mikitm104_joha_outer_104__divskn.farc 4AD804AA\nrom/osage_play_data/mikitm106_joha_outer_106__divskn.farc 58D41A53\nrom/osage_play_data/mikitm107_joha_outer_107__divskn.farc FAAACC87\nrom/osage_play_data/mikitm108_joha_outer_108__divskn.farc 5FA1E91A\nrom/osage_play_data/mikitm109_joha_outer_109__divskn.farc D0524124\nrom/osage_play_data/mikitm110_joha_outer_110__divskn.farc D9CD475F\nrom/osage_play_data/mikitm111_joha_outer_111__divskn.farc B6FC2D48\nrom/osage_play_data/mikitm112_joha_outer_112__divskn.farc CBB35A82\nrom/osage_play_data/mikitm113_joha_outer_113__divskn.farc A079FBBA\nrom/osage_play_data/mikitm114_joha_outer_114__divskn.farc C5360D75\nrom/osage_play_data/mikitm115_joha_outer_115__divskn.farc BCF9C091\nrom/osage_play_data/mikitm116_joha_outer_116__divskn.farc 47F74740\nrom/osage_play_data/mikitm118_joha_outer_118__divskn.farc B37C71F0\nrom/osage_play_data/mikitm120_joha_outer_120__divskn.farc 0B5E8483\nrom/osage_play_data/mikitm123_joha_outer_123__divskn.farc E0A97A46\nrom/osage_play_data/mikitm124_joha_outer_124__divskn.farc FB90FD8B\nrom/osage_play_data/mikitm125_joha_outer_125__divskn.farc CAD247FB\nrom/osage_play_data/mikitm126_joha_outer_126__divskn.farc 37F5EC84\nrom/osage_play_data/mikitm127_joha_outer_127__divskn.farc D9AD6D88\nrom/osage_play_data/mikitm128_joha_outer_128__divskn.farc 843501FC\nrom/osage_play_data/mikitm129_joha_outer_129__divskn.farc 68B818B2\nrom/osage_play_data/mikitm130_joha_outer_130__divskn.farc 443D87F4\nrom/osage_play_data/mikitm131_joha_outer_131__divskn.farc 7A6BCFC9\nrom/osage_play_data/mikitm132_joha_outer_132__divskn.farc 7FC69252\nrom/osage_play_data/mikitm133_joha_outer_133__divskn.farc E52CA6C1\nrom/osage_play_data/mikitm135_joha_outer_135__divskn.farc 50B26D77\nrom/osage_play_data/mikitm136_joha_outer_136__divskn.farc D3BA12F0\nrom/osage_play_data/mikitm137_joha_outer_137__divskn.farc 92FBD8A7\nrom/osage_play_data/mikitm138_joha_outer_138__divskn.farc AA660E98\nrom/osage_play_data/mikitm139_joha_outer_139__divskn.farc 42532DED\nrom/osage_play_data/mikitm140_joha_outer_140__divskn.farc A05B9808\nrom/osage_play_data/mikitm141_joha_outer_141__divskn.farc 64F7D8FD\nrom/osage_play_data/mikitm142_joha_outer_142__divskn.farc 630FA76E\nrom/osage_play_data/mikitm143_joha_outer_143__divskn.farc 393F018F\nrom/osage_play_data/mikitm144_joha_outer_144__divskn.farc 66BBFB4B\nrom/osage_play_data/mikitm145_joha_outer_145__divskn.farc 792C5F7F\nrom/osage_play_data/mikitm146_joha_outer_146__divskn.farc AB9A1D42\nrom/osage_play_data/mikitm148_joha_outer_148__divskn.farc 047F98A3\nrom/osage_play_data/mikitm149_joha_outer_149__divskn.farc E731FE1D\nrom/osage_play_data/mikitm151_joha_outer_151__divskn.farc 37EAF8E1\nrom/osage_play_data/mikitm152_joha_outer_152__divskn.farc 98D68B26\nrom/osage_play_data/mikitm153_joha_outer_153__divskn.farc 4241B513\nrom/osage_play_data/mikitm155_joha_outer_155__divskn.farc C764ABE0\nrom/osage_play_data/mikitm156_joha_outer_156__divskn.farc AE2F50C1\nrom/osage_play_data/mikitm158_joha_outer_158__divskn.farc 6DF1511D\nrom/osage_play_data/mikitm160_joha_outer_160__divskn.farc 062C06C4\nrom/osage_play_data/mikitm162_joha_outer_162__divskn.farc 691E633B\nrom/osage_play_data/mikitm163_joha_outer_163__divskn.farc 7553FF13\nrom/osage_play_data/mikitm164_joha_outer_164__divskn.farc 91730035\nrom/osage_play_data/mikitm167_joha_outer_167__divskn.farc 2C31A4B4\nrom/osage_play_data/mikitm169_joha_outer_169__divskn.farc 122F66AF\nrom/osage_play_data/mikitm170_joha_outer_170__divskn.farc 4683BF35\nrom/osage_play_data/mikitm173_joha_outer_173__divskn.farc E69262EC\nrom/osage_play_data/mikitm431_ude_hand_131__divskn.farc 2F796BC4\nrom/osage_play_data/mikitm438_ude_hand_138__divskn.farc 9A04ED95\nrom/osage_play_data/mikitm467_ude_hand_167__divskn.farc 249487EA\nrom/osage_play_data/mikitm500_atam_atama_00__divskn.farc 5D433A5C\nrom/osage_play_data/mikitm501_atam_atama_01__divskn.farc 7143B409\nrom/osage_play_data/mikitm502_atam_atama_02__divskn.farc 68CFB014\nrom/osage_play_data/mikitm504_atam_atama_04__divskn.farc 2696CABA\nrom/osage_play_data/mikitm505_atam_atama_05__divskn.farc 1D20B96C\nrom/osage_play_data/mikitm507_atam_atama_07__divskn.farc 7001A379\nrom/osage_play_data/mikitm508_atam_atama_08__divskn.farc A1A3F964\nrom/osage_play_data/mikitm509_atam_atama_09__divskn.farc 6668BCF4\nrom/osage_play_data/mikitm520_atam_atama_20__divskn.farc 036F9253\nrom/osage_play_data/mikitm522_atam_atama_22__divskn.farc 02365F27\nrom/osage_play_data/mikitm524_atam_atama_24__divskn.farc 7ECC284E\nrom/osage_play_data/mikitm525_atam_atama_25__divskn.farc EE93390D\nrom/osage_play_data/mikitm526_atam_atama_26__divskn.farc 5FB8ED33\nrom/osage_play_data/mikitm527_atam_atama_27__divskn.farc 7295A73F\nrom/osage_play_data/mikitm528_atam_atama_28__divskn.farc FE546E3F\nrom/osage_play_data/mikitm530_atam_atama_30__divskn.farc 6F9FABC8\nrom/osage_play_data/mikitm531_atam_atama_31__divskn.farc 2B44DFC3\nrom/osage_play_data/mikitm533_atam_atama_33__divskn.farc E9076770\nrom/osage_play_data/mikitm534_atam_atama_34__divskn.farc A1996671\nrom/osage_play_data/mikitm536_atam_atama_36__divskn.farc 43AD5E68\nrom/osage_play_data/mikitm537_atam_atama_37__divskn.farc 715E94B4\nrom/osage_play_data/mikitm538_atam_atama_38__divskn.farc FF0BAAFB\nrom/osage_play_data/mikitm539_atam_atama_39__divskn.farc FF764FD2\nrom/osage_play_data/mikitm540_atam_atama_40__divskn.farc C9A89F46\nrom/osage_play_data/mikitm541_atam_atama_41__divskn.farc ED32CF9D\nrom/osage_play_data/mikitm542_atam_atama_42__divskn.farc BBFAC916\nrom/osage_play_data/mikitm543_atam_atama_43__divskn.farc F3012E36\nrom/osage_play_data/mikitm544_atam_atama_44__divskn.farc 5F074B24\nrom/osage_play_data/mikitm545_atam_atama_45__divskn.farc 03F251CE\nrom/osage_play_data/mikitm547_atam_atama_47__divskn.farc 0A9D4670\nrom/osage_play_data/mikitm548_atam_atama_48__divskn.farc 0363257C\nrom/osage_play_data/mikitm549_atam_atama_49__divskn.farc 08125A39\nrom/osage_play_data/mikitm550_atam_atama_50__divskn.farc 3B9B0149\nrom/osage_play_data/mikitm551_atam_atama_51__divskn.farc A6A313F0\nrom/osage_play_data/mikitm552_atam_atama_52__divskn.farc 644BEFA2\nrom/osage_play_data/mikitm553_atam_atama_53__divskn.farc 138906F6\nrom/osage_play_data/mikitm554_atam_atama_54__divskn.farc D692EE39\nrom/osage_play_data/mikitm555_atam_atama_55__divskn.farc 6345309B\nrom/osage_play_data/mikitm556_atam_atama_56__divskn.farc 3328C03E\nrom/osage_play_data/mikitm557_atam_atama_57__divskn.farc 178C1C9E\nrom/osage_play_data/mikitm558_atam_atama_58__divskn.farc 7758BDE1\nrom/osage_play_data/mikitm051_joha_outer_51__divskn.farc 24075F80\nrom/osage_play_data/mikitm065_joha_outer_65__divskn.farc C124A2CE\nrom/osage_play_data/mikitm078_joha_outer_78__divskn.farc BB7D4CD4\nrom/osage_play_data/mikitm092_joha_outer_92__divskn.farc C461B197\nrom/osage_play_data/mikitm105_joha_outer_105__divskn.farc 9CDF642A\nrom/osage_play_data/mikitm119_joha_outer_119__divskn.farc 732DF778\nrom/osage_play_data/mikitm134_joha_outer_134__divskn.farc 24E5C749\nrom/osage_play_data/mikitm147_joha_outer_147__divskn.farc D29F40E4\nrom/osage_play_data/mikitm165_joha_outer_165__divskn.farc 4D9F3AD9\nrom/osage_play_data/mikitm506_atam_atama_06__divskn.farc FD4F5EC9\nrom/osage_play_data/mikitm532_atam_atama_32__divskn.farc C3938517\nrom/osage_play_data/mikitm560_atam_atama_60__divskn.farc 08566814\nrom/osage_play_data/mikitm593_atam_atama_93__divskn.farc 16D2262C\nrom/osage_play_data/mikitm594_atam_atama_94__divskn.farc 71B045D7\nrom/osage_play_data/mikitm595_atam_atama_95__divskn.farc 54091089\nrom/osage_play_data/mikitm596_atam_atama_96__divskn.farc 7CAB0678\nrom/osage_play_data/mikitm597_atam_atama_97__divskn.farc 5700C167\nrom/osage_play_data/mikitm598_atam_atama_98__divskn.farc 8986BF0A\nrom/osage_play_data/mikitm599_atam_atama_99__divskn.farc E4587445\nrom/osage_play_data/mikitm600_atam_atama_100__divskn.farc 59ABE7A0\nrom/osage_play_data/mikitm601_atam_atama_101__divskn.farc 3D37F970\nrom/osage_play_data/mikitm602_atam_atama_102__divskn.farc 41BD39D5\nrom/osage_play_data/mikitm603_atam_atama_103__divskn.farc 2A7940E6\nrom/osage_play_data/mikitm605_atam_atama_105__divskn.farc 1BA8826D\nrom/osage_play_data/mikitm606_atam_atama_106__divskn.farc 816FE5AC\nrom/osage_play_data/mikitm607_atam_atama_107__divskn.farc CFBD2571\nrom/osage_play_data/mikitm608_atam_atama_108__divskn.farc 2B56B76F\nrom/osage_play_data/mikitm609_atam_atama_109__divskn.farc 32E06A44\nrom/osage_play_data/mikitm610_atam_atama_110__divskn.farc 9E02E15B\nrom/osage_play_data/mikitm611_atam_atama_111__divskn.farc 85F14AF4\nrom/osage_play_data/mikitm612_atam_atama_112__divskn.farc 7F07D1A2\nrom/osage_play_data/mikitm613_atam_atama_113__divskn.farc F0BB2270\nrom/osage_play_data/mikitm614_atam_atama_114__divskn.farc AAF58313\nrom/osage_play_data/mikitm615_atam_atama_115__divskn.farc 8FF7539D\nrom/osage_play_data/mikitm616_atam_atama_116__divskn.farc 669106D9\nrom/osage_play_data/mikitm619_atam_atama_119__divskn.farc BB5C4569\nrom/osage_play_data/mikitm620_atam_atama_120__divskn.farc CFC99CAD\nrom/osage_play_data/mikitm621_atam_atama_121__divskn.farc 33BFEFFC\nrom/osage_play_data/mikitm623_atam_atama_123__divskn.farc F5381E60\nrom/osage_play_data/mikitm624_atam_atama_124__divskn.farc E2125EB5\nrom/osage_play_data/mikitm625_atam_atama_125__divskn.farc BCCC2F27\nrom/osage_play_data/mikitm626_atam_atama_126__divskn.farc 8DB4A3BB\nrom/osage_play_data/mikitm627_atam_atama_127__divskn.farc 3FEDB426\nrom/osage_play_data/mikitm628_atam_atama_128__divskn.farc 4622D8C5\nrom/osage_play_data/mikitm630_atam_atama_130__divskn.farc 6CCD49EF\nrom/osage_play_data/mikitm631_atam_atama_131__divskn.farc F7939C97\nrom/osage_play_data/mikitm632_atam_atama_132__divskn.farc 637BA830\nrom/osage_play_data/mikitm634_atam_atama_134__divskn.farc AD9B29B8\nrom/osage_play_data/mikitm635_atam_atama_135__divskn.farc 0FE4C76E\nrom/osage_play_data/mikitm636_atam_atama_136__divskn.farc 45EF3994\nrom/osage_play_data/mikitm637_atam_atama_137__divskn.farc A690BA96\nrom/osage_play_data/mikitm638_atam_atama_138__divskn.farc 3225F835\nrom/osage_play_data/mikitm639_atam_atama_139__divskn.farc 771C5442\nrom/osage_play_data/mikitm640_atam_atama_140__divskn.farc 773ADCC7\nrom/osage_play_data/mikitm641_atam_atama_141__divskn.farc 415CE3B9\nrom/osage_play_data/mikitm642_atam_atama_142__divskn.farc A41AC77D\nrom/osage_play_data/mikitm643_atam_atama_143__divskn.farc 17003D44\nrom/osage_play_data/mikitm644_atam_atama_144__divskn.farc 924FC03B\nrom/osage_play_data/mikitm645_atam_atama_145__divskn.farc 9BC1D7BC\nrom/osage_play_data/mikitm647_atam_atama_147__divskn.farc DB838E7C\nrom/osage_play_data/mikitm648_atam_atama_148__divskn.farc 1E45B96B\nrom/osage_play_data/mikitm649_atam_atama_149__divskn.farc F2C31356\nrom/osage_play_data/mikitm651_atam_atama_151__divskn.farc 249BD040\nrom/osage_play_data/mikitm652_atam_atama_152__divskn.farc 1C519B79\nrom/osage_play_data/mikitm653_atam_atama_153__divskn.farc 2A12631D\nrom/osage_play_data/mikitm655_atam_atama_155__divskn.farc 416937C2\nrom/osage_play_data/mikitm656_atam_atama_156__divskn.farc DA344261\nrom/osage_play_data/mikitm658_atam_atama_158__divskn.farc 7DB98357\nrom/osage_play_data/mikitm660_atam_atama_160__divskn.farc FFC127E8\nrom/osage_play_data/mikitm662_atam_atama_162__divskn.farc 852317AE\nrom/osage_play_data/mikitm663_atam_atama_163__divskn.farc 0AFB1800\nrom/osage_play_data/mikitm665_atam_atama_165__divskn.farc E62EC854\nrom/osage_play_data/mikitm667_atam_atama_167__divskn.farc 7FC1CDED\nrom/osage_play_data/mikitm669_atam_atama_169__divskn.farc 63730994\nrom/osage_play_data/mikitm670_atam_atama_170__divskn.farc 12C4364D\nrom/osage_play_data/mikitm673_atam_atama_173__divskn.farc 4AA191D7\nrom/osage_play_data/mikitm700_atam_zujo_00__divskn.farc 7F183636\nrom/osage_play_data/mikitm702_atam_zujo_02__divskn.farc 067E368F\nrom/osage_play_data/mikitm709_atam_zujo_09__divskn.farc 0658BE2B\nrom/osage_play_data/mikitm711_atam_zujo_11__divskn.farc 7C49BED9\nrom/osage_play_data/mikitm715_atam_zujo_15__divskn.farc 3C551435\nrom/osage_play_data/mikitm718_atam_zujo_18__divskn.farc BF298B9C\nrom/osage_play_data/mikitm721_atam_zujo_21__divskn.farc 38DBF2D9\nrom/osage_play_data/mikitm722_atam_zujo_22__divskn.farc 8C72D2C9\nrom/osage_play_data/mikitm746_atam_zujo_46__divskn.farc 8ED3D73B\nrom/osage_play_data/mikitm748_atam_zujo_48__divskn.farc DD421265\nrom/osage_play_data/mikitm749_atam_zujo_49__divskn.farc 88A9C55E\nrom/osage_play_data/mikitm751_joha_neck_51__divskn.farc 8F5C1569\nrom/osage_play_data/mikitm752_joha_neck_52__divskn.farc 4B2561CD\nrom/osage_play_data/mikitm775_joha_ushiro_75__divskn.farc 17843906\nrom/osage_play_data/mikitm776_joha_ushiro_76__divskn.farc E74561CD\nrom/osage_play_data/mikitm777_joha_ushiro_77__divskn.farc 9F7A665A\nrom/osage_play_data/mikitm780_joha_ushiro_80__divskn.farc 799DC471\nrom/osage_play_data/mikitm781_joha_ushiro_81__divskn.farc 3E30C1AE\nrom/osage_play_data/mikitm782_joha_ushiro_82__divskn.farc 958CE7B8\nrom/osage_play_data/mikitm783_joha_ushiro_83__divskn.farc 531D9F32\nrom/osage_play_data/mikitm784_joha_ushiro_84__divskn.farc 610FF50F\nrom/osage_play_data/neritm001_joha_outer_01__divskn.farc EDE6196B\nrom/osage_play_data/neritm002_joha_outer_02__divskn.farc DCD3F39E\nrom/osage_play_data/neritm003_joha_outer_03__divskn.farc EEF96C79\nrom/osage_play_data/neritm004_joha_outer_04__divskn.farc A194AAEF\nrom/osage_play_data/neritm500_atam_atama_00__divskn.farc 39110BFC\nrom/osage_play_data/neritm501_atam_atama_01__divskn.farc 1713D600\nrom/osage_play_data/opd_db.txt 496925BF\nrom/osage_play_data/rinitm001_joha_outer_01__divskn.farc 0A839D9A\nrom/osage_play_data/rinitm002_joha_outer_02__divskn.farc 342E8B00\nrom/osage_play_data/rinitm003_joha_outer_03__divskn.farc 9CDBE4A1\nrom/osage_play_data/rinitm004_joha_outer_04__divskn.farc ED69FCAD\nrom/osage_play_data/rinitm006_joha_outer_06__divskn.farc 1EDF33B9\nrom/osage_play_data/rinitm007_joha_outer_07__divskn.farc 86734AF4\nrom/osage_play_data/rinitm009_joha_outer_09__divskn.farc D603D8BB\nrom/osage_play_data/rinitm010_joha_outer_10__divskn.farc 2A5B34A4\nrom/osage_play_data/rinitm011_joha_outer_11__divskn.farc 2E2615F1\nrom/osage_play_data/rinitm012_joha_outer_12__divskn.farc 86522A15\nrom/osage_play_data/rinitm013_joha_outer_13__divskn.farc 608BB838\nrom/osage_play_data/rinitm014_joha_outer_14__divskn.farc EE763F94\nrom/osage_play_data/rinitm015_joha_outer_15__divskn.farc 10357546\nrom/osage_play_data/rinitm016_joha_outer_16__divskn.farc C71CABDC\nrom/osage_play_data/rinitm017_joha_outer_17__divskn.farc EEBE3EAB\nrom/osage_play_data/rinitm018_joha_outer_18__divskn.farc 9BF404C7\nrom/osage_play_data/rinitm020_joha_outer_20__divskn.farc 42B4FFC3\nrom/osage_play_data/rinitm021_joha_outer_21__divskn.farc 87FDCD8E\nrom/osage_play_data/rinitm023_joha_outer_23__divskn.farc 265E6647\nrom/osage_play_data/rinitm024_joha_outer_24__divskn.farc 8F703E04\nrom/osage_play_data/rinitm025_joha_outer_25__divskn.farc E6D952F5\nrom/osage_play_data/rinitm026_joha_outer_26_zzc__divskn.farc DF8E5555\nrom/osage_play_data/rinitm027_joha_outer_27__divskn.farc C03EEB1F\nrom/osage_play_data/rinitm028_joha_outer_28__divskn.farc 51993096\nrom/osage_play_data/rinitm029_joha_outer_29__divskn.farc F0150CE8\nrom/osage_play_data/rinitm030_joha_outer_30__divskn.farc 3B09D19A\nrom/osage_play_data/rinitm031_joha_outer_31__divskn.farc EBCA9776\nrom/osage_play_data/rinitm032_joha_outer_32__divskn.farc E90D4627\nrom/osage_play_data/rinitm034_joha_outer_34__divskn.farc 707247E4\nrom/osage_play_data/rinitm035_joha_outer_35__divskn.farc EB79F191\nrom/osage_play_data/rinitm036_joha_outer_36__divskn.farc 64B77D04\nrom/osage_play_data/rinitm037_joha_outer_37__divskn.farc 48D54336\nrom/osage_play_data/rinitm038_joha_outer_38__divskn.farc C40F6C04\nrom/osage_play_data/rinitm039_joha_outer_39__divskn.farc 9C553581\nrom/osage_play_data/rinitm040_joha_outer_40__divskn.farc 0F977FD0\nrom/osage_play_data/rinitm041_joha_outer_41__divskn.farc B523E7ED\nrom/osage_play_data/rinitm043_joha_outer_43__divskn.farc 9465BA07\nrom/osage_play_data/rinitm044_joha_outer_44__divskn.farc F50DF47D\nrom/osage_play_data/rinitm045_joha_outer_45__divskn.farc F9116755\nrom/osage_play_data/rinitm047_joha_outer_47__divskn.farc 7FFE1197\nrom/osage_play_data/rinitm500_atam_atama_00__divskn.farc C08C30E4\nrom/osage_play_data/rinitm501_atam_atama_01__divskn.farc 5D2FCD92\nrom/osage_play_data/rinitm502_atam_atama_02__divskn.farc A9E6648E\nrom/osage_play_data/rinitm503_atam_atama_03__divskn.farc C8FE0B4B\nrom/osage_play_data/rinitm504_atam_atama_04__divskn.farc 040CEFA3\nrom/osage_play_data/rinitm505_atam_atama_05__divskn.farc CC750AE3\nrom/osage_play_data/rinitm506_atam_atama_06__divskn.farc 9E7AF4E6\nrom/osage_play_data/rinitm507_atam_atama_07__divskn.farc F0644ADE\nrom/osage_play_data/rinitm508_atam_atama_08__divskn.farc 9E79ABA4\nrom/osage_play_data/rinitm509_atam_atama_09__divskn.farc D38DF128\nrom/osage_play_data/rinitm510_atam_atama_10__divskn.farc 25471C50\nrom/osage_play_data/rinitm511_atam_atama_11__divskn.farc D7CC70D3\nrom/osage_play_data/mikitm559_atam_atama_59__divskn.farc ABBABD95\nrom/osage_play_data/mikitm604_atam_atama_104__divskn.farc B39217A9\nrom/osage_play_data/mikitm618_atam_atama_118__divskn.farc 14C10AC9\nrom/osage_play_data/mikitm633_atam_atama_133__divskn.farc EF72925D\nrom/osage_play_data/mikitm646_atam_atama_146__divskn.farc 43B53A4A\nrom/osage_play_data/mikitm664_atam_atama_164__divskn.farc 2F682199\nrom/osage_play_data/mikitm745_atam_zujo_45__divskn.farc D925013A\nrom/osage_play_data/mikitm790_atam_zujo_90__divskn.farc 814FFB3F\nrom/osage_play_data/rinitm005_joha_outer_05__divskn.farc F727E78D\nrom/osage_play_data/rinitm019_joha_outer_19__divskn.farc 709CCC66\nrom/osage_play_data/rinitm033_joha_outer_33__divskn.farc CBB6B94A\nrom/osage_play_data/rinitm048_joha_outer_48__divskn.farc FFB47632\nrom/osage_play_data/rinitm512_atam_atama_12__divskn.farc F9CA0EC6\nrom/osage_play_data/rinitm530_atam_atama_30__divskn.farc AE5BD7CF\nrom/osage_play_data/rinitm544_atam_atama_44__divskn.farc 71095016\nrom/osage_play_data/rinitm711_atam_zujo_11__divskn.farc D74DB1B9\nrom/osage_play_data/rinitm999_atam_zujo_99__divskn.farc B01B3026\nrom/osage_play_data/rinitm513_atam_atama_13__divskn.farc 44AB9FB9\nrom/osage_play_data/rinitm514_atam_atama_14__divskn.farc A5B4A9E7\nrom/osage_play_data/rinitm515_atam_atama_15__divskn.farc ADA34A75\nrom/osage_play_data/rinitm516_atam_atama_16__divskn.farc CC734CBF\nrom/osage_play_data/rinitm517_atam_atama_17__divskn.farc 4B50C1B7\nrom/osage_play_data/rinitm518_atam_atama_18__divskn.farc 2028605F\nrom/osage_play_data/rinitm519_atam_atama_19__divskn.farc CFAC51ED\nrom/osage_play_data/rinitm520_atam_atama_20__divskn.farc 5F780E73\nrom/osage_play_data/rinitm526_atam_atama_26__divskn.farc 8F7DF1C2\nrom/osage_play_data/rinitm527_atam_atama_27__divskn.farc 67FD4629\nrom/osage_play_data/rinitm528_atam_atama_28__divskn.farc 4C131B53\nrom/osage_play_data/rinitm529_atam_atama_29__divskn.farc 16F1FAC1\nrom/osage_play_data/rinitm531_atam_atama_31__divskn.farc 9EFEC507\nrom/osage_play_data/rinitm532_atam_atama_32__divskn.farc C8259187\nrom/osage_play_data/rinitm533_atam_atama_33__divskn.farc 8A99533D\nrom/osage_play_data/rinitm534_atam_atama_34__divskn.farc D405935D\nrom/osage_play_data/rinitm535_atam_atama_35__divskn.farc EE9D84AA\nrom/osage_play_data/rinitm536_atam_atama_36__divskn.farc CC858F46\nrom/osage_play_data/rinitm537_atam_atama_37__divskn.farc EB48FEDA\nrom/osage_play_data/rinitm538_atam_atama_38__divskn.farc 77388B1B\nrom/osage_play_data/rinitm539_atam_atama_39__divskn.farc 28D88FD6\nrom/osage_play_data/rinitm540_atam_atama_40__divskn.farc EC80C27A\nrom/osage_play_data/rinitm541_atam_atama_41__divskn.farc A4A779BA\nrom/osage_play_data/rinitm543_atam_atama_43__divskn.farc D1437206\nrom/osage_play_data/rinitm545_atam_atama_45__divskn.farc 5DC8AEFD\nrom/osage_play_data/rinitm547_atam_atama_47__divskn.farc A07E3090\nrom/osage_play_data/rinitm548_atam_atama_48__divskn.farc 1D3B4160\nrom/osage_play_data/rinitm701_atam_zujo_01__divskn.farc C0CDDB3D\nrom/osage_play_data/rinitm702_atam_zujo_02__divskn.farc 08A5586A\nrom/osage_play_data/rinitm703_atam_zujo_03__divskn.farc F58FE49C\nrom/osage_play_data/rinitm704_atam_zujo_04__divskn.farc 76A70934\nrom/osage_play_data/rinitm705_atam_zujo_05__divskn.farc 91A61EA4\nrom/osage_play_data/rinitm706_atam_zujo_06__divskn.farc 0327B644\nrom/osage_play_data/rinitm707_atam_zujo_07__divskn.farc 83F761CF\nrom/osage_play_data/rinitm708_atam_zujo_08__divskn.farc E47311C5\nrom/osage_play_data/rinitm709_atam_zujo_09__divskn.farc 90192DBF\nrom/osage_play_data/rinitm710_atam_zujo_10__divskn.farc 969C10D7\nrom/osage_play_data/rinitm712_atam_zujo_12__divskn.farc F3CE52FB\nrom/osage_play_data/rinitm714_atam_zujo_14__divskn.farc 919DA24B\nrom/osage_play_data/rinitm715_atam_zujo_15__divskn.farc 57A2615D\nrom/osage_play_data/rinitm716_atam_zujo_16__divskn.farc B9B12F6B\nrom/osage_play_data/rinitm717_atam_zujo_17__divskn.farc 0E689172\nrom/osage_play_data/rinitm718_atam_zujo_18__divskn.farc 874FE32A\nrom/osage_play_data/rinitm719_atam_zujo_19__divskn.farc 080F6CDA\nrom/osage_play_data/rinitm720_atam_zujo_20__divskn.farc 4931CFDA\nrom/osage_play_data/rinitm721_atam_zujo_21__divskn.farc 2A8AC623\nrom/osage_play_data/rinitm775_joha_ushiro_75__divskn.farc 715D3878\nrom/osage_play_data/rinitm776_joha_ushiro_76__divskn.farc 23FFA255\nrom/osage_play_data/rinitm777_joha_ushiro_77__divskn.farc 0FB16EAE\nrom/osage_play_data/sakitm001_joha_outer_01__divskn.farc C8B39E86\nrom/osage_play_data/sakitm002_joha_outer_02__divskn.farc 5C006629\nrom/osage_play_data/sakitm003_joha_outer_03__divskn.farc 9EE55756\nrom/osage_play_data/sakitm005_joha_outer_05__divskn.farc 963013B5\nrom/osage_play_data/sakitm500_atam_atama_00__divskn.farc 0330E51D\nrom/osage_play_data/sakitm501_atam_atama_01__divskn.farc 3109EE48\nrom/osage_play_data/sakitm775_joha_ushiro_75__divskn.farc 75E21C3F\nrom/osage_play_data/tetitm001_joha_outer_01__divskn.farc E3B1B8B0\nrom/osage_play_data/tetitm002_joha_outer_02__divskn.farc C603ACFD\nrom/osage_play_data/tetitm003_joha_outer_03__divskn.farc DADC11B4\nrom/osage_play_data/tetitm500_atam_atama_00__divskn.farc 20FB6DC0\nrom/osage_play_data/tetitm502_atam_atama_02__divskn.farc CDF2D3FD\nrom/osage_play_data/tetitm503_atam_atama_03__divskn.farc 46CF6C76\nrom/particle/eff_pv247_cookie.farc AD331A6F\nrom/particle/eff_pv247_offset_test.farc ECC8E673\nrom/particle/eff_pv247_star.farc 8BA13F52\nrom/particle/eff_pv249_kirakira.farc 49BA60C2\nrom/particle/eff_pv250_burneer.farc DD994371\nrom/particle/eff_pv250_taxi.farc 62C6BB64\nrom/particle/eff_pv250_yuge.farc 8613517D\nrom/particle/eff_pv253_hanabi.farc FC0799D3\nrom/particle/eff_pv253_hanabi_test.farc 789FA432\nrom/particle/eff_pv253_konpei.farc 61CFDBED\nrom/particle/eff_pv253_light_glow.farc 96F5ACE1\nrom/particle/eff_pv253_light_glow_test.farc BCA9DDD4\nrom/particle/eff_pv253_moyasmoke.farc BD686C99\nrom/particle/eff_pv253_s05_coaster.farc 4390D9AE\nrom/particle/eff_pv253_smoke.farc 6321C589\nrom/particle/eff_pv255_onpu.farc 05FD9CA2\nrom/particle/eff_pv262_light_glow.farc D7AD18F9\nrom/particle/eff_pv604_main.farc 039427CF\nrom/particle/eff_pv604_tail.farc C7F01C93\nrom/particle/eff_pv710_main.farc 29975A9C\nrom/particle/eff_pv710_success.farc 48A29F53\nrom/particle/eff_pv717_rain.farc 50A5B268\nrom/particle/eff_PV722_main.farc 269D0B2D\nrom/particle/eff_pv723_main.farc E69562A8\nrom/particle/eff_pv723_success.farc F556D355\nrom/particle/eff_PV724_main.farc E0D538F6\nrom/particle/eff_PV726_main.farc D307DE16\nrom/particle/eff_pv726_success.farc 44C4012E\nrom/particle/eff_PV727_cut042.farc CDD163DD\nrom/particle/eff_PV727_main.farc 43BA1D29\nrom/particle/eff_PV728_cut050.farc D7D45504\nrom/particle/eff_PV728_cut051.farc 8E0CD34D\nrom/particle/eff_pv728_cut127.farc 80E1408E\nrom/particle/eff_PV728_lightbar.farc 4B835109\nrom/particle/eff_PV728_lightbar_climax.farc 61303E05\nrom/particle/eff_PV728_lightbar_nomalmax.farc BAD64A35\nrom/particle/eff_PV728_smoke.farc DCE25A30\nrom/particle/eff_pv729_gimmick.farc 260833BF\nrom/particle/eff_pv729_main.farc 2F0401E7\nrom/particle/eff_pv729_reef.farc 39B91E39\nrom/particle/eff_pv729_steam_1f.farc 5131DE23\nrom/particle/eff_pv729_steam_2f.farc EED55FD5\nrom/particle/eff_pv729_steam_3f.farc 8FBD08FD\nrom/particle/eff_pv731_ayasaki.farc E3C0B3FD\nrom/particle/eff_pv731_katana_aura_p1.farc 52CD9A22\nrom/particle/eff_pv731_main.farc 58F0EB90\nrom/particle/eff_pv731_miku.farc D3869868\nrom/particle/eff_pv731_miku_delete.farc 73C7979F\nrom/particle/eff_pv731_reef.farc 3FA00C66\nrom/particle/eff_pv731_stop.farc AA54274D\nrom/particle/eff_pv731_sword_p1.farc 80E51364\nrom/particle/eff_PV732_main.farc 7097AD25\nrom/particle/eff_pv733_main.farc BCC29B48\nrom/particle/eff_pv733_rain.farc FFB3C9E3\nrom/particle/eff_PV734_hibana.farc A890D639\nrom/particle/eff_PV734_hibana_n.farc 07C98142\nrom/particle/eff_PV734_hibana_s.farc C105F8B5\nrom/particle/eff_PV734_hibana_success.farc ED50AF6F\nrom/particle/eff_pv734_hinoko.farc 76DED1C3\nrom/particle/eff_pv734_hokori.farc 80AA3722\nrom/particle/eff_pv253_smoke_cloud.farc 0FF52EF6\nrom/particle/eff_pv728_cut011.farc 4D39835A\nrom/particle/eff_pv731_katana_aura_p2.farc 5CCDB57A\nrom/particle/eff_pv734_main.farc C8DF196E\nrom/particle/eff_PV736_lightchip.farc 3B515D80\nrom/particle/eff_pv734_nor.farc 9E2E4094\nrom/particle/eff_pv734_nor_hinoko.farc C31746C6\nrom/particle/eff_pv734_spark.farc 86587705\nrom/particle/eff_pv734_suc.farc 16EAA6F7\nrom/particle/eff_pv734_suc_hinoko.farc 4E6179C8\nrom/particle/eff_PV734_thunder.farc 9B852225\nrom/particle/eff_PV736_barbroken.farc 7C81276D\nrom/particle/eff_PV736_bubble.farc 2D79A719\nrom/particle/eff_PV736_bubble01.farc 3C66B156\nrom/particle/eff_PV736_chip.farc B6E8E311\nrom/particle/eff_PV736_crushball.farc 5A33971C\nrom/particle/eff_PV736_crushball01.farc 0EA7492F\nrom/particle/eff_PV736_cubebird.farc C7B890E2\nrom/particle/eff_PV736_dustchip01.farc B401A1B3\nrom/particle/eff_PV736_guitar.farc C54F59ED\nrom/particle/eff_PV736_whitechip.farc 3C88D673\nrom/particle/eff_pv737_breath.farc ED8C676E\nrom/particle/eff_pv737_main.farc 2B130795\nrom/particle/eff_PV737_shitsunai.farc 817168E3\nrom/particle/eff_pv738_card_particle.farc 79A767E7\nrom/particle/eff_pv738_success.farc ED39D61D\nrom/particle/eff_pv738_success_start.farc 90E25B1F\nrom/particle/eff_PV739_daiza.farc CF96C5EC\nrom/particle/eff_PV739_fireworks.farc A2544915\nrom/particle/eff_PV739_hover.farc F4CA4CC9\nrom/particle/eff_pv739_kirakira.farc 63253521\nrom/particle/eff_pv739_kirakira_hand.farc DAC91901\nrom/particle/eff_pv739_kirakira_line.farc 027F428A\nrom/particle/eff_pv739_kirakira_line_jikki.farc 674C5109\nrom/particle/eff_pv739_light.farc 9D14C47F\nrom/particle/eff_pv739_main.farc F8E7371D\nrom/particle/eff_pv739_main_jikki.farc 4E13C1AB\nrom/particle/eff_PV739_monitor.farc 08B71967\nrom/particle/eff_pv739_smoke.farc 24194B15\nrom/particle/eff_pv739_star.farc E7BD497F\nrom/particle/eff_pv739_star_down.farc 441FCB2E\nrom/particle/eff_pv739_star_jikki.farc CE3ACA0B\nrom/particle/eff_pv740_main.farc 52410870\nrom/particle/eff_pv740_mik_foot.farc 00F21438\nrom/particle/eff_pv740_mik_room.farc AD77D666\nrom/particle/eff_pv740_mik_sky.farc C2E5E591\nrom/particle/eff_pv740_skyonpu.farc F2854B53\nrom/particle/eff_pv740_success.farc 14B6BA93\nrom/particle/eff_stgpv832_cream_snow.farc 3CFA8004\nrom/particle/eff_stgpv832_main.farc 0E3AB30C\nrom/photo_print/aime_frame.tga 86B3E9F3\nrom/photo_print/header01.jpg 25C555EC\nrom/photo_print/header02.jpg 2B0C8913\nrom/photo_print/ic_img01.jpg 0EF317F6\nrom/photo_print/ic_img02.jpg 8450F97F\nrom/photo_print/ic_img03_01.jpg 811672C7\nrom/photo_print/ic_img04_01.jpg 10AF68C5\nrom/photo_print/ic_pity01.jpg E248C663\nrom/photo_print/ic_pity02.jpg 758B7F24\nrom/photo_print/ic_pity03.jpg A3C41D70\nrom/photo_print/ic_pity04.jpg F99DF5BE\nrom/photo_print/ic_pity05.jpg A62C1CB0\nrom/photo_print/img01_sample.jpg 67775A6A\nrom/photo_print/img02_sample.jpg E9B4DA0E\nrom/photo_print/img03_01.jpg 4586644D\nrom/photo_print/img04_01.jpg B88876B1\nrom/photo_print/pity01.jpg 3B7A2A55\nrom/photo_print/pity02.jpg 6CD6913D\nrom/photo_print/pity03.jpg D84B88F3\nrom/photo_print/pity04.jpg 7BDDC3CC\nrom/photo_print/pity05.jpg 1AD3763B\nrom/photo_print/ss_rights01.tga 5ED59C1D\nrom/photo_print/ss_rights01_ic.tga 59DE8C6D\nrom/photo_print/ss_rights02.tga 8027905B\nrom/photo_print/ss_rights02_ic.tga A246F183\nrom/photo_print/ss_rights03.tga 2EF36550\nrom/photo_print/ss_rights03_ic.tga 4D1EAE49\nrom/photo_print/ss_rights04_l.tga F4BCCBA4\nrom/photo_print/ss_rights04_l_ic.tga 3DB31DA1\nrom/photo_print/ss_rights04_r.tga 1905A8A2\nrom/photo_print/ss_rights04_r_ic.tga 6A9D3C62\nrom/photo_print/ss_rights05.tga 5D076B55\nrom/pv_expression/exp_PV206.bin 2A283830\nrom/pv_expression/exp_PV219.bin C0A2FC9C\nrom/pv_expression/exp_PV238.bin 21C775E2\nrom/pv_expression/exp_PV239.bin 00E1D3FE\nrom/pv_expression/exp_PV240.bin 49B5D1F9\nrom/pv_expression/exp_PV241.bin 0FE653C1\nrom/pv_expression/exp_PV242.bin 342DDE5B\nrom/pv_expression/exp_PV243.bin 0FD6AB88\nrom/pv_expression/exp_PV244.bin 5E9DC803\nrom/pv_expression/exp_PV246.bin E42BDE6B\nrom/pv_expression/exp_PV247.bin 717E0FFB\nrom/pv_expression/exp_PV248.bin 0D39046F\nrom/pv_expression/exp_PV249.bin 8BF61673\nrom/pv_expression/exp_PV250.bin 3C211D2E\nrom/pv_expression/exp_PV251.bin AC51996D\nrom/pv_expression/exp_PV253.bin E96058D0\nrom/pv_expression/exp_PV255.bin 54393F48\nrom/pv_expression/exp_PV259.bin 2520BA14\nrom/pv_expression/exp_PV260.bin 1A44D4B9\nrom/pv_expression/exp_PV261.bin 7C4EB670\nrom/pv_expression/exp_PV262.bin 31F3B9F0\nrom/pv_expression/exp_PV432.bin 51BDED3A\nrom/pv_expression/exp_PV433.bin 9791CBC2\nrom/pv_expression/exp_PV434.bin D9C76514\nrom/pv_expression/exp_PV435.bin E59705CA\nrom/pv_expression/exp_PV600.bin D38B105D\nrom/pv_expression/exp_PV601.bin 184B934B\nrom/pv_expression/exp_PV602.bin 9AFB8045\nrom/pv_expression/exp_PV603.bin EDBED130\nrom/pv_expression/exp_PV604.bin ABAB85DF\nrom/pv_expression/exp_PV605.bin 8E0B2351\nrom/pv_expression/exp_PV607.bin F1F80366\nrom/pv_expression/exp_PV608.bin CD08EE40\nrom/pv_expression/exp_PV609.bin 7E79571A\nrom/pv_expression/exp_PV611.bin F272A78C\nrom/pv_expression/exp_PV612.bin DF247F48\nrom/pv_expression/exp_PV613.bin E4CF5BC7\nrom/pv_expression/exp_PV614.bin 590E3DEB\nrom/pv_expression/exp_PV615.bin 5157E68D\nrom/pv_expression/exp_PV616.bin 732DFF4A\nrom/pv_expression/exp_PV617.bin FD1F9A90\nrom/pv_expression/exp_PV618.bin 2DD6700F\nrom/pv_expression/exp_PV619.bin 25828064\nrom/pv_expression/exp_PV620.bin 305377B5\nrom/pv_expression/exp_PV621.bin F6D467C2\nrom/pv_expression/exp_PV622.bin A13589EF\nrom/pv_expression/exp_PV623.bin 51A708A8\nrom/pv_expression/exp_PV624.bin 6FB635A5\nrom/pv_expression/exp_PV625.bin 0CA7989C\nrom/pv_expression/exp_PV626.bin 2FB449FE\nrom/pv_expression/exp_PV627.bin D689E5C9\nrom/pv_expression/exp_PV629.bin 8C0D1E03\nrom/pv_expression/exp_PV630.bin 3CF1B314\nrom/pv_expression/exp_PV631.bin D29D9934\nrom/pv_expression/exp_PV637.bin 6558D09D\nrom/pv_expression/exp_PV638.bin 66B36A3B\nrom/pv_expression/exp_PV639.bin 2FEB93DB\nrom/pv_expression/exp_PV640.bin C07AC05D\nrom/pv_expression/exp_PV641.bin 1162840E\nrom/pv_expression/exp_PV642.bin 35092553\nrom/pv_expression/exp_PV710.bin 49D838C5\nrom/pv_expression/exp_PV722.bin 9139DD7B\nrom/pv_expression/exp_PV723.bin 096D50DA\nrom/pv_expression/exp_PV724.bin 7E67C971\nrom/pv_expression/exp_PV725.bin 25A1C4DD\nrom/pv_expression/exp_PV726.bin 9F5B394F\nrom/pv_expression/exp_PV727.bin 7E66AE5D\nrom/pv_expression/exp_PV728.bin 4054ED6C\nrom/pv_expression/exp_PV729.bin B2DBDF2B\nrom/pv_expression/exp_PV730.bin B3AB20AB\nrom/pv_expression/exp_PV731.bin 4740AD26\nrom/pv_expression/exp_PV732.bin 021B7BAE\nrom/pv_expression/exp_PV733.bin C92D29F5\nrom/pv_expression/exp_PV734.bin 8A65B959\nrom/pv_expression/exp_PV736.bin C2316A4C\nrom/pv_expression/exp_PV737.bin 77785185\nrom/pv_expression/exp_PV738.bin B0826499\nrom/pv_expression/exp_PV739.bin 4D168904\nrom/pv_expression/exp_PV740.bin 44D2C17F\nrom/pv_expression/exp_PV832.bin 3FDEF7C1\nrom/pv_expression/exp_PV257.bin 7F5B6F34\nrom/pv_expression/exp_PV610.bin DA21FE7D\nrom/pv_expression/exp_PV628.bin DA4B1889\nrom/ranking/dummy_thumb.jpg 4CDAA935\nrom/rob/mot_PV029_FACE_NER.farc BFD4CCF9\nrom/rob/mothead_AUTH_HAK.bin 28571485\nrom/rob/mothead_AUTH_KAI.bin E78CAC79\nrom/rob/mothead_AUTH_LEN.bin A38F5693\nrom/rob/mothead_AUTH_LUK.bin 8597EFF4\nrom/rob/mothead_AUTH_MEI.bin D8B4FEB2\nrom/rob/mothead_AUTH_MIK.bin C614E78F\nrom/rob/mothead_AUTH_NER.bin CFC38663\nrom/rob/mothead_AUTH_RIN.bin AA543CCB\nrom/rob/mothead_AUTH_SAK.bin C5594550\nrom/rob/mothead_CMN.bin A9AC3C98\nrom/rob/mothead_EDT.bin 1C2CB8B3\nrom/rob/mothead_EDT2.bin 2D941FE6\nrom/rob/mothead_EDTF1.bin CF3F09C1\nrom/rob/mothead_PV001.bin 862484C2\nrom/rob/mothead_PV002.bin 8EF54CF2\nrom/rob/mothead_PV003.bin 4FF9277B\nrom/rob/mothead_PV005.bin 4082775E\nrom/rob/mothead_PV006.bin 8FA10C2E\nrom/rob/mothead_PV007.bin BC64B5FF\nrom/rob/mothead_PV008.bin 740E0E3E\nrom/rob/mothead_PV009.bin A162B9C4\nrom/rob/mothead_PV010.bin B632502C\nrom/rob/mothead_PV011.bin 6BE16818\nrom/rob/mothead_PV012.bin FCA63D95\nrom/rob/mothead_PV013.bin 53DE0A31\nrom/rob/mothead_PV014.bin 9062BF06\nrom/rob/mothead_PV015.bin E780E0AA\nrom/rob/mothead_PV016.bin F265CC85\nrom/rob/mothead_PV017.bin 618D4351\nrom/rob/mothead_PV018.bin 3A1C9EA8\nrom/rob/mothead_PV019.bin 9136094F\nrom/rob/mothead_PV020.bin 45E5B032\nrom/rob/mothead_PV022.bin A4C6C7C8\nrom/rob/mothead_PV023.bin C4AC97C0\nrom/rob/mothead_PV024.bin B4489779\nrom/rob/mothead_PV025.bin DA135C5F\nrom/rob/mothead_PV027.bin 31E02C70\nrom/rob/mothead_PV028.bin 504E0F2D\nrom/rob/mothead_PV029.bin BCF26BFF\nrom/rob/mothead_PV030.bin 7C88CFEE\nrom/rob/mothead_PV031.bin 39AF33C4\nrom/rob/mothead_PV032.bin EC4390B0\nrom/rob/mothead_PV037.bin 55D65577\nrom/rob/mothead_PV038.bin 21CB698B\nrom/rob/mothead_PV039.bin 970635DC\nrom/rob/mothead_PV040.bin C76CF362\nrom/rob/mothead_PV041.bin D836A057\nrom/rob/mothead_PV042.bin 83809182\nrom/rob/mothead_PV044.bin 0111ADF0\nrom/rob/mothead_PV045.bin 2D87EB5C\nrom/rob/mothead_PV046.bin 2A3C9D46\nrom/rob/mothead_PV047.bin F3884670\nrom/rob/mothead_PV048.bin 1FFE60BC\nrom/rob/mothead_PV049.bin 7B6A950A\nrom/rob/mothead_PV050.bin E4DA3236\nrom/rob/mothead_PV051.bin 413127E5\nrom/rob/mothead_PV052.bin DABF952D\nrom/rob/mothead_PV053.bin 1C2D75A0\nrom/rob/mothead_PV054.bin 0116A225\nrom/rob/mothead_PV055.bin D634319E\nrom/rob/mothead_PV056.bin EE06BE93\nrom/rob/mothead_PV057.bin 44E7EF21\nrom/rob/mothead_PV058.bin 3F8D9581\nrom/rob/mothead_PV059.bin C2DD284B\nrom/rob/mothead_PV004.bin 93BC6611\nrom/rob/mothead_PV021.bin B65ECB1F\nrom/rob/mothead_PV043.bin 3A162295\nrom/rob/mothead_PV060.bin B09EE39D\nrom/rob/mothead_PV090.bin E9D38868\nrom/rob/mothead_PV208.bin 59200449\nrom/rob/mothead_PV231.bin C8A48CF8\nrom/rob/mothead_PV250.bin 8C2BACF9\nrom/rob/mothead_PV604.bin 09595E47\nrom/rob/mothead_PV622.bin 4560D379\nrom/rob/mothead_PV722.bin EE85A47C\nrom/rob/mothead_PV740.bin 4B01DE0B\nrom/rob/mot_HAK.farc AA0412C9\nrom/rob/mot_PV012.farc AD3EA805\nrom/rob/mot_PV027_FACE_LEN.farc ABF0594D\nrom/rob/mothead_PV061.bin 56D7207D\nrom/rob/mothead_PV062.bin 1852F643\nrom/rob/mothead_PV063.bin 5F6BD13D\nrom/rob/mothead_PV064.bin CE157258\nrom/rob/mothead_PV065.bin 859793DB\nrom/rob/mothead_PV066.bin 00C4A54D\nrom/rob/mothead_PV079.bin B4A31CD8\nrom/rob/mothead_PV081.bin BD0C5DCD\nrom/rob/mothead_PV082.bin E735BDDA\nrom/rob/mothead_PV083.bin E217DC74\nrom/rob/mothead_PV084.bin 431C85A9\nrom/rob/mothead_PV085.bin FA64792D\nrom/rob/mothead_PV086.bin 1389A49D\nrom/rob/mothead_PV087.bin B5EF9185\nrom/rob/mothead_PV088.bin 36D7CFB7\nrom/rob/mothead_PV089.bin 69326BE8\nrom/rob/mothead_PV091.bin 7DA63EFF\nrom/rob/mothead_PV092.bin A441C861\nrom/rob/mothead_PV093.bin 6A018296\nrom/rob/mothead_PV094.bin 3062873F\nrom/rob/mothead_PV095.bin F177223F\nrom/rob/mothead_PV096.bin D02218C8\nrom/rob/mothead_PV097.bin 0B644940\nrom/rob/mothead_PV102.bin 26BD22CF\nrom/rob/mothead_PV103.bin F5960BE0\nrom/rob/mothead_PV104.bin 8F210090\nrom/rob/mothead_PV201.bin 68FCEAD8\nrom/rob/mothead_PV202.bin 63E1B617\nrom/rob/mothead_PV204.bin 80617968\nrom/rob/mothead_PV205.bin 8E3424EE\nrom/rob/mothead_PV206.bin 5F22B61A\nrom/rob/mothead_PV207.bin 72C3D410\nrom/rob/mothead_PV210.bin DC6E5B36\nrom/rob/mothead_PV211.bin 29694311\nrom/rob/mothead_PV212.bin 885DA744\nrom/rob/mothead_PV213.bin F7D83A68\nrom/rob/mothead_PV214.bin FEC451C1\nrom/rob/mothead_PV218.bin D3CAD61D\nrom/rob/mothead_PV219.bin 907C93C0\nrom/rob/mothead_PV220.bin AFEA5750\nrom/rob/mothead_PV221.bin 9E0A442C\nrom/rob/mothead_PV222.bin 6A2F6512\nrom/rob/mothead_PV223.bin 901CA512\nrom/rob/mothead_PV224.bin EF252B7F\nrom/rob/mothead_PV225.bin F2ABEB4B\nrom/rob/mothead_PV226.bin 94110BF0\nrom/rob/mothead_PV227.bin 13D43BF0\nrom/rob/mothead_PV228.bin 785CBFEC\nrom/rob/mothead_PV232.bin F70D696D\nrom/rob/mothead_PV233.bin FFB18436\nrom/rob/mothead_PV234.bin 2B091843\nrom/rob/mothead_PV235.bin 94517E67\nrom/rob/mothead_PV236.bin C1F65832\nrom/rob/mothead_PV238.bin 10F84BDF\nrom/rob/mothead_PV239.bin E7599A8E\nrom/rob/mothead_PV240.bin 8D5FAE26\nrom/rob/mothead_PV241.bin EDECF060\nrom/rob/mothead_PV242.bin 785B33A6\nrom/rob/mothead_PV243.bin 1F7777F7\nrom/rob/mothead_PV244.bin 501EFC69\nrom/rob/mothead_PV246.bin 8281FDBA\nrom/rob/mothead_PV247.bin 7FCC32CF\nrom/rob/mothead_PV248.bin A4E3F518\nrom/rob/mothead_PV249.bin 447C81E6\nrom/rob/mothead_PV251.bin 044A01B1\nrom/rob/mothead_PV253.bin 088B3988\nrom/rob/mothead_PV255.bin EDF65EE7\nrom/rob/mothead_PV257.bin 60ABBEBA\nrom/rob/mothead_PV259.bin 86C88A3D\nrom/rob/mothead_PV260.bin F4E28C06\nrom/rob/mothead_PV261.bin F054B4EB\nrom/rob/mothead_PV262.bin B3DE54B9\nrom/rob/mothead_PV432.bin 5901BA12\nrom/rob/mothead_PV433.bin D01E4A05\nrom/rob/mothead_PV434.bin 534FC8B4\nrom/rob/mothead_PV435.bin 39688F9C\nrom/rob/mothead_PV600.bin 2CA3E84B\nrom/rob/mothead_PV601.bin 33655BBB\nrom/rob/mothead_PV602.bin E8B5BE33\nrom/rob/mothead_PV603.bin 2B5609CC\nrom/rob/mothead_PV605.bin 71138329\nrom/rob/mothead_PV607.bin EE15744B\nrom/rob/mothead_PV608.bin 9AE2A665\nrom/rob/mothead_PV609.bin 76AF802E\nrom/rob/mothead_PV610.bin 1FDBE08F\nrom/rob/mothead_PV611.bin F6CC9D4B\nrom/rob/mothead_PV612.bin 17F0CF94\nrom/rob/mothead_PV613.bin A2B38CF3\nrom/rob/mothead_PV614.bin 17C24EA0\nrom/rob/mothead_PV615.bin 8873275B\nrom/rob/mothead_PV616.bin 76BD7837\nrom/rob/mothead_PV617.bin 2D377174\nrom/rob/mothead_PV618.bin 9C78366C\nrom/rob/mothead_PV619.bin 5032AE35\nrom/rob/mothead_PV620.bin 2EEE7D43\nrom/rob/mothead_PV621.bin 2420EFDD\nrom/rob/mothead_PV623.bin 57B6EA67\nrom/rob/mothead_PV624.bin 0D0466DC\nrom/rob/mothead_PV625.bin A5BFA40F\nrom/rob/mothead_PV626.bin 7BBFBF8B\nrom/rob/mothead_PV627.bin B9A20532\nrom/rob/mothead_PV628.bin 76285120\nrom/rob/mothead_PV629.bin 86441FD6\nrom/rob/mothead_PV630.bin 4DB269C0\nrom/rob/mothead_PV631.bin 0FB2BF34\nrom/rob/mothead_PV637.bin B2B99A41\nrom/rob/mothead_PV638.bin 1373CCEE\nrom/rob/mothead_PV639.bin 7A988415\nrom/rob/mothead_PV640.bin 68A7C26B\nrom/rob/mothead_PV641.bin BDAB3D2C\nrom/rob/mothead_PV642.bin 4DAC25B6\nrom/rob/mothead_PV710.bin 01238C7E\nrom/rob/mothead_PV723.bin F738290D\nrom/rob/mothead_PV724.bin 988EC738\nrom/rob/mothead_PV725.bin 79EC1284\nrom/rob/mothead_PV726.bin 7DBED8D1\nrom/rob/mothead_PV727.bin 708CF6EA\nrom/rob/mothead_PV728.bin 1EAFEF66\nrom/rob/mothead_PV729.bin FB1A2F30\nrom/rob/mothead_PV730.bin 399FD761\nrom/rob/mothead_PV731.bin 20C30D75\nrom/rob/mothead_PV732.bin AC300D2A\nrom/rob/mothead_PV733.bin BC232212\nrom/rob/mothead_PV734.bin 3F75063A\nrom/rob/mothead_PV736.bin CA4A42CA\nrom/rob/mothead_PV737.bin 30C81D0D\nrom/rob/mothead_PV738.bin AE74F2D7\nrom/rob/mothead_PV739.bin C7EB4022\nrom/rob/mothead_PV832.bin 850AD2A8\nrom/rob/mothead_TEST_DESIGN.bin 2645DD0D\nrom/rob/mot_ALL_SELECTOR_POSE.farc DD1FB415\nrom/rob/mot_AUTH_HAK.farc D06E913A\nrom/rob/mot_AUTH_KAI.farc C4E11950\nrom/rob/mot_AUTH_LEN.farc 54832199\nrom/rob/mot_AUTH_LUK.farc FCDE3F60\nrom/rob/mot_AUTH_MEI.farc 5022A71D\nrom/rob/mot_AUTH_MIK.farc 39EDE6D9\nrom/rob/mot_AUTH_NER.farc 0C4E858B\nrom/rob/mot_AUTH_RIN.farc 9C644FE4\nrom/rob/mot_AUTH_SAK.farc 28932520\nrom/rob/mot_CMN.farc 28AE6059\nrom/rob/mot_db.farc 6E06941F\nrom/rob/mot_EDT.farc 476B72D7\nrom/rob/mot_EDT2.farc 9A45D7CF\nrom/rob/mot_EDTF1.farc C98DA9BF\nrom/rob/mot_KAI.farc A686B386\nrom/rob/mot_LEN.farc 97AD9349\nrom/rob/mot_LUK.farc 2839D708\nrom/rob/mot_MEI.farc 6F2AFE71\nrom/rob/mot_MIK.farc D361F11D\nrom/rob/mot_NER.farc 83214E6B\nrom/rob/mot_PV001.farc 80B55785\nrom/rob/mot_PV002.farc 2430AA45\nrom/rob/mot_PV003.farc D82364CE\nrom/rob/mot_PV004.farc 71F656A1\nrom/rob/mot_PV005.farc C7DB4FCB\nrom/rob/mot_PV006.farc 59E61319\nrom/rob/mot_PV007.farc 416B5E54\nrom/rob/mot_PV008.farc DD98009F\nrom/rob/mot_PV009.farc C6E483CA\nrom/rob/mot_PV010.farc CE632342\nrom/rob/mot_PV011.farc 507EDAAE\nrom/rob/mot_PV013.farc 59E31C33\nrom/rob/mot_PV014.farc 42A1F736\nrom/rob/mot_PV015.farc AD3B1B5E\nrom/rob/mot_PV016.farc 9B7CF300\nrom/rob/mot_PV017.farc 779B5F95\nrom/rob/mot_PV018.farc 039870FE\nrom/rob/mot_PV019.farc F685F4FF\nrom/rob/mot_PV020.farc 9092CB1C\nrom/rob/mot_PV021.farc 23255833\nrom/rob/mot_PV022.farc AFB89EF1\nrom/rob/mot_PV023.farc 555F0452\nrom/rob/mot_PV024.farc A951E754\nrom/rob/mot_PV025.farc 0FAF6575\nrom/rob/mot_PV027.farc D7872F90\nrom/rob/mot_PV027_FACE_HAK.farc DA971F43\nrom/rob/mot_PV027_FACE_KAI.farc 7D4CB428\nrom/rob/mot_PV027_FACE_LUK.farc 8582CA8F\nrom/rob/mot_PV027_FACE_MEI.farc 6C3E5992\nrom/rob/mot_PV027_FACE_MIK.farc 4B668F81\nrom/rob/mot_PV027_FACE_NER.farc 29EDBAA9\nrom/rob/mot_PV027_FACE_RIN.farc 086A4A96\nrom/rob/mot_PV027_FACE_SAK.farc F12E4D27\nrom/rob/mot_PV027_FACE_TET.farc 3DDAD540\nrom/rob/mot_PV028.farc 5F3C4913\nrom/rob/mot_PV029.farc A09E6E6F\nrom/rob/mot_PV029_FACE_HAK.farc A587BAC9\nrom/rob/mot_PV029_FACE_KAI.farc 7B05E08D\nrom/rob/mot_PV029_FACE_LEN.farc 83C45CEE\nrom/rob/mot_PV029_FACE_LUK.farc 5EE78E7C\nrom/rob/mot_PV029_FACE_MEI.farc 2BC1FD5C\nrom/rob/mot_PV029_FACE_MIK.farc 3C70F039\nrom/rob/mot_PV029_FACE_RIN.farc 2E9C26CA\nrom/rob/mot_PV029_FACE_SAK.farc 0119EBAB\nrom/rob/mot_PV029_FACE_TET.farc BEF6FDB6\nrom/rob/mot_PV030.farc 9065CECD\nrom/rob/mot_PV030_FACE_HAK.farc 583E7D47\nrom/rob/mot_PV030_FACE_KAI.farc 7D2088D1\nrom/rob/mot_PV030_FACE_LEN.farc C513CFE4\nrom/rob/mot_PV030_FACE_LUK.farc 0B3CFE9F\nrom/rob/mot_PV030_FACE_MEI.farc 8EAC371B\nrom/rob/mot_PV030_FACE_MIK.farc 106D954F\nrom/rob/mot_PV030_FACE_NER.farc 9D3C0936\nrom/rob/mot_PV030_FACE_RIN.farc 988D14BB\nrom/rob/mot_PV030_FACE_SAK.farc 62E19641\nrom/rob/mot_PV030_FACE_TET.farc FDFDF2C8\nrom/rob/mot_PV031.farc 1B3A22BD\nrom/rob/mot_PV031_FACE_KAI.farc 8178813B\nrom/rob/mot_PV031_FACE_LEN.farc BBD8FF75\nrom/rob/mot_PV031_FACE_LUK.farc 8F336BC6\nrom/rob/mot_PV031_FACE_MEI.farc 4AAA30E7\nrom/rob/mot_PV031_FACE_MIK.farc B9231D06\nrom/rob/mot_PV031_FACE_NER.farc C882B93B\nrom/rob/mot_PV031_FACE_RIN.farc 5A118BF2\nrom/rob/mot_PV031_FACE_SAK.farc 4127FD9E\nrom/rob/mot_PV031_FACE_TET.farc 438764E8\nrom/rob/mot_PV032.farc 73DB10DC\nrom/rob/mot_PV032_FACE_HAK.farc 2C1C5509\nrom/rob/mot_PV032_FACE_KAI.farc C6FD97CE\nrom/rob/mot_PV032_FACE_LEN.farc 071BDD88\nrom/rob/mot_PV032_FACE_LUK.farc B6EB3BE5\nrom/rob/mot_PV032_FACE_MEI.farc 7E04431C\nrom/rob/mot_PV032_FACE_MIK.farc E5B7558C\nrom/rob/mot_PV032_FACE_RIN.farc 1D8B4315\nrom/rob/mot_PV032_FACE_SAK.farc E23477FC\nrom/rob/mot_PV032_FACE_TET.farc 693E634C\nrom/rob/mot_PV037.farc A8910973\nrom/rob/mot_PV038.farc 00E45EB8\nrom/rob/mot_PV039.farc 6AE62BF3\nrom/rob/mot_PV040.farc 0AEB8C5A\nrom/rob/mot_PV041.farc B0A35172\nrom/rob/mot_PV042.farc B2F170A1\nrom/rob/mot_PV043.farc 0158079E\nrom/rob/mot_PV044.farc 5F735677\nrom/rob/mot_PV045.farc AB1B3818\nrom/rob/mot_PV046.farc F72C3906\nrom/rob/mot_PV047.farc 6495CBDD\nrom/rob/mot_PV048.farc 16E120B7\nrom/rob/mot_PV049.farc DCA86EC5\nrom/rob/mot_PV050.farc BDC4C6C9\nrom/rob/mot_PV052.farc B7B60AB3\nrom/rob/mot_PV053.farc 899C150C\nrom/rob/mot_PV054.farc 9CC8409E\nrom/rob/mot_PV055.farc 1E74CBB7\nrom/rob/mot_PV056.farc EA13A898\nrom/rob/mot_PV057.farc 47E84F6F\nrom/rob/mot_PV058.farc AAB7FE03\nrom/rob/mot_PV059.farc 4B1FEDD7\nrom/rob/mot_PV060.farc C2A418C9\nrom/rob/mot_PV061.farc 8D28C33D\nrom/rob/mot_PV062.farc A9E35B74\nrom/rob/mot_PV063.farc 32DB766A\nrom/rob/mot_PV064.farc 01D763D1\nrom/rob/mot_PV065.farc E5F6AAC4\nrom/rob/mot_PV066.farc 0A5DA6D2\nrom/rob/mot_PV079.farc 4A1A8AA0\nrom/rob/mot_PV081.farc 9702C7F1\nrom/rob/mot_PV083.farc D8B7EFE7\nrom/rob/mot_PV084.farc 42AB59A8\nrom/rob/mot_PV085.farc E18F2171\nrom/rob/mot_PV086.farc 292AAA03\nrom/rob/mot_PV087.farc 463CA0C6\nrom/rob/mot_PV088.farc AA2C3AFE\nrom/rob/mot_PV089.farc 153E3C23\nrom/rob/mot_PV090.farc E24F08AC\nrom/rob/mot_PV091.farc CB5759AE\nrom/rob/mot_PV092.farc 732E2696\nrom/rob/mot_PV093.farc 98E41F08\nrom/rob/mot_PV094.farc C327FA78\nrom/rob/mot_PV095.farc AE673996\nrom/rob/mot_PV096.farc C2D694E7\nrom/rob/mot_PV097.farc E676ED74\nrom/rob/mot_PV102.farc 3C9A124A\nrom/rob/mot_PV102_FACE_KAI.farc FCCCC86F\nrom/rob/mot_PV102_FACE_LEN.farc 9796B616\nrom/rob/mot_PV102_FACE_LUK.farc 3B2C937F\nrom/rob/mot_PV102_FACE_MEI.farc CA0F893F\nrom/rob/mot_PV102_FACE_MIK.farc 0E90FF3D\nrom/rob/mot_PV102_FACE_NER.farc 5FF2D2E8\nrom/rob/mot_PV102_FACE_RIN.farc 6500A6CA\nrom/rob/mot_PV102_FACE_SAK.farc 9F7313AA\nrom/rob/mot_PV102_FACE_TET.farc 0F79667B\nrom/rob/mot_PV103.farc D6D877CF\nrom/rob/mot_PV103_FACE_HAK.farc DB3E0D49\nrom/rob/mot_PV103_FACE_KAI.farc 89E85660\nrom/rob/mot_PV103_FACE_LEN.farc 1BA17F81\nrom/rob/mot_PV103_FACE_LUK.farc 32231FC2\nrom/rob/mot_PV103_FACE_MEI.farc CF1E5D20\nrom/rob/mot_PV103_FACE_NER.farc 9E7C371E\nrom/rob/mot_PV103_FACE_RIN.farc FE715049\nrom/rob/mot_PV103_FACE_SAK.farc 36EC3596\nrom/rob/mot_PV103_FACE_TET.farc 6FF65A81\nrom/rob/mot_PV104.farc 05DDCE82\nrom/rob/mot_PV104_FACE_HAK.farc 6079A137\nrom/rob/mot_PV104_FACE_KAI.farc 700047FF\nrom/rob/mot_PV104_FACE_LEN.farc 0A933EDC\nrom/rob/mot_PV104_FACE_LUK.farc 35FCB1FB\nrom/rob/mot_PV104_FACE_MEI.farc 0907703E\nrom/rob/mot_PV104_FACE_MIK.farc 407F154D\nrom/rob/mot_PV104_FACE_NER.farc BAEA0F52\nrom/rob/mot_PV104_FACE_RIN.farc 0687A07B\nrom/rob/mot_PV104_FACE_SAK.farc 9FBA005B\nrom/rob/mot_PV104_FACE_TET.farc 294384E0\nrom/rob/mot_PV201_FACE_HAK.farc BF802324\nrom/rob/mot_PV201_FACE_KAI.farc FF7124EB\nrom/rob/mot_PV201_FACE_LEN.farc 5FF94D0E\nrom/rob/mot_PV201_FACE_LUK.farc B1EB5966\nrom/rob/mot_PV201_FACE_MEI.farc D46D936F\nrom/rob/mot_PV201_FACE_MIK.farc 9C4EBA4D\nrom/rob/mot_PV201_FACE_NER.farc B3732EEE\nrom/rob/mot_PV201_FACE_RIN.farc 494E673D\nrom/rob/mot_PV201_FACE_SAK.farc DE79533F\nrom/rob/mot_PV201_FACE_TET.farc C36BBA55\nrom/rob/mot_PV202.farc 0ADC19DC\nrom/rob/mot_PV202_FACE_HAK.farc FA3FA8E8\nrom/rob/mot_PV202_FACE_KAI.farc 805719A3\nrom/rob/mot_PV202_FACE_LEN.farc A7597636\nrom/rob/mot_PV202_FACE_LUK.farc 0D8DFF60\nrom/rob/mot_PV202_FACE_MIK.farc DD50EC7A\nrom/rob/mot_PV202_FACE_NER.farc 328C6663\nrom/rob/mot_PV202_FACE_RIN.farc 585228F2\nrom/rob/mot_PV202_FACE_SAK.farc DE23EB72\nrom/rob/mot_PV202_FACE_TET.farc 6F3E2D37\nrom/rob/mot_PV204.farc 39A1E77D\nrom/rob/mot_PV204_FACE_HAK.farc FBED96A8\nrom/rob/mot_PV204_FACE_KAI.farc 542C5FC1\nrom/rob/mot_PV204_FACE_LEN.farc 98EEC3B5\nrom/rob/mot_PV204_FACE_LUK.farc 79315D9A\nrom/rob/mot_PV204_FACE_MEI.farc D7F851AB\nrom/rob/mot_PV204_FACE_MIK.farc B51F768E\nrom/rob/mot_PV204_FACE_NER.farc 2B79E1A6\nrom/rob/mot_PV204_FACE_RIN.farc 778DA720\nrom/rob/mot_PV204_FACE_SAK.farc 87C8EF9A\nrom/rob/mot_PV205.farc A2E21EEA\nrom/rob/mot_PV205_FACE_HAK.farc A508B6A6\nrom/rob/mot_PV205_FACE_KAI.farc B9844EE9\nrom/rob/mot_PV205_FACE_LEN.farc 892F0BBD\nrom/rob/mot_PV205_FACE_LUK.farc D4ECBC43\nrom/rob/mot_PV205_FACE_MEI.farc 9A8B0E18\nrom/rob/mot_PV205_FACE_MIK.farc 3260903A\nrom/rob/mot_PV205_FACE_NER.farc 3B081816\nrom/rob/mot_PV205_FACE_RIN.farc 850C0FF8\nrom/rob/mot_PV205_FACE_SAK.farc 3CBC3B6A\nrom/rob/mot_PV205_FACE_TET.farc 6B1CF400\nrom/rob/mot_PV206.farc 72660B2D\nrom/rob/mot_PV206_FACE_HAK.farc D279636B\nrom/rob/mot_PV206_FACE_KAI.farc 552976CD\nrom/rob/mot_PV206_FACE_LEN.farc EA2C49C5\nrom/rob/mot_PV206_FACE_MEI.farc 8A250A93\nrom/rob/mot_PV206_FACE_MIK.farc 7D70536C\nrom/rob/mot_PV206_FACE_NER.farc B94704DC\nrom/rob/mot_PV206_FACE_RIN.farc 468FB881\nrom/rob/mot_PV206_FACE_SAK.farc F5BF820C\nrom/rob/mot_PV206_FACE_TET.farc 98D8C417\nrom/rob/mot_PV207.farc 0391AD72\nrom/rob/mot_PV207_FACE_HAK.farc 9D369AA1\nrom/rob/mot_PV207_FACE_KAI.farc 88762C11\nrom/rob/mot_PV207_FACE_LEN.farc F244E846\nrom/rob/mot_PV207_FACE_LUK.farc 13AC524F\nrom/rob/mot_PV207_FACE_MEI.farc C747B780\nrom/rob/mot_PV207_FACE_MIK.farc 0CCCFF55\nrom/rob/mot_PV207_FACE_NER.farc 15391257\nrom/rob/mot_PV207_FACE_RIN.farc D4DDC517\nrom/rob/mot_PV207_FACE_TET.farc CAF6DF29\nrom/rob/mot_PV208.farc C66506EF\nrom/rob/mot_PV208_FACE_HAK.farc 1B8C64B2\nrom/rob/mot_PV208_FACE_KAI.farc 76CD4111\nrom/rob/mot_PV208_FACE_LEN.farc 67ECE393\nrom/rob/mot_PV208_FACE_LUK.farc 6EF1CD38\nrom/rob/mot_PV208_FACE_MEI.farc 2EF514F6\nrom/rob/mot_PV208_FACE_MIK.farc CD1A3737\nrom/rob/mot_PV208_FACE_NER.farc FDE8FF73\nrom/rob/mot_PV208_FACE_RIN.farc 4DE67660\nrom/rob/mot_PV208_FACE_SAK.farc 9550ABEC\nrom/rob/mot_PV208_FACE_TET.farc B45021B5\nrom/rob/mot_PV210.farc 3E5944B2\nrom/rob/mot_PV210_FACE_HAK.farc 653E7C8D\nrom/rob/mot_PV210_FACE_KAI.farc 2D7C422C\nrom/rob/mot_PV210_FACE_LUK.farc 7C73C056\nrom/rob/mot_PV210_FACE_MEI.farc 36225B4C\nrom/rob/mot_PV210_FACE_MIK.farc 28BED80A\nrom/rob/mot_PV210_FACE_NER.farc 08C608A0\nrom/rob/mot_PV210_FACE_RIN.farc 23B04CF5\nrom/rob/mot_PV210_FACE_SAK.farc BAFE7F36\nrom/rob/mot_PV210_FACE_TET.farc 9BA70E89\nrom/rob/mot_PV211.farc 8667699A\nrom/rob/mot_PV211_FACE_HAK.farc 3D78A274\nrom/rob/mot_PV211_FACE_KAI.farc 7255ECC9\nrom/rob/mot_PV211_FACE_LEN.farc 95FCA063\nrom/rob/mot_PV211_FACE_LUK.farc 6ED62ACC\nrom/rob/mot_PV211_FACE_MEI.farc 3B495316\nrom/rob/mot_PV211_FACE_MIK.farc 8BECAA7F\nrom/rob/mot_PV211_FACE_NER.farc 3DF1EEC0\nrom/rob/mot_PV211_FACE_SAK.farc 650E5B6F\nrom/rob/mot_PV211_FACE_TET.farc 3D483E40\nrom/rob/mot_PV212.farc 4778AD14\nrom/rob/mot_PV212_FACE_HAK.farc D883FF80\nrom/rob/mot_PV212_FACE_KAI.farc E64F0134\nrom/rob/mot_PV212_FACE_LEN.farc C733095F\nrom/rob/mot_PV212_FACE_LUK.farc D97789EF\nrom/rob/mot_PV212_FACE_MEI.farc 14B4273B\nrom/rob/mot_PV212_FACE_MIK.farc 0CD2A368\nrom/rob/mot_PV212_FACE_NER.farc AB5A1824\nrom/rob/mot_PV212_FACE_RIN.farc C8CC39AD\nrom/rob/mot_PV212_FACE_SAK.farc 7E116F84\nrom/rob/mot_PV212_FACE_TET.farc 2AFD2C6A\nrom/rob/mot_PV213.farc 53EA615E\nrom/rob/mot_PV214.farc 31D1BEA2\nrom/rob/mot_PV214_FACE_KAI.farc 2ACA5B15\nrom/rob/mot_PV214_FACE_LEN.farc 7C51A621\nrom/rob/mot_PV214_FACE_LUK.farc 475E67AB\nrom/rob/mot_PV214_FACE_MEI.farc 65F93BD7\nrom/rob/mot_PV214_FACE_MIK.farc 4E20AE2F\nrom/rob/mot_PV214_FACE_NER.farc 234BE388\nrom/rob/mot_PV214_FACE_RIN.farc 5DD6B7E4\nrom/rob/mot_PV214_FACE_SAK.farc 70B6E986\nrom/rob/mot_PV214_FACE_TET.farc DC284597\nrom/rob/mot_PV218.farc D7762DE0\nrom/rob/mot_PV218_FACE_HAK.farc 633DF6F4\nrom/rob/mot_PV218_FACE_KAI.farc 9060B501\nrom/rob/mot_PV218_FACE_LEN.farc E52CCED0\nrom/rob/mot_PV218_FACE_LUK.farc 9BF365E7\nrom/rob/mot_PV218_FACE_MEI.farc 00CF569D\nrom/rob/mot_PV218_FACE_NER.farc 972DB190\nrom/rob/mot_PV218_FACE_RIN.farc DCFB92CF\nrom/rob/mot_PV218_FACE_SAK.farc A11370B0\nrom/rob/mot_PV218_FACE_TET.farc FEE5BC5D\nrom/rob/mot_PV219.farc F76177BC\nrom/rob/mot_PV219_FACE_HAK.farc D071FED8\nrom/rob/mot_PV219_FACE_KAI.farc 4EAF1680\nrom/rob/mot_PV219_FACE_LEN.farc 67AA80A7\nrom/rob/mot_PV219_FACE_LUK.farc 696B43FB\nrom/rob/mot_PV219_FACE_MEI.farc 4346488D\nrom/rob/mot_PV219_FACE_MIK.farc C977CEDA\nrom/rob/mot_PV219_FACE_NER.farc D50115B4\nrom/rob/mot_PV219_FACE_RIN.farc C0E2B71C\nrom/rob/mot_PV219_FACE_SAK.farc 70894DFE\nrom/rob/mot_PV219_FACE_TET.farc 4E84BD33\nrom/rob/mot_PV031_FACE_HAK.farc AE8BF51E\nrom/rob/mot_PV032_FACE_NER.farc 79071BAE\nrom/rob/mot_PV051.farc 51844B97\nrom/rob/mot_PV082.farc C9E8996D\nrom/rob/mot_PV102_FACE_HAK.farc 103D6223\nrom/rob/mot_PV103_FACE_MIK.farc 1D7F7643\nrom/rob/mot_PV201.farc C51658B3\nrom/rob/mot_PV202_FACE_MEI.farc 19E7C001\nrom/rob/mot_PV204_FACE_TET.farc 62C0D325\nrom/rob/mot_PV206_FACE_LUK.farc 423538F2\nrom/rob/mot_PV207_FACE_SAK.farc 0E39D543\nrom/rob/mot_PV210_FACE_LEN.farc A32BFEEE\nrom/rob/mot_PV211_FACE_RIN.farc 117564CE\nrom/rob/mot_PV214_FACE_HAK.farc 6D9EADF8\nrom/rob/mot_PV218_FACE_MIK.farc 8AF41808\nrom/rob/mot_PV220.farc EB54A43D\nrom/rob/mot_PV221_FACE_MEI.farc EE8FE42B\nrom/rob/mot_PV222_FACE_TET.farc 04EA5894\nrom/rob/mot_PV224_FACE_LUK.farc 91412A64\nrom/rob/mot_PV225_FACE_TET.farc 60F39DF4\nrom/rob/mot_PV232_FACE_KAI.farc B85EA1D1\nrom/rob/mot_PV233_FACE_NER.farc FCDE2606\nrom/rob/mot_PV235_FACE_HAK.farc 5680B92C\nrom/rob/mot_PV236_FACE_NER.farc 64DFDCE5\nrom/rob/mot_PV255.farc DAA6EA49\nrom/rob/mot_PV609.farc F5EB1947\nrom/rob/mot_PV627.farc D9F2BD91\nrom/rob/mot_PV220_FACE_HAK.farc 87D80FE7\nrom/rob/mot_PV220_FACE_KAI.farc A2C42711\nrom/rob/mot_PV220_FACE_LEN.farc 577C71C9\nrom/rob/mot_PV220_FACE_LUK.farc D5422989\nrom/rob/mot_PV220_FACE_MEI.farc 883C3427\nrom/rob/mot_PV220_FACE_MIK.farc EB91F559\nrom/rob/mot_PV220_FACE_NER.farc 3DB98431\nrom/rob/mot_PV220_FACE_RIN.farc 3E29BFDB\nrom/rob/mot_PV220_FACE_SAK.farc 3034C4D3\nrom/rob/mot_PV220_FACE_TET.farc F6BB7AA5\nrom/rob/mot_PV221.farc 97462CC6\nrom/rob/mot_PV221_FACE_HAK.farc E790AB0F\nrom/rob/mot_PV221_FACE_KAI.farc 78DF8957\nrom/rob/mot_PV221_FACE_LEN.farc 973C9A0F\nrom/rob/mot_PV221_FACE_LUK.farc 21F6129A\nrom/rob/mot_PV221_FACE_MIK.farc D9F257C6\nrom/rob/mot_PV221_FACE_NER.farc A4C6428F\nrom/rob/mot_PV221_FACE_RIN.farc AEC45047\nrom/rob/mot_PV221_FACE_SAK.farc 53247744\nrom/rob/mot_PV221_FACE_TET.farc 5ED2914E\nrom/rob/mot_PV222.farc DA5C0E6B\nrom/rob/mot_PV222_FACE_HAK.farc 1241EBE5\nrom/rob/mot_PV222_FACE_KAI.farc 4228A2F4\nrom/rob/mot_PV222_FACE_LEN.farc 74C3D243\nrom/rob/mot_PV222_FACE_LUK.farc 40B46699\nrom/rob/mot_PV222_FACE_MEI.farc 68043BF4\nrom/rob/mot_PV222_FACE_MIK.farc 46B708C6\nrom/rob/mot_PV222_FACE_NER.farc 83B9FA27\nrom/rob/mot_PV222_FACE_RIN.farc 5F8E61BD\nrom/rob/mot_PV222_FACE_SAK.farc 00341A4C\nrom/rob/mot_PV223.farc F5946932\nrom/rob/mot_PV223_FACE_HAK.farc B31AD813\nrom/rob/mot_PV223_FACE_KAI.farc CAABE24E\nrom/rob/mot_PV223_FACE_LEN.farc 05344A04\nrom/rob/mot_PV223_FACE_LUK.farc E8DA3541\nrom/rob/mot_PV223_FACE_MEI.farc 490FCA9E\nrom/rob/mot_PV223_FACE_MIK.farc 4FD87274\nrom/rob/mot_PV223_FACE_NER.farc DD52DBE4\nrom/rob/mot_PV223_FACE_RIN.farc 360BA728\nrom/rob/mot_PV223_FACE_SAK.farc A5446E91\nrom/rob/mot_PV223_FACE_TET.farc F10462EB\nrom/rob/mot_PV224.farc FD2C9EFB\nrom/rob/mot_PV224_FACE_HAK.farc 56490A1D\nrom/rob/mot_PV224_FACE_KAI.farc 01CB9011\nrom/rob/mot_PV224_FACE_LEN.farc CB259AFD\nrom/rob/mot_PV224_FACE_MEI.farc F52FF561\nrom/rob/mot_PV224_FACE_MIK.farc 8004BE7C\nrom/rob/mot_PV224_FACE_NER.farc 34C39A6A\nrom/rob/mot_PV224_FACE_RIN.farc 95DF5D3D\nrom/rob/mot_PV224_FACE_SAK.farc A08C7A6F\nrom/rob/mot_PV224_FACE_TET.farc DCFB2609\nrom/rob/mot_PV225.farc C6AE05A9\nrom/rob/mot_PV225_FACE_HAK.farc 67BA1221\nrom/rob/mot_PV225_FACE_KAI.farc A978E579\nrom/rob/mot_PV225_FACE_LEN.farc C0E5752C\nrom/rob/mot_PV225_FACE_LUK.farc 3F0D37ED\nrom/rob/mot_PV225_FACE_MEI.farc FD9AE0AD\nrom/rob/mot_PV225_FACE_MIK.farc DF47B8CF\nrom/rob/mot_PV225_FACE_NER.farc 4EEF103D\nrom/rob/mot_PV225_FACE_RIN.farc 173B259A\nrom/rob/mot_PV225_FACE_SAK.farc B0AD16CA\nrom/rob/mot_PV226.farc 3AEBDE0E\nrom/rob/mot_PV227.farc 7C450317\nrom/rob/mot_PV228.farc FAB9F40A\nrom/rob/mot_PV231.farc 83B2DC5A\nrom/rob/mot_PV231_FACE_HAK.farc F1371573\nrom/rob/mot_PV231_FACE_KAI.farc 6E0A8AEB\nrom/rob/mot_PV231_FACE_LEN.farc C91D2AD1\nrom/rob/mot_PV231_FACE_LUK.farc 7B661085\nrom/rob/mot_PV231_FACE_MEI.farc 3CB0FA1C\nrom/rob/mot_PV231_FACE_MIK.farc C7A85094\nrom/rob/mot_PV231_FACE_NER.farc 427B3341\nrom/rob/mot_PV231_FACE_RIN.farc EAD5DFF8\nrom/rob/mot_PV231_FACE_SAK.farc F121ED7F\nrom/rob/mot_PV231_FACE_TET.farc E687DA39\nrom/rob/mot_PV232.farc C36AD8F1\nrom/rob/mot_PV232_FACE_HAK.farc 0232BDF6\nrom/rob/mot_PV232_FACE_LEN.farc DE0D2983\nrom/rob/mot_PV232_FACE_LUK.farc 3DE218D1\nrom/rob/mot_PV232_FACE_MEI.farc 87569015\nrom/rob/mot_PV232_FACE_MIK.farc 41E10073\nrom/rob/mot_PV232_FACE_NER.farc 8143C600\nrom/rob/mot_PV232_FACE_RIN.farc 0C3E36E8\nrom/rob/mot_PV232_FACE_SAK.farc 2F9A6402\nrom/rob/mot_PV232_FACE_TET.farc 5758E900\nrom/rob/mot_PV233.farc F25944F3\nrom/rob/mot_PV233_FACE_HAK.farc 47263259\nrom/rob/mot_PV233_FACE_KAI.farc 5C018E52\nrom/rob/mot_PV233_FACE_LEN.farc F269FCD5\nrom/rob/mot_PV233_FACE_LUK.farc 9A572038\nrom/rob/mot_PV233_FACE_MEI.farc 0786BB32\nrom/rob/mot_PV233_FACE_MIK.farc 60588C47\nrom/rob/mot_PV233_FACE_RIN.farc 0B82CECF\nrom/rob/mot_PV233_FACE_SAK.farc 4D3346F6\nrom/rob/mot_PV233_FACE_TET.farc 3FC81FB1\nrom/rob/mot_PV234.farc 89EE9496\nrom/rob/mot_PV234_FACE_HAK.farc 771AC878\nrom/rob/mot_PV234_FACE_KAI.farc 36594FC8\nrom/rob/mot_PV234_FACE_LEN.farc C733A674\nrom/rob/mot_PV234_FACE_LUK.farc 83455B41\nrom/rob/mot_PV234_FACE_MEI.farc C2085FD5\nrom/rob/mot_PV234_FACE_MIK.farc DD3A7517\nrom/rob/mot_PV234_FACE_NER.farc 5247C07E\nrom/rob/mot_PV234_FACE_RIN.farc 4F653629\nrom/rob/mot_PV234_FACE_SAK.farc E3150089\nrom/rob/mot_PV234_FACE_TET.farc E2B9DFDE\nrom/rob/mot_PV235.farc 132D1EA1\nrom/rob/mot_PV235_FACE_KAI.farc A0509F39\nrom/rob/mot_PV235_FACE_LEN.farc DF8CED8B\nrom/rob/mot_PV235_FACE_LUK.farc AE14119D\nrom/rob/mot_PV235_FACE_MEI.farc 851A1DE8\nrom/rob/mot_PV235_FACE_MIK.farc 90214A28\nrom/rob/mot_PV235_FACE_NER.farc B04A1309\nrom/rob/mot_PV235_FACE_RIN.farc EE262478\nrom/rob/mot_PV235_FACE_SAK.farc C2557026\nrom/rob/mot_PV235_FACE_TET.farc 3B0A3410\nrom/rob/mot_PV236.farc 672FF2FB\nrom/rob/mot_PV236_FACE_HAK.farc 5F01C601\nrom/rob/mot_PV236_FACE_KAI.farc 9936AA2F\nrom/rob/mot_PV236_FACE_LEN.farc DD8586F1\nrom/rob/mot_PV236_FACE_LUK.farc D762E696\nrom/rob/mot_PV236_FACE_MEI.farc 80187D21\nrom/rob/mot_PV236_FACE_MIK.farc 47BCDA3B\nrom/rob/mot_PV236_FACE_RIN.farc 7D033E0B\nrom/rob/mot_PV236_FACE_SAK.farc 59B01F3A\nrom/rob/mot_PV236_FACE_TET.farc E03846B0\nrom/rob/mot_PV238.farc 0C7C660B\nrom/rob/mot_PV239.farc AEC4C3B1\nrom/rob/mot_PV240.farc E17CB211\nrom/rob/mot_PV241.farc 812063E8\nrom/rob/mot_PV242.farc C33E5400\nrom/rob/mot_PV243.farc 29A576EA\nrom/rob/mot_PV244.farc 92BFFC5A\nrom/rob/mot_PV246.farc B37B7828\nrom/rob/mot_PV247.farc D6639AEB\nrom/rob/mot_PV248.farc B515BF16\nrom/rob/mot_PV249.farc 76D882CD\nrom/rob/mot_PV250.farc 9182120E\nrom/rob/mot_PV251.farc 0C4AD4F8\nrom/rob/mot_PV253.farc 22CAFBAA\nrom/rob/mot_PV257.farc 959382CB\nrom/rob/mot_PV259.farc 9F273E32\nrom/rob/mot_PV260.farc 03CF56A3\nrom/rob/mot_PV261.farc 307674B1\nrom/rob/mot_PV262.farc A765F88C\nrom/rob/mot_PV432.farc 942718B2\nrom/rob/mot_PV433.farc 1E5AF14A\nrom/rob/mot_PV434.farc A2CB59DB\nrom/rob/mot_PV435.farc 8F810415\nrom/rob/mot_PV600.farc 09AE3483\nrom/rob/mot_PV601.farc 86E8CBDD\nrom/rob/mot_PV602.farc 677F2EF2\nrom/rob/mot_PV603.farc 7AC5F916\nrom/rob/mot_PV604.farc 161C33B9\nrom/rob/mot_PV605.farc F1B2636A\nrom/rob/mot_PV607.farc BA07C4A2\nrom/rob/mot_PV608.farc D8B8919A\nrom/rob/mot_PV610.farc 9DA0BB84\nrom/rob/mot_PV611.farc D2E3D5AF\nrom/rob/mot_PV612.farc 64EA0AFF\nrom/rob/mot_PV613.farc FC28AA41\nrom/rob/mot_PV614.farc 2D532502\nrom/rob/mot_PV615.farc 25AF554C\nrom/rob/mot_PV616.farc 2B0AF01F\nrom/rob/mot_PV617.farc 803C6D72\nrom/rob/mot_PV618.farc A99D6727\nrom/rob/mot_PV619.farc 18980224\nrom/rob/mot_PV620.farc 1C9D01CD\nrom/rob/mot_PV621.farc 615ED08D\nrom/rob/mot_PV622.farc AF97BF8C\nrom/rob/mot_PV623.farc 5069FE6A\nrom/rob/mot_PV624.farc 30D1ED50\nrom/rob/mot_PV625.farc 43AFCE74\nrom/rob/mot_PV626.farc 488C9958\nrom/rob/mot_PV628.farc DFC1AD31\nrom/rob/mot_PV629.farc 90494243\nrom/rob/mot_PV630.farc AA3EF9C1\nrom/rob/mot_PV631.farc A1E99585\nrom/rob/mot_PV637.farc 08B44675\nrom/rob/mot_PV638.farc B27583FC\nrom/rob/mot_PV639.farc 4142C057\nrom/rob/mot_PV640.farc A1084B03\nrom/rob/mot_PV641.farc 7FD9035B\nrom/rob/mot_PV642.farc FC401099\nrom/rob/mot_PV710.farc 13FBDF9A\nrom/rob/mot_PV722.farc 5DB02443\nrom/rob/mot_PV723.farc 0D699E56\nrom/rob/mot_PV724.farc CAC590BA\nrom/rob/mot_PV725.farc 6F1515FA\nrom/rob/mot_PV726.farc 0FB7EA65\nrom/rob/mot_PV727.farc A55652ED\nrom/rob/mot_PV728.farc EEB7EB0F\nrom/rob/mot_PV729.farc DB0D7BF3\nrom/rob/mot_PV730.farc 89145BED\nrom/rob/mot_PV731.farc FC88B6FF\nrom/rob/mot_PV732.farc DAD97F51\nrom/rob/mot_PV733.farc A1C3DF77\nrom/rob/mot_PV734.farc F356C916\nrom/rob/mot_PV736.farc C34CEECE\nrom/rob/mot_PV737.farc 970B05EF\nrom/rob/mot_PV738.farc D3AF873D\nrom/rob/mot_PV739.farc C7C25486\nrom/rob/mot_PV740.farc B1C031E2\nrom/rob/mot_PV832.farc AFA1D91D\nrom/rob/mot_RIN.farc 3D2AEA9F\nrom/rob/mot_SAK.farc 81A606F2\nrom/rob/mot_TEST_DESIGN.farc F3A9B25F\nrom/rob/mot_TET.farc 9A295A3E\nrom/rob/rob_mot_tbl.bin 38345C72\nrom/script/pv_079_hard.dsc 681A936E\nrom/script/pv_260_normal.dsc A56A3EDA\nrom/script/pv_001_easy.dsc 4AA93F87\nrom/script/pv_001_extreme.dsc 3659CD8B\nrom/script/pv_001_extreme_1.dsc 11D58E5E\nrom/script/pv_001_hard.dsc 030F8B7C\nrom/script/pv_001_normal.dsc B9E766FA\nrom/script/pv_002_easy.dsc 192A921A\nrom/script/pv_002_extreme.dsc E4717931\nrom/script/pv_002_extreme_1.dsc 8F8EB4F4\nrom/script/pv_002_hard.dsc F5A62426\nrom/script/pv_002_normal.dsc F4E87501\nrom/script/pv_003_easy.dsc 3984554F\nrom/script/pv_003_extreme.dsc B8895B83\nrom/script/pv_003_extreme_1.dsc 176CDB0D\nrom/script/pv_003_hard.dsc 806B1D4D\nrom/script/pv_003_normal.dsc 7A257548\nrom/script/pv_004_easy.dsc AEAFFC85\nrom/script/pv_004_extreme.dsc B3DD560A\nrom/script/pv_005_easy.dsc 94EDF711\nrom/script/pv_005_extreme.dsc A1C43375\nrom/script/pv_005_extreme_1.dsc FC5ADC71\nrom/script/pv_005_hard.dsc 79034B96\nrom/script/pv_005_normal.dsc 3A7B5A08\nrom/script/pv_006_easy.dsc 1F4273DF\nrom/script/pv_006_extreme.dsc AD6C78EF\nrom/script/pv_006_extreme_1.dsc 8D0F9A0E\nrom/script/pv_006_hard.dsc 6C2EA854\nrom/script/pv_007_easy.dsc 04ADEF2C\nrom/script/pv_007_extreme.dsc 0B1575DD\nrom/script/pv_007_extreme_1.dsc B96F08FE\nrom/script/pv_007_hard.dsc DCB50586\nrom/script/pv_008_easy.dsc F7BBD6A6\nrom/script/pv_008_extreme.dsc 395D5770\nrom/script/pv_008_extreme_1.dsc 4A4EB891\nrom/script/pv_008_hard.dsc 955DFD0B\nrom/script/pv_009_easy.dsc C5637101\nrom/script/pv_009_extreme.dsc 6D0FC43A\nrom/script/pv_009_hard.dsc 81781750\nrom/script/pv_010_easy.dsc 6DABE47A\nrom/script/pv_010_extreme.dsc 23493D67\nrom/script/pv_010_extreme_1.dsc 9A08BD81\nrom/script/pv_010_hard.dsc 70E0BD34\nrom/script/pv_011_easy.dsc 1A02F34D\nrom/script/pv_011_extreme.dsc 42B24F56\nrom/script/pv_011_extreme_1.dsc 8E63EC56\nrom/script/pv_011_hard.dsc 1B11B469\nrom/script/pv_011_normal.dsc FBAB2850\nrom/script/pv_012_extreme.dsc 965F6CBB\nrom/script/pv_012_hard.dsc CEB44624\nrom/script/pv_012_normal.dsc CB078FE5\nrom/script/pv_013_extreme.dsc C417B6F2\nrom/script/pv_013_hard.dsc 9E7B3FEA\nrom/script/pv_013_normal.dsc 594797AD\nrom/script/pv_014_extreme.dsc EDBE8158\nrom/script/pv_014_extreme_1.dsc 5B8584EA\nrom/script/pv_014_hard.dsc 2AAF243B\nrom/script/pv_014_normal.dsc 4D7458B3\nrom/script/pv_015_extreme.dsc 3955CBFC\nrom/script/pv_015_extreme_1.dsc 3DEEF12D\nrom/script/pv_015_hard.dsc AA84A7CB\nrom/script/pv_015_normal.dsc E0DCAB36\nrom/script/pv_016_easy.dsc 4F84C2D1\nrom/script/pv_016_extreme.dsc 2ADB794D\nrom/script/pv_016_hard.dsc 48130194\nrom/script/pv_017_extreme.dsc 695AEE5B\nrom/script/pv_017_extreme_1.dsc D55AD167\nrom/script/pv_017_hard.dsc 41586D5E\nrom/script/pv_017_normal.dsc 30742F01\nrom/script/pv_004_hard.dsc A21EA07D\nrom/script/pv_008_normal.dsc FA436B22\nrom/script/pv_013_extreme_1.dsc 9AEA2ABA\nrom/script/pv_018_easy.dsc C074DDC9\nrom/script/pv_023_easy.dsc A4BB7233\nrom/script/pv_027_hard.dsc B7E97FC3\nrom/script/pv_031_extreme_1.dsc 3D7BBBEC\nrom/script/pv_039_easy.dsc B496615B\nrom/script/pv_043_easy.dsc 2E9C8979\nrom/script/pv_046_normal.dsc A09F937B\nrom/script/pv_050_normal.dsc 648E5D0A\nrom/script/pv_054_extreme_1.dsc 805980C3\nrom/script/pv_058_extreme.dsc 201A8E75\nrom/script/pv_061_hard.dsc 5B3B89B2\nrom/script/pv_065_extreme.dsc 39CC3B17\nrom/script/pv_018_extreme.dsc 05285931\nrom/script/pv_018_hard.dsc 1E2EE838\nrom/script/pv_019_easy.dsc C6D4609E\nrom/script/pv_019_extreme.dsc 18AF4CDA\nrom/script/pv_019_extreme_1.dsc 9C2C9C65\nrom/script/pv_019_hard.dsc E4AD3FC0\nrom/script/pv_020_easy.dsc 94C95124\nrom/script/pv_020_extreme.dsc 9EB1469F\nrom/script/pv_020_hard.dsc C949E281\nrom/script/pv_020_normal.dsc 4F675190\nrom/script/pv_021_extreme.dsc 7F2268EB\nrom/script/pv_021_hard.dsc 7575AAE5\nrom/script/pv_021_normal.dsc 100FC3DB\nrom/script/pv_022_easy.dsc 0BE60E90\nrom/script/pv_022_extreme.dsc 7775F044\nrom/script/pv_022_hard.dsc 69EAF0D1\nrom/script/pv_022_normal.dsc 8E6CE0D6\nrom/script/pv_023_extreme.dsc 64C4AB7D\nrom/script/pv_023_extreme_1.dsc E8D7300C\nrom/script/pv_023_hard.dsc 90DB043D\nrom/script/pv_023_normal.dsc B2DA4968\nrom/script/pv_024_easy.dsc C7C01079\nrom/script/pv_024_extreme.dsc 9772A2B0\nrom/script/pv_024_extreme_1.dsc B78B7393\nrom/script/pv_024_hard.dsc 3198A1EE\nrom/script/pv_024_normal.dsc BA88B704\nrom/script/pv_025_easy.dsc C5B9D0D9\nrom/script/pv_025_extreme.dsc 42348859\nrom/script/pv_025_hard.dsc 6776008D\nrom/script/pv_025_normal.dsc 22FE9795\nrom/script/pv_027_easy.dsc 43BF7C99\nrom/script/pv_027_extreme.dsc 74EE049F\nrom/script/pv_027_extreme_1.dsc EAB3CFC4\nrom/script/pv_027_normal.dsc 4C2F59B6\nrom/script/pv_028_easy.dsc 9BA03267\nrom/script/pv_028_extreme.dsc E7804992\nrom/script/pv_028_extreme_1.dsc F0C82363\nrom/script/pv_028_hard.dsc A2B32D58\nrom/script/pv_028_normal.dsc 60DFAE56\nrom/script/pv_029_extreme.dsc C9170839\nrom/script/pv_029_extreme_1.dsc 68422DEE\nrom/script/pv_029_hard.dsc 49A23A49\nrom/script/pv_029_normal.dsc 0A169847\nrom/script/pv_030_easy.dsc B88B1E7E\nrom/script/pv_030_extreme.dsc 8EF0D9F7\nrom/script/pv_030_extreme_1.dsc 80E49DF8\nrom/script/pv_030_hard.dsc 0C92809B\nrom/script/pv_030_normal.dsc 83372986\nrom/script/pv_031_extreme.dsc 87D37084\nrom/script/pv_031_hard.dsc 928C550B\nrom/script/pv_031_normal.dsc 96AFCFE9\nrom/script/pv_032_encore.dsc 1B202EB6\nrom/script/pv_032_extreme.dsc 9E647E40\nrom/script/pv_032_extreme_1.dsc B8077A58\nrom/script/pv_032_hard.dsc 49DC4B33\nrom/script/pv_032_normal.dsc 39DC49FC\nrom/script/pv_037_easy.dsc 25F3E856\nrom/script/pv_037_extreme.dsc D9708E06\nrom/script/pv_037_extreme_1.dsc 33F9112C\nrom/script/pv_037_hard.dsc 87254D09\nrom/script/pv_037_normal.dsc 159081CE\nrom/script/pv_038_easy.dsc A55229FA\nrom/script/pv_038_extreme.dsc 6D78ADF5\nrom/script/pv_038_extreme_1.dsc C1201CBF\nrom/script/pv_038_hard.dsc 20E51D24\nrom/script/pv_038_normal.dsc 2E858CAE\nrom/script/pv_039_extreme.dsc 718D55C4\nrom/script/pv_039_extreme_1.dsc 53CFED69\nrom/script/pv_039_hard.dsc C7CDBA86\nrom/script/pv_039_normal.dsc 9D51A818\nrom/script/pv_040_easy.dsc 33F51114\nrom/script/pv_040_extreme.dsc DD418039\nrom/script/pv_040_extreme_1.dsc 7FDB7A60\nrom/script/pv_040_hard.dsc 6CC56926\nrom/script/pv_040_normal.dsc 4D7F3165\nrom/script/pv_041_easy.dsc D0E3DA17\nrom/script/pv_041_extreme.dsc 482EDB59\nrom/script/pv_041_hard.dsc 61BE158A\nrom/script/pv_041_normal.dsc 00825D36\nrom/script/pv_042_easy.dsc CC66C623\nrom/script/pv_042_extreme.dsc EB781533\nrom/script/pv_042_hard.dsc A12999B4\nrom/script/pv_042_normal.dsc C0F4FC11\nrom/script/pv_043_extreme.dsc BEF4306A\nrom/script/pv_043_extreme_1.dsc E3B180BC\nrom/script/pv_043_hard.dsc 04A9A095\nrom/script/pv_043_normal.dsc DB4ABB7F\nrom/script/pv_044_easy.dsc 73C9B09D\nrom/script/pv_044_extreme.dsc 044E6314\nrom/script/pv_044_hard.dsc F804D381\nrom/script/pv_044_normal.dsc A7442870\nrom/script/pv_045_easy.dsc BBF603B2\nrom/script/pv_045_extreme.dsc 1368A26E\nrom/script/pv_045_extreme_1.dsc CC594C4D\nrom/script/pv_045_hard.dsc 04A6967B\nrom/script/pv_045_normal.dsc 5592B67C\nrom/script/pv_046_easy.dsc F9F832E6\nrom/script/pv_046_extreme.dsc 8A87F0AC\nrom/script/pv_046_extreme_1.dsc 06941506\nrom/script/pv_046_hard.dsc 223621E6\nrom/script/pv_047_easy.dsc 32BE1383\nrom/script/pv_047_extreme.dsc 7E66F064\nrom/script/pv_047_hard.dsc 6383B972\nrom/script/pv_047_normal.dsc 747815B8\nrom/script/pv_048_easy.dsc 73358EF9\nrom/script/pv_048_extreme.dsc A7A7AE24\nrom/script/pv_048_hard.dsc 0E899E9E\nrom/script/pv_048_normal.dsc 06429EA4\nrom/script/pv_049_easy.dsc C982AA9E\nrom/script/pv_049_extreme.dsc 08E99BDD\nrom/script/pv_049_extreme_1.dsc FE127A97\nrom/script/pv_049_hard.dsc FC889DF5\nrom/script/pv_049_normal.dsc 3C5BA256\nrom/script/pv_050_easy.dsc 37F5A8B1\nrom/script/pv_050_extreme.dsc 8A53A830\nrom/script/pv_050_extreme_1.dsc 64DECD75\nrom/script/pv_050_hard.dsc 307AA6FA\nrom/script/pv_051_easy.dsc 4A190253\nrom/script/pv_051_extreme.dsc 7871D82E\nrom/script/pv_051_extreme_1.dsc F172724B\nrom/script/pv_051_hard.dsc F1AF8C62\nrom/script/pv_051_normal.dsc A097135C\nrom/script/pv_052_easy.dsc 83BE21BB\nrom/script/pv_052_extreme.dsc 047479F8\nrom/script/pv_052_extreme_1.dsc 9E7AEAC2\nrom/script/pv_052_hard.dsc D3BC6861\nrom/script/pv_052_normal.dsc F710AA94\nrom/script/pv_053_easy.dsc 62E7FEF3\nrom/script/pv_053_extreme.dsc FCF717F3\nrom/script/pv_053_extreme_1.dsc 566A2C4E\nrom/script/pv_053_hard.dsc 1444FF1D\nrom/script/pv_053_normal.dsc 3CA75D71\nrom/script/pv_054_easy.dsc 50412C39\nrom/script/pv_054_extreme.dsc 2293C5A0\nrom/script/pv_054_hard.dsc D3871C21\nrom/script/pv_054_normal.dsc 9C047B71\nrom/script/pv_055_easy.dsc 68DAD40E\nrom/script/pv_055_extreme.dsc F58FB800\nrom/script/pv_055_extreme_1.dsc 54EA9822\nrom/script/pv_055_hard.dsc B6DF9BE7\nrom/script/pv_055_normal.dsc 77612415\nrom/script/pv_056_easy.dsc DA04C81D\nrom/script/pv_056_extreme.dsc 6231D2EE\nrom/script/pv_056_hard.dsc 0E4B8403\nrom/script/pv_056_normal.dsc 6DB482CB\nrom/script/pv_057_easy.dsc 5E1F9D2C\nrom/script/pv_057_extreme.dsc 51A53C43\nrom/script/pv_057_extreme_1.dsc 22A04731\nrom/script/pv_057_hard.dsc 0CB8C8E9\nrom/script/pv_057_normal.dsc 1C30218E\nrom/script/pv_058_easy.dsc E8358344\nrom/script/pv_058_extreme_1.dsc 93E97B29\nrom/script/pv_058_hard.dsc 569CD85D\nrom/script/pv_058_normal.dsc 50C70F31\nrom/script/pv_059_easy.dsc 14DDFDF7\nrom/script/pv_059_extreme.dsc A0F96CE9\nrom/script/pv_059_extreme_1.dsc 077A945F\nrom/script/pv_059_hard.dsc 3E6C1E5C\nrom/script/pv_059_normal.dsc 2E7CD82E\nrom/script/pv_060_easy.dsc B8DB73CE\nrom/script/pv_060_extreme.dsc DD6601CB\nrom/script/pv_060_extreme_1.dsc F1E81D74\nrom/script/pv_060_hard.dsc A4B60197\nrom/script/pv_060_normal.dsc 68C1D181\nrom/script/pv_061_easy.dsc 23610D0C\nrom/script/pv_061_extreme.dsc 39847D46\nrom/script/pv_061_extreme_1.dsc 81B93800\nrom/script/pv_061_normal.dsc 4C0BB70E\nrom/script/pv_062_easy.dsc BCFC5DA1\nrom/script/pv_062_extreme.dsc DC04262D\nrom/script/pv_062_extreme_1.dsc 2DC79F31\nrom/script/pv_062_hard.dsc 88A9DFA7\nrom/script/pv_062_normal.dsc DD62712D\nrom/script/pv_063_easy.dsc EC27245A\nrom/script/pv_063_extreme.dsc D2976563\nrom/script/pv_063_extreme_1.dsc DC107CA4\nrom/script/pv_063_hard.dsc C62A8EBC\nrom/script/pv_063_normal.dsc FD2E7D76\nrom/script/pv_064_easy.dsc 3475A249\nrom/script/pv_064_extreme.dsc D619925A\nrom/script/pv_064_extreme_1.dsc 9EA670C7\nrom/script/pv_064_hard.dsc 8A1FA2B7\nrom/script/pv_064_normal.dsc 3D0AC3AD\nrom/script/pv_065_easy.dsc 1E54862F\nrom/script/pv_065_extreme_1.dsc 40FCD723\nrom/script/pv_065_hard.dsc B9C74989\nrom/script/pv_065_normal.dsc FB5B75B1\nrom/script/pv_066_easy.dsc D4D4485A\nrom/script/pv_066_extreme.dsc A0C39E00\nrom/script/pv_066_extreme_1.dsc F75CFBED\nrom/script/pv_066_hard.dsc 1C90D1A5\nrom/script/pv_066_normal.dsc 242A229C\nrom/script/pv_067_extreme.dsc 45A7E6CF\nrom/script/pv_067_hard.dsc 72CEE8DE\nrom/script/pv_067_normal.dsc 4C507D2C\nrom/script/pv_068_easy.dsc CF7EBBB1\nrom/script/pv_068_extreme.dsc 31DDA0E6\nrom/script/pv_068_hard.dsc 04A388A1\nrom/script/pv_068_normal.dsc 065C1EB9\nrom/script/pv_079_easy.dsc A8E05918\nrom/script/pv_079_extreme.dsc C82CCFEE\nrom/script/pv_079_normal.dsc 803C2FC6\nrom/script/pv_081_easy.dsc DC981053\nrom/script/pv_081_extreme.dsc B4BCE7FA\nrom/script/pv_081_extreme_1.dsc 7DD2C169\nrom/script/pv_081_hard.dsc AA94FA51\nrom/script/pv_081_normal.dsc CD5E136B\nrom/script/pv_082_easy.dsc B284FC47\nrom/script/pv_082_extreme.dsc 69FC7368\nrom/script/pv_082_extreme_1.dsc 9DBCE0CD\nrom/script/pv_082_hard.dsc 7CB1475C\nrom/script/pv_082_normal.dsc 53A026EB\nrom/script/pv_083_easy.dsc B96B2106\nrom/script/pv_083_extreme.dsc 0F91A6FB\nrom/script/pv_083_hard.dsc 096FA701\nrom/script/pv_083_normal.dsc 43AB0EA3\nrom/script/pv_084_easy.dsc 359E6ABA\nrom/script/pv_084_extreme.dsc A192F3D1\nrom/script/pv_084_hard.dsc 5D0879D6\nrom/script/pv_084_normal.dsc DEEDB5FA\nrom/script/pv_085_extreme.dsc 1EB4096F\nrom/script/pv_085_extreme_1.dsc EF1D4639\nrom/script/pv_085_hard.dsc 42E781FF\nrom/script/pv_085_normal.dsc 7DCB8214\nrom/script/pv_086_easy.dsc B6BFADFB\nrom/script/pv_086_extreme.dsc 24A21B0A\nrom/script/pv_086_hard.dsc 77BC6502\nrom/script/pv_086_normal.dsc 86E70969\nrom/script/pv_087_easy.dsc 6DF0A7C8\nrom/script/pv_087_extreme.dsc 464B2245\nrom/script/pv_087_extreme_1.dsc C2943C32\nrom/script/pv_087_hard.dsc 97D4EE94\nrom/script/pv_087_normal.dsc 4A6D06E9\nrom/script/pv_088_easy.dsc FF264BBE\nrom/script/pv_088_extreme.dsc 48AE6A2B\nrom/script/pv_088_hard.dsc 6B0DDA47\nrom/script/pv_088_normal.dsc 725BFA01\nrom/script/pv_089_easy.dsc 99D4AD49\nrom/script/pv_089_extreme.dsc 138A7451\nrom/script/pv_089_extreme_1.dsc 7D6BC4E2\nrom/script/pv_089_hard.dsc 372D2AEC\nrom/script/pv_089_normal.dsc DE363D93\nrom/script/pv_090_easy.dsc D4E6F756\nrom/script/pv_090_extreme.dsc 304094CD\nrom/script/pv_090_extreme_1.dsc 36B53828\nrom/script/pv_090_hard.dsc 1592E9FB\nrom/script/pv_090_normal.dsc 7874592B\nrom/script/pv_091_easy.dsc C77B1382\nrom/script/pv_091_extreme.dsc 517A8A57\nrom/script/pv_091_hard.dsc 506676A9\nrom/script/pv_091_normal.dsc 4E821D27\nrom/script/pv_092_easy.dsc 9C9C1004\nrom/script/pv_092_hard.dsc EEBE2682\nrom/script/pv_092_normal.dsc F64EE3C5\nrom/script/pv_093_easy.dsc B942CDCD\nrom/script/pv_093_extreme.dsc C0A9CAF8\nrom/script/pv_093_hard.dsc 3F8DB0C8\nrom/script/pv_093_normal.dsc 51FE68AC\nrom/script/pv_094_easy.dsc 591F8A37\nrom/script/pv_094_extreme.dsc 1AB6F5EF\nrom/script/pv_094_extreme_1.dsc 705E6D1B\nrom/script/pv_094_hard.dsc E7B17A5F\nrom/script/pv_094_normal.dsc 84D5C1AB\nrom/script/pv_095_easy.dsc E7E181F8\nrom/script/pv_095_extreme.dsc E9ED321B\nrom/script/pv_095_hard.dsc 4092471C\nrom/script/pv_095_normal.dsc 986E2382\nrom/script/pv_096_easy.dsc 400B92D5\nrom/script/pv_096_extreme.dsc 0E90F73B\nrom/script/pv_096_hard.dsc 5C26CEC8\nrom/script/pv_096_normal.dsc DCBE43C1\nrom/script/pv_097_easy.dsc 8B88AA82\nrom/script/pv_097_extreme.dsc 0D8C94BA\nrom/script/pv_097_hard.dsc 40E83BC0\nrom/script/pv_097_normal.dsc 7E689B9C\nrom/script/pv_101_extreme.dsc 62284407\nrom/script/pv_101_extreme_1.dsc F456999B\nrom/script/pv_101_hard.dsc 64DD71E6\nrom/script/pv_101_normal.dsc 9F1E2CE1\nrom/script/pv_102_easy.dsc DCDC615F\nrom/script/pv_102_extreme.dsc 4AE85A52\nrom/script/pv_102_hard.dsc 175548B8\nrom/script/pv_102_normal.dsc 3062AC3A\nrom/script/pv_103_extreme.dsc C4ADC4AF\nrom/script/pv_103_hard.dsc 1C526D39\nrom/script/pv_103_normal.dsc C2C17CB3\nrom/script/pv_104_hard.dsc 7A8A78A1\nrom/script/pv_104_normal.dsc DF053B6D\nrom/script/pv_201_extreme.dsc 767AF450\nrom/script/pv_201_extreme_1.dsc 096BBDB3\nrom/script/pv_201_hard.dsc 4EE06AC9\nrom/script/pv_201_normal.dsc B6B0FA87\nrom/script/pv_202_extreme.dsc 70CEF20E\nrom/script/pv_202_extreme_1.dsc 83F1B89C\nrom/script/pv_202_hard.dsc 3E6628E2\nrom/script/pv_202_normal.dsc 7113DD5C\nrom/script/pv_203_extreme.dsc 647BF6EE\nrom/script/pv_203_hard.dsc EACD792D\nrom/script/pv_203_normal.dsc C47FF165\nrom/script/pv_204_easy.dsc 6FC576BA\nrom/script/pv_204_extreme.dsc FB3001E7\nrom/script/pv_204_hard.dsc 52341D43\nrom/script/pv_204_normal.dsc 7256BFC8\nrom/script/pv_205_hard.dsc 6F1DC918\nrom/script/pv_205_normal.dsc C3C16B49\nrom/script/pv_206_easy.dsc 7864A9D8\nrom/script/pv_206_extreme.dsc 0E11271D\nrom/script/pv_206_hard.dsc 37C39A45\nrom/script/pv_206_normal.dsc A946642B\nrom/script/pv_207_extreme.dsc 0E8DA035\nrom/script/pv_207_hard.dsc 001789AE\nrom/script/pv_207_normal.dsc 0CBAE29F\nrom/script/pv_208_easy.dsc C784D9E5\nrom/script/pv_208_extreme.dsc 11D7B4DE\nrom/script/pv_208_extreme_1.dsc 4CB9EFFA\nrom/script/pv_208_hard.dsc 21703410\nrom/script/pv_208_normal.dsc 0880B676\nrom/script/pv_209_extreme.dsc 717786BE\nrom/script/pv_209_extreme_1.dsc 69029A87\nrom/script/pv_209_normal.dsc C7A948FE\nrom/script/pv_210_extreme.dsc 7EADBE59\nrom/script/pv_210_extreme_1.dsc DFCB4582\nrom/script/pv_210_hard.dsc FF9F2D36\nrom/script/pv_210_normal.dsc F0201855\nrom/script/pv_211_extreme.dsc C7E22AA6\nrom/script/pv_211_extreme_1.dsc 4B1B604F\nrom/script/pv_211_hard.dsc 0AE10552\nrom/script/pv_211_normal.dsc 6023F154\nrom/script/pv_212_extreme.dsc ABF7CFF4\nrom/script/pv_212_extreme_1.dsc EF9CEC98\nrom/script/pv_212_hard.dsc 123A99B2\nrom/script/pv_212_normal.dsc 87D7A775\nrom/script/pv_213_easy.dsc 6F3379B2\nrom/script/pv_213_extreme.dsc A6B7709C\nrom/script/pv_213_hard.dsc 8113BB8E\nrom/script/pv_213_normal.dsc F77D9D79\nrom/script/pv_214_extreme.dsc 7AB2AD55\nrom/script/pv_214_hard.dsc BB48B877\nrom/script/pv_214_normal.dsc 45B09FA0\nrom/script/pv_215_extreme.dsc CC253D2D\nrom/script/pv_215_hard.dsc 3BC5FBA4\nrom/script/pv_215_normal.dsc C615D693\nrom/script/pv_216_easy.dsc F7CBCB4E\nrom/script/pv_216_extreme.dsc 395138C6\nrom/script/pv_216_hard.dsc 0264AA43\nrom/script/pv_216_normal.dsc DFC37253\nrom/script/pv_218_extreme.dsc DE2CF56E\nrom/script/pv_218_hard.dsc 6209011C\nrom/script/pv_218_normal.dsc 0D17F2AB\nrom/script/pv_219_easy.dsc 38A0EA6A\nrom/script/pv_219_extreme.dsc 22E747A7\nrom/script/pv_219_extreme_1.dsc 67CB97A2\nrom/script/pv_219_hard.dsc FB78A0A7\nrom/script/pv_220_easy.dsc FB309FEE\nrom/script/pv_220_extreme.dsc 36193F0E\nrom/script/pv_220_hard.dsc D3265FAB\nrom/script/pv_220_normal.dsc D40FD647\nrom/script/pv_221_easy.dsc C9629C60\nrom/script/pv_221_extreme.dsc 4E4C39F6\nrom/script/pv_221_extreme_1.dsc 587A1ABF\nrom/script/pv_221_hard.dsc 0F1DA7C9\nrom/script/pv_221_normal.dsc 0C9ECC0C\nrom/script/pv_222_extreme.dsc A9F84EAB\nrom/script/pv_222_hard.dsc 199C1D52\nrom/script/pv_222_normal.dsc 942DF67F\nrom/script/pv_223_extreme.dsc 71B996E8\nrom/script/pv_223_hard.dsc A214E1B6\nrom/script/pv_223_normal.dsc 96405E3E\nrom/script/pv_224_extreme.dsc 86B00E0F\nrom/script/pv_224_extreme_1.dsc E70744B0\nrom/script/pv_224_normal.dsc AFA67C8D\nrom/script/pv_225_easy.dsc 75769DF1\nrom/script/pv_225_extreme.dsc 9CA9BF4B\nrom/script/pv_225_hard.dsc 4B95DF66\nrom/script/pv_225_normal.dsc BEA6A63E\nrom/script/pv_226_extreme.dsc 1465AC31\nrom/script/pv_226_extreme_1.dsc FAE19809\nrom/script/pv_226_hard.dsc 7556BF39\nrom/script/pv_226_normal.dsc BAA50488\nrom/script/pv_227_extreme.dsc E9BFC217\nrom/script/pv_227_hard.dsc 84ABEB36\nrom/script/pv_227_normal.dsc C418829F\nrom/script/pv_228_extreme.dsc D105177A\nrom/script/pv_228_hard.dsc D1EB5240\nrom/script/pv_228_normal.dsc 46EFDA4F\nrom/script/pv_231_extreme.dsc CB5C1ACE\nrom/script/pv_231_extreme_1.dsc 68C2A46B\nrom/script/pv_231_normal.dsc 009F13F6\nrom/script/pv_232_easy.dsc 51E9CDB2\nrom/script/pv_232_extreme.dsc 38D6A9AA\nrom/script/pv_232_extreme_1.dsc FF824E09\nrom/script/pv_232_hard.dsc F908B877\nrom/script/pv_232_normal.dsc D5369637\nrom/script/pv_233_extreme.dsc D3E14CCD\nrom/script/pv_233_hard.dsc D3A563D5\nrom/script/pv_233_normal.dsc 5AC3C8FD\nrom/script/pv_234_easy.dsc 07648C25\nrom/script/pv_234_extreme.dsc C1679949\nrom/script/pv_234_extreme_1.dsc 0CADEF49\nrom/script/pv_234_hard.dsc 395242BA\nrom/script/pv_234_normal.dsc D87C0199\nrom/script/pv_235_easy.dsc CEE6B2E8\nrom/script/pv_235_extreme.dsc 913AC8DD\nrom/script/pv_235_hard.dsc 31A863BA\nrom/script/pv_236_extreme.dsc 8C87D3FD\nrom/script/pv_236_hard.dsc 484541B5\nrom/script/pv_236_normal.dsc 331FA8E3\nrom/script/pv_238_easy.dsc AF49CF30\nrom/script/pv_238_extreme.dsc 71856D88\nrom/script/pv_238_hard.dsc D22D6C12\nrom/script/pv_238_normal.dsc 465BA128\nrom/script/pv_239_extreme.dsc 2B891D9C\nrom/script/pv_239_hard.dsc 188162F1\nrom/script/pv_239_normal.dsc 043BCFD2\nrom/script/pv_240_extreme.dsc 3CD3A651\nrom/script/pv_240_hard.dsc 38B752BD\nrom/script/pv_240_normal.dsc 048A3AB4\nrom/script/pv_241_easy.dsc 0EB4D411\nrom/script/pv_241_extreme.dsc 46757DE4\nrom/script/pv_241_hard.dsc 358D8661\nrom/script/pv_241_normal.dsc 15F1CF9B\nrom/script/pv_242_extreme.dsc DCD09A22\nrom/script/pv_242_hard.dsc 5949BA89\nrom/script/pv_242_normal.dsc A41BD831\nrom/script/pv_243_easy.dsc 996AC463\nrom/script/pv_243_extreme.dsc 92A604C7\nrom/script/pv_243_hard.dsc B44CCBD6\nrom/script/pv_243_normal.dsc 1D911F0B\nrom/script/pv_244_easy.dsc 8C2F4D3F\nrom/script/pv_244_extreme.dsc 7CA33096\nrom/script/pv_244_hard.dsc C20CA2A4\nrom/script/pv_244_normal.dsc A9EF68D0\nrom/script/pv_246_extreme.dsc 30FA7F65\nrom/script/pv_246_hard.dsc 6CD31DED\nrom/script/pv_246_normal.dsc 86C9CA6D\nrom/script/pv_247_easy.dsc FD1A426D\nrom/script/pv_247_extreme.dsc 8DEF4E45\nrom/script/pv_247_hard.dsc BB37F221\nrom/script/pv_248_easy.dsc 4DE91D61\nrom/script/pv_248_extreme.dsc 61BF4D1F\nrom/script/pv_248_hard.dsc 2C2CA66E\nrom/script/pv_248_normal.dsc A9B7CE64\nrom/script/pv_249_easy.dsc 6DB573AF\nrom/script/pv_249_extreme.dsc ABC66CB4\nrom/script/pv_249_hard.dsc ECE9C0B8\nrom/script/pv_249_normal.dsc 3AFFA79F\nrom/script/pv_250_easy.dsc 671113BD\nrom/script/pv_250_extreme.dsc D1004FB1\nrom/script/pv_250_hard.dsc 23245ACB\nrom/script/pv_250_normal.dsc F9E2E432\nrom/script/pv_251_easy.dsc E3BEA9E4\nrom/script/pv_251_extreme.dsc 2DCC3BD9\nrom/script/pv_251_hard.dsc 51CDE90A\nrom/script/pv_251_normal.dsc F06D9FBB\nrom/script/pv_253_easy.dsc 9D4BFC8D\nrom/script/pv_253_hard.dsc 4BFF047E\nrom/script/pv_253_normal.dsc EACA696C\nrom/script/pv_255_easy.dsc DDB077B7\nrom/script/pv_255_extreme.dsc 0399BDA8\nrom/script/pv_255_hard.dsc DD72FBFB\nrom/script/pv_255_normal.dsc 2218A94B\nrom/script/pv_257_easy.dsc 385B42C4\nrom/script/pv_257_extreme.dsc B5F83610\nrom/script/pv_257_hard.dsc 403162B0\nrom/script/pv_257_normal.dsc 1D0290F6\nrom/script/pv_259_easy.dsc D5703D5F\nrom/script/pv_259_extreme.dsc 871D9A49\nrom/script/pv_259_hard.dsc 5BDC1A31\nrom/script/pv_259_normal.dsc 227AFB5E\nrom/script/pv_260_easy.dsc 51FE857A\nrom/script/pv_260_extreme.dsc 24ACC4D7\nrom/script/pv_260_hard.dsc A44D9636\nrom/script/pv_261_easy.dsc 62072997\nrom/script/pv_261_extreme.dsc E0BE1F87\nrom/script/pv_261_hard.dsc 8389CDB1\nrom/script/pv_261_normal.dsc 97C4175D\nrom/script/pv_262_easy.dsc 15B7A27A\nrom/script/pv_262_extreme.dsc 2B3A41E4\nrom/script/pv_262_hard.dsc 15D36C60\nrom/script/pv_262_normal.dsc 4095010E\nrom/script/pv_265_easy.dsc 4B09CAE3\nrom/script/pv_265_extreme.dsc 8A8145E9\nrom/script/pv_265_hard.dsc 3150B964\nrom/script/pv_265_normal.dsc D58B3694\nrom/script/pv_401_extreme.dsc C1DF3A40\nrom/script/pv_401_extreme_1.dsc EDF8DF74\nrom/script/pv_401_hard.dsc 574E88D2\nrom/script/pv_401_normal.dsc 4A74AA58\nrom/script/pv_402_easy.dsc 22C84A6F\nrom/script/pv_084_extreme_1.dsc DA371828\nrom/script/pv_088_extreme_1.dsc 28043FBD\nrom/script/pv_092_extreme.dsc 9E786B13\nrom/script/pv_096_extreme_1.dsc 167132D5\nrom/script/pv_104_extreme.dsc E6FEEECB\nrom/script/pv_205_extreme.dsc E3FDFB81\nrom/script/pv_209_hard.dsc EEF6DB0B\nrom/script/pv_214_easy.dsc 99BD332A\nrom/script/pv_219_normal.dsc 8897E664\nrom/script/pv_224_hard.dsc C620E915\nrom/script/pv_231_hard.dsc D22D9B3C\nrom/script/pv_235_normal.dsc 84DCF1A6\nrom/script/pv_242_easy.dsc B7A3F2B9\nrom/script/pv_247_normal.dsc 78C7A43F\nrom/script/pv_253_extreme.dsc 4F327170\nrom/script/pv_402_extreme_1.dsc 8DB20296\nrom/script/pv_402_hard.dsc 183D9E28\nrom/script/pv_402_normal.dsc 4ED847F1\nrom/script/pv_403_extreme.dsc 5B24C156\nrom/script/pv_403_extreme_1.dsc 46A4E51B\nrom/script/pv_403_hard.dsc 347CEA8E\nrom/script/pv_403_normal.dsc 3C28B1E6\nrom/script/pv_404_extreme.dsc 0D937913\nrom/script/pv_404_extreme_1.dsc 5E6CCAD1\nrom/script/pv_404_hard.dsc E918927C\nrom/script/pv_404_normal.dsc B26EA62E\nrom/script/pv_405_easy.dsc 973527B7\nrom/script/pv_405_extreme.dsc 8560C75E\nrom/script/pv_405_extreme_1.dsc 9047D724\nrom/script/pv_405_hard.dsc 94BD5750\nrom/script/pv_405_normal.dsc 8BA04E57\nrom/script/pv_407_extreme_1.dsc 531E3764\nrom/script/pv_407_hard.dsc 64F920B6\nrom/script/pv_407_normal.dsc 27301F2F\nrom/script/pv_408_extreme.dsc A0D5765B\nrom/script/pv_408_hard.dsc BDDE8EA4\nrom/script/pv_408_normal.dsc DA6406E7\nrom/script/pv_409_easy.dsc 7185FA51\nrom/script/pv_409_extreme.dsc B25865A6\nrom/script/pv_409_hard.dsc E9F6E893\nrom/script/pv_409_normal.dsc 846B885C\nrom/script/pv_410_easy.dsc F3E37D2E\nrom/script/pv_410_extreme.dsc E7D618EA\nrom/script/pv_410_hard.dsc F03CC052\nrom/script/pv_410_normal.dsc 5F1F32E5\nrom/script/pv_411_extreme.dsc 55B83B23\nrom/script/pv_411_hard.dsc FB0FE840\nrom/script/pv_411_normal.dsc 8030E7F6\nrom/script/pv_412_hard.dsc 04F2768A\nrom/script/pv_412_normal.dsc 3627673D\nrom/script/pv_413_extreme.dsc 2CE58F9A\nrom/script/pv_413_extreme_1.dsc AC7DA763\nrom/script/pv_413_hard.dsc 4E675151\nrom/script/pv_413_normal.dsc 757A3601\nrom/script/pv_414_extreme.dsc DC21F1D8\nrom/script/pv_414_extreme_1.dsc 54C6264B\nrom/script/pv_414_hard.dsc AD745F48\nrom/script/pv_414_normal.dsc DA076028\nrom/script/pv_415_easy.dsc A9245ABD\nrom/script/pv_415_extreme.dsc 4B32630D\nrom/script/pv_415_extreme_1.dsc DD2766A0\nrom/script/pv_415_hard.dsc 6ED8E424\nrom/script/pv_415_normal.dsc AC78FEAC\nrom/script/pv_416_easy.dsc 00ECEB5E\nrom/script/pv_416_extreme.dsc C05F23B6\nrom/script/pv_416_normal.dsc 1096FE0B\nrom/script/pv_417_extreme.dsc 42564497\nrom/script/pv_417_hard.dsc 93D757FE\nrom/script/pv_417_normal.dsc 9BC39807\nrom/script/pv_418_easy.dsc F6970E94\nrom/script/pv_418_extreme.dsc CD23749F\nrom/script/pv_418_hard.dsc 110D2BF5\nrom/script/pv_418_normal.dsc 3AB8CEB9\nrom/script/pv_419_easy.dsc F00274BB\nrom/script/pv_419_extreme.dsc B3438178\nrom/script/pv_419_hard.dsc A384C367\nrom/script/pv_419_normal.dsc 6FC45FF7\nrom/script/pv_420_extreme.dsc B12E3101\nrom/script/pv_420_hard.dsc 3872277E\nrom/script/pv_420_normal.dsc 30132D8E\nrom/script/pv_421_extreme.dsc 14D3D908\nrom/script/pv_421_extreme_1.dsc A970BE34\nrom/script/pv_421_normal.dsc B6A39E1F\nrom/script/pv_422_extreme.dsc 9F385D0F\nrom/script/pv_422_extreme_1.dsc EB2BFB36\nrom/script/pv_422_hard.dsc E33F8A11\nrom/script/pv_422_normal.dsc 1E699628\nrom/script/pv_423_extreme.dsc 8FCC56B4\nrom/script/pv_423_extreme_1.dsc A3482C51\nrom/script/pv_423_hard.dsc A9827105\nrom/script/pv_423_normal.dsc 8DC89527\nrom/script/pv_424_easy.dsc 584819AB\nrom/script/pv_424_extreme.dsc 9F92F3ED\nrom/script/pv_424_extreme_1.dsc E28136B7\nrom/script/pv_424_hard.dsc FC9B8326\nrom/script/pv_424_normal.dsc 5729764A\nrom/script/pv_425_extreme.dsc 88D1EB75\nrom/script/pv_425_hard.dsc DD77B5DB\nrom/script/pv_426_extreme.dsc 6C06E8DD\nrom/script/pv_426_hard.dsc C376DF45\nrom/script/pv_426_normal.dsc A00ABE1D\nrom/script/pv_427_easy.dsc 398A793C\nrom/script/pv_427_extreme.dsc 02875766\nrom/script/pv_427_hard.dsc 2081783A\nrom/script/pv_427_normal.dsc 759AF989\nrom/script/pv_428_extreme.dsc C0532D08\nrom/script/pv_428_extreme_1.dsc A5AE7753\nrom/script/pv_428_hard.dsc 823FAB63\nrom/script/pv_428_normal.dsc 0B38AAB2\nrom/script/pv_429_easy.dsc 7A22E7CD\nrom/script/pv_429_extreme.dsc 2FD844CC\nrom/script/pv_429_extreme_1.dsc 36E23DFF\nrom/script/pv_429_hard.dsc 2726EDB5\nrom/script/pv_429_normal.dsc 11DF6BA1\nrom/script/pv_430_easy.dsc 7D4D67B0\nrom/script/pv_430_hard.dsc 9DC00083\nrom/script/pv_430_normal.dsc AD9F08A1\nrom/script/pv_431_extreme.dsc 53F93FCF\nrom/script/pv_431_hard.dsc BEDE855A\nrom/script/pv_431_normal.dsc 17B90E26\nrom/script/pv_432_easy.dsc C7206F4E\nrom/script/pv_432_extreme.dsc 0571FF01\nrom/script/pv_432_hard.dsc EE975FE2\nrom/script/pv_432_normal.dsc 34704A06\nrom/script/pv_433_easy.dsc B4489645\nrom/script/pv_433_extreme.dsc CF569FCC\nrom/script/pv_433_hard.dsc 4340D551\nrom/script/pv_433_normal.dsc CECC287C\nrom/script/pv_434_easy.dsc A32DBF80\nrom/script/pv_434_extreme.dsc BF1984AA\nrom/script/pv_434_hard.dsc 26C5E857\nrom/script/pv_434_normal.dsc 2039CDE9\nrom/script/pv_435_hard.dsc 94865B92\nrom/script/pv_435_normal.dsc 957ED391\nrom/script/pv_436_easy.dsc 2889D99E\nrom/script/pv_436_extreme.dsc F2F5E1B5\nrom/script/pv_436_hard.dsc DD1D92CB\nrom/script/pv_436_normal.dsc AF678CE7\nrom/script/pv_437_extreme.dsc 6C80423C\nrom/script/pv_437_hard.dsc 125A427F\nrom/script/pv_437_normal.dsc 69A665E4\nrom/script/pv_438_extreme.dsc 04DC81E4\nrom/script/pv_438_hard.dsc B6AF3774\nrom/script/pv_438_normal.dsc 9E6C89AB\nrom/script/pv_439_easy.dsc 639CA9F9\nrom/script/pv_439_extreme.dsc 09EF8ECB\nrom/script/pv_439_hard.dsc 766E19A4\nrom/script/pv_439_normal.dsc 727C11E7\nrom/script/pv_440_easy.dsc 10D95923\nrom/script/pv_440_hard.dsc 3C9FC6F1\nrom/script/pv_440_normal.dsc AA49F01C\nrom/script/pv_441_extreme.dsc 97106866\nrom/script/pv_441_hard.dsc DA321D60\nrom/script/pv_441_normal.dsc B1E7450A\nrom/script/pv_442_easy.dsc B550B4FA\nrom/script/pv_442_extreme.dsc E81926C4\nrom/script/pv_442_hard.dsc 27204A58\nrom/script/pv_442_normal.dsc D3EE3EEC\nrom/script/pv_443_easy.dsc B44DA82F\nrom/script/pv_443_extreme.dsc EDCECC9F\nrom/script/pv_443_hard.dsc 5C3FFA7D\nrom/script/pv_443_normal.dsc EACC718B\nrom/script/pv_600_easy.dsc 55EF125E\nrom/script/pv_600_extreme.dsc EF5975D8\nrom/script/pv_600_hard.dsc E5313131\nrom/script/pv_600_normal.dsc C0B6096D\nrom/script/pv_601_extreme.dsc B1952826\nrom/script/pv_601_hard.dsc F65966A7\nrom/script/pv_601_normal.dsc 583070DF\nrom/script/pv_602_easy.dsc E5CD6440\nrom/script/pv_602_extreme.dsc 68ABD27F\nrom/script/pv_602_hard.dsc BB751311\nrom/script/pv_602_normal.dsc 931D4E0C\nrom/script/pv_603_easy.dsc D996A55F\nrom/script/pv_603_extreme.dsc 4280D540\nrom/script/pv_603_hard.dsc D9371EAF\nrom/script/pv_603_normal.dsc 28BBFC14\nrom/script/pv_604_easy.dsc 8AC73691\nrom/script/pv_604_extreme.dsc A39BE2DD\nrom/script/pv_604_hard.dsc C802C4F8\nrom/script/pv_604_normal.dsc 4D8FE5EA\nrom/script/pv_605_easy.dsc 8A26BAE6\nrom/script/pv_605_extreme.dsc DE358191\nrom/script/pv_605_normal.dsc 16A7B1B2\nrom/script/pv_607_easy.dsc 7433BF0D\nrom/script/pv_607_extreme.dsc 45E2D7DC\nrom/script/pv_607_hard.dsc 6E99F89F\nrom/script/pv_607_normal.dsc FA917C48\nrom/script/pv_608_easy.dsc 2BC6643B\nrom/script/pv_608_extreme.dsc 56E00753\nrom/script/pv_608_hard.dsc 28B1DA82\nrom/script/pv_608_normal.dsc 4CC11AC9\nrom/script/pv_609_easy.dsc B502744C\nrom/script/pv_609_extreme.dsc 794CD45C\nrom/script/pv_609_hard.dsc DC85D47B\nrom/script/pv_609_normal.dsc 3DAC6822\nrom/script/pv_610_easy.dsc 287F44E6\nrom/script/pv_610_extreme.dsc 11AC1223\nrom/script/pv_610_hard.dsc 3EA821C9\nrom/script/pv_610_normal.dsc DBADEE53\nrom/script/pv_611_extreme.dsc EB533EAC\nrom/script/pv_611_hard.dsc 3C917C75\nrom/script/pv_611_normal.dsc DDD65A6B\nrom/script/pv_612_easy.dsc 235DF7B3\nrom/script/pv_612_extreme.dsc 5B5724D6\nrom/script/pv_612_hard.dsc AC0DE6D6\nrom/script/pv_612_normal.dsc A7724998\nrom/script/pv_613_easy.dsc D94A6422\nrom/script/pv_613_extreme.dsc CE628CA6\nrom/script/pv_613_hard.dsc 1DD06CE7\nrom/script/pv_613_normal.dsc A2C75A7B\nrom/script/pv_614_extreme.dsc 1288E6FE\nrom/script/pv_614_hard.dsc B0A572EA\nrom/script/pv_614_normal.dsc 3115F728\nrom/script/pv_615_easy.dsc 8FA88B74\nrom/script/pv_615_extreme.dsc B4B79D38\nrom/script/pv_615_hard.dsc 29D33EC8\nrom/script/pv_616_easy.dsc C1D5A84E\nrom/script/pv_616_extreme.dsc 6BDF13F1\nrom/script/pv_616_hard.dsc DC8D7BFF\nrom/script/pv_616_normal.dsc 5CE69DF9\nrom/script/pv_617_extreme.dsc 3CE78EDB\nrom/script/pv_617_hard.dsc E780ADD6\nrom/script/pv_617_normal.dsc DE865F01\nrom/script/pv_618_easy.dsc 9F234803\nrom/script/pv_618_extreme.dsc A3CA77F4\nrom/script/pv_618_hard.dsc A4FC6048\nrom/script/pv_618_normal.dsc 4DA427B9\nrom/script/pv_619_easy.dsc 70FFCECF\nrom/script/pv_619_extreme.dsc ACEED224\nrom/script/pv_619_hard.dsc B70AC164\nrom/script/pv_619_normal.dsc DC18AB4A\nrom/script/pv_620_easy.dsc 3C662266\nrom/script/pv_620_extreme.dsc E44336FA\nrom/script/pv_620_normal.dsc 2D3508E4\nrom/script/pv_621_easy.dsc 37336FB6\nrom/script/pv_621_extreme.dsc 961BE775\nrom/script/pv_621_hard.dsc EFCA2214\nrom/script/pv_621_normal.dsc 9989211C\nrom/script/pv_622_easy.dsc C90A6926\nrom/script/pv_622_extreme.dsc A41E85B2\nrom/script/pv_622_hard.dsc 9E05AEBE\nrom/script/pv_622_normal.dsc 99F09CFE\nrom/script/pv_623_easy.dsc DE457A08\nrom/script/pv_623_extreme.dsc CD7DF773\nrom/script/pv_623_hard.dsc FF4D4D28\nrom/script/pv_623_normal.dsc B0061EA1\nrom/script/pv_624_easy.dsc 317F6537\nrom/script/pv_624_extreme.dsc 9972F01A\nrom/script/pv_624_hard.dsc 2B81D650\nrom/script/pv_624_normal.dsc F54BD407\nrom/script/pv_625_hard.dsc 5711A769\nrom/script/pv_625_normal.dsc 968276FF\nrom/script/pv_626_easy.dsc DC1C0E44\nrom/script/pv_626_extreme.dsc 20C35461\nrom/script/pv_626_hard.dsc 269329D7\nrom/script/pv_626_normal.dsc 77B1A1B9\nrom/script/pv_627_easy.dsc 6806FAC1\nrom/script/pv_627_extreme.dsc EF0AD937\nrom/script/pv_627_hard.dsc 6FD4FAF7\nrom/script/pv_627_normal.dsc 9AFBC354\nrom/script/pv_628_easy.dsc AC39E385\nrom/script/pv_628_extreme.dsc 355C488D\nrom/script/pv_628_hard.dsc D590A9E3\nrom/script/pv_628_normal.dsc 5D9B5CDB\nrom/script/pv_629_easy.dsc C909FE10\nrom/script/pv_629_extreme.dsc 44E2E6B5\nrom/script/pv_629_hard.dsc AB0A5102\nrom/script/pv_630_easy.dsc 6AF7B496\nrom/script/pv_630_extreme.dsc 984941D1\nrom/script/pv_630_hard.dsc 704E6602\nrom/script/pv_630_normal.dsc 2D4526F9\nrom/script/pv_631_easy.dsc A84DCAFA\nrom/script/pv_631_extreme.dsc 99DB8C90\nrom/script/pv_631_hard.dsc 34508993\nrom/script/pv_631_normal.dsc E46AE0D2\nrom/script/pv_637_easy.dsc 3D89CDFC\nrom/script/pv_637_extreme.dsc BCDA2E13\nrom/script/pv_637_hard.dsc 263F183F\nrom/script/pv_637_normal.dsc 075166C2\nrom/script/pv_638_easy.dsc A0437A88\nrom/script/pv_638_extreme.dsc 03C4E956\nrom/script/pv_638_hard.dsc D9921311\nrom/script/pv_638_normal.dsc C71BF509\nrom/script/pv_639_extreme.dsc 990961FE\nrom/script/pv_402_extreme.dsc FB9E6181\nrom/script/pv_407_extreme.dsc 2061842F\nrom/script/pv_412_extreme.dsc 5FF778DD\nrom/script/pv_416_hard.dsc 1082AEFA\nrom/script/pv_421_hard.dsc DE8DE37A\nrom/script/pv_425_normal.dsc B5F81A4B\nrom/script/pv_430_extreme.dsc EC9BA228\nrom/script/pv_435_extreme.dsc 3DCA160D\nrom/script/pv_440_extreme.dsc 3FE74792\nrom/script/pv_601_easy.dsc 00E4B62D\nrom/script/pv_605_hard.dsc A45DA3B0\nrom/script/pv_611_easy.dsc DAAF2E76\nrom/script/pv_615_normal.dsc 1C2D1E5E\nrom/script/pv_620_hard.dsc DE497FF8\nrom/script/pv_625_extreme.dsc 72A20C06\nrom/script/pv_629_normal.dsc 99FECCD7\nrom/script/pv_639_hard.dsc A68BF106\nrom/script/pv_722_easy.dsc 97C37BCD\nrom/script/pv_726_hard.dsc 43AC2370\nrom/script/pv_731_easy.dsc A7C95048\nrom/script/pv_736_hard.dsc 875E6EEF\nrom/script/pv_639_normal.dsc 94D5E9E0\nrom/script/pv_640_easy.dsc C75D9D8A\nrom/script/pv_640_extreme.dsc 975279A3\nrom/script/pv_640_hard.dsc E45BD044\nrom/script/pv_640_normal.dsc 96A5B6BB\nrom/script/pv_641_easy.dsc 294B061F\nrom/script/pv_641_extreme.dsc 0F7032B6\nrom/script/pv_641_hard.dsc 40AE5C4C\nrom/script/pv_641_normal.dsc BECDD6C8\nrom/script/pv_642_easy.dsc 1DA5F826\nrom/script/pv_642_extreme.dsc C2624516\nrom/script/pv_642_hard.dsc FD782288\nrom/script/pv_642_normal.dsc 4F036C01\nrom/script/pv_710_easy.dsc 83CBB982\nrom/script/pv_710_extreme.dsc 7E76539B\nrom/script/pv_710_hard.dsc 8DCA80E9\nrom/script/pv_710_normal.dsc 057D63EC\nrom/script/pv_722_extreme.dsc 83CA3801\nrom/script/pv_722_hard.dsc CCC45AD4\nrom/script/pv_722_normal.dsc 7E877EEC\nrom/script/pv_723_easy.dsc 0AF66A8F\nrom/script/pv_723_extreme.dsc A82341C1\nrom/script/pv_723_hard.dsc 85D30986\nrom/script/pv_723_normal.dsc DBD40CF2\nrom/script/pv_724_easy.dsc 0B711633\nrom/script/pv_724_extreme.dsc 9BDECA3B\nrom/script/pv_724_hard.dsc 30C21361\nrom/script/pv_724_normal.dsc 6D97A45F\nrom/script/pv_725_easy.dsc 653502FC\nrom/script/pv_725_extreme.dsc 06C7CBDF\nrom/script/pv_725_hard.dsc 5804170C\nrom/script/pv_725_normal.dsc CF00CEB0\nrom/script/pv_726_easy.dsc AB604F24\nrom/script/pv_726_extreme.dsc 7D9FF60B\nrom/script/pv_726_normal.dsc 9E428F9C\nrom/script/pv_727_easy.dsc 0D920142\nrom/script/pv_727_extreme.dsc FC5E02DE\nrom/script/pv_727_hard.dsc 9D1F211D\nrom/script/pv_727_normal.dsc 2219193E\nrom/script/pv_728_easy.dsc A821666E\nrom/script/pv_728_extreme.dsc E3E0AD64\nrom/script/pv_728_hard.dsc 4295048D\nrom/script/pv_728_normal.dsc C2BEB540\nrom/script/pv_729_easy.dsc AC005FF1\nrom/script/pv_729_extreme.dsc 9C922E28\nrom/script/pv_729_hard.dsc F85D8482\nrom/script/pv_729_normal.dsc D96769D2\nrom/script/pv_730_easy.dsc 3ABE0731\nrom/script/pv_730_extreme.dsc 0A773EED\nrom/script/pv_730_hard.dsc E2628663\nrom/script/pv_730_normal.dsc 44A75C5A\nrom/script/pv_731_extreme.dsc 9B5ACA6B\nrom/script/pv_731_hard.dsc 58CFB01F\nrom/script/pv_731_normal.dsc B94A1ADF\nrom/script/pv_732_easy.dsc A7D9FB75\nrom/script/pv_732_extreme.dsc 4ED63BD7\nrom/script/pv_732_hard.dsc 2A1AB39C\nrom/script/pv_732_normal.dsc 86C08125\nrom/script/pv_733_easy.dsc 635C6926\nrom/script/pv_733_extreme.dsc F03B1889\nrom/script/pv_733_hard.dsc 4DBAE275\nrom/script/pv_733_normal.dsc ACF528E5\nrom/script/pv_734_easy.dsc 06CDE987\nrom/script/pv_734_extreme.dsc D96CB68A\nrom/script/pv_734_hard.dsc 78D24578\nrom/script/pv_734_normal.dsc B20AFB9A\nrom/script/pv_736_easy.dsc 5DCF7A31\nrom/script/pv_736_extreme.dsc EE902872\nrom/script/pv_736_normal.dsc 6B82ECA7\nrom/script/pv_737_easy.dsc 694931D3\nrom/script/pv_737_extreme.dsc 6486CE59\nrom/script/pv_737_hard.dsc F7D0D55C\nrom/script/pv_737_normal.dsc 459C5EEA\nrom/script/pv_738_extreme.dsc BC99BCD1\nrom/script/pv_738_hard.dsc 34E71E37\nrom/script/pv_738_normal.dsc 0D547301\nrom/script/pv_739_easy.dsc C69080EF\nrom/script/pv_739_extreme.dsc 68E1ECE3\nrom/script/pv_739_hard.dsc EE35E342\nrom/script/pv_739_normal.dsc 221D8776\nrom/script/pv_740_easy.dsc DA0B7A6B\nrom/script/pv_740_extreme.dsc D4E7C7C5\nrom/script/pv_740_hard.dsc B23C953B\nrom/script/pv_740_normal.dsc F05FF0A4\nrom/script/pv_832_easy.dsc 03E0DBD3\nrom/script/pv_832_extreme.dsc 762F5177\nrom/script/pv_832_hard.dsc 1326952C\nrom/script/pv_832_normal.dsc EA731D11\nrom/script/pv_999_normal.dsc FD8D1E42\nrom/skin_param/ext_skp_hakitm001_joha_outer_01__divskn.txt 4D24DA8E\nrom/skin_param/ext_skp_hakitm002_joha_outer_02__divskn.txt 84BAACF1\nrom/skin_param/ext_skp_hakitm003_joha_outer_03__divskn.txt 7F86191A\nrom/skin_param/ext_skp_hakitm004_joha_outer_04__divskn.txt 79ACFF1E\nrom/skin_param/ext_skp_hakitm500_atam_atama_00__divskn.txt 04BDCDAC\nrom/skin_param/ext_skp_hakitm501_atam_atama_01__divskn.txt 6E716419\nrom/skin_param/ext_skp_hakitm502_atam_atama_02__divskn.txt 284CA3EC\nrom/skin_param/ext_skp_hakitm700_atam_zujo_00__divskn.txt 74629E5C\nrom/skin_param/ext_skp_hnditm057_schoolbag_b_close_bone_l__divskn.txt 323082A7\nrom/skin_param/ext_skp_hnditm057_schoolbag_b_close_bone_r__divskn.txt B579B24D\nrom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_l_kai__divskn.txt 2EE3AAE2\nrom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_l__divskn.txt 2EE3AAE2\nrom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_r_kai__divskn.txt 246D6842\nrom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_r_len__divskn.txt 246D6842\nrom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_r__divskn.txt 246D6842\nrom/skin_param/ext_skp_kaiitm001_joha_outer_01__divskn.txt 8C1BE0FB\nrom/skin_param/ext_skp_kaiitm002_joha_outer_02__divskn.txt 9F36E712\nrom/skin_param/ext_skp_kaiitm003_joha_outer_03__divskn.txt 3F8FE4E8\nrom/skin_param/ext_skp_kaiitm004_joha_outer_04__divskn.txt 3E616EB3\nrom/skin_param/ext_skp_kaiitm006_joha_outer_06__divskn.txt 2E548BD1\nrom/skin_param/ext_skp_kaiitm008_joha_outer_08__divskn.txt D5F07089\nrom/skin_param/ext_skp_kaiitm009_joha_outer_09__divskn.txt E2588062\nrom/skin_param/ext_skp_kaiitm011_joha_outer_11__divskn.txt 946809E5\nrom/skin_param/ext_skp_kaiitm012_joha_outer_12__divskn.txt 4941911F\nrom/skin_param/ext_skp_kaiitm015_joha_outer_15__divskn.txt 3EA50175\nrom/skin_param/ext_skp_kaiitm016_joha_outer_16__divskn.txt E3EC46A4\nrom/skin_param/ext_skp_kaiitm018_joha_outer_18__divskn.txt 847FFEA3\nrom/skin_param/ext_skp_kaiitm019_joha_outer_19__divskn.txt F370F7A5\nrom/skin_param/ext_skp_kaiitm020_joha_outer_20__divskn.txt DE1EBE3F\nrom/skin_param/ext_skp_kaiitm022_joha_outer_22__divskn.txt 8633A383\nrom/skin_param/ext_skp_kaiitm024_joha_outer_24__divskn.txt 37C513E8\nrom/skin_param/ext_skp_kaiitm025_joha_outer_25__divskn.txt E735CA83\nrom/skin_param/ext_skp_kaiitm027_joha_outer_27__divskn.txt 215E9852\nrom/skin_param/ext_skp_hnditm601_pv_bonbon_sing_l_len__divskn.txt 2EE3AAE2\nrom/skin_param/ext_skp_kaiitm010_joha_outer_10__divskn.txt 497365B1\nrom/skin_param/ext_skp_kaiitm028_joha_outer_28__divskn.txt 78D2D4EF\nrom/skin_param/ext_skp_kaiitm502_atam_atama_02__divskn.txt 9CB70A08\nrom/skin_param/ext_skp_kaiitm524_atam_atama_24__divskn.txt E93C73E7\nrom/skin_param/ext_skp_kaiitm705_atam_zujo_05__divskn.txt 686FC4D4\nrom/skin_param/ext_skp_lenitm009_joha_outer_09__divskn.txt 382B6653\nrom/skin_param/ext_skp_lenitm022_joha_outer_22__divskn.txt 9747EDC4\nrom/skin_param/ext_skp_lenitm034_joha_outer_34__divskn.txt E1027AB5\nrom/skin_param/ext_skp_lenitm507_atam_atama_07__divskn.txt 685B5D10\nrom/skin_param/ext_skp_lenitm528_atam_atama_28__divskn.txt C48FB670\nrom/skin_param/ext_skp_kaiitm029_joha_outer_29__divskn.txt FA3EA7B9\nrom/skin_param/ext_skp_kaiitm030_joha_outer_30__divskn.txt 5C18A136\nrom/skin_param/ext_skp_kaiitm031_joha_outer_31__divskn.txt B2C76F64\nrom/skin_param/ext_skp_kaiitm032_joha_outer_32__divskn.txt 7DBD2466\nrom/skin_param/ext_skp_kaiitm033_joha_outer_33__divskn.txt 5D7B06EE\nrom/skin_param/ext_skp_kaiitm034_joha_outer_34__divskn.txt 07F5CE85\nrom/skin_param/ext_skp_kaiitm036_joha_outer_36__divskn.txt F303BEAB\nrom/skin_param/ext_skp_kaiitm041_joha_outer_41__divskn.txt 1BF2404D\nrom/skin_param/ext_skp_kaiitm042_joha_outer_42__divskn.txt 9C52BBDE\nrom/skin_param/ext_skp_kaiitm500_atam_atama_00__divskn.txt 19EC854D\nrom/skin_param/ext_skp_kaiitm501_atam_atama_01__divskn.txt 8E03B4E2\nrom/skin_param/ext_skp_kaiitm503_atam_atama_03__divskn.txt 4BAE4D26\nrom/skin_param/ext_skp_kaiitm504_atam_atama_04__divskn.txt 1E2FFD8B\nrom/skin_param/ext_skp_kaiitm505_atam_atama_05__divskn.txt AA42F404\nrom/skin_param/ext_skp_kaiitm506_atam_atama_06__divskn.txt 840EC0D4\nrom/skin_param/ext_skp_kaiitm507_atam_atama_07__divskn.txt F35392FF\nrom/skin_param/ext_skp_kaiitm508_atam_atama_08__divskn.txt 13B49259\nrom/skin_param/ext_skp_kaiitm509_atam_atama_09__divskn.txt A9B6B152\nrom/skin_param/ext_skp_kaiitm510_atam_atama_10__divskn.txt 2ACC939E\nrom/skin_param/ext_skp_kaiitm520_atam_atama_20__divskn.txt 01F8B471\nrom/skin_param/ext_skp_kaiitm522_atam_atama_22__divskn.txt 8F3918A7\nrom/skin_param/ext_skp_kaiitm523_atam_atama_23__divskn.txt 667D75E2\nrom/skin_param/ext_skp_kaiitm527_atam_atama_27__divskn.txt 2E0C888E\nrom/skin_param/ext_skp_kaiitm528_atam_atama_28__divskn.txt 73491F88\nrom/skin_param/ext_skp_kaiitm529_atam_atama_29__divskn.txt 272D1656\nrom/skin_param/ext_skp_kaiitm531_atam_atama_31__divskn.txt 419552EE\nrom/skin_param/ext_skp_kaiitm532_atam_atama_32__divskn.txt 5A5353AB\nrom/skin_param/ext_skp_kaiitm533_atam_atama_33__divskn.txt 13B49259\nrom/skin_param/ext_skp_kaiitm534_atam_atama_34__divskn.txt 1CDB2E67\nrom/skin_param/ext_skp_kaiitm536_atam_atama_36__divskn.txt 78E123DE\nrom/skin_param/ext_skp_kaiitm541_atam_atama_41__divskn.txt D2F4972E\nrom/skin_param/ext_skp_kaiitm542_atam_atama_42__divskn.txt AEE53D61\nrom/skin_param/ext_skp_kaiitm701_atam_zujo_01__divskn.txt 1FA0E0F0\nrom/skin_param/ext_skp_kaiitm706_atam_zujo_06__divskn.txt A570CFCC\nrom/skin_param/ext_skp_kaiitm750_joha_neck_50__divskn.txt F0AF8544\nrom/skin_param/ext_skp_kaiitm751_joha_neck_51__divskn.txt 65631614\nrom/skin_param/ext_skp_kaiitm775_joha_ushiro_75__divskn.txt 8AA2DBC3\nrom/skin_param/ext_skp_lenitm001_joha_outer_01__divskn.txt 55A8C416\nrom/skin_param/ext_skp_lenitm002_joha_outer_02__divskn.txt 21274F4A\nrom/skin_param/ext_skp_lenitm003_joha_outer_03__divskn.txt 9705B54B\nrom/skin_param/ext_skp_lenitm004_joha_outer_04__divskn.txt B36FD6EE\nrom/skin_param/ext_skp_lenitm005_joha_outer_05__divskn.txt D72CBA3A\nrom/skin_param/ext_skp_lenitm007_joha_outer_07__divskn.txt 7FE0EA6C\nrom/skin_param/ext_skp_lenitm008_joha_outer_08__divskn.txt 9772EBEA\nrom/skin_param/ext_skp_lenitm010_joha_outer_10__divskn.txt 93EE30EE\nrom/skin_param/ext_skp_lenitm011_joha_outer_11__divskn.txt C871752A\nrom/skin_param/ext_skp_lenitm012_joha_outer_12__divskn.txt 20FDB291\nrom/skin_param/ext_skp_lenitm013_joha_outer_13__divskn.txt A2F40B68\nrom/skin_param/ext_skp_lenitm014_joha_outer_14__divskn.txt CA074C71\nrom/skin_param/ext_skp_lenitm015_joha_outer_15__divskn.txt C80B1B33\nrom/skin_param/ext_skp_lenitm016_joha_outer_16__divskn.txt 9121F172\nrom/skin_param/ext_skp_lenitm017_joha_outer_17__divskn.txt F1075733\nrom/skin_param/ext_skp_lenitm018_joha_outer_18__divskn.txt C28E33B0\nrom/skin_param/ext_skp_lenitm019_joha_outer_19__divskn.txt EE076B01\nrom/skin_param/ext_skp_lenitm021_joha_outer_21__divskn.txt 92F4F9FE\nrom/skin_param/ext_skp_lenitm023_joha_outer_23__divskn.txt 3CBC9280\nrom/skin_param/ext_skp_lenitm024_joha_outer_24__divskn.txt 925824D3\nrom/skin_param/ext_skp_lenitm025_joha_outer_25__divskn.txt 89E8F269\nrom/skin_param/ext_skp_lenitm026_joha_outer_26__divskn.txt 705B679A\nrom/skin_param/ext_skp_lenitm027_joha_outer_27__divskn.txt EFF34072\nrom/skin_param/ext_skp_lenitm028_joha_outer_28__divskn.txt 00C9F784\nrom/skin_param/ext_skp_lenitm029_joha_outer_29__divskn.txt E3DE802F\nrom/skin_param/ext_skp_lenitm030_joha_outer_30__divskn.txt A8E54719\nrom/skin_param/ext_skp_lenitm031_joha_outer_31__divskn.txt 8CA5C00D\nrom/skin_param/ext_skp_lenitm032_joha_outer_32__divskn.txt 0DEB4749\nrom/skin_param/ext_skp_lenitm033_joha_outer_33__divskn.txt BBC1212D\nrom/skin_param/ext_skp_lenitm035_joha_outer_35__divskn.txt A9E9FC90\nrom/skin_param/ext_skp_lenitm036_joha_outer_36__divskn.txt 9B6123B7\nrom/skin_param/ext_skp_lenitm038_joha_outer_38__divskn.txt 179D24CD\nrom/skin_param/ext_skp_lenitm040_joha_outer_40__divskn.txt C6801D18\nrom/skin_param/ext_skp_lenitm500_atam_atama_00__divskn.txt D910C084\nrom/skin_param/ext_skp_lenitm501_atam_atama_01__divskn.txt 3E519A80\nrom/skin_param/ext_skp_lenitm502_atam_atama_02__divskn.txt 2C4F0FEA\nrom/skin_param/ext_skp_lenitm503_atam_atama_03__divskn.txt FD3D9A32\nrom/skin_param/ext_skp_lenitm504_atam_atama_04__divskn.txt 2E592957\nrom/skin_param/ext_skp_lenitm505_atam_atama_05__divskn.txt 98E59E3E\nrom/skin_param/ext_skp_lenitm506_atam_atama_06__divskn.txt B98FCC44\nrom/skin_param/ext_skp_lenitm508_atam_atama_08__divskn.txt 5C7DA3B0\nrom/skin_param/ext_skp_lenitm509_atam_atama_09__divskn.txt 62721319\nrom/skin_param/ext_skp_lenitm510_atam_atama_10__divskn.txt E42BD014\nrom/skin_param/ext_skp_lenitm511_atam_atama_11__divskn.txt 96BC8337\nrom/skin_param/ext_skp_lenitm519_atam_atama_19__divskn.txt 29757C9E\nrom/skin_param/ext_skp_lenitm521_atam_atama_21__divskn.txt 38F0F907\nrom/skin_param/ext_skp_lenitm522_atam_atama_22__divskn.txt F530E67C\nrom/skin_param/ext_skp_lenitm523_atam_atama_23__divskn.txt FBFC8406\nrom/skin_param/ext_skp_lenitm524_atam_atama_24__divskn.txt E292B771\nrom/skin_param/ext_skp_lenitm525_atam_atama_25__divskn.txt D2956189\nrom/skin_param/ext_skp_lenitm526_atam_atama_26__divskn.txt 9FD32D2F\nrom/skin_param/ext_skp_lenitm529_atam_atama_29__divskn.txt F54C8A9A\nrom/skin_param/ext_skp_lenitm530_atam_atama_30__divskn.txt 9632D537\nrom/skin_param/ext_skp_lenitm531_atam_atama_31__divskn.txt 61DAC8D3\nrom/skin_param/ext_skp_lenitm532_atam_atama_32__divskn.txt B5D58E3C\nrom/skin_param/ext_skp_lenitm533_atam_atama_33__divskn.txt 9F0BB8EF\nrom/skin_param/ext_skp_lenitm534_atam_atama_34__divskn.txt 718D4801\nrom/skin_param/ext_skp_lenitm535_atam_atama_35__divskn.txt C2F62745\nrom/skin_param/ext_skp_lenitm536_atam_atama_36__divskn.txt 5DCD74FC\nrom/skin_param/ext_skp_lenitm537_atam_atama_37__divskn.txt 02BDAE3B\nrom/skin_param/ext_skp_lenitm538_atam_atama_38__divskn.txt 4F56EAB9\nrom/skin_param/ext_skp_lenitm540_atam_atama_40__divskn.txt C441EDC1\nrom/skin_param/ext_skp_lenitm775_joha_ushiro_75__divskn.txt D216DEAD\nrom/skin_param/ext_skp_lukitm001_joha_outer_01_zzc__divskn.txt 654805C5\nrom/skin_param/ext_skp_lukitm002_joha_outer_02__divskn.txt E17F62F1\nrom/skin_param/ext_skp_lukitm003_joha_outer_03__divskn.txt 25195EA0\nrom/skin_param/ext_skp_lukitm004_joha_outer_04__divskn.txt 214BCD31\nrom/skin_param/ext_skp_lukitm005_joha_outer_05__divskn.txt E4D482F7\nrom/skin_param/ext_skp_lukitm006_joha_outer_06__divskn.txt 220D8A17\nrom/skin_param/ext_skp_lukitm007_joha_outer_07__divskn.txt ADA69068\nrom/skin_param/ext_skp_lukitm008_joha_outer_08__divskn.txt B5B57701\nrom/skin_param/ext_skp_lukitm009_joha_outer_09__divskn.txt 280C99FE\nrom/skin_param/ext_skp_lukitm010_joha_outer_10__divskn.txt 16DA411B\nrom/skin_param/ext_skp_lukitm012_joha_outer_12__divskn.txt B890CD58\nrom/skin_param/ext_skp_lukitm013_joha_outer_13__divskn.txt 8276AF21\nrom/skin_param/ext_skp_lukitm014_joha_outer_14__divskn.txt 7A2DCF8C\nrom/skin_param/ext_skp_lukitm015_joha_outer_15__divskn.txt 9FF9A753\nrom/skin_param/ext_skp_lukitm017_joha_outer_17_zzc__divskn.txt 8AEF2838\nrom/skin_param/ext_skp_lukitm018_joha_outer_18__divskn.txt 41A3DEC2\nrom/skin_param/ext_skp_lukitm019_joha_outer_19__divskn.txt F41EA21C\nrom/skin_param/ext_skp_lukitm020_joha_outer_20__divskn.txt F5759B2F\nrom/skin_param/ext_skp_lukitm021_joha_outer_21__divskn.txt 03807B90\nrom/skin_param/ext_skp_lukitm022_joha_outer_22__divskn.txt 2D127092\nrom/skin_param/ext_skp_lukitm023_joha_outer_23__divskn.txt 02E7BA68\nrom/skin_param/ext_skp_lukitm025_joha_outer_25__divskn.txt C0950F86\nrom/skin_param/ext_skp_lukitm026_joha_outer_26__divskn.txt 2BAE2E86\nrom/skin_param/ext_skp_lukitm027_joha_outer_27__divskn.txt 9FE08A57\nrom/skin_param/ext_skp_lukitm028_joha_outer_28__divskn.txt 5961D7D3\nrom/skin_param/ext_skp_lukitm029_joha_outer_29__divskn.txt F8742093\nrom/skin_param/ext_skp_lukitm030_joha_outer_30__divskn.txt E62E3AD6\nrom/skin_param/ext_skp_lukitm031_joha_outer_31__divskn.txt F3C25D81\nrom/skin_param/ext_skp_lukitm032_joha_outer_32__divskn.txt 76ED4243\nrom/skin_param/ext_skp_lukitm033_joha_outer_33__divskn.txt 8F2BC033\nrom/skin_param/ext_skp_lukitm034_joha_outer_34__divskn.txt 214BCD31\nrom/skin_param/ext_skp_lukitm035_joha_outer_35__divskn.txt 62E22A35\nrom/skin_param/ext_skp_lukitm037_joha_outer_37__divskn.txt 10E57D9A\nrom/skin_param/ext_skp_lukitm038_joha_outer_38__divskn.txt CE8AFFED\nrom/skin_param/ext_skp_lukitm039_joha_outer_39__divskn.txt 3156C805\nrom/skin_param/ext_skp_lukitm040_joha_outer_40__divskn.txt 98F0E7C2\nrom/skin_param/ext_skp_lukitm042_joha_outer_42__divskn.txt 149B3BCF\nrom/skin_param/ext_skp_lukitm311_ude_hand_11__divskn.txt A62E4BCF\nrom/skin_param/ext_skp_lukitm500_atam_atama_00__divskn.txt 1E93DA16\nrom/skin_param/ext_skp_lukitm501_atam_atama_01__divskn.txt E540B91D\nrom/skin_param/ext_skp_lukitm502_atam_atama_02__divskn.txt 60D49880\nrom/skin_param/ext_skp_lukitm503_atam_atama_03__divskn.txt 73E7D894\nrom/skin_param/ext_skp_lukitm504_atam_atama_04__divskn.txt 2AD8D280\nrom/skin_param/ext_skp_lukitm506_atam_atama_06__divskn.txt D8424EDF\nrom/skin_param/ext_skp_lukitm507_atam_atama_07__divskn.txt 55B50F1E\nrom/skin_param/ext_skp_lukitm508_atam_atama_08__divskn.txt 1E93DA16\nrom/skin_param/ext_skp_lukitm509_atam_atama_09__divskn.txt 73E7D894\nrom/skin_param/ext_skp_lukitm510_atam_atama_10__divskn.txt 1E93DA16\nrom/skin_param/ext_skp_lukitm511_atam_atama_11__divskn.txt E4F6544F\nrom/skin_param/ext_skp_lukitm512_atam_atama_12__divskn.txt 5C4FF82F\nrom/skin_param/ext_skp_lukitm513_atam_atama_13__divskn.txt 34637A9E\nrom/skin_param/ext_skp_lukitm514_atam_atama_14__divskn.txt 9A20B7AD\nrom/skin_param/ext_skp_lukitm515_atam_atama_15__divskn.txt 7054E187\nrom/skin_param/ext_skp_lukitm516_atam_atama_16__divskn.txt 30B9489A\nrom/skin_param/ext_skp_lukitm525_atam_atama_25__divskn.txt 7C08E2E9\nrom/skin_param/ext_skp_lukitm526_atam_atama_26__divskn.txt B2685485\nrom/skin_param/ext_skp_lukitm527_atam_atama_27__divskn.txt 08415D9B\nrom/skin_param/ext_skp_lukitm528_atam_atama_28__divskn.txt 9BF39C9D\nrom/skin_param/ext_skp_lukitm529_atam_atama_29__divskn.txt E57BE10E\nrom/skin_param/ext_skp_lukitm530_atam_atama_30__divskn.txt 3A35570E\nrom/skin_param/ext_skp_lukitm531_atam_atama_31__divskn.txt 03571AC4\nrom/skin_param/ext_skp_lukitm532_atam_atama_32__divskn.txt 755E0D97\nrom/skin_param/ext_skp_lukitm533_atam_atama_33__divskn.txt 0E59E330\nrom/skin_param/ext_skp_lukitm534_atam_atama_34__divskn.txt 85FC9650\nrom/skin_param/ext_skp_lukitm535_atam_atama_35__divskn.txt 0AEF6013\nrom/skin_param/ext_skp_lukitm537_atam_atama_37__divskn.txt B25AA34F\nrom/skin_param/ext_skp_lukitm538_atam_atama_38__divskn.txt 9F6E06A5\nrom/skin_param/ext_skp_lukitm539_atam_atama_39__divskn.txt 422048E7\nrom/skin_param/ext_skp_lukitm540_atam_atama_40__divskn.txt E739752A\nrom/skin_param/ext_skp_lukitm542_atam_atama_42__divskn.txt 12DEB872\nrom/skin_param/ext_skp_lukitm700_atam_zujo_00__divskn.txt 9FEF0013\nrom/skin_param/ext_skp_lukitm702_atam_zujo_02__divskn.txt B841A829\nrom/skin_param/ext_skp_lukitm703_atam_zujo_03__divskn.txt 0F0D1518\nrom/skin_param/ext_skp_lukitm705_atam_zujo_05__divskn.txt B83E4D47\nrom/skin_param/ext_skp_meiitm001_joha_outer_01__divskn.txt DA57FC3C\nrom/skin_param/ext_skp_meiitm002_joha_outer_02__divskn.txt 41569244\nrom/skin_param/ext_skp_meiitm004_joha_outer_04__divskn.txt 2DCCF95F\nrom/skin_param/ext_skp_meiitm005_joha_outer_05__divskn.txt 23C85D3A\nrom/skin_param/ext_skp_meiitm006_joha_outer_06__divskn.txt 2CB0A9B8\nrom/skin_param/ext_skp_meiitm008_joha_outer_08__divskn.txt 88D864E1\nrom/skin_param/ext_skp_meiitm009_joha_outer_09__divskn.txt 3A9CEBCD\nrom/skin_param/ext_skp_meiitm010_joha_outer_10__divskn.txt D7067EDF\nrom/skin_param/ext_skp_meiitm011_joha_outer_11__divskn.txt 129AA502\nrom/skin_param/ext_skp_meiitm012_joha_outer_12__divskn.txt E9F58A3B\nrom/skin_param/ext_skp_meiitm013_joha_outer_13__divskn.txt 15C853A7\nrom/skin_param/ext_skp_meiitm014_joha_outer_14__divskn.txt B2CEA443\nrom/skin_param/ext_skp_meiitm015_joha_outer_15__divskn.txt E8572C6C\nrom/skin_param/ext_skp_meiitm017_joha_outer_17_zzc__divskn.txt 7E2556A7\nrom/skin_param/ext_skp_meiitm018_joha_outer_18__divskn.txt A4E3B72D\nrom/skin_param/ext_skp_meiitm019_joha_outer_19__divskn.txt 5AA3F97F\nrom/skin_param/ext_skp_meiitm020_joha_outer_20__divskn.txt 2F81C041\nrom/skin_param/ext_skp_meiitm021_joha_outer_21__divskn.txt AB5D216A\nrom/skin_param/ext_skp_meiitm022_joha_outer_22__divskn.txt AE7781F9\nrom/skin_param/ext_skp_meiitm023_joha_outer_23__divskn.txt 0A00487A\nrom/skin_param/ext_skp_meiitm024_joha_outer_24__divskn.txt 9CF9E170\nrom/skin_param/ext_skp_meiitm025_joha_outer_25__divskn.txt 6D8D4950\nrom/skin_param/ext_skp_meiitm026_joha_outer_26__divskn.txt FA002260\nrom/skin_param/ext_skp_meiitm027_joha_outer_27__divskn.txt 5A8626FD\nrom/skin_param/ext_skp_meiitm029_joha_outer_29__divskn.txt 955BA10A\nrom/skin_param/ext_skp_meiitm030_joha_outer_30__divskn.txt E5328983\nrom/skin_param/ext_skp_meiitm032_joha_outer_32__divskn.txt AC3A0FC9\nrom/skin_param/ext_skp_meiitm033_joha_outer_33__divskn.txt 0CA9311C\nrom/skin_param/ext_skp_meiitm500_atam_atama_00__divskn.txt C77F53B1\nrom/skin_param/ext_skp_meiitm501_atam_atama_01__divskn.txt DD359CDB\nrom/skin_param/ext_skp_meiitm502_atam_atama_02__divskn.txt 87B06D33\nrom/skin_param/ext_skp_meiitm503_atam_atama_03__divskn.txt 7CA5CEE3\nrom/skin_param/ext_skp_meiitm504_atam_atama_04__divskn.txt 3D15FFE6\nrom/skin_param/ext_skp_meiitm505_atam_atama_05__divskn.txt C1254D7D\nrom/skin_param/ext_skp_meiitm506_atam_atama_06__divskn.txt 371F01B9\nrom/skin_param/ext_skp_meiitm508_atam_atama_08__divskn.txt 667ABD2E\nrom/skin_param/ext_skp_meiitm509_atam_atama_09__divskn.txt 8A104EA8\nrom/skin_param/ext_skp_meiitm510_atam_atama_10__divskn.txt B1CFB791\nrom/skin_param/ext_skp_meiitm511_atam_atama_11__divskn.txt F2B75879\nrom/skin_param/ext_skp_meiitm512_atam_atama_12__divskn.txt 00D8137C\nrom/skin_param/ext_skp_meiitm513_atam_atama_13__divskn.txt E1F74858\nrom/skin_param/ext_skp_meiitm514_atam_atama_14__divskn.txt 727A8466\nrom/skin_param/ext_skp_meiitm515_atam_atama_15__divskn.txt 349DCD6F\nrom/skin_param/ext_skp_meiitm521_atam_atama_21__divskn.txt B14D9896\nrom/skin_param/ext_skp_meiitm522_atam_atama_22__divskn.txt A99F80CA\nrom/skin_param/ext_skp_meiitm523_atam_atama_23__divskn.txt 9536DA3F\nrom/skin_param/ext_skp_meiitm525_atam_atama_25__divskn.txt 5E7F0941\nrom/skin_param/ext_skp_meiitm526_atam_atama_26__divskn.txt 7A04E25C\nrom/skin_param/ext_skp_meiitm527_atam_atama_27__divskn.txt FFDB626C\nrom/skin_param/ext_skp_meiitm528_atam_atama_28__divskn.txt 6F46A143\nrom/skin_param/ext_skp_meiitm529_atam_atama_29__divskn.txt F3F39871\nrom/skin_param/ext_skp_meiitm530_atam_atama_30__divskn.txt 1729312E\nrom/skin_param/ext_skp_meiitm532_atam_atama_32__divskn.txt 3855628D\nrom/skin_param/ext_skp_meiitm533_atam_atama_33__divskn.txt 0CB7B09A\nrom/skin_param/ext_skp_meiitm700_atam_zujo_00__divskn.txt 6CE45455\nrom/skin_param/ext_skp_meiitm701_atam_zujo_01__divskn.txt D7FAE2BD\nrom/skin_param/ext_skp_meiitm702_atam_zujo_02__divskn.txt 8E1948E0\nrom/skin_param/ext_skp_lukitm011_joha_outer_11__divskn.txt 50240D20\nrom/skin_param/ext_skp_lukitm024_joha_outer_24__divskn.txt 7715ABE7\nrom/skin_param/ext_skp_lukitm036_joha_outer_36__divskn.txt E0A4B742\nrom/skin_param/ext_skp_lukitm505_atam_atama_05__divskn.txt 428394B7\nrom/skin_param/ext_skp_lukitm517_atam_atama_17__divskn.txt 2A9A98A2\nrom/skin_param/ext_skp_lukitm536_atam_atama_36__divskn.txt 3B9D4131\nrom/skin_param/ext_skp_meiitm003_joha_outer_03__divskn.txt FF3BA966\nrom/skin_param/ext_skp_meiitm016_joha_outer_16__divskn.txt 728A8122\nrom/skin_param/ext_skp_meiitm028_joha_outer_28__divskn.txt B9121E5E\nrom/skin_param/ext_skp_meiitm507_atam_atama_07__divskn.txt 1C6898BA\nrom/skin_param/ext_skp_meiitm524_atam_atama_24__divskn.txt 5EF04A2A\nrom/skin_param/ext_skp_meiitm705_atam_zujo_05__divskn.txt D36B6569\nrom/skin_param/ext_skp_meiitm709_atam_zujo_09__divskn.txt 2B69955A\nrom/skin_param/ext_skp_meiitm775_joha_ushiro_75__divskn.txt 9B576E3B\nrom/skin_param/ext_skp_mikitm001_joha_outer_01__divskn.txt 5BF7D343\nrom/skin_param/ext_skp_mikitm002_joha_outer_02__divskn.txt FC16024B\nrom/skin_param/ext_skp_mikitm003_joha_outer_03__divskn.txt CEA69D40\nrom/skin_param/ext_skp_mikitm004_joha_outer_04__divskn.txt 60742290\nrom/skin_param/ext_skp_mikitm005_joha_outer_05__divskn.txt 05C447F3\nrom/skin_param/ext_skp_mikitm006_joha_outer_06__divskn.txt AA966DF0\nrom/skin_param/ext_skp_mikitm007_joha_outer_07__divskn.txt 8450E7B3\nrom/skin_param/ext_skp_mikitm008_joha_outer_08__divskn.txt 34E8037D\nrom/skin_param/ext_skp_mikitm010_joha_outer_10__divskn.txt F81B0047\nrom/skin_param/ext_skp_mikitm011_joha_outer_11__divskn.txt AEE44D44\nrom/skin_param/ext_skp_mikitm012_joha_outer_12__divskn.txt 45FA3DA4\nrom/skin_param/ext_skp_mikitm013_joha_outer_13__divskn.txt 8A2B3217\nrom/skin_param/ext_skp_mikitm014_joha_outer_14__divskn.txt 6322964D\nrom/skin_param/ext_skp_mikitm015_joha_outer_15__divskn.txt CBA071FF\nrom/skin_param/ext_skp_mikitm016_joha_outer_16__divskn.txt 862218E1\nrom/skin_param/ext_skp_mikitm017_joha_outer_17__divskn.txt 05C447F3\nrom/skin_param/ext_skp_mikitm018_joha_outer_18__divskn.txt 7547744B\nrom/skin_param/ext_skp_mikitm019_joha_outer_19__divskn.txt 847E5718\nrom/skin_param/ext_skp_mikitm020_joha_outer_20__divskn.txt D418840D\nrom/skin_param/ext_skp_mikitm022_joha_outer_22_zzc__divskn.txt B5ED7130\nrom/skin_param/ext_skp_mikitm023_joha_outer_23__divskn.txt 91C30F14\nrom/skin_param/ext_skp_mikitm024_joha_outer_24__divskn.txt 8946A95D\nrom/skin_param/ext_skp_mikitm025_joha_outer_25__divskn.txt EE4DFBCE\nrom/skin_param/ext_skp_mikitm026_joha_outer_26__divskn.txt 89B73FB8\nrom/skin_param/ext_skp_mikitm027_joha_outer_27__divskn.txt 8B67EE31\nrom/skin_param/ext_skp_mikitm029_joha_outer_29__divskn.txt E8B018B1\nrom/skin_param/ext_skp_mikitm030_joha_outer_30__divskn.txt 862218E1\nrom/skin_param/ext_skp_mikitm031_joha_outer_31__divskn.txt 79C95511\nrom/skin_param/ext_skp_mikitm032_joha_outer_32__divskn.txt 9C0EEE6B\nrom/skin_param/ext_skp_mikitm038_joha_outer_38__divskn.txt 5822232A\nrom/skin_param/ext_skp_mikitm041_joha_outer_41__divskn.txt 9E09C52E\nrom/skin_param/ext_skp_mikitm042_joha_outer_42__divskn.txt 9EBF87E0\nrom/skin_param/ext_skp_mikitm043_joha_outer_43__divskn.txt 7674C6AF\nrom/skin_param/ext_skp_mikitm044_joha_outer_44__divskn.txt 3379CB65\nrom/skin_param/ext_skp_mikitm045_joha_outer_45__divskn.txt E1DF73A0\nrom/skin_param/ext_skp_mikitm046_joha_outer_46__divskn.txt E5F4A646\nrom/skin_param/ext_skp_mikitm047_joha_outer_47__divskn.txt BC2EEC9D\nrom/skin_param/ext_skp_mikitm048_joha_outer_48__divskn.txt 7FC7D9C6\nrom/skin_param/ext_skp_mikitm049_joha_outer_49__divskn.txt BAE140AE\nrom/skin_param/ext_skp_mikitm050_joha_outer_50__divskn.txt A366912B\nrom/skin_param/ext_skp_mikitm051_joha_outer_51__divskn.txt DE6B1241\nrom/skin_param/ext_skp_mikitm053_joha_outer_53__divskn.txt F0021584\nrom/skin_param/ext_skp_mikitm054_joha_outer_54__divskn.txt 74392B6C\nrom/skin_param/ext_skp_mikitm055_joha_outer_55__divskn.txt B71FC8C5\nrom/skin_param/ext_skp_mikitm056_joha_outer_56__divskn.txt 52D68518\nrom/skin_param/ext_skp_mikitm057_joha_outer_57__divskn.txt 9CC9CF6A\nrom/skin_param/ext_skp_mikitm058_joha_outer_58__divskn.txt 006E8F44\nrom/skin_param/ext_skp_mikitm059_joha_outer_59__divskn.txt 7B33B910\nrom/skin_param/ext_skp_mikitm060_joha_outer_60__divskn.txt EBDEA426\nrom/skin_param/ext_skp_mikitm061_joha_outer_61__divskn.txt 05C447F3\nrom/skin_param/ext_skp_mikitm063_joha_outer_63__divskn.txt 423ECA6B\nrom/skin_param/ext_skp_mikitm064_joha_outer_64__divskn.txt 47994D0C\nrom/skin_param/ext_skp_mikitm066_joha_outer_66__divskn.txt 7AEAE985\nrom/skin_param/ext_skp_mikitm067_joha_outer_67__divskn.txt 3F360360\nrom/skin_param/ext_skp_mikitm068_joha_outer_68__divskn.txt 9051C0B4\nrom/skin_param/ext_skp_mikitm069_joha_outer_69__divskn.txt 9C4ADA52\nrom/skin_param/ext_skp_mikitm070_joha_outer_70__divskn.txt 6B324288\nrom/skin_param/ext_skp_mikitm071_joha_outer_71__divskn.txt 6ABE10D4\nrom/skin_param/ext_skp_mikitm072_joha_outer_72__divskn.txt 71642F89\nrom/skin_param/ext_skp_mikitm073_joha_outer_73__divskn.txt F912649B\nrom/skin_param/ext_skp_mikitm074_joha_outer_74__divskn.txt 3B076776\nrom/skin_param/ext_skp_mikitm075_joha_outer_75__divskn.txt 7226B61C\nrom/skin_param/ext_skp_mikitm076_joha_outer_76__divskn.txt 31E4706D\nrom/skin_param/ext_skp_mikitm078_joha_outer_78__divskn.txt FA69172D\nrom/skin_param/ext_skp_mikitm079_joha_outer_79__divskn.txt 7B05F40F\nrom/skin_param/ext_skp_mikitm080_joha_outer_80__divskn.txt 6C4CCD10\nrom/skin_param/ext_skp_mikitm081_joha_outer_81__divskn.txt DBE5F45D\nrom/skin_param/ext_skp_mikitm082_joha_outer_82__divskn.txt 034D07E0\nrom/skin_param/ext_skp_mikitm083_joha_outer_83__divskn.txt 34BBF4EF\nrom/skin_param/ext_skp_mikitm084_joha_outer_84__divskn.txt 8205C4E5\nrom/skin_param/ext_skp_mikitm085_joha_outer_85__divskn.txt B5B53C8B\nrom/skin_param/ext_skp_mikitm087_joha_outer_87__divskn.txt 56417917\nrom/skin_param/ext_skp_mikitm088_joha_outer_88__divskn.txt FFA7C9D5\nrom/skin_param/ext_skp_mikitm089_joha_outer_89__divskn.txt C0A95582\nrom/skin_param/ext_skp_mikitm091_joha_outer_91__divskn.txt 58431A97\nrom/skin_param/ext_skp_mikitm092_joha_outer_92__divskn.txt A28A7CA1\nrom/skin_param/ext_skp_mikitm093_joha_outer_93__divskn.txt 5F4F85D3\nrom/skin_param/ext_skp_mikitm094_joha_outer_94__divskn.txt 862218E1\nrom/skin_param/ext_skp_mikitm095_joha_outer_95__divskn.txt 34302067\nrom/skin_param/ext_skp_mikitm096_joha_outer_96__divskn.txt D126D43C\nrom/skin_param/ext_skp_mikitm097_joha_outer_97__divskn.txt 8D6A931D\nrom/skin_param/ext_skp_mikitm098_joha_outer_98__divskn.txt FC35D2E7\nrom/skin_param/ext_skp_mikitm099_joha_outer_99__divskn.txt 5BAA1705\nrom/skin_param/ext_skp_mikitm100_joha_outer_100__divskn.txt EB87BE6A\nrom/skin_param/ext_skp_mikitm101_joha_outer_101__divskn.txt A2C905E1\nrom/skin_param/ext_skp_mikitm103_joha_outer_103__divskn.txt 2FCCA9D0\nrom/skin_param/ext_skp_mikitm104_joha_outer_104__divskn.txt 17B75285\nrom/skin_param/ext_skp_mikitm105_joha_outer_105__divskn.txt 5ED2C5E6\nrom/skin_param/ext_skp_mikitm106_joha_outer_106__divskn.txt ECE1D208\nrom/skin_param/ext_skp_mikitm107_joha_outer_107__divskn.txt 02B3DC05\nrom/skin_param/ext_skp_mikitm108_joha_outer_108__divskn.txt B0FF8C59\nrom/skin_param/ext_skp_mikitm109_joha_outer_109__divskn.txt A6D394EF\nrom/skin_param/ext_skp_mikitm110_joha_outer_110__divskn.txt 2FF360CE\nrom/skin_param/ext_skp_mikitm111_joha_outer_111__divskn.txt DE47A971\nrom/skin_param/ext_skp_mikitm112_joha_outer_112__divskn.txt 9BD4A7B8\nrom/skin_param/ext_skp_mikitm113_joha_outer_113__divskn.txt DE17C9C5\nrom/skin_param/ext_skp_mikitm115_joha_outer_115__divskn.txt 54C9B5CA\nrom/skin_param/ext_skp_mikitm116_joha_outer_116__divskn.txt 3758B88F\nrom/skin_param/ext_skp_mikitm118_joha_outer_118__divskn.txt D9DCFE67\nrom/skin_param/ext_skp_mikitm119_joha_outer_119__divskn.txt 6F9C059F\nrom/skin_param/ext_skp_mikitm120_joha_outer_120__divskn.txt DA66AED9\nrom/skin_param/ext_skp_mikitm123_joha_outer_123__divskn.txt 858B6DD0\nrom/skin_param/ext_skp_mikitm124_joha_outer_124__divskn.txt 31D91254\nrom/skin_param/ext_skp_mikitm125_joha_outer_125__divskn.txt 0FA7BE78\nrom/skin_param/ext_skp_mikitm126_joha_outer_126__divskn.txt 20585E87\nrom/skin_param/ext_skp_mikitm127_joha_outer_127__divskn.txt 7EB12E71\nrom/skin_param/ext_skp_mikitm128_joha_outer_128__divskn.txt BE624A63\nrom/skin_param/ext_skp_mikitm130_joha_outer_130__divskn.txt F3341B0F\nrom/skin_param/ext_skp_mikitm131_joha_outer_131__divskn.txt AE77BAEC\nrom/skin_param/ext_skp_mikitm132_joha_outer_132__divskn.txt AEC0E7EC\nrom/skin_param/ext_skp_mikitm133_joha_outer_133__divskn.txt 5AC35C25\nrom/skin_param/ext_skp_mikitm134_joha_outer_134__divskn.txt 618269E3\nrom/skin_param/ext_skp_mikitm135_joha_outer_135__divskn.txt 681E9874\nrom/skin_param/ext_skp_mikitm136_joha_outer_136__divskn.txt A3E7E5A5\nrom/skin_param/ext_skp_mikitm137_joha_outer_137__divskn.txt 05C447F3\nrom/skin_param/ext_skp_mikitm138_joha_outer_138__divskn.txt EE4F7DB8\nrom/skin_param/ext_skp_mikitm139_joha_outer_139__divskn.txt 601B2221\nrom/skin_param/ext_skp_mikitm140_joha_outer_140__divskn.txt B51D0AB1\nrom/skin_param/ext_skp_mikitm142_joha_outer_142__divskn.txt 50DB8293\nrom/skin_param/ext_skp_mikitm143_joha_outer_143__divskn.txt A410E502\nrom/skin_param/ext_skp_mikitm144_joha_outer_144__divskn.txt DC798F7C\nrom/skin_param/ext_skp_mikitm145_joha_outer_145__divskn.txt 16593EC0\nrom/skin_param/ext_skp_mikitm146_joha_outer_146__divskn.txt 13095E7E\nrom/skin_param/ext_skp_mikitm147_joha_outer_147__divskn.txt 8D19D53A\nrom/skin_param/ext_skp_mikitm148_joha_outer_148__divskn.txt 26B6438D\nrom/skin_param/ext_skp_mikitm149_joha_outer_149__divskn.txt E562ACB0\nrom/skin_param/ext_skp_mikitm151_joha_outer_151__divskn.txt 013CF39B\nrom/skin_param/ext_skp_mikitm152_joha_outer_152__divskn.txt BF7D6BC4\nrom/skin_param/ext_skp_mikitm153_joha_outer_153__divskn.txt 63B13007\nrom/skin_param/ext_skp_mikitm009_joha_outer_09__divskn.txt 1A44438B\nrom/skin_param/ext_skp_mikitm021_joha_outer_21__divskn.txt 64A9306A\nrom/skin_param/ext_skp_mikitm040_joha_outer_40__divskn.txt 5822232A\nrom/skin_param/ext_skp_mikitm052_joha_outer_52__divskn.txt 69592F1D\nrom/skin_param/ext_skp_mikitm065_joha_outer_65__divskn.txt 973AAA32\nrom/skin_param/ext_skp_mikitm077_joha_outer_77__divskn.txt A79D2AB9\nrom/skin_param/ext_skp_mikitm090_joha_outer_90__divskn.txt 05C447F3\nrom/skin_param/ext_skp_mikitm102_joha_outer_102__divskn.txt 4DD3584B\nrom/skin_param/ext_skp_mikitm114_joha_outer_114__divskn.txt 798BEBFE\nrom/skin_param/ext_skp_mikitm129_joha_outer_129__divskn.txt F23767D7\nrom/skin_param/ext_skp_mikitm141_joha_outer_141__divskn.txt A94451A4\nrom/skin_param/ext_skp_lenitm700_atam_zujo_00__divskn.txt F22FAB4C\nrom/skin_param/ext_skp_meiitm704_atam_zujo_04__divskn.txt 8FE7B9BB\nrom/skin_param/ext_skp_mikitm155_joha_outer_155__divskn.txt 379F8814\nrom/skin_param/ext_skp_mikitm156_joha_outer_156__divskn.txt BD8C869A\nrom/skin_param/ext_skp_mikitm158_joha_outer_158__divskn.txt 25C4ECDD\nrom/skin_param/ext_skp_mikitm160_joha_outer_160__divskn.txt B3A112C0\nrom/skin_param/ext_skp_mikitm162_joha_outer_162__divskn.txt E78B23CA\nrom/skin_param/ext_skp_mikitm163_joha_outer_163__divskn.txt 8FA33D89\nrom/skin_param/ext_skp_mikitm164_joha_outer_164__divskn.txt 860582A0\nrom/skin_param/ext_skp_mikitm165_joha_outer_165__divskn.txt 042C4E88\nrom/skin_param/ext_skp_mikitm167_joha_outer_167__divskn.txt 2DD00E12\nrom/skin_param/ext_skp_mikitm169_joha_outer_169__divskn.txt 37FBF027\nrom/skin_param/ext_skp_mikitm170_joha_outer_170__divskn.txt FEDA77CC\nrom/skin_param/ext_skp_mikitm173_joha_outer_173__divskn.txt 8851741A\nrom/skin_param/ext_skp_mikitm467_ude_hand_167__divskn.txt 2532F654\nrom/skin_param/ext_skp_mikitm500_atam_atama_00__divskn.txt 023A24E1\nrom/skin_param/ext_skp_mikitm501_atam_atama_01__divskn.txt 46C1D123\nrom/skin_param/ext_skp_mikitm502_atam_atama_02__divskn.txt 327BFA33\nrom/skin_param/ext_skp_mikitm504_atam_atama_04__divskn.txt 85935CEC\nrom/skin_param/ext_skp_mikitm505_atam_atama_05__divskn.txt 33E89077\nrom/skin_param/ext_skp_mikitm506_atam_atama_06__divskn.txt 2712B460\nrom/skin_param/ext_skp_mikitm507_atam_atama_07__divskn.txt 6B7CB6FC\nrom/skin_param/ext_skp_mikitm508_atam_atama_08__divskn.txt 0A845D3C\nrom/skin_param/ext_skp_mikitm509_atam_atama_09__divskn.txt 94EABF1A\nrom/skin_param/ext_skp_mikitm520_atam_atama_20__divskn.txt E91A73D5\nrom/skin_param/ext_skp_mikitm524_atam_atama_24__divskn.txt DBF3E169\nrom/skin_param/ext_skp_mikitm525_atam_atama_25__divskn.txt 6CAFF96E\nrom/skin_param/ext_skp_mikitm526_atam_atama_26__divskn.txt 2BC13821\nrom/skin_param/ext_skp_mikitm527_atam_atama_27__divskn.txt 8C626EA5\nrom/skin_param/ext_skp_mikitm528_atam_atama_28__divskn.txt 9FBF330C\nrom/skin_param/ext_skp_mikitm530_atam_atama_30__divskn.txt 66FB7BCC\nrom/skin_param/ext_skp_mikitm531_atam_atama_31__divskn.txt DE2B21D9\nrom/skin_param/ext_skp_mikitm532_atam_atama_32__divskn.txt 3990F531\nrom/skin_param/ext_skp_mikitm533_atam_atama_33__divskn.txt E74DCC49\nrom/skin_param/ext_skp_mikitm534_atam_atama_34__divskn.txt A9DB9978\nrom/skin_param/ext_skp_mikitm535_atam_atama_35__divskn.txt 6FA3E009\nrom/skin_param/ext_skp_mikitm537_atam_atama_37__divskn.txt A9DB9978\nrom/skin_param/ext_skp_mikitm538_atam_atama_38__divskn.txt E188A7F4\nrom/skin_param/ext_skp_mikitm539_atam_atama_39__divskn.txt 503D85EF\nrom/skin_param/ext_skp_mikitm540_atam_atama_40__divskn.txt A9DB9978\nrom/skin_param/ext_skp_mikitm541_atam_atama_41__divskn.txt B22D4C52\nrom/skin_param/ext_skp_mikitm542_atam_atama_42__divskn.txt C6BBED2B\nrom/skin_param/ext_skp_mikitm543_atam_atama_43__divskn.txt C597AD61\nrom/skin_param/ext_skp_mikitm544_atam_atama_44__divskn.txt 3F1C9DE2\nrom/skin_param/ext_skp_mikitm545_atam_atama_45__divskn.txt 87C11CD6\nrom/skin_param/ext_skp_mikitm546_atam_atama_46__divskn.txt 7669FDF7\nrom/skin_param/ext_skp_mikitm547_atam_atama_47__divskn.txt B5D1D099\nrom/skin_param/ext_skp_mikitm549_atam_atama_49__divskn.txt 29AF20C6\nrom/skin_param/ext_skp_mikitm550_atam_atama_50__divskn.txt 3990F531\nrom/skin_param/ext_skp_mikitm551_atam_atama_51__divskn.txt 7D661C89\nrom/skin_param/ext_skp_mikitm552_atam_atama_52__divskn.txt 0CE74CFF\nrom/skin_param/ext_skp_mikitm553_atam_atama_53__divskn.txt 610B3F4C\nrom/skin_param/ext_skp_mikitm554_atam_atama_54__divskn.txt 61D5D40A\nrom/skin_param/ext_skp_mikitm555_atam_atama_55__divskn.txt 89D67510\nrom/skin_param/ext_skp_mikitm556_atam_atama_56__divskn.txt D34669A8\nrom/skin_param/ext_skp_mikitm557_atam_atama_57__divskn.txt C81BD2A8\nrom/skin_param/ext_skp_mikitm558_atam_atama_58__divskn.txt 770FBDCC\nrom/skin_param/ext_skp_mikitm559_atam_atama_59__divskn.txt B5D1D099\nrom/skin_param/ext_skp_mikitm593_atam_atama_93__divskn.txt 78AB177C\nrom/skin_param/ext_skp_mikitm594_atam_atama_94__divskn.txt 408477EB\nrom/skin_param/ext_skp_mikitm595_atam_atama_95__divskn.txt C16CE759\nrom/skin_param/ext_skp_mikitm596_atam_atama_96__divskn.txt 6B99AC48\nrom/skin_param/ext_skp_mikitm597_atam_atama_97__divskn.txt 4520ABDC\nrom/skin_param/ext_skp_mikitm598_atam_atama_98__divskn.txt D9259F16\nrom/skin_param/ext_skp_mikitm599_atam_atama_99__divskn.txt B9971A42\nrom/skin_param/ext_skp_mikitm600_atam_atama_100__divskn.txt 9721AEBC\nrom/skin_param/ext_skp_mikitm601_atam_atama_101__divskn.txt 23FE17A8\nrom/skin_param/ext_skp_mikitm602_atam_atama_102__divskn.txt A4C475E6\nrom/skin_param/ext_skp_mikitm603_atam_atama_103__divskn.txt 2EA73AD2\nrom/skin_param/ext_skp_mikitm605_atam_atama_105__divskn.txt F298B535\nrom/skin_param/ext_skp_mikitm606_atam_atama_106__divskn.txt 089887AD\nrom/skin_param/ext_skp_mikitm607_atam_atama_107__divskn.txt 2E51EEDA\nrom/skin_param/ext_skp_mikitm608_atam_atama_108__divskn.txt A72F4FC5\nrom/skin_param/ext_skp_mikitm609_atam_atama_109__divskn.txt 5E688A5C\nrom/skin_param/ext_skp_mikitm610_atam_atama_110__divskn.txt DEC35D28\nrom/skin_param/ext_skp_mikitm611_atam_atama_111__divskn.txt A9DB9978\nrom/skin_param/ext_skp_mikitm612_atam_atama_112__divskn.txt A9DB9978\nrom/skin_param/ext_skp_mikitm613_atam_atama_113__divskn.txt FD657ECD\nrom/skin_param/ext_skp_mikitm614_atam_atama_114__divskn.txt 39A956EE\nrom/skin_param/ext_skp_mikitm615_atam_atama_115__divskn.txt 6300DDC7\nrom/skin_param/ext_skp_mikitm618_atam_atama_118__divskn.txt 27B6372B\nrom/skin_param/ext_skp_mikitm619_atam_atama_119__divskn.txt 6005F61D\nrom/skin_param/ext_skp_mikitm620_atam_atama_120__divskn.txt 8D52A8DA\nrom/skin_param/ext_skp_mikitm621_atam_atama_121__divskn.txt CD90D0FA\nrom/skin_param/ext_skp_mikitm623_atam_atama_123__divskn.txt 6B8E9556\nrom/skin_param/ext_skp_mikitm624_atam_atama_124__divskn.txt 5766FE02\nrom/skin_param/ext_skp_mikitm625_atam_atama_125__divskn.txt 023A24E1\nrom/skin_param/ext_skp_mikitm626_atam_atama_126__divskn.txt 24E06709\nrom/skin_param/ext_skp_mikitm627_atam_atama_127__divskn.txt 97EBF71A\nrom/skin_param/ext_skp_mikitm628_atam_atama_128__divskn.txt 6697392C\nrom/skin_param/ext_skp_mikitm630_atam_atama_130__divskn.txt 72D320C0\nrom/skin_param/ext_skp_mikitm632_atam_atama_132__divskn.txt EC2B7BCE\nrom/skin_param/ext_skp_mikitm633_atam_atama_133__divskn.txt 46AD0A2D\nrom/skin_param/ext_skp_mikitm634_atam_atama_134__divskn.txt E59B7CBF\nrom/skin_param/ext_skp_mikitm635_atam_atama_135__divskn.txt AB465E69\nrom/skin_param/ext_skp_mikitm636_atam_atama_136__divskn.txt BA9636A5\nrom/skin_param/ext_skp_mikitm637_atam_atama_137__divskn.txt AB3F040E\nrom/skin_param/ext_skp_mikitm638_atam_atama_138__divskn.txt A34AE7C4\nrom/skin_param/ext_skp_mikitm639_atam_atama_139__divskn.txt 1212A262\nrom/skin_param/ext_skp_mikitm640_atam_atama_140__divskn.txt 8155128F\nrom/skin_param/ext_skp_mikitm641_atam_atama_141__divskn.txt 52CA686C\nrom/skin_param/ext_skp_mikitm642_atam_atama_142__divskn.txt B4EBAE0C\nrom/skin_param/ext_skp_mikitm644_atam_atama_144__divskn.txt 38FFCB48\nrom/skin_param/ext_skp_mikitm645_atam_atama_145__divskn.txt 78BAD7A8\nrom/skin_param/ext_skp_mikitm646_atam_atama_146__divskn.txt 8A13D8D7\nrom/skin_param/ext_skp_mikitm647_atam_atama_147__divskn.txt D3DCF94B\nrom/skin_param/ext_skp_mikitm648_atam_atama_148__divskn.txt 9B95854A\nrom/skin_param/ext_skp_mikitm649_atam_atama_149__divskn.txt 01A3ABC4\nrom/skin_param/ext_skp_mikitm651_atam_atama_151__divskn.txt 1496B2FD\nrom/skin_param/ext_skp_mikitm652_atam_atama_152__divskn.txt 83853C94\nrom/skin_param/ext_skp_mikitm653_atam_atama_153__divskn.txt F31EAEC9\nrom/skin_param/ext_skp_mikitm655_atam_atama_155__divskn.txt F765C923\nrom/skin_param/ext_skp_mikitm656_atam_atama_156__divskn.txt 59FB3DE7\nrom/skin_param/ext_skp_mikitm660_atam_atama_160__divskn.txt 4D1D337F\nrom/skin_param/ext_skp_mikitm662_atam_atama_162__divskn.txt 24BCEA2F\nrom/skin_param/ext_skp_mikitm663_atam_atama_163__divskn.txt A244EDCA\nrom/skin_param/ext_skp_mikitm664_atam_atama_164__divskn.txt 455E0131\nrom/skin_param/ext_skp_mikitm665_atam_atama_165__divskn.txt 7A706C5D\nrom/skin_param/ext_skp_mikitm667_atam_atama_167__divskn.txt 089887AD\nrom/skin_param/ext_skp_mikitm669_atam_atama_169__divskn.txt 0DA3E3BC\nrom/skin_param/ext_skp_mikitm670_atam_atama_170__divskn.txt 8E9C3C34\nrom/skin_param/ext_skp_mikitm673_atam_atama_173__divskn.txt 39826281\nrom/skin_param/ext_skp_mikitm700_atam_zujo_00__divskn.txt FFF4385B\nrom/skin_param/ext_skp_mikitm701_face_hitai_01__divskn.txt 5A7D4362\nrom/skin_param/ext_skp_mikitm709_atam_zujo_09__divskn.txt 715B58C9\nrom/skin_param/ext_skp_mikitm711_atam_zujo_11__divskn.txt 922179B4\nrom/skin_param/ext_skp_mikitm715_atam_zujo_15__divskn.txt FD1C57DC\nrom/skin_param/ext_skp_mikitm718_atam_zujo_18__divskn.txt 6C33BE57\nrom/skin_param/ext_skp_mikitm721_atam_zujo_21__divskn.txt 891330EA\nrom/skin_param/ext_skp_mikitm722_atam_zujo_22__divskn.txt CE988E0B\nrom/skin_param/ext_skp_mikitm745_atam_zujo_45__divskn.txt 06B46774\nrom/skin_param/ext_skp_mikitm746_atam_zujo_46__divskn.txt E774C913\nrom/skin_param/ext_skp_mikitm748_atam_zujo_48__divskn.txt A61065AA\nrom/skin_param/ext_skp_mikitm749_atam_zujo_49__divskn.txt 53BCFB17\nrom/skin_param/ext_skp_mikitm751_joha_neck_51__divskn.txt C8834A12\nrom/skin_param/ext_skp_mikitm438_ude_hand_138__divskn.txt 3FDAE812\nrom/skin_param/ext_skp_mikitm522_atam_atama_22__divskn.txt 750B04C5\nrom/skin_param/ext_skp_mikitm536_atam_atama_36__divskn.txt A9DB9978\nrom/skin_param/ext_skp_mikitm548_atam_atama_48__divskn.txt DC921685\nrom/skin_param/ext_skp_mikitm560_atam_atama_60__divskn.txt B76EF533\nrom/skin_param/ext_skp_mikitm604_atam_atama_104__divskn.txt 75655482\nrom/skin_param/ext_skp_mikitm616_atam_atama_116__divskn.txt 6E071CC2\nrom/skin_param/ext_skp_mikitm631_atam_atama_131__divskn.txt BDD4DC2C\nrom/skin_param/ext_skp_mikitm643_atam_atama_143__divskn.txt 52307DF6\nrom/skin_param/ext_skp_mikitm658_atam_atama_158__divskn.txt 9B5BEEDE\nrom/skin_param/ext_skp_mikitm702_atam_zujo_02__divskn.txt 187620AC\nrom/skin_param/ext_skp_mikitm752_joha_neck_52__divskn.txt 38DABA50\nrom/skin_param/ext_skp_neritm003_joha_outer_03__divskn.txt 4F6944E2\nrom/skin_param/ext_skp_rinitm010_joha_outer_10__divskn.txt 511EB230\nrom/skin_param/ext_skp_rinitm023_joha_outer_23__divskn.txt 01118353\nrom/skin_param/ext_skp_rinitm035_joha_outer_35__divskn.txt 0EA5111E\nrom/skin_param/ext_skp_rinitm500_atam_atama_00__divskn.txt B35E76FD\nrom/skin_param/ext_skp_rinitm512_atam_atama_12__divskn.txt F63C9AFE\nrom/skin_param/ext_skp_rinitm529_atam_atama_29__divskn.txt 01BFA23A\nrom/skin_param/ext_skp_rinitm541_atam_atama_41__divskn.txt C0205C6C\nrom/skin_param/ext_skp_rinitm706_atam_zujo_06__divskn.txt F7DB2AF2\nrom/skin_param/ext_skp_rinitm719_atam_zujo_19__divskn.txt FEC26DAC\nrom/skin_param/ext_skp_mikitm775_joha_ushiro_75__divskn.txt 930463CA\nrom/skin_param/ext_skp_mikitm776_joha_ushiro_76__divskn.txt 930463CA\nrom/skin_param/ext_skp_mikitm777_joha_ushiro_77__divskn.txt 850DC7F1\nrom/skin_param/ext_skp_mikitm780_joha_ushiro_80__divskn.txt E794BD23\nrom/skin_param/ext_skp_mikitm781_joha_ushiro_81__divskn.txt 021D1808\nrom/skin_param/ext_skp_mikitm782_joha_ushiro_82__divskn.txt 781FC504\nrom/skin_param/ext_skp_mikitm783_joha_ushiro_83__divskn.txt 8488D5F9\nrom/skin_param/ext_skp_mikitm784_joha_ushiro_84__divskn.txt FD7A5090\nrom/skin_param/ext_skp_mikitm790_atam_zujo_90__divskn.txt EA293B0E\nrom/skin_param/ext_skp_neritm001_joha_outer_01__divskn.txt FCA51C45\nrom/skin_param/ext_skp_neritm002_joha_outer_02__divskn.txt 84EB0D79\nrom/skin_param/ext_skp_neritm004_joha_outer_04__divskn.txt 07111C81\nrom/skin_param/ext_skp_neritm500_atam_atama_00__divskn.txt 9883A4BF\nrom/skin_param/ext_skp_neritm501_atam_atama_01__divskn.txt 8FB444DB\nrom/skin_param/ext_skp_rinitm001_joha_outer_01__divskn.txt A39FD710\nrom/skin_param/ext_skp_rinitm002_joha_outer_02__divskn.txt F8E6E228\nrom/skin_param/ext_skp_rinitm003_joha_outer_03__divskn.txt 0133F70C\nrom/skin_param/ext_skp_rinitm004_joha_outer_04__divskn.txt 0CABFE9F\nrom/skin_param/ext_skp_rinitm005_joha_outer_05__divskn.txt 6228AEB1\nrom/skin_param/ext_skp_rinitm006_joha_outer_06__divskn.txt AFCBC71A\nrom/skin_param/ext_skp_rinitm007_joha_outer_07__divskn.txt 0B2FD66E\nrom/skin_param/ext_skp_rinitm009_joha_outer_09__divskn.txt FA69D76E\nrom/skin_param/ext_skp_rinitm011_joha_outer_11__divskn.txt 27D9EFAA\nrom/skin_param/ext_skp_rinitm012_joha_outer_12__divskn.txt 34B0C381\nrom/skin_param/ext_skp_rinitm013_joha_outer_13__divskn.txt 3FD953BC\nrom/skin_param/ext_skp_rinitm014_joha_outer_14__divskn.txt 33212428\nrom/skin_param/ext_skp_rinitm015_joha_outer_15__divskn.txt A17CB969\nrom/skin_param/ext_skp_rinitm016_joha_outer_16__divskn.txt 031C9CD4\nrom/skin_param/ext_skp_rinitm017_joha_outer_17__divskn.txt 29075ABC\nrom/skin_param/ext_skp_rinitm018_joha_outer_18__divskn.txt 36D46DC1\nrom/skin_param/ext_skp_rinitm019_joha_outer_19__divskn.txt A1251601\nrom/skin_param/ext_skp_rinitm020_joha_outer_20__divskn.txt 821104DD\nrom/skin_param/ext_skp_rinitm021_joha_outer_21__divskn.txt F520829F\nrom/skin_param/ext_skp_rinitm024_joha_outer_24__divskn.txt D37A60F8\nrom/skin_param/ext_skp_rinitm025_joha_outer_25__divskn.txt 013D4D61\nrom/skin_param/ext_skp_rinitm026_joha_outer_26_zzc__divskn.txt 7A40F3E8\nrom/skin_param/ext_skp_rinitm027_joha_outer_27__divskn.txt 1A443A27\nrom/skin_param/ext_skp_rinitm028_joha_outer_28__divskn.txt 5390B7FD\nrom/skin_param/ext_skp_rinitm029_joha_outer_29__divskn.txt 1C1EF3E9\nrom/skin_param/ext_skp_rinitm030_joha_outer_30__divskn.txt 9DDE250B\nrom/skin_param/ext_skp_rinitm031_joha_outer_31__divskn.txt 1B85D852\nrom/skin_param/ext_skp_rinitm032_joha_outer_32__divskn.txt E1A9DDF5\nrom/skin_param/ext_skp_rinitm033_joha_outer_33__divskn.txt D74AC82B\nrom/skin_param/ext_skp_rinitm034_joha_outer_34__divskn.txt 8880981A\nrom/skin_param/ext_skp_rinitm036_joha_outer_36__divskn.txt DE5E3ACE\nrom/skin_param/ext_skp_rinitm037_joha_outer_37__divskn.txt 27CD999D\nrom/skin_param/ext_skp_rinitm038_joha_outer_38__divskn.txt 4A63B0B1\nrom/skin_param/ext_skp_rinitm039_joha_outer_39__divskn.txt E919B6EA\nrom/skin_param/ext_skp_rinitm040_joha_outer_40__divskn.txt 25803125\nrom/skin_param/ext_skp_rinitm041_joha_outer_41__divskn.txt D49BF6A9\nrom/skin_param/ext_skp_rinitm043_joha_outer_43__divskn.txt 09F13CC8\nrom/skin_param/ext_skp_rinitm044_joha_outer_44__divskn.txt 03329C70\nrom/skin_param/ext_skp_rinitm045_joha_outer_45__divskn.txt 179D24CD\nrom/skin_param/ext_skp_rinitm047_joha_outer_47__divskn.txt C44496FD\nrom/skin_param/ext_skp_rinitm048_joha_outer_48__divskn.txt 152702C4\nrom/skin_param/ext_skp_rinitm501_atam_atama_01__divskn.txt 25B0ABB9\nrom/skin_param/ext_skp_rinitm502_atam_atama_02__divskn.txt 5F7BC57F\nrom/skin_param/ext_skp_rinitm503_atam_atama_03__divskn.txt DAFA77EF\nrom/skin_param/ext_skp_rinitm504_atam_atama_04__divskn.txt 219EAD84\nrom/skin_param/ext_skp_rinitm505_atam_atama_05__divskn.txt A33A5A8D\nrom/skin_param/ext_skp_rinitm506_atam_atama_06__divskn.txt 31DD9D62\nrom/skin_param/ext_skp_rinitm507_atam_atama_07__divskn.txt A33A5A8D\nrom/skin_param/ext_skp_rinitm508_atam_atama_08__divskn.txt 4EFD05CA\nrom/skin_param/ext_skp_rinitm509_atam_atama_09__divskn.txt 85AFBD4E\nrom/skin_param/ext_skp_rinitm510_atam_atama_10__divskn.txt 1E466AD7\nrom/skin_param/ext_skp_rinitm511_atam_atama_11__divskn.txt 4EFD05CA\nrom/skin_param/ext_skp_rinitm513_atam_atama_13__divskn.txt 219EAD84\nrom/skin_param/ext_skp_rinitm514_atam_atama_14__divskn.txt 6B54760D\nrom/skin_param/ext_skp_rinitm515_atam_atama_15__divskn.txt 45354EC4\nrom/skin_param/ext_skp_rinitm516_atam_atama_16__divskn.txt 4DABA121\nrom/skin_param/ext_skp_rinitm517_atam_atama_17__divskn.txt 7C61E7F7\nrom/skin_param/ext_skp_rinitm518_atam_atama_18__divskn.txt E3EB0236\nrom/skin_param/ext_skp_rinitm519_atam_atama_19__divskn.txt D6B09073\nrom/skin_param/ext_skp_rinitm520_atam_atama_20__divskn.txt 5BDF15F8\nrom/skin_param/ext_skp_rinitm526_atam_atama_26__divskn.txt 9E1D0233\nrom/skin_param/ext_skp_rinitm527_atam_atama_27__divskn.txt 16153C35\nrom/skin_param/ext_skp_rinitm528_atam_atama_28__divskn.txt 554C7EAC\nrom/skin_param/ext_skp_rinitm530_atam_atama_30__divskn.txt 6AB338C1\nrom/skin_param/ext_skp_rinitm531_atam_atama_31__divskn.txt E2501EE0\nrom/skin_param/ext_skp_rinitm532_atam_atama_32__divskn.txt 6E3160B4\nrom/skin_param/ext_skp_rinitm533_atam_atama_33__divskn.txt B35E76FD\nrom/skin_param/ext_skp_rinitm534_atam_atama_34__divskn.txt 09E54640\nrom/skin_param/ext_skp_rinitm535_atam_atama_35__divskn.txt 904A29FB\nrom/skin_param/ext_skp_rinitm536_atam_atama_36__divskn.txt D1A5C023\nrom/skin_param/ext_skp_rinitm537_atam_atama_37__divskn.txt 051566B0\nrom/skin_param/ext_skp_rinitm538_atam_atama_38__divskn.txt 66D793B1\nrom/skin_param/ext_skp_rinitm539_atam_atama_39__divskn.txt 19BFD3E2\nrom/skin_param/ext_skp_rinitm540_atam_atama_40__divskn.txt E31888E3\nrom/skin_param/ext_skp_rinitm543_atam_atama_43__divskn.txt E14ACBC0\nrom/skin_param/ext_skp_rinitm544_atam_atama_44__divskn.txt 308ADC0C\nrom/skin_param/ext_skp_rinitm545_atam_atama_45__divskn.txt 6E7EFCBE\nrom/skin_param/ext_skp_rinitm547_atam_atama_47__divskn.txt D3F558ED\nrom/skin_param/ext_skp_rinitm548_atam_atama_48__divskn.txt 48E6CB56\nrom/skin_param/ext_skp_rinitm600_atama_cat_00__divskn.txt 8ED6582E\nrom/skin_param/ext_skp_rinitm701_atam_zujo_01__divskn.txt 272C9797\nrom/skin_param/ext_skp_rinitm702_atam_zujo_02__divskn.txt 187620AC\nrom/skin_param/ext_skp_rinitm703_atam_zujo_03__divskn.txt 8C06D20F\nrom/skin_param/ext_skp_rinitm704_atam_zujo_04__divskn.txt 187620AC\nrom/skin_param/ext_skp_rinitm705_atam_zujo_05__divskn.txt 1E08F32F\nrom/skin_param/ext_skp_rinitm707_atam_zujo_07__divskn.txt 57BA5035\nrom/skin_param/ext_skp_rinitm708_atam_zujo_08__divskn.txt 8768EBAB\nrom/skin_param/ext_skp_rinitm709_atam_zujo_09__divskn.txt 272C9797\nrom/skin_param/ext_skp_rinitm710_atam_zujo_10__divskn.txt 0CBB9E5A\nrom/skin_param/ext_skp_rinitm711_atam_zujo_11__divskn.txt B07EF5CA\nrom/skin_param/ext_skp_rinitm712_atam_zujo_12__divskn.txt E27DEA48\nrom/skin_param/ext_skp_rinitm714_atam_zujo_14__divskn.txt 49A799C8\nrom/skin_param/ext_skp_rinitm715_atam_zujo_15__divskn.txt FB6C0405\nrom/skin_param/ext_skp_rinitm716_atam_zujo_16__divskn.txt AA26FB95\nrom/skin_param/ext_skp_rinitm717_atam_zujo_17__divskn.txt 9FCFE7F0\nrom/skin_param/ext_skp_rinitm718_atam_zujo_18__divskn.txt AA451C84\nrom/skin_param/ext_skp_rinitm720_atam_zujo_20__divskn.txt 66A42663\nrom/skin_param/ext_skp_rinitm721_atam_zujo_21__divskn.txt 89E3A891\nrom/skin_param/ext_skp_rinitm775_joha_ushiro_75__divskn.txt F51F42DD\nrom/skin_param/ext_skp_rinitm776_joha_ushiro_76__divskn.txt F5DAAD39\nrom/skin_param/ext_skp_rinitm777_joha_ushiro_77__divskn.txt C1C339B2\nrom/skin_param/ext_skp_rinitm997_atam_zujo_97__divskn.txt AA451C84\nrom/skin_param/ext_skp_rinitm999_atam_zujo_99__divskn.txt 272C9797\nrom/skin_param/ext_skp_sakitm001_joha_outer_01__divskn.txt 6759ECD8\nrom/skin_param/ext_skp_sakitm002_joha_outer_02__divskn.txt A4876D4D\nrom/skin_param/ext_skp_sakitm003_joha_outer_03__divskn.txt F585A0CE\nrom/skin_param/ext_skp_sakitm005_joha_outer_05__divskn.txt BDA58F1A\nrom/skin_param/ext_skp_sakitm500_atam_atama_00__divskn.txt 32FC9CD9\nrom/skin_param/ext_skp_sakitm501_atam_atama_01__divskn.txt 9A371BE2\nrom/skin_param/ext_skp_sakitm600_atama_cat_01__divskn.txt 395B3F57\nrom/skin_param/ext_skp_sakitm775_joha_ushiro_75__divskn.txt 2921F138\nrom/skin_param/ext_skp_tetitm001_joha_outer_01__divskn.txt 5333E0E9\nrom/skin_param/ext_skp_tetitm002_joha_outer_02__divskn.txt 27FD8FEF\nrom/skin_param/ext_skp_tetitm003_joha_outer_03__divskn.txt 23DF162B\nrom/skin_param/ext_skp_tetitm500_atam_atama_00__divskn.txt 9F60FE5A\nrom/skin_param/ext_skp_tetitm502_atam_atama_02__divskn.txt 9F60FE5A\nrom/skin_param/ext_skp_tetitm503_atam_atama_03__divskn.txt 68DA14FD\nrom/skin_param/osage_setting.txt 10D9C7FE\nrom/skin_param/sp_skp.farc D7C4A2C8\nrom/skin_param/sp_skp_db.txt 09EBB9A1\nrom/sound/button.farc D4314C72\nrom/sound/pv600_effect.farc 7DC9A152\nrom/sound/pv601_effect.farc 1C9517FC\nrom/sound/pv602_effect.farc 4B04891D\nrom/sound/pv603_effect.farc F2FBE7AE\nrom/sound/pv604_effect.farc D181548E\nrom/sound/pv605_effect.farc D3437F6E\nrom/sound/pv607_effect.farc 05BD6C43\nrom/sound/pv608_effect.farc 52D0A0BA\nrom/sound/pv609_effect.farc B0F0ED60\nrom/sound/pv610_effect.farc 858EA4EA\nrom/sound/pv611_effect.farc 305989D8\nrom/sound/pv612_effect.farc D11D6928\nrom/sound/pv613_effect.farc F0627441\nrom/sound/pv614_effect.farc 06FF8DCE\nrom/sound/pv615_effect.farc 96373245\nrom/sound/pv617_effect.farc 027BB6CD\nrom/sound/pv618_effect.farc D22AC7A5\nrom/sound/pv619_effect.farc 72BF56A4\nrom/sound/pv620_effect.farc B00F8146\nrom/sound/pv621_effect.farc 8BD1AFF2\nrom/sound/pv622_effect.farc 3CA9B0D6\nrom/sound/pv623_effect.farc A1C4D442\nrom/sound/pv624_effect.farc 8F71E931\nrom/sound/pv625_effect.farc B57EA346\nrom/sound/pv626_effect.farc 1E923F71\nrom/sound/pv627_effect.farc EB6EF226\nrom/sound/pv628_effect.farc B8FF3EDF\nrom/sound/pv629_effect.farc 117FAF2F\nrom/sound/pv630_effect.farc 066EDD45\nrom/sound/pv631_effect.farc 36AE3F6D\nrom/sound/pv637_effect.farc FB23B20C\nrom/sound/pv639_effect.farc C9734FB1\nrom/sound/pv640_effect.farc F4DCF27B\nrom/sound/pv641_effect.farc 1287C462\nrom/sound/pv642_effect.farc CFF26B0A\nrom/sound/pv710_effect.farc AEBDF761\nrom/sound/pv722_effect.farc 1C351A95\nrom/sound/pv723_effect.farc 1A6CB53D\nrom/sound/pv724_effect.farc A6470E93\nrom/sound/pv725_effect.farc 22CCC68C\nrom/sound/pv726_effect.farc 8B9968B6\nrom/sound/pv727_effect.farc 852DCF77\nrom/sound/pv728_effect.farc 5A81B18D\nrom/sound/pv729_effect.farc F8E34938\nrom/sound/pv730_effect.farc 62DD79D0\nrom/sound/pv731_effect.farc 995B327C\nrom/sound/pv732_effect.farc 0EF1320D\nrom/sound/pv733_effect.farc CE7B424A\nrom/sound/pv736_effect.farc 82054E35\nrom/sound/pv737_effect.farc 596D1BC5\nrom/sound/pv738_effect.farc 85BD1F12\nrom/sound/pv739_effect.farc 9FA1BBBD\nrom/sound/pv740_effect.farc 2A5F82E9\nrom/sound/pvchange.farc 0BCD83AB\nrom/sound/result_len.farc D3786616\nrom/sound/result_miku.farc 926B306C\nrom/sound/result_rin.farc 6078F06B\nrom/sound/se.farc 62216ECE\nrom/sound/se_adv.farc 0590DA6E\nrom/sound/se_aime.farc E8F2F34B\nrom/sound/se_cmn.farc 1B61F363\nrom/sound/se_over.farc 02095243\nrom/sound/se_result.farc D919C8BD\nrom/sound/se_sel.farc 7F243885\nrom/sound/slide_bell.farc 8151DDCF\nrom/sound/slide_bell2.farc C54D1E9C\nrom/sound/slide_harp.farc 5DC013C1\nrom/sound/slide_laser.farc E5CE6B76\nrom/sound/slide_long.farc 574FFD70\nrom/sound/slide_piano.farc 74D32839\nrom/sound/slide_se.farc C7AAAE53\nrom/sound/slide_windchime.farc 4840E25B\nrom/sound/pv616_effect.farc 758809CE\nrom/sound/pv638_effect.farc 827FB0AD\nrom/sound/pv734_effect.farc 5C17A58C\nrom/stage_param/coli_no_ring.txt C7369958\nrom/stage_param/coli_pv083_stgns098.txt 4322EE7D\nrom/stage_param/coli_pv434_mhd3070.txt 90B45C59\nrom/stage_param/coli_pv434_mhd6677.txt 87509EC5\nrom/stage_param/coli_pv614_mhd0000.txt A9A0D16B\nrom/stage_param/coli_pv614_mhd7334.txt AC40F66C\nrom/stage_param/coli_pv620_p1_00000.txt 6C44C7D4\nrom/stage_param/coli_pv620_p1_03848.txt DCFC3EA8\nrom/stage_param/coli_pv620_p1_06720.txt A32AEBA4\nrom/stage_param/coli_pv620_p1_07038.txt A32AEBA4\nrom/stage_param/coli_pv620_p1_11992.txt 3E01760A\nrom/stage_param/coli_pv620_p2_00000.txt 4E48EDD7\nrom/stage_param/coli_pv620_p2_01568.txt B4BD325B\nrom/stage_param/coli_pv620_p2_07518.txt 0FFCB3A4\nrom/stage_param/coli_pv620_p2_11992.txt 1767399C\nrom/stage_param/coli_stgd2pv037s01_snow.txt 5E74069B\nrom/stage_param/coli_stgd2pv038s01.txt E53CB8F8\nrom/stage_param/coli_stgd2pv044s03.txt 3DA04D3D\nrom/stage_param/coli_stgd2pv046s04.txt 1B095B78\nrom/stage_param/coli_stgd2pv047s03.txt B04A3BB7\nrom/stage_param/coli_stgd2pv047s04.txt 77E764E9\nrom/stage_param/coli_stgd2pv051s05.txt 144F4F2F\nrom/stage_param/coli_stgd2pv058s01.txt 7EBE038A\nrom/stage_param/coli_stgd2pv065s01.txt 76B0F15C\nrom/stage_param/coli_stgpv081s01.txt B8DC74C1\nrom/stage_param/coli_stgpv081s06.txt 3E9CE864\nrom/stage_param/coli_stgpv082s62.txt 3A7797D6\nrom/stage_param/coli_stgpv082s63.txt A61E7622\nrom/stage_param/coli_stgpv083s05.txt 04E38931\nrom/stage_param/coli_stgpv083s18.txt B325EE5C\nrom/stage_param/coli_stgpv091s09.txt EFECA48C\nrom/stage_param/coli_stgpv091s15.txt 61BE60C3\nrom/stage_param/coli_stgpv104s02.txt 059FD8E9\nrom/stage_param/coli_stgpv219s09.txt 8271223D\nrom/stage_param/coli_stgpv219s10.txt C7369958\nrom/stage_param/coli_stgpv221s07.txt CBEB5BE3\nrom/stage_param/coli_stgpv221s11.txt E4262A5F\nrom/stage_param/coli_stgpv222s02.txt 6CA5D865\nrom/stage_param/coli_stgpv226s01.txt 2F2E0E8F\nrom/stage_param/coli_stgpv233s02.txt EF408E5A\nrom/stage_param/coli_stgpv235s04.txt 46FE95EE\nrom/stage_param/coli_stgpv236s07.txt 758FC167\nrom/stage_param/coli_stgpv240s01.txt C219CCDC\nrom/stage_param/coli_stgpv241s01.txt BBE33D94\nrom/stage_param/coli_stgpv241_mhd481.txt 6974CDD3\nrom/stage_param/coli_stgpv601s04.txt 5021E013\nrom/stage_param/coli_stgpv602s01.txt 13374B55\nrom/stage_param/coli_stgpv602s03.txt 564E121B\nrom/stage_param/coli_stgpv605s01.txt 40FADD6E\nrom/stage_param/coli_stgpv622s01.txt AA29C76D\nrom/stage_param/coli_stgpv625s01.txt 5937333A\nrom/stage_param/coli_stgpv625s04.txt F5257559\nrom/stage_param/coli_stgpv740s01.txt BB3388D2\nrom/stage_param/fog_ring_d2ns058.txt EF17102D\nrom/stage_param/fog_ring_d2ns082.txt 6825C7BF\nrom/stage_param/fog_ring_d2pv050s01.txt EF17102D\nrom/stage_param/fog_ring_ns004.txt 6FCC594C\nrom/stage_param/fog_ring_ns021.txt 8273ADF5\nrom/stage_param/fog_ring_ns022.txt 83FAD4A3\nrom/stage_param/fog_ring_ns023.txt 35AD01AE\nrom/stage_param/coli_pv625_mhd3860.txt F8E390B1\nrom/stage_param/coli_stgpv083s18_clone1.txt 0E232977\nrom/stage_param/coli_stgpv600s04.txt C0A381EA\nrom/stage_param/fog_ring_ns032.txt 72805160\nrom/stage_param/leaf_ns094.txt 1920B7AC\nrom/stage_param/rain_pv233s02.txt 9E194743\nrom/stage_param/ripple_pv233s03.txt 6047BCF8\nrom/stage_param/snow_pv007s10.txt 41E435F7\nrom/stage_param/splash_d2ns064.txt 912A1E6A\nrom/stage_param/fog_ring_ns084.txt 1F144BC2\nrom/stage_param/fog_ring_ns084_snow.txt 1F144BC2\nrom/stage_param/fog_ring_ns086.txt C448FE31\nrom/stage_param/fog_ring_ns249.txt B9162C2B\nrom/stage_param/fog_ring_pv001s01.txt 8273ADF5\nrom/stage_param/fog_ring_pv001s02.txt 8273ADF5\nrom/stage_param/fog_ring_pv001s03.txt 8273ADF5\nrom/stage_param/fog_ring_pv001s04.txt 8273ADF5\nrom/stage_param/fog_ring_pv001s05.txt 8273ADF5\nrom/stage_param/fog_ring_pv001s06.txt 8273ADF5\nrom/stage_param/fog_ring_pv001s07.txt 8273ADF5\nrom/stage_param/fog_ring_pv008s01.txt B4665FDD\nrom/stage_param/fog_ring_pv008s07.txt B4665FDD\nrom/stage_param/fog_ring_pv223s02.txt EF9B3C68\nrom/stage_param/fog_ring_pv223s03.txt EF9B3C68\nrom/stage_param/fog_ring_pv241s01.txt 0EAF9745\nrom/stage_param/leaf_pv081s03.txt 5670C40F\nrom/stage_param/leaf_pv087s02.txt 663FE483\nrom/stage_param/leaf_pv087s17.txt 663FE483\nrom/stage_param/leaf_pv221s01.txt 43C20938\nrom/stage_param/leaf_pv441s01_clone1.txt 23ECC832\nrom/stage_param/leaf_tst.txt 205F942A\nrom/stage_param/litproj_d2pv208s01.txt BAA46088\nrom/stage_param/litproj_pv255s01.txt 835F0189\nrom/stage_param/litproj_pv257s01.txt ADA9290F\nrom/stage_param/litproj_pv627s02.txt 32256156\nrom/stage_param/rain_ns005_clone1.txt 0A25FE49\nrom/stage_param/rain_pv011s01.txt 3BCB3105\nrom/stage_param/rain_pv011s06.txt 3BCB3105\nrom/stage_param/rain_pv083s08.txt 6218F42E\nrom/stage_param/rain_pv083s24.txt 484DD473\nrom/stage_param/rain_pv089s03_clone1.txt 05C9D401\nrom/stage_param/rain_pv233s03.txt A7B7D5AD\nrom/stage_param/rain_pv233s06.txt F4BB4EB5\nrom/stage_param/rain_pv233s07.txt A7B7D5AD\nrom/stage_param/rain_pv432s01.txt EB6E2F7E\nrom/stage_param/rain_pv432s02_clone1.txt B449C12D\nrom/stage_param/rain_pv609s01_rain.txt 782DDB5D\nrom/stage_param/rain_pv619s02_rain.txt E0DE6F83\nrom/stage_param/rain_pv625s01_clone.txt 54D7936D\nrom/stage_param/ripple_d2ns064.txt 1FC980C5\nrom/stage_param/ripple_ns123.txt 7F5988D6\nrom/stage_param/ripple_pv083s24.txt F15ECED8\nrom/stage_param/ripple_pv089s03_clone1.txt F15ECED8\nrom/stage_param/ripple_pv219s02.txt 98785ADB\nrom/stage_param/ripple_pv219s05.txt 2C932C06\nrom/stage_param/ripple_pv220s03.txt 1FC980C5\nrom/stage_param/ripple_pv233s01.txt 42E2E78D\nrom/stage_param/ripple_pv233s06.txt 6047BCF8\nrom/stage_param/ripple_pv233s07.txt 6047BCF8\nrom/stage_param/ripple_pv236s02.txt 78D2F9B0\nrom/stage_param/ripple_pv432s01.txt 3A0E8724\nrom/stage_param/ripple_pv432s02_clone1.txt 985108AC\nrom/stage_param/snow_d2pv037s01_snow.txt B5C347A2\nrom/stage_param/snow_d2pv051s03.txt D98E0C3B\nrom/stage_param/snow_ns005_snow.txt 2FB25F4B\nrom/stage_param/snow_ns014_snow.txt BCC4FA75\nrom/stage_param/snow_ns015_snow.txt 752B73C8\nrom/stage_param/snow_ns033.txt 62BE1941\nrom/stage_param/snow_ns084_snow.txt 6C9EFC8C\nrom/stage_param/snow_pv007s01.txt 7D6215B2\nrom/stage_param/snow_pv007s06.txt 637B51F3\nrom/stage_param/snow_pv007s07_snow.txt B746DB63\nrom/stage_param/snow_pv007s09.txt 43F6C549\nrom/stage_param/snow_pv007s11_snow.txt D0458C46\nrom/stage_param/snow_pv020s01.txt F3490395\nrom/stage_param/snow_pv020s02.txt 9D77296D\nrom/stage_param/snow_pv020s03.txt 2F20AAEA\nrom/stage_param/snow_pv086s02.txt A28D550F\nrom/stage_param/snow_pv218s01.txt FF3CA6D9\nrom/stage_param/snow_pv218s02.txt FF3CA6D9\nrom/stage_param/snow_pv224s01.txt A6F89750\nrom/stage_param/snow_pv224s02.txt 74A98783\nrom/stage_param/snow_pv224s03.txt 77562BA4\nrom/stage_param/snow_pv244s01.txt 978071BD\nrom/stage_param/snow_pv247s02.txt A40FCD70\nrom/stage_param/snow_pv609s01_snow.txt D13AACC9\nrom/stage_param/snow_pv622s01_snow.txt 51378EC3\nrom/stage_param/snow_pv737s01.txt 995D9895\nrom/stage_param/snow_pv737s02.txt 5508691F\nrom/stage_param/splash_ns123.txt F6595122\nrom/stage_param/splash_pv220s03.txt 912A1E6A\nrom/stage_param/splash_pv233s01.txt DE422615\nrom/stage_param/splash_pv233s03.txt DE422615\nrom/stage_param/splash_pv233s06.txt DE422615\nrom/stage_param/splash_pv233s07.txt DE422615\nrom/stage_param/splash_pv236s02.txt F582BB0C\nrom/stage_param/star_ns266.txt 54809301\nrom/stage_param/star_pv242s01.txt FC265C7B\nrom/stage_param/star_pv253s01.txt F2991F16\nrom/stage_param/star_pv253s02.txt F2991F16\nrom/stage_param/star_pv253s03.txt F2991F16\nrom/stage_param/star_pv253s04.txt F2991F16\nrom/stage_param/star_pv253s05.txt F2991F16\nrom/stage_param/star_pv253s06.txt F2991F16\nrom/stage_param/star_pv253s07.txt F2991F16\nrom/stage_param/star_pv253s08.txt F2991F16\nrom/stage_param/star_pv253s09.txt F2991F16\nrom/stage_param/star_pv621s01.txt D3FC4B18\nrom/stage_param/star_pv622s01.txt 37A8C1E3\nrom/stage_param/star_pv622s01_snow.txt 37A8C1E3\nrom/stage_param/star_pv626s01.txt 21321B56\nrom/stage_param/star_pv638s01.txt 0D315CCB\nrom/stage_param/star_pv642s04.txt 818BEC6E\nrom/photo_print/card/CLT_CRD0271_01.jpg A4F27F93\nrom/photo_print/card/CLT_CRD0000_01.jpg 5330040B\nrom/photo_print/card/CLT_CRD0001_01.jpg 648A4E18\nrom/photo_print/card/CLT_CRD0002_01.jpg 6EEE7995\nrom/photo_print/card/CLT_CRD0003_01.jpg BF939B8C\nrom/photo_print/card/CLT_CRD0004_01.jpg AEC407E2\nrom/photo_print/card/CLT_CRD0005_01.jpg 6FC75B6C\nrom/photo_print/card/CLT_CRD0006_01.jpg 6531F36B\nrom/photo_print/card/CLT_CRD0007_01.jpg 90ED6E1A\nrom/photo_print/card/CLT_CRD0008_01.jpg 7293B5E6\nrom/photo_print/card/CLT_CRD0009_01.jpg 7E010E4C\nrom/photo_print/card/CLT_CRD0010_01.jpg 232FE088\nrom/photo_print/card/CLT_CRD0011_01.jpg A7B39322\nrom/photo_print/card/CLT_CRD0012_01.jpg 9E998994\nrom/photo_print/card/CLT_CRD0013_01.jpg E68318B2\nrom/photo_print/card/CLT_CRD0014_01.jpg 98E7209B\nrom/photo_print/card/CLT_CRD0015_01.jpg 7ADF4A67\nrom/photo_print/card/CLT_CRD0017_01.jpg 08001113\nrom/photo_print/card/CLT_CRD0018_01.jpg AF749343\nrom/photo_print/card/CLT_CRD0019_01.jpg A5D0A7FE\nrom/photo_print/card/CLT_CRD0020_01.jpg 26E511EF\nrom/photo_print/card/CLT_CRD0021_01.jpg E7990363\nrom/photo_print/card/CLT_CRD0022_01.jpg E77FCAD1\nrom/photo_print/card/CLT_CRD0023_01.jpg 3B7824F8\nrom/photo_print/card/CLT_CRD0024_01.jpg FBFD7966\nrom/photo_print/card/CLT_CRD0025_01.jpg 96E01D9D\nrom/photo_print/card/CLT_CRD0026_01.jpg E5D0E6B7\nrom/photo_print/card/CLT_CRD0027_01.jpg A11AAFB2\nrom/photo_print/card/CLT_CRD0028_01.jpg 8D069CCF\nrom/photo_print/card/CLT_CRD0029_01.jpg 5FDE5DFF\nrom/photo_print/card/CLT_CRD0030_01.jpg 464F90DA\nrom/photo_print/card/CLT_CRD0031_01.jpg BBE4E772\nrom/photo_print/card/CLT_CRD0032_01.jpg 13440440\nrom/photo_print/card/CLT_CRD0034_01.jpg 81527166\nrom/photo_print/card/CLT_CRD0035_01.jpg B9DB0B04\nrom/photo_print/card/CLT_CRD0036_01.jpg FCAF1E36\nrom/photo_print/card/CLT_CRD0037_01.jpg 61B56997\nrom/photo_print/card/CLT_CRD0038_01.jpg 3108962A\nrom/photo_print/card/CLT_CRD0039_01.jpg 00DDE11D\nrom/photo_print/card/CLT_CRD0040_01.jpg A5F1E308\nrom/photo_print/card/CLT_CRD0041_01.jpg 0F9112DD\nrom/photo_print/card/CLT_CRD0042_01.jpg CE5E52E6\nrom/photo_print/card/CLT_CRD0043_01.jpg 1D452D52\nrom/photo_print/card/CLT_CRD0044_01.jpg FF438207\nrom/photo_print/card/CLT_CRD0045_01.jpg 7CDA52FE\nrom/photo_print/card/CLT_CRD0046_01.jpg E2C72135\nrom/photo_print/card/CLT_CRD0047_01.jpg A8B0F4C2\nrom/photo_print/card/CLT_CRD0048_01.jpg E0EF5C6C\nrom/photo_print/card/CLT_CRD0049_01.jpg 30CE3997\nrom/photo_print/card/CLT_CRD0051_01.jpg D66D8F20\nrom/photo_print/card/CLT_CRD0052_01.jpg 2B809C7B\nrom/photo_print/card/CLT_CRD0053_01.jpg 6B65BBD2\nrom/photo_print/card/CLT_CRD0054_01.jpg 871EC938\nrom/photo_print/card/CLT_CRD0055_01.jpg 4C0EC1CF\nrom/photo_print/card/CLT_CRD0056_01.jpg 793A2FF5\nrom/photo_print/card/CLT_CRD0057_01.jpg 03ACE248\nrom/photo_print/card/CLT_CRD0058_01.jpg E5BB956B\nrom/photo_print/card/CLT_CRD0059_01.jpg 9B76C2C1\nrom/photo_print/card/CLT_CRD0060_01.jpg D668B881\nrom/photo_print/card/CLT_CRD0061_01.jpg 9DEC1796\nrom/photo_print/card/CLT_CRD0062_01.jpg 982175C3\nrom/photo_print/card/CLT_CRD0063_01.jpg 17A924E9\nrom/photo_print/card/CLT_CRD0064_01.jpg 4593DD54\nrom/photo_print/card/CLT_CRD0065_01.jpg 6F9617D3\nrom/photo_print/card/CLT_CRD0066_01.jpg C9F4C520\nrom/photo_print/card/CLT_CRD0016_01.jpg 137F2601\nrom/photo_print/card/CLT_CRD0033_01.jpg 829F410C\nrom/photo_print/card/CLT_CRD0050_01.jpg 90696D53\nrom/photo_print/card/CLT_CRD0067_01.jpg F1DD7F0E\nrom/photo_print/card/CLT_CRD0084_01.jpg 9F18D156\nrom/photo_print/card/CLT_CRD0101_01.jpg 0420DD0A\nrom/photo_print/card/CLT_CRD0118_01.jpg 73D79A2C\nrom/photo_print/card/CLT_CRD0135_01.jpg B9320480\nrom/photo_print/card/CLT_CRD0152_01.jpg 7BCA8351\nrom/photo_print/card/CLT_CRD0169_01.jpg DEFE8CE7\nrom/photo_print/card/CLT_CRD0186_01.jpg DB0D365A\nrom/photo_print/card/CLT_CRD0203_01.jpg C9B24F55\nrom/photo_print/card/CLT_CRD0220_01.jpg F2233C6B\nrom/photo_print/card/CLT_CRD0237_01.jpg 985B1C20\nrom/photo_print/card/CLT_CRD0254_01.jpg A94E071C\nrom/photo_print/card/CLT_CRD0068_01.jpg F80E831E\nrom/photo_print/card/CLT_CRD0069_01.jpg 48D64F4D\nrom/photo_print/card/CLT_CRD0070_01.jpg 9E4884F8\nrom/photo_print/card/CLT_CRD0071_01.jpg 59CFE49A\nrom/photo_print/card/CLT_CRD0072_01.jpg F6E095C7\nrom/photo_print/card/CLT_CRD0073_01.jpg E757086C\nrom/photo_print/card/CLT_CRD0074_01.jpg 7DE01F54\nrom/photo_print/card/CLT_CRD0075_01.jpg A8C4D4E7\nrom/photo_print/card/CLT_CRD0076_01.jpg 270FEA8F\nrom/photo_print/card/CLT_CRD0077_01.jpg 1F135785\nrom/photo_print/card/CLT_CRD0078_01.jpg 35470773\nrom/photo_print/card/CLT_CRD0079_01.jpg 6B13DC3A\nrom/photo_print/card/CLT_CRD0080_01.jpg 2EC70D94\nrom/photo_print/card/CLT_CRD0081_01.jpg 1B432A12\nrom/photo_print/card/CLT_CRD0082_01.jpg 677F26E8\nrom/photo_print/card/CLT_CRD0083_01.jpg E93C4C56\nrom/photo_print/card/CLT_CRD0085_01.jpg 7A10CEC5\nrom/photo_print/card/CLT_CRD0086_01.jpg 4625F421\nrom/photo_print/card/CLT_CRD0087_01.jpg EF52748F\nrom/photo_print/card/CLT_CRD0088_01.jpg FB974487\nrom/photo_print/card/CLT_CRD0089_01.jpg 47B28626\nrom/photo_print/card/CLT_CRD0090_01.jpg D70704FD\nrom/photo_print/card/CLT_CRD0091_01.jpg BA8D4BC2\nrom/photo_print/card/CLT_CRD0092_01.jpg 1021B700\nrom/photo_print/card/CLT_CRD0093_01.jpg 65D1C147\nrom/photo_print/card/CLT_CRD0094_01.jpg 05F609EE\nrom/photo_print/card/CLT_CRD0095_01.jpg 913B6DD4\nrom/photo_print/card/CLT_CRD0096_01.jpg 88F2C517\nrom/photo_print/card/CLT_CRD0097_01.jpg 934E6F44\nrom/photo_print/card/CLT_CRD0098_01.jpg 835822AD\nrom/photo_print/card/CLT_CRD0099_01.jpg 346B4498\nrom/photo_print/card/CLT_CRD0100_01.jpg 2D4A0C47\nrom/photo_print/card/CLT_CRD0102_01.jpg 99EF6A4D\nrom/photo_print/card/CLT_CRD0103_01.jpg 6199EF1A\nrom/photo_print/card/CLT_CRD0104_01.jpg CDCD4AA7\nrom/photo_print/card/CLT_CRD0105_01.jpg 536DA05C\nrom/photo_print/card/CLT_CRD0106_01.jpg DF4646BF\nrom/photo_print/card/CLT_CRD0107_01.jpg F08D5EF3\nrom/photo_print/card/CLT_CRD0108_01.jpg 6BFC687F\nrom/photo_print/card/CLT_CRD0109_01.jpg 492338D3\nrom/photo_print/card/CLT_CRD0110_01.jpg 372131CE\nrom/photo_print/card/CLT_CRD0111_01.jpg 4B7F3535\nrom/photo_print/card/CLT_CRD0112_01.jpg FD165620\nrom/photo_print/card/CLT_CRD0113_01.jpg 19F4E10E\nrom/photo_print/card/CLT_CRD0114_01.jpg A50DE06D\nrom/photo_print/card/CLT_CRD0115_01.jpg DC2E8896\nrom/photo_print/card/CLT_CRD0116_01.jpg 543B3FEC\nrom/photo_print/card/CLT_CRD0117_01.jpg 196CA994\nrom/photo_print/card/CLT_CRD0119_01.jpg 13EB570C\nrom/photo_print/card/CLT_CRD0120_01.jpg 5136E6F7\nrom/photo_print/card/CLT_CRD0121_01.jpg 10CB188D\nrom/photo_print/card/CLT_CRD0122_01.jpg D83C6970\nrom/photo_print/card/CLT_CRD0123_01.jpg F65B6903\nrom/photo_print/card/CLT_CRD0124_01.jpg E10A4D92\nrom/photo_print/card/CLT_CRD0125_01.jpg 5D2F855B\nrom/photo_print/card/CLT_CRD0126_01.jpg C719D6CE\nrom/photo_print/card/CLT_CRD0127_01.jpg 5C24341E\nrom/photo_print/card/CLT_CRD0128_01.jpg 0DD315DD\nrom/photo_print/card/CLT_CRD0129_01.jpg 7E100B0B\nrom/photo_print/card/CLT_CRD0130_01.jpg AECD0619\nrom/photo_print/card/CLT_CRD0131_01.jpg 56319EC9\nrom/photo_print/card/CLT_CRD0132_01.jpg 087A50BA\nrom/photo_print/card/CLT_CRD0133_01.jpg 05252024\nrom/photo_print/card/CLT_CRD0134_01.jpg F07CBBE0\nrom/photo_print/card/CLT_CRD0136_01.jpg FEE9824B\nrom/photo_print/card/CLT_CRD0137_01.jpg BA94E490\nrom/photo_print/card/CLT_CRD0138_01.jpg 76E95DC8\nrom/photo_print/card/CLT_CRD0139_01.jpg ED5B139F\nrom/photo_print/card/CLT_CRD0140_01.jpg 20CE1B20\nrom/photo_print/card/CLT_CRD0141_01.jpg 0DA3EC0E\nrom/photo_print/card/CLT_CRD0142_01.jpg F34BBF24\nrom/photo_print/card/CLT_CRD0143_01.jpg B5B92966\nrom/photo_print/card/CLT_CRD0144_01.jpg 6B2BC6EB\nrom/photo_print/card/CLT_CRD0145_01.jpg 8FA117DF\nrom/photo_print/card/CLT_CRD0146_01.jpg B5F1B0C4\nrom/photo_print/card/CLT_CRD0147_01.jpg 84152926\nrom/photo_print/card/CLT_CRD0148_01.jpg A6F03019\nrom/photo_print/card/CLT_CRD0149_01.jpg 2F40C186\nrom/photo_print/card/CLT_CRD0150_01.jpg 0755BE8C\nrom/photo_print/card/CLT_CRD0151_01.jpg 7BC71110\nrom/photo_print/card/CLT_CRD0153_01.jpg 05432790\nrom/photo_print/card/CLT_CRD0154_01.jpg D725D4D3\nrom/photo_print/card/CLT_CRD0155_01.jpg 53741E1C\nrom/photo_print/card/CLT_CRD0156_01.jpg C8FE7149\nrom/photo_print/card/CLT_CRD0157_01.jpg 76CA0E00\nrom/photo_print/card/CLT_CRD0158_01.jpg 1C376326\nrom/photo_print/card/CLT_CRD0159_01.jpg 741EAA11\nrom/photo_print/card/CLT_CRD0160_01.jpg E2864066\nrom/photo_print/card/CLT_CRD0161_01.jpg C40FA2C2\nrom/photo_print/card/CLT_CRD0162_01.jpg C481B147\nrom/photo_print/card/CLT_CRD0163_01.jpg A073EB11\nrom/photo_print/card/CLT_CRD0164_01.jpg FA9BEBE5\nrom/photo_print/card/CLT_CRD0165_01.jpg 579401A3\nrom/photo_print/card/CLT_CRD0166_01.jpg EF24881D\nrom/photo_print/card/CLT_CRD0167_01.jpg 263E34C0\nrom/photo_print/card/CLT_CRD0168_01.jpg 0DF19897\nrom/photo_print/card/CLT_CRD0170_01.jpg D5D04242\nrom/photo_print/card/CLT_CRD0171_01.jpg FFC2568C\nrom/photo_print/card/CLT_CRD0172_01.jpg 5BAC9D12\nrom/photo_print/card/CLT_CRD0173_01.jpg FE81C735\nrom/photo_print/card/CLT_CRD0174_01.jpg 078B3884\nrom/photo_print/card/CLT_CRD0175_01.jpg B78D4E67\nrom/photo_print/card/CLT_CRD0176_01.jpg 74B61B9F\nrom/photo_print/card/CLT_CRD0177_01.jpg 9262A330\nrom/photo_print/card/CLT_CRD0178_01.jpg 2134B75E\nrom/photo_print/card/CLT_CRD0179_01.jpg 967B58E4\nrom/photo_print/card/CLT_CRD0180_01.jpg BD0FACC9\nrom/photo_print/card/CLT_CRD0181_01.jpg 5F1BE524\nrom/photo_print/card/CLT_CRD0182_01.jpg E693F4D4\nrom/photo_print/card/CLT_CRD0183_01.jpg EDB5D21B\nrom/photo_print/card/CLT_CRD0184_01.jpg A013DB8B\nrom/photo_print/card/CLT_CRD0185_01.jpg 229D8A24\nrom/photo_print/card/CLT_CRD0187_01.jpg 420E1484\nrom/photo_print/card/CLT_CRD0188_01.jpg 754677CF\nrom/photo_print/card/CLT_CRD0189_01.jpg 7DC7F1F3\nrom/photo_print/card/CLT_CRD0190_01.jpg 8445B1CD\nrom/photo_print/card/CLT_CRD0191_01.jpg 6F3CB710\nrom/photo_print/card/CLT_CRD0192_01.jpg 585E0C77\nrom/photo_print/card/CLT_CRD0193_01.jpg DF5899B6\nrom/photo_print/card/CLT_CRD0194_01.jpg 45186FBB\nrom/photo_print/card/CLT_CRD0195_01.jpg A20EC50E\nrom/photo_print/card/CLT_CRD0196_01.jpg ED26D146\nrom/photo_print/card/CLT_CRD0197_01.jpg D3DF55DA\nrom/photo_print/card/CLT_CRD0198_01.jpg 605D051B\nrom/photo_print/card/CLT_CRD0199_01.jpg DA63C182\nrom/photo_print/card/CLT_CRD0200_01.jpg 7D943A11\nrom/photo_print/card/CLT_CRD0201_01.jpg D60E7037\nrom/photo_print/card/CLT_CRD0202_01.jpg EAD16C3E\nrom/photo_print/card/CLT_CRD0204_01.jpg 3EE3CB2C\nrom/photo_print/card/CLT_CRD0205_01.jpg 773931AD\nrom/photo_print/card/CLT_CRD0206_01.jpg 05573353\nrom/photo_print/card/CLT_CRD0207_01.jpg 7AD5E2B4\nrom/photo_print/card/CLT_CRD0208_01.jpg E85612EA\nrom/photo_print/card/CLT_CRD0209_01.jpg 2172E63E\nrom/photo_print/card/CLT_CRD0210_01.jpg 114FF36E\nrom/photo_print/card/CLT_CRD0211_01.jpg F401B645\nrom/photo_print/card/CLT_CRD0212_01.jpg 4BC429BF\nrom/photo_print/card/CLT_CRD0213_01.jpg 0350F207\nrom/photo_print/card/CLT_CRD0214_01.jpg 0D547389\nrom/photo_print/card/CLT_CRD0215_01.jpg DBA60843\nrom/photo_print/card/CLT_CRD0216_01.jpg 0F5C5705\nrom/photo_print/card/CLT_CRD0217_01.jpg 1D9C0ADD\nrom/photo_print/card/CLT_CRD0218_01.jpg FE560EA3\nrom/photo_print/card/CLT_CRD0219_01.jpg DE12E32F\nrom/photo_print/card/CLT_CRD0221_01.jpg 1032C05A\nrom/photo_print/card/CLT_CRD0222_01.jpg C5E8959E\nrom/photo_print/card/CLT_CRD0223_01.jpg 58F0B93B\nrom/photo_print/card/CLT_CRD0224_01.jpg 7D66090B\nrom/photo_print/card/CLT_CRD0225_01.jpg 596F6FFA\nrom/photo_print/card/CLT_CRD0226_01.jpg F0438FA7\nrom/photo_print/card/CLT_CRD0227_01.jpg 6DA274C9\nrom/photo_print/card/CLT_CRD0228_01.jpg B702C046\nrom/photo_print/card/CLT_CRD0229_01.jpg CAAE135D\nrom/photo_print/card/CLT_CRD0230_01.jpg 5CC135A7\nrom/photo_print/card/CLT_CRD0231_01.jpg E85954DF\nrom/photo_print/card/CLT_CRD0232_01.jpg C948EC14\nrom/photo_print/card/CLT_CRD0233_01.jpg DD2ACA03\nrom/photo_print/card/CLT_CRD0234_01.jpg 1258D02A\nrom/photo_print/card/CLT_CRD0235_01.jpg 2D09EAAA\nrom/photo_print/card/CLT_CRD0236_01.jpg 4DCEC9BD\nrom/photo_print/card/CLT_CRD0238_01.jpg 727C7454\nrom/photo_print/card/CLT_CRD0239_01.jpg 09A0E692\nrom/photo_print/card/CLT_CRD0240_01.jpg C76638A3\nrom/photo_print/card/CLT_CRD0241_01.jpg DB8B6574\nrom/photo_print/card/CLT_CRD0242_01.jpg 5A3CAA53\nrom/photo_print/card/CLT_CRD0243_01.jpg 58300360\nrom/photo_print/card/CLT_CRD0244_01.jpg F77A2C64\nrom/photo_print/card/CLT_CRD0245_01.jpg 4B2B8696\nrom/photo_print/card/CLT_CRD0246_01.jpg 03C6E28F\nrom/photo_print/card/CLT_CRD0247_01.jpg B3CC76F4\nrom/photo_print/card/CLT_CRD0248_01.jpg 9BA83CBA\nrom/photo_print/card/CLT_CRD0249_01.jpg 044D34C1\nrom/photo_print/card/CLT_CRD0250_01.jpg 94AB3CD4\nrom/photo_print/card/CLT_CRD0251_01.jpg 32E957A6\nrom/photo_print/card/CLT_CRD0252_01.jpg 3F6F09DD\nrom/photo_print/card/CLT_CRD0253_01.jpg 7C391B47\nrom/photo_print/card/CLT_CRD0255_01.jpg A0CC2D47\nrom/photo_print/card/CLT_CRD0256_01.jpg 97573DDA\nrom/photo_print/card/CLT_CRD0257_01.jpg 20A4A139\nrom/photo_print/card/CLT_CRD0258_01.jpg C2DCDD89\nrom/photo_print/card/CLT_CRD0259_01.jpg CBCAD4E4\nrom/photo_print/card/CLT_CRD0260_01.jpg 82DBCD07\nrom/photo_print/card/CLT_CRD0261_01.jpg 27275778\nrom/photo_print/card/CLT_CRD0262_01.jpg BCB82201\nrom/photo_print/card/CLT_CRD0263_01.jpg CBDD70DE\nrom/photo_print/card/CLT_CRD0264_01.jpg 9C589F8F\nrom/photo_print/card/CLT_CRD0265_01.jpg 250315F8\nrom/photo_print/card/CLT_CRD0266_01.jpg DA740E40\nrom/photo_print/card/CLT_CRD0267_01.jpg FDB4BE9E\nrom/photo_print/card/CLT_CRD0268_01.jpg F0BF3C59\nrom/photo_print/card/CLT_CRD0269_01.jpg C9F90F46\nrom/photo_print/card/CLT_CRD0270_01.jpg C2ADD35E\nrom/photo_print/card/CLT_CRD0272_01.jpg CC29228F\nrom/photo_print/card/CLT_CRD0273_01.jpg B1C357B2\nrom/photo_print/card/CLT_CRD0274_01.jpg 27BDDE89\nrom/photo_print/card/CLT_CRD0275_01.jpg 803F4956\nrom/photo_print/card/CLT_CRD0276_01.jpg 87EA9910\nrom/photo_print/card/CLT_CRD0277_01.jpg 29F522B3\nrom/photo_print/card/CLT_CRD0278_01.jpg 6F938CE6\nrom/photo_print/card/CLT_CRD0279_01.jpg 0872EEC3\nrom/photo_print/card/CLT_CRD0280_01.jpg D85EA9B3\nrom/photo_print/card/CLT_CRD0281_01.jpg 858FD6A3\nrom/photo_print/card/CLT_CRD0282_01.jpg 9D721BD7\nrom/photo_print/card/CLT_CRD0283_01.jpg 8846C6EC\nrom/photo_print/card/CLT_CRD0284_01.jpg 0335115E\nrom/photo_print/card/CLT_CRD0285_01.jpg B4C87802\nrom/photo_print/card/CLT_CRD0286_01.jpg 0B6156D4\nrom/photo_print/card/CLT_CRD0287_01.jpg DE68DCA2\nrom/photo_print/card/CLT_CRD0289_01.jpg 2E7C7BBE\nrom/photo_print/card/CLT_CRD0290_01.jpg 5578FF4B\nrom/photo_print/card/CLT_CRD0291_01.jpg 419CCD6E\nrom/photo_print/card/CLT_CRD0292_01.jpg C1C0FF04\nrom/photo_print/card/CLT_CRD0293_01.jpg 580E4DE6\nrom/photo_print/card/CLT_CRD0294_01.jpg 2FF04F36\nrom/photo_print/card/CLT_CRD0295_01.jpg 5FDD876C\nrom/photo_print/card/CLT_CRD0296_01.jpg 461CE8DB\nrom/photo_print/card/CLT_CRD0297_01.jpg F0C57A8F\nrom/photo_print/card/CLT_CRD0298_01.jpg 19B99DEC\nrom/photo_print/card/CLT_CRD0299_01.jpg B58F3EA9\nrom/photo_print/card/CLT_CRD0300_01.jpg 7AF85207\nrom/photo_print/card/CLT_CRD0301_01.jpg 4BD81D46\nrom/photo_print/card/CLT_CRD0302_01.jpg D5A3E57A\nrom/photo_print/card/CLT_CRD0303_01.jpg 6E099825\nrom/photo_print/card/CLT_CRD0304_01.jpg DD7C7EC4\nrom/photo_print/card/CLT_CRD0306_01.jpg 8AFA6BBB\nrom/photo_print/card/CLT_CRD0307_01.jpg D5E1820F\nrom/photo_print/card/CLT_CRD0308_01.jpg DC8567AE\nrom/photo_print/card/CLT_CRD0309_01.jpg 6B592CC3\nrom/photo_print/card/CLT_CRD0310_01.jpg 3C2B7EC6\nrom/photo_print/card/CLT_CRD0311_01.jpg C820C4A5\nrom/photo_print/card/CLT_CRD0312_01.jpg 57F56AF9\nrom/photo_print/card/CLT_CRD0313_01.jpg B52FD69A\nrom/photo_print/card/CLT_CRD0314_01.jpg 07B26F9E\nrom/photo_print/card/CLT_CRD0315_01.jpg D78F2F41\nrom/photo_print/card/CLT_CRD0316_01.jpg C88E5271\nrom/photo_print/card/CLT_CRD0317_01.jpg 71C66005\nrom/photo_print/card/CLT_CRD0318_01.jpg 421A43F6\nrom/photo_print/card/CLT_CRD0319_01.jpg 0ED5C93B\nrom/photo_print/card/CLT_CRD0320_01.jpg 37D32A22\nrom/photo_print/card/CLT_CRD0321_01.jpg A9F5EF17\nrom/photo_print/card/CLT_CRD0323_01.jpg 4ADC3D45\nrom/photo_print/card/CLT_CRD0324_01.jpg 1519C8D2\nrom/photo_print/card/CLT_CRD0325_01.jpg 6E354CC4\nrom/photo_print/card/CLT_CRD0326_01.jpg C007C083\nrom/photo_print/card/CLT_CRD0327_01.jpg EF0E46A1\nrom/photo_print/card/CLT_CRD0328_01.jpg 7CC7C488\nrom/photo_print/card/CLT_CRD0329_01.jpg F88F6C5E\nrom/photo_print/card/CLT_CRD0330_01.jpg 36251574\nrom/photo_print/card/CLT_CRD0331_01.jpg 0A303C10\nrom/photo_print/card/CLT_CRD0332_01.jpg 22543654\nrom/photo_print/card/CLT_CRD0333_01.jpg 6B99EF10\nrom/photo_print/card/CLT_CRD0334_01.jpg 42C67BF8\nrom/photo_print/card/CLT_CRD0335_01.jpg 18FAC083\nrom/photo_print/card/CLT_CRD0336_01.jpg 4EE786D8\nrom/photo_print/card/CLT_CRD0337_01.jpg DA41C478\nrom/photo_print/card/CLT_CRD0338_01.jpg 0814201F\nrom/photo_print/card/CLT_CRD0340_01.jpg AA800EA8\nrom/photo_print/card/CLT_CRD0341_01.jpg 40F769C8\nrom/photo_print/card/CLT_CRD0342_01.jpg 23E72F7F\nrom/photo_print/card/CLT_CRD0343_01.jpg 96527BE8\nrom/photo_print/card/CLT_CRD0344_01.jpg AB984ADC\nrom/photo_print/card/CLT_CRD0345_01.jpg 529B7630\nrom/photo_print/card/CLT_CRD0346_01.jpg D1F037D3\nrom/photo_print/card/CLT_CRD0347_01.jpg 167A0BA7\nrom/photo_print/card/CLT_CRD0348_01.jpg 5C39BE36\nrom/photo_print/card/CLT_CRD0349_01.jpg 9299B16A\nrom/photo_print/card/CLT_CRD0350_01.jpg D2A81376\nrom/photo_print/card/CLT_CRD0351_01.jpg C4AB0AFB\nrom/photo_print/card/CLT_CRD0352_01.jpg F5B35F56\nrom/photo_print/card/CLT_CRD0353_01.jpg 39963568\nrom/photo_print/card/CLT_CRD0354_01.jpg 203B9EDB\nrom/photo_print/card/CLT_CRD0355_01.jpg 3C14C48B\nrom/photo_print/card/CLT_CRD0357_01.jpg FBB303CD\nrom/photo_print/card/CLT_CRD0358_01.jpg 2EC26D2A\nrom/photo_print/card/CLT_CRD0359_01.jpg A19D05BA\nrom/photo_print/card/CLT_CRD0360_01.jpg D5E210B2\nrom/photo_print/card/CLT_CRD0361_01.jpg EC792089\nrom/photo_print/card/CLT_CRD0362_01.jpg A48D0A28\nrom/photo_print/card/CLT_CRD0363_01.jpg 9033F71C\nrom/photo_print/card/CLT_CRD0364_01.jpg D684E1E1\nrom/photo_print/card/CLT_CRD0365_01.jpg 24D2726A\nrom/photo_print/card/CLT_CRD0366_01.jpg 9AF977CB\nrom/photo_print/card/CLT_CRD0367_01.jpg 5EED1BE0\nrom/photo_print/card/CLT_CRD0368_01.jpg 23A7621C\nrom/photo_print/card/CLT_CRD0369_01.jpg E3B914E5\nrom/photo_print/card/CLT_CRD0370_01.jpg 22EFDAFF\nrom/photo_print/card/CLT_CRD0371_01.jpg 189FF09E\nrom/photo_print/card/CLT_CRD0372_01.jpg A808AB97\nrom/photo_print/card/CLT_CRD0374_01.jpg FAABB4E0\nrom/photo_print/card/CLT_CRD0375_01.jpg 81EFEB78\nrom/photo_print/card/CLT_CRD0376_01.jpg D376B1C6\nrom/photo_print/card/CLT_CRD0377_01.jpg DDC612F9\nrom/photo_print/card/CLT_CRD0378_01.jpg 7F0C49CB\nrom/photo_print/card/CLT_CRD0379_01.jpg CA00D62C\nrom/photo_print/card/CLT_CRD0380_01.jpg C36AF38A\nrom/photo_print/card/CLT_CRD0381_01.jpg 2D661637\nrom/photo_print/card/CLT_CRD0382_01.jpg 5988B49B\nrom/photo_print/card/CLT_CRD0383_01.jpg CF7E19ED\nrom/photo_print/card/CLT_CRD0384_01.jpg 8BD0B808\nrom/photo_print/card/CLT_CRD0385_01.jpg 9A96D3A6\nrom/photo_print/card/CLT_CRD0386_01.jpg 01DF5D06\nrom/photo_print/card/CLT_CRD0387_01.jpg EA465312\nrom/photo_print/card/CLT_CRD0388_01.jpg 80A8C815\nrom/photo_print/card/CLT_CRD0389_01.jpg 42924415\nrom/photo_print/card/CLT_CRD0391_01.jpg D7FD7B49\nrom/photo_print/card/CLT_CRD0392_01.jpg 0B6C6C4B\nrom/photo_print/card/CLT_CRD0393_01.jpg 12C08F39\nrom/photo_print/card/CLT_CRD0394_01.jpg DA4691F5\nrom/photo_print/card/CLT_CRD0395_01.jpg C44F4481\nrom/photo_print/card/CLT_CRD0396_01.jpg BA382D07\nrom/photo_print/card/CLT_CRD0397_01.jpg 76659EE4\nrom/photo_print/card/CLT_CRD0398_01.jpg CCF7A97A\nrom/photo_print/card/CLT_CRD0399_01.jpg 3AEF67F9\nrom/photo_print/card/CLT_CRD0400_01.jpg BCBBF5D6\nrom/photo_print/card/CLT_CRD0401_01.jpg C36FBEA9\nrom/photo_print/card/CLT_CRD0402_01.jpg 93178B03\nrom/photo_print/card/CLT_CRD0403_01.jpg 2077848E\nrom/photo_print/card/CLT_CRD0404_01.jpg 6F0DCB9E\nrom/photo_print/card/CLT_CRD0405_01.jpg 392BB70F\nrom/photo_print/card/CLT_CRD0406_01.jpg D2E0FEF6\nrom/photo_print/card/CLT_CRD0408_01.jpg 328CC11B\nrom/photo_print/card/CLT_CRD0409_01.jpg B47378C1\nrom/photo_print/card/CLT_CRD0410_01.jpg 6AA3CFCE\nrom/photo_print/card/CLT_CRD0411_01.jpg C4E800D8\nrom/photo_print/card/CLT_CRD0412_01.jpg 671CEC1B\nrom/photo_print/card/CLT_CRD0413_01.jpg C173C7E6\nrom/photo_print/card/CLT_CRD0414_01.jpg 2169991B\nrom/photo_print/card/CLT_CRD0415_01.jpg 88828C03\nrom/photo_print/card/CLT_CRD0416_01.jpg 9C423B69\nrom/photo_print/card/CLT_CRD0417_01.jpg AA8E2CF9\nrom/photo_print/card/CLT_CRD0418_01.jpg CA38F7B4\nrom/photo_print/card/CLT_CRD0419_01.jpg B4729CAC\nrom/photo_print/card/CLT_CRD0420_01.jpg 8E6248C6\nrom/photo_print/card/CLT_CRD0421_01.jpg C67AB47D\nrom/photo_print/card/CLT_CRD0422_01.jpg BE0B5105\nrom/photo_print/card/CLT_CRD0423_01.jpg AE5309EF\nrom/photo_print/card/CLT_CRD0425_01.jpg 3F93386C\nrom/photo_print/card/CLT_CRD0426_01.jpg 9F5CF2F3\nrom/photo_print/card/CLT_CRD0427_01.jpg 6114FF6B\nrom/photo_print/card/CLT_CRD0428_01.jpg 48470912\nrom/photo_print/card/CLT_CRD0429_01.jpg 5AD5E6B0\nrom/photo_print/card/CLT_CRD0430_01.jpg E34B1C8D\nrom/photo_print/card/CLT_CRD0431_01.jpg 3EBCCE7F\nrom/photo_print/card/CLT_CRD0432_01.jpg F8286732\nrom/photo_print/card/CLT_CRD0433_01.jpg EDA17ADE\nrom/photo_print/card/CLT_CRD0434_01.jpg 284E2435\nrom/photo_print/card/CLT_CRD0435_01.jpg 32766A6A\nrom/photo_print/card/CLT_CRD0436_01.jpg 9893829D\nrom/photo_print/card/CLT_CRD0437_01.jpg ABB30A52\nrom/photo_print/card/CLT_CRD0438_01.jpg CC3E4126\nrom/photo_print/card/CLT_CRD0439_01.jpg 473306EF\nrom/photo_print/card/CLT_CRD0440_01.jpg 0D3B0D8C\nrom/photo_print/card/CLT_CRD0442_01.jpg A6A91A04\nrom/photo_print/card/CLT_CRD0443_01.jpg 96FD9311\nrom/photo_print/card/CLT_CRD0444_01.jpg 0309A003\nrom/photo_print/card/CLT_CRD0445_01.jpg 4A2881D6\nrom/photo_print/card/CLT_CRD0446_01.jpg 1222B6BD\nrom/photo_print/card/CLT_CRD0447_01.jpg 00CE3CC1\nrom/photo_print/card/CLT_CRD0448_01.jpg E8C8EB63\nrom/photo_print/card/CLT_CRD0449_01.jpg D76C5016\nrom/photo_print/card/CLT_CRD0450_01.jpg 6B211877\nrom/photo_print/card/CLT_CRD0451_01.jpg A645E5B9\nrom/photo_print/card/CLT_CRD0452_01.jpg 220D243B\nrom/photo_print/card/CLT_CRD0453_01.jpg 0419A702\nrom/photo_print/card/CLT_CRD0454_01.jpg B938A48A\nrom/photo_print/card/CLT_CRD0455_01.jpg E97244BB\nrom/photo_print/card/CLT_CRD0456_01.jpg 34404E73\nrom/photo_print/card/CLT_CRD0457_01.jpg 0E454FC0\nrom/photo_print/card/CLT_CRD0459_01.jpg DA50F6D6\nrom/photo_print/card/CLT_CRD0460_01.jpg 396ADC4B\nrom/photo_print/card/CLT_CRD0461_01.jpg 008674CA\nrom/photo_print/card/CLT_CRD0462_01.jpg 0919EC53\nrom/photo_print/card/CLT_CRD0463_01.jpg 53CD10ED\nrom/photo_print/card/CLT_CRD0464_01.jpg 7318C972\nrom/photo_print/card/CLT_CRD0465_01.jpg 2D768D13\nrom/photo_print/card/CLT_CRD0466_01.jpg E2BBB2FD\nrom/photo_print/card/CLT_CRD0467_01.jpg BCD702BB\nrom/photo_print/card/CLT_CRD0468_01.jpg A81A14ED\nrom/photo_print/card/CLT_CRD0469_01.jpg 25CC55D4\nrom/photo_print/card/CLT_CRD0470_01.jpg 479B073D\nrom/photo_print/card/CLT_CRD0471_01.jpg 1F12495B\nrom/photo_print/card/CLT_CRD0472_01.jpg BF09ADB9\nrom/photo_print/card/CLT_CRD0473_01.jpg EEEEB7F1\nrom/photo_print/card/CLT_CRD0474_01.jpg FE01309D\nrom/photo_print/card/CLT_CRD0476_01.jpg A8E63F7C\nrom/photo_print/card/CLT_CRD0477_01.jpg 68D6F6FF\nrom/photo_print/card/CLT_CRD0478_01.jpg F0E1393A\nrom/photo_print/card/CLT_CRD0479_01.jpg D3E308F8\nrom/photo_print/card/CLT_CRD0480_01.jpg DB9FDB47\nrom/photo_print/card/CLT_CRD0481_01.jpg 80D78BA7\nrom/photo_print/card/CLT_CRD0482_01.jpg 119B5D52\nrom/photo_print/card/CLT_CRD0483_01.jpg 5DCB59D8\nrom/photo_print/card/CLT_CRD0484_01.jpg E2A70AF9\nrom/photo_print/card/CLT_CRD0485_01.jpg 5C5BECBB\nrom/photo_print/card/CLT_CRD0486_01.jpg 97FDBD31\nrom/photo_print/card/CLT_CRD0487_01.jpg BBAE0264\nrom/photo_print/card/CLT_CRD0488_01.jpg 58E28AD0\nrom/photo_print/card/CLT_CRD0489_01.jpg 96ACA27A\nrom/photo_print/card/CLT_CRD0490_01.jpg 6B47253E\nrom/photo_print/card/CLT_CRD0491_01.jpg 6586CADD\nrom/photo_print/card/CLT_CRD0493_01.jpg 4DD00F35\nrom/photo_print/card/CLT_CRD0494_01.jpg D0B9C359\nrom/photo_print/card/CLT_CRD0495_01.jpg FFB495ED\nrom/photo_print/card/CLT_CRD0496_01.jpg 2DDF20F2\nrom/photo_print/card/CLT_CRD0497_01.jpg F64F2D74\nrom/photo_print/card/CLT_CRD0498_01.jpg AE615FE2\nrom/photo_print/card/CLT_CRD0499_01.jpg F63B3EF1\nrom/photo_print/card/CLT_CRD0500_01.jpg 6C906D7A\nrom/photo_print/card/CLT_CRD0501_01.jpg 470F86DF\nrom/photo_print/card/CLT_CRD0502_01.jpg 7E40D5BC\nrom/photo_print/card/CLT_CRD0503_01.jpg E0F2C33B\nrom/photo_print/card/CLT_CRD0504_01.jpg F097DDB0\nrom/photo_print/card/CLT_CRD0505_01.jpg 3A73E4FE\nrom/photo_print/card/CLT_CRD0506_01.jpg 260814DE\nrom/photo_print/card/CLT_CRD0507_01.jpg A49C5A4D\nrom/photo_print/card/CLT_CRD0508_01.jpg 457738BE\nrom/photo_print/card/CLT_CRD0510_01.jpg D025588A\nrom/photo_print/card/CLT_CRD0511_01.jpg 82001303\nrom/photo_print/card/CLT_CRD0512_01.jpg 211654CC\nrom/photo_print/card/CLT_CRD0513_01.jpg 973A1D58\nrom/photo_print/card/CLT_CRD0514_01.jpg BE7DCD13\nrom/photo_print/card/CLT_CRD0515_01.jpg F468A9DC\nrom/photo_print/card/CLT_CRD0516_01.jpg 66CAF3CD\nrom/photo_print/card/CLT_CRD0517_01.jpg 66B7363C\nrom/photo_print/card/CLT_CRD0518_01.jpg 498C7C41\nrom/photo_print/card/CLT_CRD0519_01.jpg 083B5C08\nrom/photo_print/card/CLT_CRD0520_01.jpg CFD34F96\nrom/photo_print/card/CLT_CRD0521_01.jpg 5C1030ED\nrom/photo_print/card/CLT_CRD0522_01.jpg F9E002D9\nrom/photo_print/card/CLT_CRD0523_01.jpg 3402C281\nrom/photo_print/card/CLT_CRD0524_01.jpg 1D1728FA\nrom/photo_print/card/CLT_CRD0525_01.jpg 06D60DBE\nrom/photo_print/card/CLT_CRD0527_01.jpg 318F6766\nrom/photo_print/card/CLT_CRD0528_01.jpg 97E72864\nrom/photo_print/card/CLT_CRD0529_01.jpg 6F724DB6\nrom/photo_print/card/CLT_CRD0530_01.jpg 346CDB29\nrom/photo_print/card/CLT_CRD0531_01.jpg 244CA7DB\nrom/photo_print/card/CLT_CRD0532_01.jpg 94153BB3\nrom/photo_print/card/CLT_CRD0533_01.jpg 8C5BAF19\nrom/photo_print/card/CLT_CRD0534_01.jpg 603BD1DE\nrom/photo_print/card/CLT_CRD0535_01.jpg D8A64101\nrom/photo_print/card/CLT_CRD0536_01.jpg EA8DDF37\nrom/photo_print/card/CLT_CRD0537_01.jpg 55C15843\nrom/photo_print/card/CLT_CRD0538_01.jpg 5E9092D6\nrom/photo_print/card/CLT_CRD0539_01.jpg BE96A6AB\nrom/photo_print/card/CLT_CRD0540_01.jpg 72F250E3\nrom/photo_print/card/CLT_CRD0541_01.jpg 0564C944\nrom/photo_print/card/CLT_CRD0542_01.jpg 25154490\nrom/photo_print/card/CLT_CRD0544_01.jpg 05542817\nrom/photo_print/card/CLT_CRD0545_01.jpg F2DF9C28\nrom/photo_print/card/CLT_CRD0546_01.jpg C867B781\nrom/photo_print/card/CLT_CRD0547_01.jpg CBED371C\nrom/photo_print/card/CLT_CRD0554_01.jpg 00F59612\nrom/photo_print/card/CLT_CRD0555_01.jpg 2F4B070A\nrom/photo_print/card/CLT_CRD0556_01.jpg 15703F35\nrom/photo_print/card/CLT_CRD0557_01.jpg 93F043B3\nrom/photo_print/card/CLT_CRD0558_01.jpg B0DCC8C2\nrom/photo_print/card/CLT_CRD0559_01.jpg 8ED8F131\nrom/photo_print/card/CLT_CRD0560_01.jpg E03CBDB4\nrom/photo_print/card/CLT_CRD0561_01.jpg 744356EE\nrom/photo_print/card/CLT_CRD0562_01.jpg 37FB54E3\nrom/photo_print/card/CLT_CRD0563_01.jpg 5D08819F\nrom/photo_print/card/CLT_CRD0564_01.jpg 6C038C9A\nrom/photo_print/card/CLT_CRD0565_01.jpg 7B915931\nrom/photo_print/card/CLT_CRD0288_01.jpg A80A3BA6\nrom/photo_print/card/CLT_CRD0305_01.jpg ACA6AFCA\nrom/photo_print/card/CLT_CRD0322_01.jpg 32C216CD\nrom/photo_print/card/CLT_CRD0339_01.jpg 0FEB4D74\nrom/photo_print/card/CLT_CRD0356_01.jpg EF28219F\nrom/photo_print/card/CLT_CRD0373_01.jpg D722EBBF\nrom/photo_print/card/CLT_CRD0390_01.jpg 7B8C7EA1\nrom/photo_print/card/CLT_CRD0407_01.jpg 647A8131\nrom/photo_print/card/CLT_CRD0424_01.jpg BAB92118\nrom/photo_print/card/CLT_CRD0441_01.jpg 8746A93E\nrom/photo_print/card/CLT_CRD0458_01.jpg 28CC0E11\nrom/photo_print/card/CLT_CRD0475_01.jpg BE7E5014\nrom/photo_print/card/CLT_CRD0492_01.jpg 6DF5A128\nrom/photo_print/card/CLT_CRD0509_01.jpg B5A24614\nrom/photo_print/card/CLT_CRD0526_01.jpg 8CF6C301\nrom/photo_print/card/CLT_CRD0543_01.jpg 0DF14B54\nrom/photo_print/card/CLT_CRD0566_01.jpg 13D58669\nrom/photo_print/card/CLT_CRD0583_01.jpg D5FC2F6F\nrom/photo_print/card/CLT_CRD0600_01.jpg 382B2DAE\nrom/photo_print/card/CLT_CRD0567_01.jpg 301CC1E8\nrom/photo_print/card/CLT_CRD0568_01.jpg DB52D9D9\nrom/photo_print/card/CLT_CRD0569_01.jpg B5FBA4F2\nrom/photo_print/card/CLT_CRD0570_01.jpg A7A71634\nrom/photo_print/card/CLT_CRD0571_01.jpg ADF6241A\nrom/photo_print/card/CLT_CRD0572_01.jpg 3A7B06E2\nrom/photo_print/card/CLT_CRD0573_01.jpg E898BCB6\nrom/photo_print/card/CLT_CRD0574_01.jpg 8D202514\nrom/photo_print/card/CLT_CRD0575_01.jpg 71D7437F\nrom/photo_print/card/CLT_CRD0576_01.jpg 79CCB45E\nrom/photo_print/card/CLT_CRD0577_01.jpg D9BF428C\nrom/photo_print/card/CLT_CRD0578_01.jpg F450BAD4\nrom/photo_print/card/CLT_CRD0579_01.jpg 09598539\nrom/photo_print/card/CLT_CRD0580_01.jpg E4B0A870\nrom/photo_print/card/CLT_CRD0581_01.jpg 752CBA15\nrom/photo_print/card/CLT_CRD0582_01.jpg 53DBCAEA\nrom/photo_print/card/CLT_CRD0584_01.jpg 314C944E\nrom/photo_print/card/CLT_CRD0585_01.jpg B04B35F6\nrom/photo_print/card/CLT_CRD0586_01.jpg 2B9DD68E\nrom/photo_print/card/CLT_CRD0587_01.jpg 1FA71178\nrom/photo_print/card/CLT_CRD0588_01.jpg F4277A59\nrom/photo_print/card/CLT_CRD0589_01.jpg 8365FD2E\nrom/photo_print/card/CLT_CRD0590_01.jpg 99DECB1A\nrom/photo_print/card/CLT_CRD0591_01.jpg 45D95556\nrom/photo_print/card/CLT_CRD0592_01.jpg 78497070\nrom/photo_print/card/CLT_CRD0593_01.jpg 056A5951\nrom/photo_print/card/CLT_CRD0594_01.jpg 97404066\nrom/photo_print/card/CLT_CRD0595_01.jpg 60D06937\nrom/photo_print/card/CLT_CRD0596_01.jpg 7919C33C\nrom/photo_print/card/CLT_CRD0597_01.jpg AEA8566C\nrom/photo_print/card/CLT_CRD0598_01.jpg 031716D4\nrom/photo_print/card/CLT_CRD0599_01.jpg 186A376B\nrom/photo_print/card/CLT_CRD0601_01.jpg 2877ACE8\nrom/photo_print/card/CLT_CRD0602_01.jpg B4602DA9\nrom/photo_print/card/CLT_CRD0603_01.jpg E1ABB893\nrom/photo_print/card/CLT_CRD0604_01.jpg 0D373EF8\nrom/photo_print/card/CLT_CRD0605_01.jpg 3B0A7CA6\nrom/photo_print/card/CLT_CRD0606_01.jpg 9A8EF5FE\nrom/photo_print/card/CLT_CRD0607_01.jpg A31FCA92\nrom/photo_print/card/CLT_CRD0608_01.jpg 1DD373E0\nrom/photo_print/card/CLT_CRD0609_01.jpg AC133F53\nrom/photo_print/card/CLT_CRD0610_01.jpg 0A2326A5\nrom/photo_print/card/CLT_CRD0611_01.jpg A851E860\nrom/photo_print/card/CLT_CRD0612_01.jpg 35D85701\nrom/photo_print/card/CLT_CRD0613_01.jpg D5C4FC9D\nrom/photo_print/card/CLT_CRD0614_01.jpg 97D19327\nrom/photo_print/card/CLT_CRD0615_01.jpg 27755328\nrom/photo_print/card/CLT_CRD0616_01.jpg EC6C1BE8\nrom/photo_print/card/CLT_CRD0617_01.jpg 4347D666\nrom/photo_print/card/CLT_CRD0618_01.jpg 6B8D513D\nrom/photo_print/card/CLT_CRD0619_01.jpg 5AB8FE9E\nrom/photo_print/card/CLT_CRD0620_01.jpg 0A486E9B\nrom/photo_print/card/CLT_CRD0621_01.jpg F7DC7052\nrom/photo_print/card/CLT_CRD0622_01.jpg 8E1A677F\nrom/photo_print/card/CLT_CRD0623_01.jpg 349E6E0E\nrom/photo_print/card/CLT_CRD0624_01.jpg 5D914A7F\nrom/photo_print/card/CLT_CRD0625_01.jpg C86A4E5A\nrom/photo_print/card/CLT_CRD0626_01.jpg 5A2BE598\nrom/photo_print/card/CLT_CRD0627_01.jpg 332FB2DB\nrom/photo_print/card/CLT_CRD0628_01.jpg 945D8B04\nrom/photo_print/card/CLT_CRD0629_01.jpg 50C964A9\nrom/photo_print/card/CLT_CRD0630_01.jpg BFD62A4D\nrom/photo_print/card/CLT_CRD0631_01.jpg C9109522\nrom/photo_print/card/CLT_CRD0632_01.jpg 1C1C7320\nrom/photo_print/card/CLT_CRD0633_01.jpg 96AA0185\nrom/photo_print/ext/ext_ic_img01_00.jpg 9184F8C3\nrom/photo_print/ext/ext_ic_img02_00.jpg D861438E\nrom/photo_print/ext/ext_ic_img03_00.jpg D08D8442\nrom/photo_print/ext/ext_img01_00.jpg 0329B80C\nrom/photo_print/ext/ext_img02_00.jpg 63FC9F70\nrom/photo_print/ext/ext_img03_00.jpg 370BDC94\nrom/photo_print/ext/ext_ss_rights01.tga 8FAB82F1\nrom/photo_print/ext/ext_ss_rights01_ic.tga E2D69CA9\nrom/photo_print/ext/ext_ss_rights02.tga 650A7E12\nrom/photo_print/ext/ext_ss_rights02_ic.tga 175E9AFE\nrom/photo_print/ext/ext_ss_rights03.tga 74FD8F7B\nrom/photo_print/ext/ext_ss_rights03_ic.tga 92253B16\nrom/photo_print/stamp/stamp000_01.tga C005A330\nrom/photo_print/stamp/stamp001_01.tga 18D6BC3C\nrom/photo_print/stamp/stamp002_00.tga 8C32C9F6\nrom/photo_print/stamp/stamp003_00.tga 35302BFA\nrom/photo_print/stamp/stamp004_00.tga 470A7BBF\nrom/photo_print/stamp/stamp005_00.tga A33BB186\nrom/photo_print/stamp/stamp006_00.tga 30FC5917\nrom/photo_print/stamp/stamp007_00.tga E401FBBE\nrom/photo_print/stamp/stamp008_00.tga 59E0A727\nrom/photo_print/stamp/stamp009_00.tga FAD87BF1\nrom/photo_print/stamp/stamp010_00.tga 50B6607D\nrom/photo_print/stamp/stamp011_00.tga 93798E84\nrom/photo_print/stamp/stamp012_00.tga 323472D0\nrom/photo_print/stamp/stamp013_00.tga A2EB194A\nrom/photo_print/stamp/stamp014_00.tga A2E24AFA\nrom/photo_print/stamp/stamp016_00.tga 3A21B4C7\nrom/photo_print/stamp/stamp017_00.tga 56AEA0AA\nrom/photo_print/stamp/stamp018_00.tga 0FA0F6A7\nrom/photo_print/stamp/stamp019_00.tga 7CEAF63C\nrom/photo_print/stamp/stamp020_00.tga C6955087\nrom/photo_print/stamp/stamp021_00.tga 56CD3D2F\nrom/photo_print/stamp/stamp022_00.tga CB449193\nrom/photo_print/stamp/stamp023_00.tga 37619944\nrom/photo_print/stamp/stamp024_00.tga 7A96A20C\nrom/photo_print/stamp/stamp030_02.tga 955E0F9C\nrom/photo_print/stamp/stamp031_02.tga 6B538EE6\nrom/photo_print/stamp/stamp032_02.tga AC39D739\nrom/photo_print/stamp/stamp033_02.tga 5D598812\nrom/photo_print/stamp/stamp034_02.tga 23C90DF6\nrom/photo_print/stamp/stamp035_02.tga F2A3E944\nrom/photo_print/stamp/stamp040_00.tga 854DED5F\nrom/photo_print/stamp/stamp041_00.tga 4F718416\nrom/photo_print/stamp/stamp043_00.tga FAEDB916\nrom/photo_print/stamp/stamp044_00.tga 27D802D5\nrom/photo_print/stamp/stamp045_00.tga F11C9813\nrom/photo_print/stamp/stamp046_00.tga 30E1C357\nrom/photo_print/stamp/stamp047_00.tga 3F83BE6B\nrom/photo_print/stamp/stamp048_00.tga 3E54562A\nrom/photo_print/stamp/stamp049_00.tga FE99F560\nrom/photo_print/stamp/stamp050_00.tga 9ED6DE02\nrom/photo_print/stamp/stamp051_00.tga 4BC559FF\nrom/photo_print/stamp/stamp052_00.tga 4E1CE0BC\nrom/photo_print/stamp/stamp053_00.tga 24005799\nrom/photo_print/stamp/stamp054_00.tga F9B3651B\nrom/photo_print/stamp/stamp055_00.tga FD625B17\nrom/photo_print/stamp/stamp056_00.tga DF97892D\nrom/photo_print/stamp/stamp057_00.tga 00FA25B8\nrom/photo_print/stamp/stamp058_00.tga 1FC5777E\nrom/photo_print/stamp/stamp059_00.tga A9690988\nrom/photo_print/stamp/stamp061_00.tga 2D9A9249\nrom/photo_print/stamp/stamp062_00.tga 9B010377\nrom/photo_print/stamp/stamp063_00.tga 161B3E43\nrom/photo_print/stamp/stamp064_00.tga 8D7FFF5D\nrom/photo_print/stamp/stamp065_00.tga 08D33828\nrom/photo_print/stamp/stamp066_00.tga E002BA85\nrom/photo_print/stamp/stamp067_00.tga 0C29099F\nrom/photo_print/stamp/stamp068_00.tga 4147FB08\nrom/photo_print/stamp/stamp069_00.tga E9A6364C\nrom/photo_print/stamp/stamp070_00.tga 3A772612\nrom/photo_print/stamp/stamp071_00.tga 29CF17D6\nrom/photo_print/stamp/stamp072_00.tga 6B0B616C\nrom/photo_print/stamp/stamp073_00.tga 6722EDC9\nrom/photo_print/stamp/stamp074_00.tga 38861CFD\nrom/photo_print/stamp/stamp075_00.tga 8E5DC50D\nrom/photo_print/stamp/stamp076_00.tga E19E8272\nrom/photo_print/stamp/stamp077_00.tga 10D53246\nrom/photo_print/stamp/stamp078_00.tga 0265378F\nrom/photo_print/stamp/stamp079_00.tga C52EC04E\nrom/photo_print/stamp/stamp080_00.tga 36C27F75\nrom/photo_print/stamp/stamp081_00.tga 071CB73C\nrom/photo_print/stamp/stamp082_00.tga FC6B55FC\nrom/photo_print/stamp/stamp083_00.tga B4A37DF8\nrom/photo_print/stamp/stamp084_00.tga CD768F70\nrom/photo_print/stamp/stamp085_00.tga A2F72952\nrom/photo_print/stamp/stamp086_00.tga 92DD6F12\nrom/photo_print/stamp/stamp087_00.tga 1F5D0AED\nrom/photo_print/stamp/stamp015_00.tga 8ED43EFC\nrom/photo_print/stamp/stamp042_00.tga E6A84DE3\nrom/photo_print/stamp/stamp060_00.tga A0B8D906\nrom/pv_param/pv710/bloom.txt B21B8636\nrom/pv_param/pv710/cc.txt 9F325BC8\nrom/pv_param/pv710/chara_light.txt 732314C5\nrom/pv_param/pv710/dof.txt 2A2B98EC\nrom/pv_param/pv710/stage_light.txt A30C0CCE\nrom/pv_param/pv740/dof.txt 6309A2D1\nrom/sound/bgm/encore_jng_adx.ogg B879C4CB\nrom/sound/bgm/random_select.ogg 11025647\nrom/sound/bgm/result_ft_clear.ogg 310FFC3B\nrom/sound/bgm/result_lp.ogg F5DD51FD\nrom/sound/bgm/result_verB_clear.ogg A5F605DF\nrom/sound/bgm/screenshot.ogg D175AAA7\nrom/sound/bgm/selector_ft_lp.ogg 73392E98\nrom/sound/bgm/selector_verB_a_lp.ogg 3246A78E\nrom/sound/song/pv_001.ogg 1C98A85C\nrom/sound/song/pv_002.ogg 77AC5730\nrom/sound/song/pv_003.ogg 816A75FE\nrom/sound/song/pv_004.ogg 336C18F8\nrom/sound/song/pv_005.ogg 138839BF\nrom/sound/song/pv_006.ogg 282E7515\nrom/sound/song/pv_007.ogg F76F9F56\nrom/sound/song/pv_008.ogg 8F563212\nrom/sound/song/pv_009.ogg 4BC17D9C\nrom/sound/song/pv_010.ogg 8374D37B\nrom/sound/song/pv_011.ogg 3788CCD2\nrom/sound/song/pv_012.ogg CC6ED135\nrom/sound/song/pv_013.ogg E9D9EF25\nrom/sound/song/pv_014.ogg 708382D4\nrom/sound/song/pv_015.ogg CFC3378D\nrom/sound/song/pv_016.ogg 1BCC9472\nrom/sound/song/pv_017.ogg C06304A9\nrom/sound/song/pv_018.ogg 55494B3A\nrom/sound/song/pv_019.ogg E99876E6\nrom/sound/song/pv_021.ogg 7018C955\nrom/sound/song/pv_022.ogg B6510BC9\nrom/sound/song/pv_023.ogg 56957253\nrom/sound/song/pv_024.ogg 388F1DB7\nrom/sound/song/pv_025.ogg 2848D4B8\nrom/sound/song/pv_026.ogg 118D4D10\nrom/sound/song/pv_027.ogg B40BA9FF\nrom/sound/song/pv_028.ogg 96294A6D\nrom/sound/song/pv_029.ogg 3B3FFAA3\nrom/sound/song/pv_030.ogg 51968963\nrom/sound/song/pv_031.ogg 8E00148B\nrom/sound/song/pv_032.ogg DE0A32E2\nrom/sound/song/pv_033.ogg F7F8470B\nrom/sound/song/pv_034.ogg CD70D1A0\nrom/sound/song/pv_035.ogg DCB8436C\nrom/sound/song/pv_036.ogg BA78A63F\nrom/sound/song/pv_037.ogg 2CA97AC5\nrom/sound/song/pv_038.ogg ED0293E5\nrom/sound/song/pv_039.ogg 7F5543C2\nrom/sound/song/pv_041.ogg 652151AD\nrom/sound/song/pv_042.ogg 46E95728\nrom/sound/song/pv_043.ogg 6478E129\nrom/sound/song/pv_044.ogg 97D97174\nrom/sound/song/pv_045.ogg 06FB40D5\nrom/sound/song/pv_046.ogg D1B85F8E\nrom/sound/song/pv_047.ogg 0DEC9749\nrom/sound/song/pv_048.ogg 49C1A0F0\nrom/sound/song/pv_049.ogg 2DBA41B6\nrom/sound/song/pv_050.ogg 2422987F\nrom/sound/song/pv_051.ogg 50E063B2\nrom/sound/song/pv_052.ogg 342DA983\nrom/sound/song/pv_053.ogg 725A327D\nrom/sound/song/pv_054.ogg C2953768\nrom/sound/song/pv_055.ogg BE3D80A8\nrom/sound/song/pv_056.ogg D2314E6B\nrom/sound/song/pv_057.ogg 6FA11AB3\nrom/sound/song/pv_058.ogg 839EC91E\nrom/sound/song/pv_059.ogg C7ACF496\nrom/sound/song/pv_061.ogg 2ABD3DBF\nrom/sound/song/pv_062.ogg F4242D55\nrom/sound/song/pv_063.ogg 084CF89D\nrom/sound/song/pv_064.ogg 79DD1186\nrom/sound/song/pv_065.ogg FF71BCD5\nrom/sound/song/pv_066.ogg 99C42876\nrom/sound/song/pv_079.ogg 9FEE09E4\nrom/sound/song/pv_081.ogg 92B723DD\nrom/sound/song/pv_082.ogg 02477B43\nrom/sound/song/pv_083.ogg 56B3C97C\nrom/sound/song/pv_084.ogg 605DF0B2\nrom/sound/song/pv_085.ogg 9D1D0267\nrom/sound/song/pv_086.ogg 783004A6\nrom/sound/song/pv_087.ogg B6C55BA1\nrom/sound/song/pv_088.ogg B4AA4FDC\nrom/sound/song/pv_089.ogg AA67CD1C\nrom/sound/song/pv_090.ogg 1EF44CE5\nrom/sound/song/pv_091.ogg D603C3C8\nrom/sound/song/pv_092.ogg 8840750E\nrom/sound/song/pv_094.ogg C9E98E66\nrom/sound/song/pv_095.ogg 9AFB027A\nrom/sound/song/pv_096.ogg A00EFA8C\nrom/sound/song/pv_097.ogg 0B92D454\nrom/sound/song/pv_101.ogg A2EAC506\nrom/sound/song/pv_102.ogg 11138999\nrom/sound/song/pv_103.ogg EDEAB6AB\nrom/sound/song/pv_104.ogg 8FA20F81\nrom/sound/song/pv_201.ogg 02501EDF\nrom/sound/song/pv_202.ogg 2147FC5C\nrom/sound/song/pv_203.ogg 6C234527\nrom/sound/song/pv_204.ogg 2098E9BC\nrom/sound/song/pv_205.ogg F1B9DF28\nrom/sound/song/pv_206.ogg B23C8878\nrom/sound/song/pv_207.ogg 4E82E264\nrom/sound/song/pv_208.ogg 8E98EDE7\nrom/sound/song/pv_209.ogg FC532E93\nrom/sound/song/pv_210.ogg 9662A664\nrom/sound/song/pv_211.ogg F011C647\nrom/sound/song/pv_020.ogg 001E6929\nrom/sound/song/pv_040.ogg 3238023B\nrom/sound/song/pv_060.ogg 8DECF3BC\nrom/sound/song/pv_093.ogg ECBFDA9A\nrom/sound/song/pv_212.ogg 6712B106\nrom/sound/song/pv_233.ogg AE8AE48D\nrom/sound/song/pv_244.ogg EC3A2799\nrom/sound/song/pv_265.ogg FBEE6A44\nrom/sound/song/pv_421.ogg 97D6CAAE\nrom/sound/song/pv_441.ogg D4063DD1\nrom/sound/song/pv_618.ogg 55B839CD\nrom/sound/song/pv_641.ogg 727F0DF2\nrom/sound/song/pv_213.ogg 9C826B63\nrom/sound/song/pv_214.ogg 21E54143\nrom/sound/song/pv_215.ogg 1DC9A831\nrom/sound/song/pv_216.ogg 87C9A4E0\nrom/sound/song/pv_218.ogg 4DA0B37B\nrom/sound/song/pv_219.ogg A257A6F4\nrom/sound/song/pv_220.ogg 5D8B2EDD\nrom/sound/song/pv_221.ogg DF0E5E52\nrom/sound/song/pv_222.ogg BCAA5288\nrom/sound/song/pv_223.ogg 8A82C337\nrom/sound/song/pv_224.ogg 367010BC\nrom/sound/song/pv_225.ogg B8C848B6\nrom/sound/song/pv_226.ogg 2FBE680F\nrom/sound/song/pv_227.ogg 048FD581\nrom/sound/song/pv_227_rin.ogg 5476D324\nrom/sound/song/pv_228.ogg D3985FCB\nrom/sound/song/pv_231.ogg B92B66FF\nrom/sound/song/pv_232.ogg C19CBDD0\nrom/sound/song/pv_234.ogg EBD5D108\nrom/sound/song/pv_235.ogg 9321BDB5\nrom/sound/song/pv_236.ogg ED3C868A\nrom/sound/song/pv_238.ogg CD3A6B39\nrom/sound/song/pv_238_kaito.ogg B665967E\nrom/sound/song/pv_238_len.ogg 1A609C4A\nrom/sound/song/pv_238_luka.ogg E6E9EA8D\nrom/sound/song/pv_238_meiko.ogg 3542DEA9\nrom/sound/song/pv_238_rin.ogg A8DE978D\nrom/sound/song/pv_239.ogg 584474E9\nrom/sound/song/pv_239_luka.ogg 6BDD754C\nrom/sound/song/pv_239_meiko.ogg 3514F515\nrom/sound/song/pv_239_rin.ogg DA7EC86A\nrom/sound/song/pv_240.ogg 67D353A3\nrom/sound/song/pv_241.ogg 0B312FEF\nrom/sound/song/pv_242.ogg A795CEB7\nrom/sound/song/pv_243.ogg 2360622C\nrom/sound/song/pv_243_miku.ogg 0205919B\nrom/sound/song/pv_244_len.ogg DC7EE1FD\nrom/sound/song/pv_246.ogg 8777555D\nrom/sound/song/pv_246_kaito.ogg F2D67CCC\nrom/sound/song/pv_247.ogg 9192D48F\nrom/sound/song/pv_248.ogg E8107583\nrom/sound/song/pv_249.ogg EF5AA99E\nrom/sound/song/pv_250.ogg BEF223B1\nrom/sound/song/pv_251.ogg AC1D3B10\nrom/sound/song/pv_253.ogg 2AB583EF\nrom/sound/song/pv_254.ogg 3B7E29E7\nrom/sound/song/pv_255.ogg 412DD378\nrom/sound/song/pv_257.ogg 98C667DA\nrom/sound/song/pv_259.ogg BB95499E\nrom/sound/song/pv_260.ogg 9519E4D7\nrom/sound/song/pv_261.ogg F35896E9\nrom/sound/song/pv_262.ogg BD2C3685\nrom/sound/song/pv_262_kai.ogg C135CC2C\nrom/sound/song/pv_262_mik.ogg BE6062D1\nrom/sound/song/pv_262_rin.ogg 6C314DC1\nrom/sound/song/pv_401.ogg 742B02CD\nrom/sound/song/pv_402.ogg 24764EDF\nrom/sound/song/pv_403.ogg 2248DA3C\nrom/sound/song/pv_404.ogg C2B1F8A5\nrom/sound/song/pv_405.ogg 7991B112\nrom/sound/song/pv_407.ogg D532D55F\nrom/sound/song/pv_408.ogg BE217F8D\nrom/sound/song/pv_409.ogg B5EA9AD9\nrom/sound/song/pv_410.ogg 1FD18E91\nrom/sound/song/pv_411.ogg 30901286\nrom/sound/song/pv_412.ogg 7FB5EDCE\nrom/sound/song/pv_413.ogg 0B27AA04\nrom/sound/song/pv_414.ogg 6D58DB1D\nrom/sound/song/pv_415.ogg 19F6A1FB\nrom/sound/song/pv_416.ogg C374EA2F\nrom/sound/song/pv_417.ogg E1110DE0\nrom/sound/song/pv_418.ogg A9BAC713\nrom/sound/song/pv_419.ogg 841CF31F\nrom/sound/song/pv_420.ogg B870F2CD\nrom/sound/song/pv_422.ogg 486FDC84\nrom/sound/song/pv_423.ogg 7A9A21EF\nrom/sound/song/pv_424.ogg 16621A99\nrom/sound/song/pv_425.ogg 34DC711A\nrom/sound/song/pv_426.ogg F51A64BB\nrom/sound/song/pv_427.ogg 2BB171BF\nrom/sound/song/pv_428.ogg 6CCD19E9\nrom/sound/song/pv_429.ogg 8F175080\nrom/sound/song/pv_430.ogg 9882F545\nrom/sound/song/pv_431.ogg 831E1806\nrom/sound/song/pv_432.ogg EC1659E6\nrom/sound/song/pv_433.ogg C5876364\nrom/sound/song/pv_434.ogg 269E4976\nrom/sound/song/pv_435.ogg C302B877\nrom/sound/song/pv_436.ogg 6DD0811D\nrom/sound/song/pv_437.ogg ACB0AAA7\nrom/sound/song/pv_438.ogg 399C9BC0\nrom/sound/song/pv_439.ogg 79C68956\nrom/sound/song/pv_440.ogg DC56928C\nrom/sound/song/pv_442.ogg 6AB91EBB\nrom/sound/song/pv_443.ogg 08567A63\nrom/sound/song/pv_600.ogg 2B3375B8\nrom/sound/song/pv_601.ogg F3A95BFD\nrom/sound/song/pv_602.ogg FF41452E\nrom/sound/song/pv_603.ogg 6294F99D\nrom/sound/song/pv_604.ogg C694FB89\nrom/sound/song/pv_605.ogg 681C7B84\nrom/sound/song/pv_607.ogg 83A100D1\nrom/sound/song/pv_608.ogg 327A6FB4\nrom/sound/song/pv_609.ogg 056E03AA\nrom/sound/song/pv_610.ogg 4282AE3C\nrom/sound/song/pv_611.ogg 51E4F1F9\nrom/sound/song/pv_612.ogg 579D8B81\nrom/sound/song/pv_613.ogg E27B1C7E\nrom/sound/song/pv_614.ogg 8DDFE1AD\nrom/sound/song/pv_615.ogg 868E7225\nrom/sound/song/pv_616.ogg BBDCCC29\nrom/sound/song/pv_617.ogg F73DF1F5\nrom/sound/song/pv_619.ogg F709BD19\nrom/sound/song/pv_620.ogg EFBC8F24\nrom/sound/song/pv_621.ogg 7DCF0337\nrom/sound/song/pv_621_meiko.ogg E7951E35\nrom/sound/song/pv_622.ogg 0FE48733\nrom/sound/song/pv_623.ogg 9F61050F\nrom/sound/song/pv_624.ogg DD4AECAE\nrom/sound/song/pv_625.ogg 2DE45738\nrom/sound/song/pv_626.ogg 5C8816E0\nrom/sound/song/pv_627.ogg 6D5D7B7E\nrom/sound/song/pv_628.ogg E822E614\nrom/sound/song/pv_629.ogg 17B4F7E2\nrom/sound/song/pv_630.ogg 8699084D\nrom/sound/song/pv_631.ogg 97314709\nrom/sound/song/pv_637.ogg 9FF5B111\nrom/sound/song/pv_637_all.ogg 5B72BC67\nrom/sound/song/pv_638.ogg 0D07CA70\nrom/sound/song/pv_639.ogg 13720829\nrom/sound/song/pv_640.ogg 43B40DE9\nrom/sound/song/pv_642.ogg 078D32F7\nrom/sound/song/pv_710.ogg 98395B7D\nrom/sound/song/pv_722.ogg E10ECC0C\nrom/sound/song/pv_723.ogg 3E12B568\nrom/sound/song/pv_724.ogg 1242E2BD\nrom/sound/song/pv_725.ogg 16D24AD5\nrom/sound/song/pv_726.ogg 524F5760\nrom/sound/song/pv_727.ogg 7E50E78B\nrom/sound/song/pv_728.ogg 930E044D\nrom/sound/song/pv_729.ogg 83D2A528\nrom/sound/song/pv_730.ogg 272466BB\nrom/sound/song/pv_731.ogg CEE9C519\nrom/sound/song/pv_732.ogg F8FD2F58\nrom/sound/song/pv_733.ogg 950DBEB5\nrom/sound/song/pv_734.ogg 99272300\nrom/sound/song/pv_736.ogg E07927EB\nrom/sound/song/pv_737.ogg 88393B85\nrom/sound/song/pv_738.ogg 26C1FE7C\nrom/sound/song/pv_739.ogg 522D8C00\nrom/sound/song/pv_740.ogg B70A7C3C\nrom/sound/song/pv_832.ogg C8AE0DF4\nrom/photo_print/stamp/ext/ext_stamp001_00.tga CC536E68\nrom/photo_print/stamp/ext/ext_stamp002_00.tga 9C638554\nrom/photo_print/stamp/ext/ext_stamp003_00.tga 5F4B78CE\nrom/photo_print/stamp/ext/ext_stamp004_00.tga 7EB148B0\nrom/photo_print/stamp/module/stamp_md_sub_000_00.tga 92C5233C\nrom/photo_print/stamp/module/stamp_md_sub_001_00.tga 98AD84E9\nrom/photo_print/stamp/module/stamp_md_sub_002_00.tga 197C964C\nrom/photo_print/stamp/module/stamp_md_sub_003_00.tga 61060BCD\nrom/photo_print/stamp/module/stamp_md_sub_004_00.tga 7A60C691\nrom/photo_print/stamp/module/stamp_md_sub_005_00.tga 90971714\nrom/photo_print/stamp/module/stamp_md_sub_006_00.tga 5126EC1A\nrom/photo_print/stamp/module/stamp_md_sub_007_00.tga B254D05F\nrom/photo_print/stamp/module/stamp_md_sub_008_00.tga 3FE45DBB\nrom/photo_print/stamp/module/stamp_md_sub_009_00.tga A3D46BFF\nrom/photo_print/stamp/module/stamp_md_sub_010_00.tga 0CA56F0F\nrom/photo_print/stamp/module/stamp_md_sub_011_00.tga 0A70E4C8\nrom/photo_print/stamp/module/stamp_md_sub_012_00.tga 343F9355\nrom/photo_print/stamp/module/stamp_md_sub_013_00.tga EAABBBEA\nrom/photo_print/stamp/module/stamp_md_sub_014_00.tga D94E1D99\nrom/photo_print/stamp/module/stamp_md_sub_016_00.tga 1A9D8F98\nrom/photo_print/stamp/module/stamp_md_sub_017_00.tga 98CE179B\nrom/photo_print/stamp/module/stamp_md_sub_018_00.tga 5457035A\nrom/photo_print/stamp/module/stamp_md_sub_019_00.tga 22706406\nrom/photo_print/stamp/module/stamp_md_sub_020_00.tga 1FDEB98C\nrom/photo_print/stamp/module/stamp_md_sub_021_00.tga 0586813D\nrom/photo_print/stamp/module/stamp_md_sub_022_00.tga 3F5208FA\nrom/photo_print/stamp/module/stamp_md_sub_023_00.tga D11BBC30\nrom/photo_print/stamp/module/stamp_md_sub_024_00.tga 16D0FFD4\nrom/photo_print/stamp/module/stamp_md_sub_025_00.tga A5A19D38\nrom/photo_print/stamp/module/stamp_md_sub_026_00.tga 84F32C0A\nrom/photo_print/stamp/module/stamp_md_sub_027_00.tga 1ED795AF\nrom/photo_print/stamp/module/stamp_md_sub_028_00.tga 4BF2576D\nrom/photo_print/stamp/module/stamp_md_sub_029_00.tga 1ED53B7F\nrom/photo_print/stamp/module/stamp_md_sub_030_00.tga A613DD97\nrom/photo_print/stamp/module/stamp_md_sub_032_00.tga C62931EB\nrom/photo_print/stamp/module/stamp_md_sub_033_00.tga B6846FC7\nrom/photo_print/stamp/module/stamp_md_sub_034_00.tga 85F15E13\nrom/photo_print/stamp/module/stamp_md_sub_035_00.tga 8765860A\nrom/photo_print/stamp/module/stamp_md_sub_036_00.tga 196BD4F7\nrom/photo_print/stamp/module/stamp_md_sub_037_00.tga D3A8B096\nrom/photo_print/stamp/module/stamp_md_sub_038_00.tga ACEB0CB3\nrom/photo_print/stamp/module/stamp_md_sub_039_00.tga EEFAC576\nrom/photo_print/stamp/module/stamp_md_sub_040_00.tga C45831BE\nrom/photo_print/stamp/module/stamp_md_sub_041_00.tga A6383072\nrom/photo_print/stamp/module/stamp_md_sub_042_00.tga FF0AB25C\nrom/photo_print/stamp/module/stamp_md_sub_043_00.tga EDC49985\nrom/photo_print/stamp/module/stamp_md_sub_044_00.tga 447354B1\nrom/photo_print/stamp/module/stamp_md_sub_045_00.tga 662E270E\nrom/photo_print/stamp/module/stamp_md_sub_046_00.tga AA00A76F\nrom/photo_print/stamp/module/stamp_md_sub_048_00.tga 8C5D16DC\nrom/photo_print/stamp/module/stamp_md_sub_049_00.tga 29176AAE\nrom/photo_print/stamp/module/stamp_md_sub_050_00.tga 04EFF093\nrom/photo_print/stamp/module/stamp_md_sub_051_00.tga 9263F05F\nrom/photo_print/stamp/module/stamp_md_sub_052_00.tga 2EBFDC8E\nrom/photo_print/stamp/module/stamp_md_sub_053_00.tga 643E016A\nrom/photo_print/stamp/module/stamp_md_sub_054_00.tga 2368996B\nrom/photo_print/stamp/module/stamp_md_sub_055_00.tga F5DF5C88\nrom/photo_print/stamp/module/stamp_md_sub_056_00.tga BCFFA7B0\nrom/photo_print/stamp/module/stamp_md_sub_057_00.tga A01365BB\nrom/photo_print/stamp/module/stamp_md_sub_058_00.tga 3D120102\nrom/photo_print/stamp/module/stamp_md_sub_059_00.tga E0C6247A\nrom/photo_print/stamp/module/stamp_md_sub_060_00.tga 4382C309\nrom/photo_print/stamp/module/stamp_md_sub_061_00.tga 4AFF5792\nrom/photo_print/stamp/module/stamp_md_sub_062_00.tga C61BCFAF\nrom/photo_print/stamp/module/stamp_md_sub_015_00.tga 50EF5981\nrom/photo_print/stamp/module/stamp_md_sub_031_00.tga 7F1EABBB\nrom/photo_print/stamp/module/stamp_md_sub_047_00.tga F740D309\nrom/photo_print/stamp/module/stamp_md_sub_063_00.tga 346056BA\nrom/photo_print/stamp/module/stamp_md_sub_079_00.tga 7992D7F8\nrom/photo_print/stamp/module/stamp_md_sub_095_00.tga 1308CC7F\nrom/photo_print/stamp/module/stamp_md_sub_111_00.tga C9E7CF2E\nrom/photo_print/stamp/module/stamp_md_sub_128_00.tga 05AA5F32\nrom/photo_print/stamp/module/stamp_md_sub_145_00.tga 1B4925EF\nrom/photo_print/stamp/module/stamp_md_sub_162_00.tga C055091F\nrom/photo_print/stamp/module/stamp_md_sub_193_00.tga 34E3B644\nrom/photo_print/stamp/module/stamp_md_sub_209_00.tga 04128ED3\nrom/photo_print/stamp/module/stamp_md_sub_225_00.tga 3DD0A0F9\nrom/photo_print/stamp/module/stamp_md_sub_241_00.tga EB315BA0\nrom/photo_print/stamp/module/stamp_md_sub_257_00.tga 4DDCC125\nrom/photo_print/stamp/module/stamp_md_sub_273_00.tga 26073395\nrom/photo_print/stamp/module/stamp_md_sub_289_00.tga 2E769C60\nrom/photo_print/stamp/module/stamp_md_sub_305_00.tga F4133F0E\nrom/photo_print/stamp/module/stamp_md_sub_323_00.tga EFDC7C03\nrom/photo_print/stamp/module/stamp_md_sub_341_00.tga 4ED80719\nrom/photo_print/stamp/module/stamp_md_sub_359_00.tga 391EDA23\nrom/photo_print/stamp/module/stamp_md_sub_375_00.tga C08D7CA5\nrom/photo_print/stamp/module/stamp_md_sub_393_00.tga F9BF5004\nrom/photo_print/stamp/module/stamp_md_sub_064_00.tga 8C069260\nrom/photo_print/stamp/module/stamp_md_sub_065_00.tga E52B999C\nrom/photo_print/stamp/module/stamp_md_sub_066_00.tga FC081E76\nrom/photo_print/stamp/module/stamp_md_sub_067_00.tga 78750116\nrom/photo_print/stamp/module/stamp_md_sub_068_00.tga 08751694\nrom/photo_print/stamp/module/stamp_md_sub_069_00.tga C16A9C9B\nrom/photo_print/stamp/module/stamp_md_sub_070_00.tga 8A84B711\nrom/photo_print/stamp/module/stamp_md_sub_071_00.tga ADE4AD08\nrom/photo_print/stamp/module/stamp_md_sub_072_00.tga 35D75971\nrom/photo_print/stamp/module/stamp_md_sub_073_00.tga 468BDD06\nrom/photo_print/stamp/module/stamp_md_sub_074_00.tga D15E0A15\nrom/photo_print/stamp/module/stamp_md_sub_075_00.tga C31CAE1D\nrom/photo_print/stamp/module/stamp_md_sub_076_00.tga 17A79635\nrom/photo_print/stamp/module/stamp_md_sub_077_00.tga 3F0827F0\nrom/photo_print/stamp/module/stamp_md_sub_078_00.tga CDD160C5\nrom/photo_print/stamp/module/stamp_md_sub_080_00.tga 0ACC8DE0\nrom/photo_print/stamp/module/stamp_md_sub_081_00.tga F6F35689\nrom/photo_print/stamp/module/stamp_md_sub_082_00.tga 9D92A0E0\nrom/photo_print/stamp/module/stamp_md_sub_083_00.tga FB7280EA\nrom/photo_print/stamp/module/stamp_md_sub_084_00.tga BD3B359C\nrom/photo_print/stamp/module/stamp_md_sub_085_00.tga 8215C98B\nrom/photo_print/stamp/module/stamp_md_sub_086_00.tga F8E50A74\nrom/photo_print/stamp/module/stamp_md_sub_087_00.tga 5BCBAB43\nrom/photo_print/stamp/module/stamp_md_sub_088_00.tga 01A6D6D8\nrom/photo_print/stamp/module/stamp_md_sub_089_00.tga 0BFF6847\nrom/photo_print/stamp/module/stamp_md_sub_090_00.tga 909A76F8\nrom/photo_print/stamp/module/stamp_md_sub_091_00.tga 4D681B2C\nrom/photo_print/stamp/module/stamp_md_sub_092_00.tga 5EAD1206\nrom/photo_print/stamp/module/stamp_md_sub_093_00.tga 4317AE90\nrom/photo_print/stamp/module/stamp_md_sub_094_00.tga 1AEC1323\nrom/photo_print/stamp/module/stamp_md_sub_096_00.tga 0BF4DF26\nrom/photo_print/stamp/module/stamp_md_sub_097_00.tga F09C30A8\nrom/photo_print/stamp/module/stamp_md_sub_098_00.tga 5825946E\nrom/photo_print/stamp/module/stamp_md_sub_099_00.tga BE4B53AB\nrom/photo_print/stamp/module/stamp_md_sub_100_00.tga DC8A61A3\nrom/photo_print/stamp/module/stamp_md_sub_101_00.tga 1075CC12\nrom/photo_print/stamp/module/stamp_md_sub_102_00.tga 7FB60BD7\nrom/photo_print/stamp/module/stamp_md_sub_103_00.tga CCC2512A\nrom/photo_print/stamp/module/stamp_md_sub_104_00.tga F6D443D1\nrom/photo_print/stamp/module/stamp_md_sub_105_00.tga 12271B3B\nrom/photo_print/stamp/module/stamp_md_sub_106_00.tga 8B97755A\nrom/photo_print/stamp/module/stamp_md_sub_107_00.tga 348AF030\nrom/photo_print/stamp/module/stamp_md_sub_108_00.tga 342D0F3D\nrom/photo_print/stamp/module/stamp_md_sub_109_00.tga 9E100433\nrom/photo_print/stamp/module/stamp_md_sub_110_00.tga 7F0569DD\nrom/photo_print/stamp/module/stamp_md_sub_112_00.tga 1AEEC6A9\nrom/photo_print/stamp/module/stamp_md_sub_113_00.tga 971BC1FC\nrom/photo_print/stamp/module/stamp_md_sub_114_00.tga 38AC152F\nrom/photo_print/stamp/module/stamp_md_sub_115_00.tga 036AA244\nrom/photo_print/stamp/module/stamp_md_sub_116_00.tga C955EFF0\nrom/photo_print/stamp/module/stamp_md_sub_117_00.tga 09989567\nrom/photo_print/stamp/module/stamp_md_sub_118_00.tga F1CD1A22\nrom/photo_print/stamp/module/stamp_md_sub_119_00.tga F083B9DC\nrom/photo_print/stamp/module/stamp_md_sub_120_00.tga 605D3456\nrom/photo_print/stamp/module/stamp_md_sub_121_00.tga 4A62F772\nrom/photo_print/stamp/module/stamp_md_sub_122_00.tga 157A91DD\nrom/photo_print/stamp/module/stamp_md_sub_124_00.tga 46CE2B56\nrom/photo_print/stamp/module/stamp_md_sub_125_00.tga 9D36F17D\nrom/photo_print/stamp/module/stamp_md_sub_126_00.tga 31E044FE\nrom/photo_print/stamp/module/stamp_md_sub_127_00.tga 55F53C2E\nrom/photo_print/stamp/module/stamp_md_sub_129_00.tga BFC2834B\nrom/photo_print/stamp/module/stamp_md_sub_130_00.tga 4C1DFB32\nrom/photo_print/stamp/module/stamp_md_sub_131_00.tga 363B2590\nrom/photo_print/stamp/module/stamp_md_sub_132_00.tga DA6A6654\nrom/photo_print/stamp/module/stamp_md_sub_133_00.tga 96E30CD3\nrom/photo_print/stamp/module/stamp_md_sub_134_00.tga D8C2365A\nrom/photo_print/stamp/module/stamp_md_sub_135_00.tga DD533B9D\nrom/photo_print/stamp/module/stamp_md_sub_136_00.tga 77F1C171\nrom/photo_print/stamp/module/stamp_md_sub_137_00.tga 03ECD96C\nrom/photo_print/stamp/module/stamp_md_sub_138_00.tga 590F4E63\nrom/photo_print/stamp/module/stamp_md_sub_139_00.tga 4087492A\nrom/photo_print/stamp/module/stamp_md_sub_141_00.tga A6A2F200\nrom/photo_print/stamp/module/stamp_md_sub_142_00.tga F8090C1F\nrom/photo_print/stamp/module/stamp_md_sub_143_00.tga 8F38D8C3\nrom/photo_print/stamp/module/stamp_md_sub_144_00.tga C5908520\nrom/photo_print/stamp/module/stamp_md_sub_146_00.tga B304CB39\nrom/photo_print/stamp/module/stamp_md_sub_147_00.tga C5C04D2D\nrom/photo_print/stamp/module/stamp_md_sub_148_00.tga 93697B9C\nrom/photo_print/stamp/module/stamp_md_sub_149_00.tga 616623B1\nrom/photo_print/stamp/module/stamp_md_sub_150_00.tga 23804836\nrom/photo_print/stamp/module/stamp_md_sub_151_00.tga 1FD70DB7\nrom/photo_print/stamp/module/stamp_md_sub_153_00.tga CD4EEE1B\nrom/photo_print/stamp/module/stamp_md_sub_154_00.tga 1B81FF8D\nrom/photo_print/stamp/module/stamp_md_sub_155_00.tga 8E61B407\nrom/photo_print/stamp/module/stamp_md_sub_156_00.tga 28149094\nrom/photo_print/stamp/module/stamp_md_sub_157_00.tga 09E147BC\nrom/photo_print/stamp/module/stamp_md_sub_158_00.tga 0FEA08B0\nrom/photo_print/stamp/module/stamp_md_sub_159_00.tga 122F9412\nrom/photo_print/stamp/module/stamp_md_sub_160_00.tga 7140D9D8\nrom/photo_print/stamp/module/stamp_md_sub_161_00.tga 592B0136\nrom/photo_print/stamp/module/stamp_md_sub_163_00.tga FBB4FF2A\nrom/photo_print/stamp/module/stamp_md_sub_164_00.tga 27353EFD\nrom/photo_print/stamp/module/stamp_md_sub_165_00.tga 3FAD19A1\nrom/photo_print/stamp/module/stamp_md_sub_166_00.tga C8FB9F96\nrom/photo_print/stamp/module/stamp_md_sub_167_00.tga B36F0719\nrom/photo_print/stamp/module/stamp_md_sub_168_00.tga DA7BBFC9\nrom/photo_print/stamp/module/stamp_md_sub_169_00.tga E61E7EE7\nrom/photo_print/stamp/module/stamp_md_sub_170_00.tga 87808B22\nrom/photo_print/stamp/module/stamp_md_sub_171_00.tga 438FFEC5\nrom/photo_print/stamp/module/stamp_md_sub_172_00.tga 034574F3\nrom/photo_print/stamp/module/stamp_md_sub_188_00.tga 57DCFBF9\nrom/photo_print/stamp/module/stamp_md_sub_189_00.tga 39C1259E\nrom/photo_print/stamp/module/stamp_md_sub_190_00.tga A42D5D46\nrom/photo_print/stamp/module/stamp_md_sub_191_00.tga AE92216C\nrom/photo_print/stamp/module/stamp_md_sub_192_00.tga 701274F6\nrom/photo_print/stamp/module/stamp_md_sub_194_00.tga F56A150B\nrom/photo_print/stamp/module/stamp_md_sub_195_00.tga D54C2A06\nrom/photo_print/stamp/module/stamp_md_sub_196_00.tga 72130520\nrom/photo_print/stamp/module/stamp_md_sub_197_00.tga D8FD3525\nrom/photo_print/stamp/module/stamp_md_sub_198_00.tga 8A52A1F8\nrom/photo_print/stamp/module/stamp_md_sub_199_00.tga 37275D07\nrom/photo_print/stamp/module/stamp_md_sub_200_00.tga 0F9EA6C2\nrom/photo_print/stamp/module/stamp_md_sub_201_00.tga 58325A35\nrom/photo_print/stamp/module/stamp_md_sub_202_00.tga B277B6F2\nrom/photo_print/stamp/module/stamp_md_sub_203_00.tga 4C855364\nrom/photo_print/stamp/module/stamp_md_sub_204_00.tga 1389C7CB\nrom/photo_print/stamp/module/stamp_md_sub_205_00.tga 36F472C2\nrom/photo_print/stamp/module/stamp_md_sub_206_00.tga 0ADBAB32\nrom/photo_print/stamp/module/stamp_md_sub_207_00.tga 54F3C981\nrom/photo_print/stamp/module/stamp_md_sub_208_00.tga CC528BE3\nrom/photo_print/stamp/module/stamp_md_sub_210_00.tga 0CCDB21B\nrom/photo_print/stamp/module/stamp_md_sub_211_00.tga 699A4B56\nrom/photo_print/stamp/module/stamp_md_sub_212_00.tga 59461149\nrom/photo_print/stamp/module/stamp_md_sub_213_00.tga DE9BD34F\nrom/photo_print/stamp/module/stamp_md_sub_214_00.tga B4D33AB5\nrom/photo_print/stamp/module/stamp_md_sub_215_00.tga A9FDF241\nrom/photo_print/stamp/module/stamp_md_sub_216_00.tga 2BCC7161\nrom/photo_print/stamp/module/stamp_md_sub_217_00.tga F2059B6C\nrom/photo_print/stamp/module/stamp_md_sub_218_00.tga 417DE2D3\nrom/photo_print/stamp/module/stamp_md_sub_219_00.tga 09F80902\nrom/photo_print/stamp/module/stamp_md_sub_220_00.tga 61382902\nrom/photo_print/stamp/module/stamp_md_sub_221_00.tga 74B35AAD\nrom/photo_print/stamp/module/stamp_md_sub_222_00.tga DB069995\nrom/photo_print/stamp/module/stamp_md_sub_223_00.tga C009E20E\nrom/photo_print/stamp/module/stamp_md_sub_224_00.tga A77576BF\nrom/photo_print/stamp/module/stamp_md_sub_226_00.tga F650FA1B\nrom/photo_print/stamp/module/stamp_md_sub_227_00.tga BFC87B97\nrom/photo_print/stamp/module/stamp_md_sub_228_00.tga E47FF0DD\nrom/photo_print/stamp/module/stamp_md_sub_229_00.tga 0C40D703\nrom/photo_print/stamp/module/stamp_md_sub_230_00.tga 76504299\nrom/photo_print/stamp/module/stamp_md_sub_231_00.tga 6E5A9A53\nrom/photo_print/stamp/module/stamp_md_sub_232_00.tga F00745E9\nrom/photo_print/stamp/module/stamp_md_sub_233_00.tga F24B2837\nrom/photo_print/stamp/module/stamp_md_sub_234_00.tga 78259285\nrom/photo_print/stamp/module/stamp_md_sub_235_00.tga 340E1355\nrom/photo_print/stamp/module/stamp_md_sub_236_00.tga 8D97A80C\nrom/photo_print/stamp/module/stamp_md_sub_237_00.tga 73D282D7\nrom/photo_print/stamp/module/stamp_md_sub_238_00.tga 46AAE428\nrom/photo_print/stamp/module/stamp_md_sub_239_00.tga 35D606D4\nrom/photo_print/stamp/module/stamp_md_sub_240_00.tga C495C03A\nrom/photo_print/stamp/module/stamp_md_sub_242_00.tga 77FE45BF\nrom/photo_print/stamp/module/stamp_md_sub_243_00.tga 89F7AFB4\nrom/photo_print/stamp/module/stamp_md_sub_244_00.tga C7D64D0E\nrom/photo_print/stamp/module/stamp_md_sub_245_00.tga 4D603A33\nrom/photo_print/stamp/module/stamp_md_sub_246_00.tga 6EB17DAC\nrom/photo_print/stamp/module/stamp_md_sub_247_00.tga A494D9A0\nrom/photo_print/stamp/module/stamp_md_sub_248_00.tga 4B6160F3\nrom/photo_print/stamp/module/stamp_md_sub_249_00.tga 15BFE149\nrom/photo_print/stamp/module/stamp_md_sub_250_00.tga F921B225\nrom/photo_print/stamp/module/stamp_md_sub_251_00.tga 785025B6\nrom/photo_print/stamp/module/stamp_md_sub_252_00.tga CCF3B72B\nrom/photo_print/stamp/module/stamp_md_sub_253_00.tga 65D56624\nrom/photo_print/stamp/module/stamp_md_sub_254_00.tga A56B65D3\nrom/photo_print/stamp/module/stamp_md_sub_255_00.tga 07A07B7B\nrom/photo_print/stamp/module/stamp_md_sub_256_00.tga AEC9BCEA\nrom/photo_print/stamp/module/stamp_md_sub_258_00.tga 6FF73E22\nrom/photo_print/stamp/module/stamp_md_sub_259_00.tga C2007C07\nrom/photo_print/stamp/module/stamp_md_sub_260_00.tga FCE6A6DA\nrom/photo_print/stamp/module/stamp_md_sub_261_00.tga 7FA806EA\nrom/photo_print/stamp/module/stamp_md_sub_262_00.tga 8FFC3601\nrom/photo_print/stamp/module/stamp_md_sub_263_00.tga BDD39D4E\nrom/photo_print/stamp/module/stamp_md_sub_264_00.tga FCB48755\nrom/photo_print/stamp/module/stamp_md_sub_265_00.tga 06882B23\nrom/photo_print/stamp/module/stamp_md_sub_266_00.tga 538ABD25\nrom/photo_print/stamp/module/stamp_md_sub_267_00.tga B8640609\nrom/photo_print/stamp/module/stamp_md_sub_268_00.tga 0376B82E\nrom/photo_print/stamp/module/stamp_md_sub_269_00.tga E84A6235\nrom/photo_print/stamp/module/stamp_md_sub_270_00.tga 1F672B24\nrom/photo_print/stamp/module/stamp_md_sub_271_00.tga 73E86741\nrom/photo_print/stamp/module/stamp_md_sub_272_00.tga C94CEF7D\nrom/photo_print/stamp/module/stamp_md_sub_274_00.tga 22616850\nrom/photo_print/stamp/module/stamp_md_sub_275_00.tga 998E299E\nrom/photo_print/stamp/module/stamp_md_sub_276_00.tga 3F158FF7\nrom/photo_print/stamp/module/stamp_md_sub_277_00.tga 662631E9\nrom/photo_print/stamp/module/stamp_md_sub_278_00.tga AB59E275\nrom/photo_print/stamp/module/stamp_md_sub_279_00.tga 379C9615\nrom/photo_print/stamp/module/stamp_md_sub_280_00.tga C2897664\nrom/photo_print/stamp/module/stamp_md_sub_281_00.tga 1665A09B\nrom/photo_print/stamp/module/stamp_md_sub_282_00.tga CDA17A9D\nrom/photo_print/stamp/module/stamp_md_sub_283_00.tga 19C6D60B\nrom/photo_print/stamp/module/stamp_md_sub_284_00.tga 31AA1797\nrom/photo_print/stamp/module/stamp_md_sub_285_00.tga 183D20EA\nrom/photo_print/stamp/module/stamp_md_sub_286_00.tga 3E9EEB34\nrom/photo_print/stamp/module/stamp_md_sub_287_00.tga D1E1D26E\nrom/photo_print/stamp/module/stamp_md_sub_288_00.tga 39748CC9\nrom/photo_print/stamp/module/stamp_md_sub_290_00.tga 4DE7A503\nrom/photo_print/stamp/module/stamp_md_sub_291_00.tga 06730EFB\nrom/photo_print/stamp/module/stamp_md_sub_292_00.tga 8234A798\nrom/photo_print/stamp/module/stamp_md_sub_293_00.tga 664757C0\nrom/photo_print/stamp/module/stamp_md_sub_294_00.tga 4DEB24E6\nrom/photo_print/stamp/module/stamp_md_sub_295_00.tga 1C93B8B8\nrom/photo_print/stamp/module/stamp_md_sub_296_00.tga F37356B2\nrom/photo_print/stamp/module/stamp_md_sub_297_00.tga 2E3232EF\nrom/photo_print/stamp/module/stamp_md_sub_298_00.tga 1716F63D\nrom/photo_print/stamp/module/stamp_md_sub_299_00.tga D7F38D60\nrom/photo_print/stamp/module/stamp_md_sub_300_00.tga 34AA1594\nrom/photo_print/stamp/module/stamp_md_sub_301_00.tga A6F79FE1\nrom/photo_print/stamp/module/stamp_md_sub_302_00.tga 0096B281\nrom/photo_print/stamp/module/stamp_md_sub_303_00.tga D8CD4BC5\nrom/photo_print/stamp/module/stamp_md_sub_304_00.tga B9BB34A5\nrom/photo_print/stamp/module/stamp_md_sub_306_00.tga 9214CDA2\nrom/photo_print/stamp/module/stamp_md_sub_308_00.tga 2B273497\nrom/photo_print/stamp/module/stamp_md_sub_309_00.tga 49BF5DE0\nrom/photo_print/stamp/module/stamp_md_sub_310_00.tga 657DCBEC\nrom/photo_print/stamp/module/stamp_md_sub_311_00.tga 0A466B9B\nrom/photo_print/stamp/module/stamp_md_sub_313_00.tga 528E6C91\nrom/photo_print/stamp/module/stamp_md_sub_314_00.tga C9288CB7\nrom/photo_print/stamp/module/stamp_md_sub_315_00.tga 60D4B599\nrom/photo_print/stamp/module/stamp_md_sub_316_00.tga CD9C303A\nrom/photo_print/stamp/module/stamp_md_sub_317_00.tga CF0DD183\nrom/photo_print/stamp/module/stamp_md_sub_318_00.tga 5DB13E89\nrom/photo_print/stamp/module/stamp_md_sub_319_00.tga EF748687\nrom/photo_print/stamp/module/stamp_md_sub_320_00.tga A879784D\nrom/photo_print/stamp/module/stamp_md_sub_321_00.tga 53D1C08E\nrom/photo_print/stamp/module/stamp_md_sub_322_00.tga 7B800749\nrom/photo_print/stamp/module/stamp_md_sub_324_00.tga 74A99273\nrom/photo_print/stamp/module/stamp_md_sub_325_00.tga 90EC4194\nrom/photo_print/stamp/module/stamp_md_sub_326_00.tga FFF5F1BE\nrom/photo_print/stamp/module/stamp_md_sub_327_00.tga BD335A15\nrom/photo_print/stamp/module/stamp_md_sub_328_00.tga 912F9AE2\nrom/photo_print/stamp/module/stamp_md_sub_329_00.tga A878E44E\nrom/photo_print/stamp/module/stamp_md_sub_330_00.tga E0EAA392\nrom/photo_print/stamp/module/stamp_md_sub_331_00.tga EF817E00\nrom/photo_print/stamp/module/stamp_md_sub_332_00.tga 6E19A033\nrom/photo_print/stamp/module/stamp_md_sub_334_00.tga 8522882A\nrom/photo_print/stamp/module/stamp_md_sub_335_00.tga 76179688\nrom/photo_print/stamp/module/stamp_md_sub_336_00.tga 1D759835\nrom/photo_print/stamp/module/stamp_md_sub_338_00.tga C35FA6FE\nrom/photo_print/stamp/module/stamp_md_sub_339_00.tga 42B1652C\nrom/photo_print/stamp/module/stamp_md_sub_340_00.tga 664437F4\nrom/photo_print/stamp/module/stamp_md_sub_343_00.tga 68C536A8\nrom/photo_print/stamp/module/stamp_md_sub_344_00.tga A568881A\nrom/photo_print/stamp/module/stamp_md_sub_345_00.tga 1227A47D\nrom/photo_print/stamp/module/stamp_md_sub_346_00.tga 4B4A78ED\nrom/photo_print/stamp/module/stamp_md_sub_347_00.tga 887F0FF3\nrom/photo_print/stamp/module/stamp_md_sub_348_00.tga D06D0FC3\nrom/photo_print/stamp/module/stamp_md_sub_349_00.tga 2940C873\nrom/photo_print/stamp/module/stamp_md_sub_350_00.tga 60DFB7B0\nrom/photo_print/stamp/module/stamp_md_sub_351_00.tga BA17B361\nrom/photo_print/stamp/module/stamp_md_sub_352_00.tga 47688A9D\nrom/photo_print/stamp/module/stamp_md_sub_353_00.tga 295FF785\nrom/photo_print/stamp/module/stamp_md_sub_354_00.tga 45230B2A\nrom/photo_print/stamp/module/stamp_md_sub_355_00.tga CA4D9C87\nrom/photo_print/stamp/module/stamp_md_sub_356_00.tga 31AF00FD\nrom/photo_print/stamp/module/stamp_md_sub_358_00.tga B2F2BA13\nrom/photo_print/stamp/module/stamp_md_sub_360_00.tga 1B79843F\nrom/photo_print/stamp/module/stamp_md_sub_361_00.tga 35BB024D\nrom/photo_print/stamp/module/stamp_md_sub_362_00.tga C5290653\nrom/photo_print/stamp/module/stamp_md_sub_363_00.tga B3B2BC38\nrom/photo_print/stamp/module/stamp_md_sub_364_00.tga D80CA25D\nrom/photo_print/stamp/module/stamp_md_sub_365_00.tga 0FBD262D\nrom/photo_print/stamp/module/stamp_md_sub_366_00.tga 4B6BFB27\nrom/photo_print/stamp/module/stamp_md_sub_367_00.tga 9FA4E224\nrom/photo_print/stamp/module/stamp_md_sub_368_00.tga 1F77DF86\nrom/photo_print/stamp/module/stamp_md_sub_369_00.tga 4D7FEB22\nrom/photo_print/stamp/module/stamp_md_sub_370_00.tga 7BF534F3\nrom/photo_print/stamp/module/stamp_md_sub_371_00.tga 04D47A2D\nrom/photo_print/stamp/module/stamp_md_sub_372_00.tga E54B997D\nrom/photo_print/stamp/module/stamp_md_sub_373_00.tga 17DAD79C\nrom/photo_print/stamp/module/stamp_md_sub_374_00.tga 84AFCC63\nrom/photo_print/stamp/module/stamp_md_sub_376_00.tga DF854163\nrom/photo_print/stamp/module/stamp_md_sub_377_00.tga B2262233\nrom/photo_print/stamp/module/stamp_md_sub_378_00.tga 4A5E0D9D\nrom/photo_print/stamp/module/stamp_md_sub_379_00.tga 0A5121CE\nrom/photo_print/stamp/module/stamp_md_sub_380_00.tga 02D7D69B\nrom/photo_print/stamp/module/stamp_md_sub_381_00.tga 77FD68B0\nrom/photo_print/stamp/module/stamp_md_sub_382_00.tga 1E60DFA3\nrom/photo_print/stamp/module/stamp_md_sub_383_00.tga C2955FCA\nrom/photo_print/stamp/module/stamp_md_sub_385_00.tga DB3DEC1E\nrom/photo_print/stamp/module/stamp_md_sub_386_00.tga C93EB20B\nrom/photo_print/stamp/module/stamp_md_sub_387_00.tga 86A76000\nrom/photo_print/stamp/module/stamp_md_sub_389_00.tga A5025226\nrom/photo_print/stamp/module/stamp_md_sub_390_00.tga 6E3D7E7B\nrom/photo_print/stamp/module/stamp_md_sub_391_00.tga 056A6306\nrom/photo_print/stamp/module/stamp_md_sub_392_00.tga 4467DC61\nrom/photo_print/stamp/module/stamp_md_sub_394_00.tga 68F8B0CD\nrom/photo_print/stamp/module/stamp_md_sub_395_00.tga 7D7D645B\nrom/photo_print/stamp/module/stamp_md_sub_398_00.tga 826CD5FB\nrom/photo_print/stamp/module/stamp_md_sub_402_00.tga 507B4D05\nrom/photo_print/stamp/module/stamp_md_sub_403_00.tga EDE1A7CC\nrom/photo_print/stamp/module/stamp_md_sub_404_00.tga 96C7932A\nrom/photo_print/stamp/module/stamp_md_sub_405_00.tga 1A9FDC21\nrom/photo_print/stamp/module/stamp_md_sub_406_00.tga 42C3E5A6\nrom/photo_print/stamp/module/stamp_md_sub_407_00.tga F638D00F\nrom/photo_print/stamp/module/stamp_md_sub_408_00.tga CA0C14A5\nrom/photo_print/stamp/module/stamp_md_sub_409_00.tga D37CC553\nrom/photo_print/stamp/module/stamp_md_sub_410_00.tga D0744C6F\nrom/photo_print/stamp/module/stamp_md_sub_411_00.tga 34CEB465\nrom/photo_print/stamp/module/stamp_md_sub_412_00.tga 1B4D9BB7\nrom/photo_print/stamp/module/stamp_md_sub_420_00.tga CA8C911B\nrom/photo_print/stamp/module/stamp_md_sub_421_00.tga 3A71CD10\nrom/photo_print/stamp/module/stamp_md_sub_422_00.tga 9B935077\nrom/photo_print/stamp/module/stamp_md_sub_423_00.tga 588370F9\nrom/photo_print/stamp/module/stamp_md_sub_ext001_00.tga 68FE128B\nrom/photo_print/stamp/module/stamp_md_sub_ext002_00.tga 5332CC25\nrom/photo_print/stamp/module/stamp_md_sub_ext003_00.tga B02FB1EC\nrom/photo_print/stamp/module/stamp_md_sub_ext004_00.tga 836BB4A6\nrom/photo_print/stamp/module/stamp_md_sub_ext005_00.tga 01DE9AFC\nrom/photo_print/stamp/module/stamp_md_sub_ext006_00.tga 77E959E2\nrom/photo_print/stamp/module/stamp_md_sub_ext007_00.tga 8E5F09A8\nrom/photo_print/stamp/module/stamp_md_sub_ext008_00.tga BDDFBBC1\nrom/photo_print/stamp/module/stamp_md_sub_ext009_00.tga 190A378D\nrom/photo_print/stamp/module/stamp_md_sub_ext010_00.tga A393842A\nrom/photo_print/stamp/module/stamp_md_sub_ext011_00.tga CAE8F81E\nrom/photo_print/stamp/module/stamp_md_sub_ext012_00.tga 9282B0D9\nrom/photo_print/stamp/pv/stamp_pv001_logo001_00.tga C33FC925\nrom/photo_print/stamp/pv/stamp_pv002_logo002_00.tga 74FD52F1\nrom/photo_print/stamp/pv/stamp_pv003_logo003_00.tga 2463F9E6\nrom/photo_print/stamp/pv/stamp_pv004_logo004_00.tga EEF10A55\nrom/photo_print/stamp/pv/stamp_pv005_logo005_00.tga 3523AC5D\nrom/photo_print/stamp/pv/stamp_pv006_logo006_00.tga 6A774A3E\nrom/photo_print/stamp/pv/stamp_pv007_logo007_00.tga 4DCF2921\nrom/photo_print/stamp/pv/stamp_pv008_logo008_00.tga CF410419\nrom/photo_print/stamp/pv/stamp_pv009_logo009_00.tga 41E06B00\nrom/photo_print/stamp/pv/stamp_pv010_logo010_00.tga 324ED023\nrom/photo_print/stamp/pv/stamp_pv011_logo011_00.tga 7F91D99D\nrom/photo_print/stamp/pv/stamp_pv012_logo012_00.tga 956F7BD5\nrom/photo_print/stamp/pv/stamp_pv013_logo013_00.tga E9F6B134\nrom/photo_print/stamp/pv/stamp_pv014_logo014_00.tga AE29CDFF\nrom/photo_print/stamp/pv/stamp_pv016_logo016_00.tga 08BE9118\nrom/photo_print/stamp/pv/stamp_pv017_logo017_00.tga F82E92AF\nrom/photo_print/stamp/pv/stamp_pv018_logo018_00.tga EA613F69\nrom/photo_print/stamp/pv/stamp_pv019_logo019_00.tga A53F9C25\nrom/photo_print/stamp/pv/stamp_pv020_logo020_00.tga 6A432B7C\nrom/photo_print/stamp/pv/stamp_pv021_logo021_00.tga 81A0CA9C\nrom/photo_print/stamp/pv/stamp_pv022_logo022_00.tga E8D3E8CA\nrom/photo_print/stamp/pv/stamp_pv023_logo023_00.tga 21D6E715\nrom/photo_print/stamp/pv/stamp_pv024_logo024_00.tga 466D880A\nrom/photo_print/stamp/pv/stamp_pv025_logo025_00.tga E79A5549\nrom/photo_print/stamp/pv/stamp_pv027_logo027_00.tga A93B85F5\nrom/photo_print/stamp/pv/stamp_pv028_logo028_00.tga 2AC6CDDE\nrom/photo_print/stamp/pv/stamp_pv029_logo029_00.tga B6E2AE71\nrom/photo_print/stamp/pv/stamp_pv030_logo030_00.tga B9546294\nrom/photo_print/stamp/pv/stamp_pv032_logo032_00.tga 207E95C1\nrom/photo_print/stamp/pv/stamp_pv037_logo037_00.tga CFCD366A\nrom/photo_print/stamp/pv/stamp_pv038_logo038_00.tga A8E97487\nrom/photo_print/stamp/pv/stamp_pv039_logo039_00.tga EA152DD3\nrom/photo_print/stamp/pv/stamp_pv040_logo040_00.tga 9A8640A8\nrom/photo_print/stamp/pv/stamp_pv041_logo041_00.tga 6A81ADB5\nrom/photo_print/stamp/pv/stamp_pv042_logo042_00.tga 855E645B\nrom/photo_print/stamp/pv/stamp_pv043_logo043_00.tga 3912D06F\nrom/photo_print/stamp/pv/stamp_pv044_logo044_00.tga A61B57E7\nrom/photo_print/stamp/pv/stamp_pv045_logo045_00.tga FD71FB85\nrom/photo_print/stamp/pv/stamp_pv046_logo046_00.tga 32587512\nrom/photo_print/stamp/pv/stamp_pv047_logo047_00.tga 05FD7435\nrom/photo_print/stamp/pv/stamp_pv048_logo048_00.tga C67BE822\nrom/photo_print/stamp/pv/stamp_pv049_logo049_00.tga D7E60A70\nrom/photo_print/stamp/pv/stamp_pv051_logo051_00.tga 5B8455E4\nrom/photo_print/stamp/pv/stamp_pv052_logo052_00.tga C82C607F\nrom/photo_print/stamp/pv/stamp_pv053_logo053_00.tga F6CAE985\nrom/photo_print/stamp/pv/stamp_pv054_logo054_00.tga 5D5E72F2\nrom/photo_print/stamp/pv/stamp_pv055_logo055_00.tga D133406C\nrom/photo_print/stamp/pv/stamp_pv056_logo056_00.tga 950E8833\nrom/photo_print/stamp/pv/stamp_pv057_logo057_00.tga 908F4C8C\nrom/photo_print/stamp/pv/stamp_pv058_logo058_00.tga 45959F5B\nrom/photo_print/stamp/pv/stamp_pv059_logo059_00.tga 5513FF8B\nrom/photo_print/stamp/pv/stamp_pv060_logo060_00.tga EDBDB5F3\nrom/photo_print/stamp/pv/stamp_pv061_logo061_00.tga 58061228\nrom/photo_print/stamp/pv/stamp_pv062_logo062_00.tga 4B9FBF7C\nrom/photo_print/stamp/pv/stamp_pv063_logo063_00.tga C6102945\nrom/photo_print/stamp/pv/stamp_pv064_logo064_00.tga 7B7671EE\nrom/photo_print/stamp/pv/stamp_pv015_logo015_00.tga 00300724\nrom/photo_print/stamp/pv/stamp_pv031_logo031_00.tga 8D710EF3\nrom/photo_print/stamp/pv/stamp_pv050_logo050_00.tga 227D9752\nrom/photo_print/stamp/pv/stamp_pv065_logo065_00.tga 03F575A2\nrom/photo_print/stamp/pv/stamp_pv093_logo093_00.tga 6B4EC239\nrom/photo_print/stamp/pv/stamp_pv207_logo207_00.tga 8AB43CED\nrom/photo_print/stamp/pv/stamp_pv223_logo223_00.tga 2A0DBF7D\nrom/photo_print/stamp/pv/stamp_pv241_logo241_00.tga B6436C92\nrom/photo_print/stamp/pv/stamp_pv261_logo261_00.tga D2BE4B23\nrom/photo_print/stamp/pv/stamp_pv413_logo413_00.tga 36C003EE\nrom/photo_print/stamp/pv/stamp_pv428_logo428_00.tga 37D5F4BD\nrom/photo_print/stamp/pv/stamp_pv443_logo443_00.tga CF872F97\nrom/photo_print/stamp/pv/stamp_pv615_logo615_00.tga 76BEF6ED\nrom/photo_print/stamp/pv/stamp_pv630_logo630_00.tga C9D33010\nrom/photo_print/stamp/pv/stamp_pv066_logo066_00.tga 1DB95254\nrom/photo_print/stamp/pv/stamp_pv079_logo079_00.tga F75EED39\nrom/photo_print/stamp/pv/stamp_pv081_logo081_00.tga 7D600E19\nrom/photo_print/stamp/pv/stamp_pv082_logo082_00.tga 24FA5766\nrom/photo_print/stamp/pv/stamp_pv083_logo083_00.tga AD680AB4\nrom/photo_print/stamp/pv/stamp_pv084_logo084_00.tga 4B0EF51E\nrom/photo_print/stamp/pv/stamp_pv085_logo085_00.tga E32DEA05\nrom/photo_print/stamp/pv/stamp_pv086_logo086_00.tga C8F78640\nrom/photo_print/stamp/pv/stamp_pv087_logo087_00.tga CC4A83CE\nrom/photo_print/stamp/pv/stamp_pv088_logo088_00.tga FC442C12\nrom/photo_print/stamp/pv/stamp_pv089_logo089_00.tga CC455320\nrom/photo_print/stamp/pv/stamp_pv090_logo090_00.tga 8AF17E19\nrom/photo_print/stamp/pv/stamp_pv091_logo091_00.tga 9BBA53C4\nrom/photo_print/stamp/pv/stamp_pv092_logo092_00.tga 822E4BF8\nrom/photo_print/stamp/pv/stamp_pv094_logo094_00.tga BB8844DF\nrom/photo_print/stamp/pv/stamp_pv095_logo095_00.tga 6BA0CA19\nrom/photo_print/stamp/pv/stamp_pv096_logo096_00.tga E75D3FDE\nrom/photo_print/stamp/pv/stamp_pv097_logo097_00.tga 7D9772D3\nrom/photo_print/stamp/pv/stamp_pv101_logo101_00.tga 88CEC92B\nrom/photo_print/stamp/pv/stamp_pv102_logo102_00.tga CEA2194D\nrom/photo_print/stamp/pv/stamp_pv103_logo103_00.tga 6B5BE979\nrom/photo_print/stamp/pv/stamp_pv104_logo104_00.tga 4CFAC38D\nrom/photo_print/stamp/pv/stamp_pv201_logo201_00.tga 43C5C261\nrom/photo_print/stamp/pv/stamp_pv202_logo202_00.tga E83FAAB5\nrom/photo_print/stamp/pv/stamp_pv203_logo203_00.tga D80F4DAC\nrom/photo_print/stamp/pv/stamp_pv204_logo204_00.tga 6C9BD279\nrom/photo_print/stamp/pv/stamp_pv205_logo205_00.tga F6731B8C\nrom/photo_print/stamp/pv/stamp_pv206_logo206_00.tga E6446A18\nrom/photo_print/stamp/pv/stamp_pv208_logo208_00.tga BDF07C60\nrom/photo_print/stamp/pv/stamp_pv209_logo209_00.tga EB58C05F\nrom/photo_print/stamp/pv/stamp_pv210_logo210_00.tga AA55A120\nrom/photo_print/stamp/pv/stamp_pv211_logo211_00.tga D1ABB1A7\nrom/photo_print/stamp/pv/stamp_pv212_logo212_00.tga CA09DF41\nrom/photo_print/stamp/pv/stamp_pv213_logo213_00.tga 7617893C\nrom/photo_print/stamp/pv/stamp_pv214_logo214_00.tga 38409483\nrom/photo_print/stamp/pv/stamp_pv215_logo215_00.tga 391DD13A\nrom/photo_print/stamp/pv/stamp_pv216_logo216_00.tga 05DD3BA3\nrom/photo_print/stamp/pv/stamp_pv218_logo218_00.tga FCF6A399\nrom/photo_print/stamp/pv/stamp_pv219_logo219_00.tga EB285E20\nrom/photo_print/stamp/pv/stamp_pv220_logo220_00.tga 028D041B\nrom/photo_print/stamp/pv/stamp_pv221_logo221_00.tga 4D421847\nrom/photo_print/stamp/pv/stamp_pv222_logo222_00.tga F71E90D3\nrom/photo_print/stamp/pv/stamp_pv224_logo224_00.tga D040702F\nrom/photo_print/stamp/pv/stamp_pv225_logo225_00.tga 6B623160\nrom/photo_print/stamp/pv/stamp_pv226_logo226_00.tga 7FDB4C84\nrom/photo_print/stamp/pv/stamp_pv227_logo227_00.tga EE83EAFA\nrom/photo_print/stamp/pv/stamp_pv228_logo228_00.tga 838C303A\nrom/photo_print/stamp/pv/stamp_pv231_logo231_00.tga EF7A6DA4\nrom/photo_print/stamp/pv/stamp_pv232_logo232_00.tga F9A572D8\nrom/photo_print/stamp/pv/stamp_pv233_logo233_00.tga 0E664131\nrom/photo_print/stamp/pv/stamp_pv234_logo234_00.tga 56EB23A4\nrom/photo_print/stamp/pv/stamp_pv235_logo235_00.tga DD5570F7\nrom/photo_print/stamp/pv/stamp_pv236_logo236_00.tga 790BC882\nrom/photo_print/stamp/pv/stamp_pv238_logo238_00.tga 51177349\nrom/photo_print/stamp/pv/stamp_pv239_logo239_00.tga E3B90762\nrom/photo_print/stamp/pv/stamp_pv240_logo240_00.tga 0465F910\nrom/photo_print/stamp/pv/stamp_pv242_logo242_00.tga B4C91785\nrom/photo_print/stamp/pv/stamp_pv243_logo243_00.tga 2CE26985\nrom/photo_print/stamp/pv/stamp_pv244_logo244_00.tga 8ACB92E3\nrom/photo_print/stamp/pv/stamp_pv246_logo246_00.tga 58285ED7\nrom/photo_print/stamp/pv/stamp_pv247_logo247_00.tga 84B408DA\nrom/photo_print/stamp/pv/stamp_pv248_logo248_00.tga EDECAD7F\nrom/photo_print/stamp/pv/stamp_pv249_logo249_00.tga E0325433\nrom/photo_print/stamp/pv/stamp_pv250_logo250_00.tga 711B6EE9\nrom/photo_print/stamp/pv/stamp_pv251_logo251_00.tga F608B3E2\nrom/photo_print/stamp/pv/stamp_pv253_logo253_00.tga 67289D6D\nrom/photo_print/stamp/pv/stamp_pv255_logo255_00.tga 0F0516C9\nrom/photo_print/stamp/pv/stamp_pv257_logo257_00.tga 30E49D9D\nrom/photo_print/stamp/pv/stamp_pv259_logo259_00.tga DD64190A\nrom/photo_print/stamp/pv/stamp_pv260_logo260_00.tga 6A54B7AE\nrom/photo_print/stamp/pv/stamp_pv262_logo262_00.tga 2E54B026\nrom/photo_print/stamp/pv/stamp_pv265_logo265_00.tga 804B5B5C\nrom/photo_print/stamp/pv/stamp_pv401_logo401_00.tga 8A7DAC53\nrom/photo_print/stamp/pv/stamp_pv402_logo402_00.tga 8DE9E34A\nrom/photo_print/stamp/pv/stamp_pv403_logo403_00.tga 940363FB\nrom/photo_print/stamp/pv/stamp_pv403_logo403_ex_00.tga 09737333\nrom/photo_print/stamp/pv/stamp_pv404_logo404_00.tga 0FA159CD\nrom/photo_print/stamp/pv/stamp_pv405_logo405_00.tga 1A24905C\nrom/photo_print/stamp/pv/stamp_pv407_logo407_00.tga 9B9B4A5E\nrom/photo_print/stamp/pv/stamp_pv408_logo408_00.tga 6A3C33FA\nrom/photo_print/stamp/pv/stamp_pv409_logo409_00.tga 065E41EB\nrom/photo_print/stamp/pv/stamp_pv410_logo410_00.tga 6819687F\nrom/photo_print/stamp/pv/stamp_pv411_logo411_00.tga 4022ED51\nrom/photo_print/stamp/pv/stamp_pv412_logo412_00.tga 2B2976E5\nrom/photo_print/stamp/pv/stamp_pv414_logo414_00.tga 693517FE\nrom/photo_print/stamp/pv/stamp_pv415_logo415_00.tga 7D810A96\nrom/photo_print/stamp/pv/stamp_pv416_logo416_00.tga 38258FE9\nrom/photo_print/stamp/pv/stamp_pv417_logo417_00.tga 193EDFF6\nrom/photo_print/stamp/pv/stamp_pv418_logo418_00.tga 20E52D38\nrom/photo_print/stamp/pv/stamp_pv419_logo419_00.tga 8C33A6FE\nrom/photo_print/stamp/pv/stamp_pv420_logo420_00.tga B7B67F6F\nrom/photo_print/stamp/pv/stamp_pv421_logo421_00.tga 334002B8\nrom/photo_print/stamp/pv/stamp_pv422_logo422_00.tga F0D9FBBF\nrom/photo_print/stamp/pv/stamp_pv423_logo423_00.tga 22EF7E5D\nrom/photo_print/stamp/pv/stamp_pv424_logo424_00.tga A92F8D20\nrom/photo_print/stamp/pv/stamp_pv425_logo425_00.tga 3CEE8B84\nrom/photo_print/stamp/pv/stamp_pv426_logo426_00.tga 808EFBF4\nrom/photo_print/stamp/pv/stamp_pv427_logo427_00.tga 5D200B9F\nrom/photo_print/stamp/pv/stamp_pv429_logo429_00.tga 3E9A081E\nrom/photo_print/stamp/pv/stamp_pv430_logo430_00.tga A114CCD7\nrom/photo_print/stamp/pv/stamp_pv431_logo431_00.tga E77924B9\nrom/photo_print/stamp/pv/stamp_pv432_logo432_00.tga 5FF8A8B0\nrom/photo_print/stamp/pv/stamp_pv433_logo433_00.tga 3101C130\nrom/photo_print/stamp/pv/stamp_pv434_logo434_00.tga 8D80F850\nrom/photo_print/stamp/pv/stamp_pv435_logo435_00.tga 547DE5B6\nrom/photo_print/stamp/pv/stamp_pv436_logo436_00.tga 8806C867\nrom/photo_print/stamp/pv/stamp_pv437_logo437_00.tga 8073965B\nrom/photo_print/stamp/pv/stamp_pv438_logo438_00.tga 2DEB99BA\nrom/photo_print/stamp/pv/stamp_pv439_logo439_00.tga 06643A3B\nrom/photo_print/stamp/pv/stamp_pv440_logo440_00.tga 90E2AE84\nrom/photo_print/stamp/pv/stamp_pv441_logo441_00.tga 7DCB1872\nrom/photo_print/stamp/pv/stamp_pv442_logo442_00.tga 19C087C9\nrom/photo_print/stamp/pv/stamp_pv600_logo600_00.tga 6269F945\nrom/photo_print/stamp/pv/stamp_pv601_logo601_00.tga EEEDD74F\nrom/photo_print/stamp/pv/stamp_pv602_logo602_00.tga 4AA52D98\nrom/photo_print/stamp/pv/stamp_pv603_logo603_00.tga 664773C6\nrom/photo_print/stamp/pv/stamp_pv604_logo604_00.tga 911B518C\nrom/photo_print/stamp/pv/stamp_pv605_logo605_00.tga 54C77486\nrom/photo_print/stamp/pv/stamp_pv607_logo607_00.tga 3E840491\nrom/photo_print/stamp/pv/stamp_pv608_logo608_00.tga 030016AF\nrom/photo_print/stamp/pv/stamp_pv609_logo609_00.tga 6FA56A28\nrom/photo_print/stamp/pv/stamp_pv610_logo610_00.tga 4BFACCA3\nrom/photo_print/stamp/pv/stamp_pv611_logo611_00.tga 9E191314\nrom/photo_print/stamp/pv/stamp_pv612_logo612_00.tga F511B9CF\nrom/photo_print/stamp/pv/stamp_pv613_logo613_00.tga 81425F8D\nrom/photo_print/stamp/pv/stamp_pv614_logo614_00.tga D5A1D20C\nrom/photo_print/stamp/pv/stamp_pv616_logo616_00.tga DB405E1D\nrom/photo_print/stamp/pv/stamp_pv617_logo617_00.tga 2D12C742\nrom/photo_print/stamp/pv/stamp_pv618_logo618_00.tga 10B65472\nrom/photo_print/stamp/pv/stamp_pv619_logo619_00.tga A6A42B39\nrom/photo_print/stamp/pv/stamp_pv620_logo620_00.tga 5AD1A210\nrom/photo_print/stamp/pv/stamp_pv621_logo621_00.tga 1DB2FEB0\nrom/photo_print/stamp/pv/stamp_pv622_logo622_00.tga 353FECF6\nrom/photo_print/stamp/pv/stamp_pv623_logo623_00.tga 3AF24D8F\nrom/photo_print/stamp/pv/stamp_pv624_logo624_00.tga C86BC55E\nrom/photo_print/stamp/pv/stamp_pv625_logo625_00.tga A147986C\nrom/photo_print/stamp/pv/stamp_pv626_logo626_00.tga 059BBD4F\nrom/photo_print/stamp/pv/stamp_pv627_logo627_00.tga 1A997F23\nrom/photo_print/stamp/pv/stamp_pv628_logo628_00.tga 055C7D1D\nrom/photo_print/stamp/pv/stamp_pv629_logo629_00.tga 63316CA2\nrom/photo_print/stamp/pv/stamp_pv631_logo631_00.tga 0B97EB07\nrom/photo_print/stamp/pv/stamp_pv637_logo637_00.tga 5E9B1887\nrom/photo_print/stamp/pv/stamp_pv638_logo638_00.tga 049E1838\nrom/photo_print/stamp/pv/stamp_pv639_logo639_00.tga FD512A4D\nrom/photo_print/stamp/pv/stamp_pv640_logo640_00.tga F8D44B3D\nrom/photo_print/stamp/pv/stamp_pv641_logo641_00.tga 6C3C6612\nrom/photo_print/stamp/pv/stamp_pv642_logo642_00.tga 1DAF669C\nrom/photo_print/stamp/pv/stamp_pv710_logo710_00.tga 4C9DBCFB\nrom/photo_print/stamp/pv/stamp_pv722_logo722_00.tga 0C0C9CBA\nrom/photo_print/stamp/pv/stamp_pv723_logo723_00.tga E5E7375B\nrom/photo_print/stamp/pv/stamp_pv724_logo724_00.tga D45DBBF8\nrom/photo_print/stamp/pv/stamp_pv725_logo725_00.tga 8699573B\nrom/photo_print/stamp/pv/stamp_pv726_logo726_00.tga B3F8B8A7\nrom/photo_print/stamp/pv/stamp_pv727_logo727_00.tga BA0B967A\nrom/photo_print/stamp/pv/stamp_pv728_logo728_00.tga 0DA3E2CB\nrom/photo_print/stamp/pv/stamp_pv729_logo729_00.tga 96E049A9\nrom/photo_print/stamp/pv/stamp_pv730_logo730_00.tga 1B9E5BDC\nrom/photo_print/stamp/pv/stamp_pv731_logo731_00.tga FF72A6E1\nrom/photo_print/stamp/pv/stamp_pv732_logo732_00.tga 8CEA3A49\nrom/photo_print/stamp/pv/stamp_pv733_logo733_00.tga 7CCD1813\nrom/photo_print/stamp/pv/stamp_pv734_logo734_00.tga 18D10A5D\nrom/photo_print/stamp/pv/stamp_pv736_logo736_00.tga 7C1F7CC5\nrom/photo_print/stamp/pv/stamp_pv737_logo737_00.tga 722C1436\nrom/photo_print/stamp/pv/stamp_pv738_logo738_00.tga 5DD8A756\nrom/photo_print/stamp/pv/stamp_pv739_logo739_00.tga 8772D31E\nrom/photo_print/stamp/pv/stamp_pv740_logo740_00.tga 77C9AEF2\nrom/photo_print/stamp/pv/stamp_pv832_logo832_00.tga 7317EB58\n"
  },
  {
    "path": "source-code/data/verify_mount_data.sfv",
    "content": "; Generated by QuickSFV v2.36 on 2021-10-27 at 17:56:21\r\n; http://www.QuickSFV.org\r\n;\r\n;           45  15:58.08 2016-10-30 mdata/M215/info.txt\r\n;         1056  14:19.40 2016-12-07 mdata/M215/rom/objset/mdata_obj_db.bin\r\n;          864  14:19.40 2016-12-07 mdata/M215/rom/objset/mdata_tex_db.bin\r\n;      1464001  14:19.40 2016-12-07 mdata/M215/rom/objset/meiitm809.farc\r\n;      1801679  14:19.40 2016-12-07 mdata/M215/rom/objset/meiitm823.farc\r\n;           59  11:20.49 2016-12-07 mdata/M220/info.txt\r\n;       262629  06:41.41 2016-11-09 mdata/M220/rom/mdata_chritm_prop.farc\r\n;        54328  11:10.31 2016-12-06 mdata/M220/rom/mdata_gm_collection_card_tbl.farc\r\n;        21937  07:27.43 2016-11-09 mdata/M220/rom/mdata_gm_module_tbl.farc\r\n;       130435  09:47.13 2016-12-09 mdata/M220/rom/mdata_pv_db.txt\r\n;       927440  08:53.45 2016-12-09 mdata/M220/rom/mdata_pv_field.txt\r\n;        54714  04:29.37 2016-11-16 mdata/M220/rom/mdata_rob_sleeve_data.txt\r\n;       266140  11:47.36 2016-11-29 mdata/M220/rom/mdata_stage_data.bin\r\n;     17244430  10:18.12 2016-12-02 mdata/M220/rom/osage_play_data/kaiitm043_joha_outer_43__divskn.farc\r\n;     28461396  17:39.54 2016-10-30 mdata/M220/rom/osage_play_data/kaiitm044_joha_outer_44__divskn.farc\r\n;      1437441  15:25.12 2016-11-25 mdata/M220/rom/osage_play_data/kaiitm543_atam_atama_43__divskn.farc\r\n;      1712836  17:39.54 2016-10-30 mdata/M220/rom/osage_play_data/kaiitm544_atam_atama_44__divskn.farc\r\n;      2090009  17:39.54 2016-10-30 mdata/M220/rom/osage_play_data/kaiitm708_atam_zujo_08__divskn.farc\r\n;      2224061  12:06.03 2016-11-29 mdata/M220/rom/osage_play_data/lenitm041_joha_outer_41__divskn.farc\r\n;      1009700  15:25.12 2016-11-25 mdata/M220/rom/osage_play_data/lenitm541_atam_atama_41__divskn.farc\r\n;      6851122  14:12.54 2016-11-15 mdata/M220/rom/osage_play_data/lukitm043_joha_outer_43__divskn.farc\r\n;      8108727  13:05.09 2016-11-14 mdata/M220/rom/osage_play_data/lukitm543_atam_atama_43__divskn.farc\r\n;         1564  10:18.12 2016-12-02 mdata/M220/rom/osage_play_data/mdata_opd_db.txt\r\n;      2408987  12:06.03 2016-11-29 mdata/M220/rom/osage_play_data/meiitm034_joha_outer_34__divskn.farc\r\n;      2161544  15:25.12 2016-11-25 mdata/M220/rom/osage_play_data/meiitm534_atam_atama_34__divskn.farc\r\n;      5262898  12:06.03 2016-11-29 mdata/M220/rom/osage_play_data/mikitm171_joha_outer_171__divskn.farc\r\n;     28751224  11:28.36 2016-11-16 mdata/M220/rom/osage_play_data/mikitm172_joha_outer_172__divskn.farc\r\n;     54885615  17:39.54 2016-10-30 mdata/M220/rom/osage_play_data/mikitm174_joha_outer_174__divskn.farc\r\n;     11034331  08:48.04 2016-12-02 mdata/M220/rom/osage_play_data/mikitm671_atam_atama_171__divskn.farc\r\n;      8734657  13:05.09 2016-11-14 mdata/M220/rom/osage_play_data/mikitm672_atam_atama_172__divskn.farc\r\n;      9661531  17:39.54 2016-10-30 mdata/M220/rom/osage_play_data/mikitm674_atam_atama_174__divskn.farc\r\n;     30446901  07:23.14 2016-11-17 mdata/M220/rom/osage_play_data/rinitm042_joha_outer_42__divskn.farc\r\n;      6325840  15:25.12 2016-11-25 mdata/M220/rom/osage_play_data/rinitm049_joha_outer_49__divskn.farc\r\n;      1682711  14:12.54 2016-11-15 mdata/M220/rom/osage_play_data/rinitm542_atam_atama_42__divskn.farc\r\n;      1075061  15:25.12 2016-11-25 mdata/M220/rom/osage_play_data/rinitm549_atam_atama_49__divskn.farc\r\n;       203150  14:12.55 2016-11-15 mdata/M220/rom/osage_play_data/rinitm722_atam_zujo_22__divskn.farc\r\n;      1320903  14:12.55 2016-11-15 mdata/M220/rom/osage_play_data/rinitm778_joha_ushiro_78__divskn.farc\r\n;       249994  02:39.04 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0634_01.jpg\r\n;       195708  02:39.06 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0635_01.jpg\r\n;       251487  02:39.07 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0636_01.jpg\r\n;       257190  02:39.09 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0637_01.jpg\r\n;       252768  02:39.11 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0638_01.jpg\r\n;       257483  02:39.13 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0639_01.jpg\r\n;       246946  02:39.15 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0640_01.jpg\r\n;       236538  02:39.17 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0641_01.jpg\r\n;       239023  02:39.18 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0642_01.jpg\r\n;       275560  02:39.20 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0643_01.jpg\r\n;       250910  02:39.22 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0644_01.jpg\r\n;       234450  02:39.23 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0645_01.jpg\r\n;       246921  02:38.53 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0646_01.jpg\r\n;       247684  02:38.55 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0647_01.jpg\r\n;       258917  02:38.57 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0648_01.jpg\r\n;       229720  02:38.59 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0649_01.jpg\r\n;       243356  02:39.00 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0650_01.jpg\r\n;       226333  02:39.02 2016-12-05 mdata/M220/rom/photo_print/card/CLT_CRD0651_01.jpg\r\n;       333652  02:42.56 2016-12-05 mdata/M220/rom/photo_print/stamp/pv/stamp_pv254_logo254_00.tga\r\n;       365612  02:43.00 2016-12-05 mdata/M220/rom/photo_print/stamp/pv/stamp_pv263_logo263_00.tga\r\n;       921644  02:44.25 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_399_00.tga\r\n;       921644  02:44.28 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_413_00.tga\r\n;       921644  02:44.30 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_414_00.tga\r\n;       921644  02:44.33 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_415_00.tga\r\n;       921644  02:44.35 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_416_00.tga\r\n;       921644  02:44.38 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_417_00.tga\r\n;       921644  02:44.40 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_418_00.tga\r\n;       921644  02:44.17 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_419_00.tga\r\n;       921644  02:44.21 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_424_00.tga\r\n;       921644  02:44.23 2016-12-05 mdata/M220/rom/photo_print/stamp/module/stamp_md_sub_425_00.tga\r\n;      6590881  09:25.50 2016-11-11 mdata/M220/rom/objset/kaiitm003.farc\r\n;     16775763  08:52.53 2016-11-11 mdata/M220/rom/objset/kaiitm032.farc\r\n;     14718893  16:23.34 2016-12-01 mdata/M220/rom/objset/kaiitm043.farc\r\n;     15003404  08:52.52 2016-11-11 mdata/M220/rom/objset/kaiitm044.farc\r\n;      1957406  03:37.18 2016-11-09 mdata/M220/rom/objset/kaiitm332.farc\r\n;       172423  13:33.50 2016-11-07 mdata/M220/rom/objset/kaiitm343.farc\r\n;      1891914  13:53.06 2016-11-07 mdata/M220/rom/objset/kaiitm344.farc\r\n;       975576  08:49.05 2016-12-01 mdata/M220/rom/objset/kaiitm543.farc\r\n;       980189  13:55.25 2016-11-07 mdata/M220/rom/objset/kaiitm544.farc\r\n;      4553588  03:37.18 2016-11-09 mdata/M220/rom/objset/kaiitm705.farc\r\n;      4260594  13:55.25 2016-11-07 mdata/M220/rom/objset/kaiitm708.farc\r\n;       485333  13:33.50 2016-11-07 mdata/M220/rom/objset/kaiitm709.farc\r\n;       459825  13:53.06 2016-11-07 mdata/M220/rom/objset/kaiitm730.farc\r\n;       448522  13:53.06 2016-11-07 mdata/M220/rom/objset/kaiitm731.farc\r\n;       324435  13:53.06 2016-11-07 mdata/M220/rom/objset/kaiitm832.farc\r\n;        92457  13:33.50 2016-11-07 mdata/M220/rom/objset/kaiitm843.farc\r\n;       324253  13:53.05 2016-11-07 mdata/M220/rom/objset/kaiitm844.farc\r\n;      7087145  09:10.48 2016-11-08 mdata/M220/rom/objset/lenitm038.farc\r\n;     12586321  09:48.21 2016-12-06 mdata/M220/rom/objset/lenitm041.farc\r\n;       137442  05:05.42 2016-12-06 mdata/M220/rom/objset/lenitm341.farc\r\n;      1944721  06:57.05 2016-12-07 mdata/M220/rom/objset/lenitm541.farc\r\n;       489274  05:05.41 2016-12-06 mdata/M220/rom/objset/lenitm705.farc\r\n;        39659  05:05.41 2016-12-06 mdata/M220/rom/objset/lenitm841.farc\r\n;      9474364  12:43.19 2016-11-15 mdata/M220/rom/objset/lukitm043.farc\r\n;       143436  07:38.58 2016-11-08 mdata/M220/rom/objset/lukitm343.farc\r\n;      1091807  12:43.19 2016-11-15 mdata/M220/rom/objset/lukitm543.farc\r\n;       471966  07:38.58 2016-11-08 mdata/M220/rom/objset/lukitm707.farc\r\n;        29100  07:38.58 2016-11-08 mdata/M220/rom/objset/lukitm843.farc\r\n;        63200  08:54.27 2016-12-08 mdata/M220/rom/objset/mdata_obj_db.bin\r\n;        35232  08:54.27 2016-12-08 mdata/M220/rom/objset/mdata_tex_db.bin\r\n;      9666260  08:47.34 2016-12-05 mdata/M220/rom/objset/meiitm034.farc\r\n;       138075  07:38.58 2016-11-08 mdata/M220/rom/objset/meiitm334.farc\r\n;       492348  07:45.23 2016-11-08 mdata/M220/rom/objset/meiitm534.farc\r\n;       469300  07:38.58 2016-11-08 mdata/M220/rom/objset/meiitm708.farc\r\n;      1463975  08:54.27 2016-12-08 mdata/M220/rom/objset/meiitm809.farc\r\n;      1801717  08:54.27 2016-12-08 mdata/M220/rom/objset/meiitm823.farc\r\n;         1467  07:38.58 2016-11-08 mdata/M220/rom/objset/meiitm834.farc\r\n;      9713960  14:26.18 2016-11-10 mdata/M220/rom/objset/mikitm143.farc\r\n;      9212987  13:15.59 2016-11-30 mdata/M220/rom/objset/mikitm171.farc\r\n;     12721318  07:14.42 2016-11-11 mdata/M220/rom/objset/mikitm172.farc\r\n;      7504045  14:26.17 2016-11-10 mdata/M220/rom/objset/mikitm174.farc\r\n;       581503  06:44.10 2016-11-07 mdata/M220/rom/objset/mikitm443.farc\r\n;       137797  13:33.49 2016-11-07 mdata/M220/rom/objset/mikitm471.farc\r\n;      1150298  06:48.20 2016-11-11 mdata/M220/rom/objset/mikitm472.farc\r\n;       541380  06:44.10 2016-11-07 mdata/M220/rom/objset/mikitm474.farc\r\n;      3010677  06:44.09 2016-11-07 mdata/M220/rom/objset/mikitm643.farc\r\n;      2446745  11:28.24 2016-11-30 mdata/M220/rom/objset/mikitm671.farc\r\n;      2435746  06:50.03 2016-11-11 mdata/M220/rom/objset/mikitm672.farc\r\n;      2595564  06:44.09 2016-11-07 mdata/M220/rom/objset/mikitm674.farc\r\n;      1045852  06:44.08 2016-11-07 mdata/M220/rom/objset/mikitm730.farc\r\n;       907524  06:44.08 2016-11-07 mdata/M220/rom/objset/mikitm731.farc\r\n;       500407  13:33.49 2016-11-07 mdata/M220/rom/objset/mikitm739.farc\r\n;       493172  06:44.08 2016-11-07 mdata/M220/rom/objset/mikitm943.farc\r\n;        91227  13:33.49 2016-11-07 mdata/M220/rom/objset/mikitm971.farc\r\n;        97602  06:48.20 2016-11-11 mdata/M220/rom/objset/mikitm972.farc\r\n;       501616  06:44.08 2016-11-07 mdata/M220/rom/objset/mikitm974.farc\r\n;      8881257  11:55.23 2016-11-30 mdata/M220/rom/objset/rinitm042.farc\r\n;      7504007  09:10.48 2016-11-08 mdata/M220/rom/objset/rinitm045.farc\r\n;     13886062  10:54.27 2016-11-29 mdata/M220/rom/objset/rinitm049.farc\r\n;       159768  11:35.13 2016-11-08 mdata/M220/rom/objset/rinitm342.farc\r\n;       154172  12:04.25 2016-11-08 mdata/M220/rom/objset/rinitm349.farc\r\n;      1299669  09:59.08 2016-11-15 mdata/M220/rom/objset/rinitm542.farc\r\n;      2129942  12:11.25 2016-11-08 mdata/M220/rom/objset/rinitm549.farc\r\n;      1007314  11:59.15 2016-11-14 mdata/M220/rom/objset/rinitm722.farc\r\n;       476353  12:04.25 2016-11-08 mdata/M220/rom/objset/rinitm723.farc\r\n;       482328  11:49.58 2016-11-08 mdata/M220/rom/objset/rinitm778.farc\r\n;        92761  11:35.12 2016-11-08 mdata/M220/rom/objset/rinitm842.farc\r\n;        37396  12:04.25 2016-11-08 mdata/M220/rom/objset/rinitm849.farc\r\n;     47070816  07:23.49 2016-12-05 mdata/M220/rom/objset/stgpv254.farc\r\n;     18053129  07:50.17 2016-11-28 mdata/M220/rom/objset/stgpv254s01.farc\r\n;      1522299  10:16.27 2016-12-01 mdata/M220/rom/objset/stgpv254s02.farc\r\n;       195424  06:55.07 2016-11-28 mdata/M220/rom/objset/stgpv254s03.farc\r\n;     10938262  07:50.17 2016-11-28 mdata/M220/rom/objset/stgpv254s04.farc\r\n;      3753932  07:08.16 2016-11-28 mdata/M220/rom/objset/stgpv254s05.farc\r\n;      4109714  07:29.46 2016-11-29 mdata/M220/rom/objset/stgpv254s08.farc\r\n;        31156  07:11.22 2016-11-28 mdata/M220/rom/objset/stgpv254s09.farc\r\n;        10878  07:13.30 2016-11-28 mdata/M220/rom/objset/stgpv254s12.farc\r\n;        90857  07:25.37 2016-11-28 mdata/M220/rom/objset/stgpv254s13.farc\r\n;        45687  07:23.49 2016-12-05 mdata/M220/rom/objset/stgpv254s17.farc\r\n;     14835919  06:33.18 2016-12-05 mdata/M220/rom/objset/stgpv263.farc\r\n;       392185  06:42.20 2016-11-14 mdata/M220/rom/objset/stgpv263hrc.farc\r\n;       196382  05:44.14 2016-11-14 mdata/M220/rom/objset/stgpv263s01.farc\r\n;      6948960  06:33.17 2016-12-05 mdata/M220/rom/objset/stgpv263s02.farc\r\n;       156409  05:55.16 2016-11-14 mdata/M220/rom/objset/stgpv263s03.farc\r\n;        22143  05:55.16 2016-11-14 mdata/M220/rom/objset/stgpv263s04.farc\r\n;      4762283  05:55.16 2016-11-14 mdata/M220/rom/objset/stgpv263s05.farc\r\n;       784427  06:01.20 2016-11-14 mdata/M220/rom/objset/stgpv263s06.farc\r\n;       796871  06:01.20 2016-11-14 mdata/M220/rom/objset/stgpv263s07.farc\r\n;        10024  06:01.20 2016-11-14 mdata/M220/rom/objset/stgpv263s08.farc\r\n;     23388133  06:37.31 2016-11-14 mdata/M220/rom/objset/stgpv263s09.farc\r\n;      9121837  06:37.30 2016-11-14 mdata/M220/rom/objset/stgpv263s10.farc\r\n;      1162843  06:37.30 2016-11-14 mdata/M220/rom/objset/stgpv263s11.farc\r\n;       791085  06:37.30 2016-11-14 mdata/M220/rom/objset/stgpv263s12.farc\r\n;        57684  05:17.22 2016-12-01 mdata/M220/rom/script/pv_041_easy.dsc\r\n;        67284  05:17.22 2016-12-01 mdata/M220/rom/script/pv_041_extreme.dsc\r\n;        84644  05:17.22 2016-12-01 mdata/M220/rom/script/pv_041_extreme_1.dsc\r\n;        64492  05:17.22 2016-12-01 mdata/M220/rom/script/pv_041_hard.dsc\r\n;        61324  05:17.22 2016-12-01 mdata/M220/rom/script/pv_041_normal.dsc\r\n;        36840  08:39.30 2016-12-06 mdata/M220/rom/script/pv_218_extreme.dsc\r\n;        57272  08:39.30 2016-12-06 mdata/M220/rom/script/pv_218_extreme_1.dsc\r\n;        34288  08:39.30 2016-12-06 mdata/M220/rom/script/pv_218_hard.dsc\r\n;        29400  08:39.30 2016-12-06 mdata/M220/rom/script/pv_218_normal.dsc\r\n;        49692  15:30.01 2016-11-30 mdata/M220/rom/script/pv_222_extreme.dsc\r\n;        85684  15:30.01 2016-11-30 mdata/M220/rom/script/pv_222_extreme_1.dsc\r\n;        45972  15:30.01 2016-11-30 mdata/M220/rom/script/pv_222_hard.dsc\r\n;        41036  15:30.01 2016-11-30 mdata/M220/rom/script/pv_222_normal.dsc\r\n;        62868  09:11.48 2016-12-05 mdata/M220/rom/script/pv_254_easy.dsc\r\n;        94852  09:11.48 2016-12-05 mdata/M220/rom/script/pv_254_extreme.dsc\r\n;        82732  09:11.48 2016-12-05 mdata/M220/rom/script/pv_254_hard.dsc\r\n;        68100  09:11.48 2016-12-05 mdata/M220/rom/script/pv_254_normal.dsc\r\n;        18460  08:14.27 2016-12-06 mdata/M220/rom/script/pv_263_easy.dsc\r\n;        42716  08:14.27 2016-12-06 mdata/M220/rom/script/pv_263_extreme.dsc\r\n;        30988  08:14.27 2016-12-06 mdata/M220/rom/script/pv_263_hard.dsc\r\n;        21236  08:14.27 2016-12-06 mdata/M220/rom/script/pv_263_normal.dsc\r\n;        30268  08:58.14 2016-12-05 mdata/M220/rom/script/pv_431_extreme.dsc\r\n;        48660  08:58.14 2016-12-05 mdata/M220/rom/script/pv_431_extreme_1.dsc\r\n;        22812  08:58.14 2016-12-05 mdata/M220/rom/script/pv_431_hard.dsc\r\n;        19100  08:58.14 2016-12-05 mdata/M220/rom/script/pv_431_normal.dsc\r\n;        48424  13:14.05 2016-11-15 mdata/M220/rom/script/pv_602_easy.dsc\r\n;        60096  13:14.05 2016-11-15 mdata/M220/rom/script/pv_602_extreme.dsc\r\n;        57800  13:14.05 2016-11-15 mdata/M220/rom/script/pv_602_hard.dsc\r\n;        52544  13:14.05 2016-11-15 mdata/M220/rom/script/pv_602_normal.dsc\r\n;        33164  08:51.03 2016-12-02 mdata/M220/rom/script/pv_630_easy.dsc\r\n;        43580  08:51.03 2016-12-02 mdata/M220/rom/script/pv_630_extreme.dsc\r\n;        40556  08:51.03 2016-12-02 mdata/M220/rom/script/pv_630_hard.dsc\r\n;        37540  08:51.03 2016-12-02 mdata/M220/rom/script/pv_630_normal.dsc\r\n;         2444  12:06.48 2016-11-29 mdata/M220/rom/pv_expression/exp_PV254.bin\r\n;         6540  14:04.55 2016-11-14 mdata/M220/rom/pv_expression/exp_PV263.bin\r\n;         1599  09:15.44 2016-12-01 mdata/M220/rom/rob/mdata_mot_db.farc\r\n;     13135030  12:11.48 2016-11-29 mdata/M220/rom/rob/mot_PV254.farc\r\n;      7486095  10:03.27 2016-11-15 mdata/M220/rom/rob/mot_PV263.farc\r\n;     10835915  09:15.44 2016-12-01 mdata/M220/rom/rob/mot_PV728.farc\r\n;        13376  09:37.47 2016-12-09 mdata/M220/rom/rob/mothead_PV254.bin\r\n;        11680  15:40.20 2016-12-09 mdata/M220/rom/rob/mothead_PV263.bin\r\n;       371028  05:29.08 2016-12-01 mdata/M220/rom/auth_3d/CAMPV254.farc\r\n;       141029  10:43.09 2016-11-10 mdata/M220/rom/auth_3d/CAMPV263.farc\r\n;       664077  08:10.00 2016-12-02 mdata/M220/rom/auth_3d/EFFSTGPV254.farc\r\n;      2261797  10:37.39 2016-12-02 mdata/M220/rom/auth_3d/EFFSTGPV263.farc\r\n;         4171  10:37.38 2016-12-02 mdata/M220/rom/auth_3d/mdata_auth_3d_db.bin\r\n;       225775  16:23.14 2016-12-01 mdata/M220/rom/skin_param/ext_skp_kaiitm043_joha_outer_43__divskn.txt\r\n;       181925  08:52.30 2016-11-11 mdata/M220/rom/skin_param/ext_skp_kaiitm044_joha_outer_44__divskn.txt\r\n;        21184  08:48.48 2016-12-01 mdata/M220/rom/skin_param/ext_skp_kaiitm543_atam_atama_43__divskn.txt\r\n;        29683  13:55.24 2016-11-07 mdata/M220/rom/skin_param/ext_skp_kaiitm544_atam_atama_44__divskn.txt\r\n;        12718  13:55.24 2016-11-07 mdata/M220/rom/skin_param/ext_skp_kaiitm708_atam_zujo_08__divskn.txt\r\n;        65883  09:47.56 2016-12-06 mdata/M220/rom/skin_param/ext_skp_lenitm041_joha_outer_41__divskn.txt\r\n;        14967  06:56.47 2016-12-07 mdata/M220/rom/skin_param/ext_skp_lenitm541_atam_atama_41__divskn.txt\r\n;       133072  12:43.01 2016-11-15 mdata/M220/rom/skin_param/ext_skp_lukitm043_joha_outer_43__divskn.txt\r\n;        99386  12:43.01 2016-11-15 mdata/M220/rom/skin_param/ext_skp_lukitm543_atam_atama_43__divskn.txt\r\n;        59984  08:47.15 2016-12-05 mdata/M220/rom/skin_param/ext_skp_meiitm034_joha_outer_34__divskn.txt\r\n;        25591  07:45.23 2016-11-08 mdata/M220/rom/skin_param/ext_skp_meiitm534_atam_atama_34__divskn.txt\r\n;       118388  13:15.40 2016-11-30 mdata/M220/rom/skin_param/ext_skp_mikitm171_joha_outer_171__divskn.txt\r\n;       347548  07:14.29 2016-11-11 mdata/M220/rom/skin_param/ext_skp_mikitm172_joha_outer_172__divskn.txt\r\n;       434749  14:25.33 2016-11-10 mdata/M220/rom/skin_param/ext_skp_mikitm174_joha_outer_174__divskn.txt\r\n;        64401  11:28.00 2016-11-30 mdata/M220/rom/skin_param/ext_skp_mikitm671_atam_atama_171__divskn.txt\r\n;        63063  06:50.03 2016-11-11 mdata/M220/rom/skin_param/ext_skp_mikitm672_atam_atama_172__divskn.txt\r\n;        57912  06:43.04 2016-11-07 mdata/M220/rom/skin_param/ext_skp_mikitm674_atam_atama_174__divskn.txt\r\n;       303532  11:55.02 2016-11-30 mdata/M220/rom/skin_param/ext_skp_rinitm042_joha_outer_42__divskn.txt\r\n;       142181  10:54.09 2016-11-29 mdata/M220/rom/skin_param/ext_skp_rinitm049_joha_outer_49__divskn.txt\r\n;        43569  09:59.08 2016-11-15 mdata/M220/rom/skin_param/ext_skp_rinitm542_atam_atama_42__divskn.txt\r\n;        13377  12:11.25 2016-11-08 mdata/M220/rom/skin_param/ext_skp_rinitm549_atam_atama_49__divskn.txt\r\n;         1493  11:59.15 2016-11-14 mdata/M220/rom/skin_param/ext_skp_rinitm722_atam_zujo_22__divskn.txt\r\n;        11678  11:49.57 2016-11-08 mdata/M220/rom/skin_param/ext_skp_rinitm778_joha_ushiro_78__divskn.txt\r\n;        18005  04:17.46 2016-11-10 mdata/M220/rom/skin_param/mdata_osage_setting.txt\r\n;    137592774  11:10.45 2016-12-09 mdata/M220/rom/skin_param/mdata_sp_skp.farc\r\n;       849273  11:10.45 2016-12-09 mdata/M220/rom/skin_param/mdata_sp_skp_db.txt\r\n;          282  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s01.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s02.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s03.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s05.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s06.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s07.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s09.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s13.txt\r\n;          280  05:20.01 2016-12-01 mdata/M220/rom/stage_param/star_pv254s17.txt\r\n;     19561460  12:08.05 2016-12-06 mdata/M220/rom/sound/song/pv_254.ogg\r\n;      9728258  06:34.15 2016-12-06 mdata/M220/rom/sound/song/pv_263.ogg\r\n;      9453567  06:35.45 2016-12-06 mdata/M220/rom/sound/song/pv_263_kai.ogg\r\n;      9776917  06:37.03 2016-12-06 mdata/M220/rom/sound/song/pv_263_len.ogg\r\n;      9453732  06:39.51 2016-12-06 mdata/M220/rom/sound/song/pv_263_luk.ogg\r\n;      9496233  06:41.51 2016-12-06 mdata/M220/rom/sound/song/pv_263_mei.ogg\r\n;      9768042  06:43.10 2016-12-06 mdata/M220/rom/sound/song/pv_263_rin.ogg\r\n;       549580  10:31.36 2016-12-01 mdata/M220/rom/2d/aet_gam_pv254.bin\r\n;       280784  03:41.29 2016-11-28 mdata/M220/rom/2d/aet_gam_pv255.bin\r\n;       228344  12:02.16 2016-12-05 mdata/M220/rom/2d/aet_gam_pv263.bin\r\n;       379348  02:18.31 2016-11-17 mdata/M220/rom/2d/aet_gam_pv724.bin\r\n;       172108  08:33.12 2016-11-17 mdata/M220/rom/2d/aet_gam_pv832.bin\r\n;         1500  11:40.25 2016-12-02 mdata/M220/rom/2d/aet_gam_skin739.bin\r\n;          568  12:02.21 2016-12-05 mdata/M220/rom/2d/mdata_aet_db.bin\r\n;        23756  12:23.10 2016-12-05 mdata/M220/rom/2d/mdata_spr_db.bin\r\n;        44314  03:13.57 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0634.farc\r\n;        28280  03:13.58 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0635.farc\r\n;        45537  03:13.58 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0636.farc\r\n;        45679  03:13.58 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0637.farc\r\n;        44993  03:13.58 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0638.farc\r\n;        45561  03:13.58 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0639.farc\r\n;        45670  03:13.58 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0640.farc\r\n;        45472  03:13.59 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0641.farc\r\n;        45773  03:13.59 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0642.farc\r\n;        46877  03:13.59 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0643.farc\r\n;        45386  03:13.59 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0644.farc\r\n;        43554  03:13.59 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0645.farc\r\n;        44628  03:13.59 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0646.farc\r\n;        44827  03:13.54 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0647.farc\r\n;        46027  03:13.54 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0648.farc\r\n;        43918  03:13.54 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0649.farc\r\n;        45204  03:13.54 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0650.farc\r\n;        43114  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_clt_crd0651.farc\r\n;      3853499  11:11.45 2016-12-01 mdata/M220/rom/2d/spr_gam_pv254.farc\r\n;      1871482  04:13.42 2016-11-28 mdata/M220/rom/2d/spr_gam_pv255.farc\r\n;      4581583  12:22.56 2016-12-05 mdata/M220/rom/2d/spr_gam_pv263.farc\r\n;       381440  02:29.41 2016-11-17 mdata/M220/rom/2d/spr_gam_pv724.farc\r\n;      1106829  08:39.14 2016-11-17 mdata/M220/rom/2d/spr_gam_pv832.farc\r\n;       166837  11:47.56 2016-12-02 mdata/M220/rom/2d/spr_gam_skin739.farc\r\n;        21254  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md399cmn.farc\r\n;        17710  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md413cmn.farc\r\n;        14533  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md414cmn.farc\r\n;        16938  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md415cmn.farc\r\n;        14756  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md416cmn.farc\r\n;        20349  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md417cmn.farc\r\n;        14218  03:13.55 2016-12-05 mdata/M220/rom/2d/spr_sel_md418cmn.farc\r\n;        25269  03:13.56 2016-12-05 mdata/M220/rom/2d/spr_sel_md419cmn.farc\r\n;        29859  03:13.56 2016-12-05 mdata/M220/rom/2d/spr_sel_md424cmn.farc\r\n;        19769  03:13.57 2016-12-05 mdata/M220/rom/2d/spr_sel_md425cmn.farc\r\n;       557786  11:18.58 2016-11-07 mdata/M220/rom/2d/spr_sel_pv254.farc\r\n;       276313  13:11.39 2016-11-17 mdata/M220/rom/2d/spr_sel_pv263.farc\r\n;        34511  08:53.59 2016-12-09 mdata/M220/rom/particle/eff_pv254_c34_korobi.farc\r\n;        28767  08:54.00 2016-12-09 mdata/M220/rom/particle/eff_pv254_c36_korobi.farc\r\n;       354088  08:54.00 2016-12-09 mdata/M220/rom/particle/eff_pv254_c37_kusarakka.farc\r\n;       808796  08:54.01 2016-12-09 mdata/M220/rom/particle/eff_pv254_c43_onibi.farc\r\n;       209045  08:54.01 2016-12-09 mdata/M220/rom/particle/eff_pv254_jinja_tourou.farc\r\n;        49560  08:54.02 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura.farc\r\n;       120362  08:54.02 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura_cut15.farc\r\n;       256378  08:54.03 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura_cut31.farc\r\n;       575898  08:54.03 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura_cut39.farc\r\n;       179082  08:54.04 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura_cut42.farc\r\n;       130010  08:54.04 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura_cut44.farc\r\n;        49575  08:54.05 2016-12-09 mdata/M220/rom/particle/eff_pv254_kirakira_aura_test.farc\r\n;       658286  08:54.05 2016-12-09 mdata/M220/rom/particle/eff_pv254_lightball_cut29.farc\r\n;      1460541  08:54.06 2016-12-09 mdata/M220/rom/particle/eff_pv254_moon.farc\r\n;        62737  08:54.06 2016-12-09 mdata/M220/rom/particle/eff_pv254_nagarebosi_cut11.farc\r\n;       738432  08:54.07 2016-12-09 mdata/M220/rom/particle/eff_pv254_rakka.farc\r\n;        74700  08:53.58 2016-12-09 mdata/M220/rom/particle/eff_pv254s01_hotaru.farc\r\n;       466172  08:53.59 2016-12-09 mdata/M220/rom/particle/eff_pv254S04_spirit.farc\r\n;          343  07:07.48 2016-11-30 mdata/M220/rom/light_param/fog_pv254s01.txt\r\n;          338  07:07.48 2016-11-30 mdata/M220/rom/light_param/fog_pv254s02.txt\r\n;          338  07:07.49 2016-11-30 mdata/M220/rom/light_param/fog_pv254s03.txt\r\n;          338  07:07.49 2016-11-30 mdata/M220/rom/light_param/fog_pv254s05.txt\r\n;          338  08:57.40 2016-12-01 mdata/M220/rom/light_param/fog_pv254s06.txt\r\n;          338  07:07.49 2016-11-30 mdata/M220/rom/light_param/fog_pv254s07.txt\r\n;          338  07:07.49 2016-11-30 mdata/M220/rom/light_param/fog_pv254s08.txt\r\n;          343  07:07.49 2016-11-30 mdata/M220/rom/light_param/fog_pv254s09.txt\r\n;          342  07:07.49 2016-11-30 mdata/M220/rom/light_param/fog_pv254s13.txt\r\n;          341  06:15.49 2016-11-10 mdata/M220/rom/light_param/fog_pv263s01.txt\r\n;          341  05:26.04 2016-11-10 mdata/M220/rom/light_param/fog_pv263s03.txt\r\n;          341  05:26.04 2016-11-10 mdata/M220/rom/light_param/fog_pv263s07.txt\r\n;          343  05:26.04 2016-11-10 mdata/M220/rom/light_param/fog_pv263s10.txt\r\n;          339  05:26.05 2016-11-10 mdata/M220/rom/light_param/fog_pv263s11.txt\r\n;          321  07:07.48 2016-11-30 mdata/M220/rom/light_param/glow_pv254s01.txt\r\n;          321  07:07.48 2016-11-30 mdata/M220/rom/light_param/glow_pv254s02.txt\r\n;          321  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s03.txt\r\n;          321  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s05.txt\r\n;          321  08:57.40 2016-12-01 mdata/M220/rom/light_param/glow_pv254s06.txt\r\n;          321  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s07.txt\r\n;          321  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s08.txt\r\n;          321  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s09.txt\r\n;          323  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s13.txt\r\n;          319  07:07.49 2016-11-30 mdata/M220/rom/light_param/glow_pv254s17.txt\r\n;          321  06:15.49 2016-11-10 mdata/M220/rom/light_param/glow_pv263s01.txt\r\n;          321  05:26.04 2016-11-10 mdata/M220/rom/light_param/glow_pv263s03.txt\r\n;          321  05:26.04 2016-11-10 mdata/M220/rom/light_param/glow_pv263s05.txt\r\n;          320  05:26.04 2016-11-10 mdata/M220/rom/light_param/glow_pv263s07.txt\r\n;          322  05:26.05 2016-11-10 mdata/M220/rom/light_param/glow_pv263s10.txt\r\n;          319  05:26.05 2016-11-10 mdata/M220/rom/light_param/glow_pv263s11.txt\r\n;        13907  08:34.46 2016-12-05 mdata/M220/rom/light_param/light_pv254.farc\r\n;         1708  07:07.48 2016-11-30 mdata/M220/rom/light_param/light_pv254s01.txt\r\n;         1709  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s02.txt\r\n;         1709  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s03.txt\r\n;         1706  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s05.txt\r\n;         1709  08:57.40 2016-12-01 mdata/M220/rom/light_param/light_pv254s06.txt\r\n;         1709  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s07.txt\r\n;         1705  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s08.txt\r\n;         1705  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s09.txt\r\n;         1693  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s12.txt\r\n;         1708  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s13.txt\r\n;         1698  07:07.49 2016-11-30 mdata/M220/rom/light_param/light_pv254s17.txt\r\n;        21467  05:26.17 2016-11-10 mdata/M220/rom/light_param/light_pv263.farc\r\n;         1693  06:15.49 2016-11-10 mdata/M220/rom/light_param/light_pv263s01.txt\r\n;         1695  05:26.04 2016-11-10 mdata/M220/rom/light_param/light_pv263s03.txt\r\n;         1696  05:26.04 2016-11-10 mdata/M220/rom/light_param/light_pv263s04.txt\r\n;         1697  05:26.04 2016-11-10 mdata/M220/rom/light_param/light_pv263s07.txt\r\n;         1693  05:26.05 2016-11-10 mdata/M220/rom/light_param/light_pv263s10.txt\r\n;          206  07:07.48 2016-11-30 mdata/M220/rom/light_param/wind_pv254s01.txt\r\n;          219  07:07.49 2016-11-30 mdata/M220/rom/light_param/wind_pv254s02.txt\r\n;          206  08:57.40 2016-12-01 mdata/M220/rom/light_param/wind_pv254s06.txt\r\n;          206  07:07.49 2016-11-30 mdata/M220/rom/light_param/wind_pv254s17.txt\r\n;          202  06:15.49 2016-11-10 mdata/M220/rom/light_param/wind_pv263s01.txt\r\n;          213  05:26.04 2016-11-10 mdata/M220/rom/light_param/wind_pv263s02.txt\r\n;          217  06:41.45 2016-11-10 mdata/M220/rom/light_param/wind_pv263s06.txt\r\n;          220  06:53.40 2016-11-10 mdata/M220/rom/light_param/wind_pv263s09.txt\r\n;          217  06:58.52 2016-11-10 mdata/M220/rom/light_param/wind_pv263s12.txt\r\n;           73  07:22.09 2016-12-27 mdata/M230/info.txt\r\n;       263201  10:04.28 2017-09-25 mdata/M230/rom/mdata_chritm_prop.farc\r\n;        54658  10:58.41 2017-10-02 mdata/M230/rom/mdata_gm_collection_card_tbl.farc\r\n;        22065  03:05.52 2017-09-27 mdata/M230/rom/mdata_gm_module_tbl.farc\r\n;       181582  08:26.40 2017-10-12 mdata/M230/rom/mdata_pv_db.txt\r\n;      1110153  09:49.18 2017-10-12 mdata/M230/rom/mdata_pv_field.txt\r\n;        55116  03:03.07 2017-09-27 mdata/M230/rom/mdata_rob_sleeve_data.txt\r\n;       267420  09:17.57 2017-09-25 mdata/M230/rom/mdata_stage_data.bin\r\n;         1909  11:17.40 2017-10-03 mdata/M230/rom/osage_play_data/mdata_opd_db.txt\r\n;      4637742  11:17.42 2017-10-03 mdata/M230/rom/osage_play_data/mikitm175_joha_outer_175__divskn.farc\r\n;      8430851  11:17.42 2017-10-03 mdata/M230/rom/osage_play_data/mikitm176_joha_outer_176__divskn.farc\r\n;     20269212  11:17.42 2017-10-03 mdata/M230/rom/osage_play_data/mikitm675_atam_atama_175__divskn.farc\r\n;     27079446  11:17.42 2017-10-03 mdata/M230/rom/osage_play_data/mikitm676_atam_atama_176__divskn.farc\r\n;      8025029  11:17.42 2017-10-03 mdata/M230/rom/osage_play_data/mikitm785_joha_ushiro_85__divskn.farc\r\n;       269312  02:54.45 2017-10-02 mdata/M230/rom/photo_print/card/CLT_CRD0652_01.jpg\r\n;       205792  02:54.35 2017-10-02 mdata/M230/rom/photo_print/card/CLT_CRD0653_01.jpg\r\n;       266721  02:54.57 2017-10-02 mdata/M230/rom/photo_print/card/CLT_CRD0654_01.jpg\r\n;       299566  02:55.20 2017-10-02 mdata/M230/rom/photo_print/card/CLT_CRD0655_01.jpg\r\n;       341184  02:58.20 2017-09-26 mdata/M230/rom/photo_print/stamp/pv/stamp_pv266_logo266_00.tga\r\n;       354188  02:58.21 2017-09-26 mdata/M230/rom/photo_print/stamp/pv/stamp_pv267_logo267_00.tga\r\n;       921644  02:54.25 2017-09-26 mdata/M230/rom/photo_print/stamp/module/stamp_md_sub_426_00.tga\r\n;       921644  02:54.26 2017-09-26 mdata/M230/rom/photo_print/stamp/module/stamp_md_sub_427_00.tga\r\n;     93232304  03:33.17 2017-08-29 mdata/M230/rom/movie/adv_sega_cm.wmv\r\n;    163446513  13:42.26 2017-07-07 mdata/M230/rom/movie/pv_267.wmv\r\n;        72928  08:19.25 2017-09-27 mdata/M230/rom/objset/mdata_obj_db.bin\r\n;        45792  08:19.25 2017-09-27 mdata/M230/rom/objset/mdata_tex_db.bin\r\n;      2648067  10:01.56 2017-09-25 mdata/M230/rom/objset/mikitm175.farc\r\n;      6143775  10:01.56 2017-09-25 mdata/M230/rom/objset/mikitm176.farc\r\n;       733533  09:48.43 2017-09-25 mdata/M230/rom/objset/mikitm475.farc\r\n;      1892721  10:01.56 2017-09-25 mdata/M230/rom/objset/mikitm675.farc\r\n;      2347341  10:01.56 2017-09-25 mdata/M230/rom/objset/mikitm676.farc\r\n;       893021  10:01.56 2017-09-25 mdata/M230/rom/objset/mikitm785.farc\r\n;        42599  09:48.43 2017-09-25 mdata/M230/rom/objset/mikitm975.farc\r\n;     44492164  08:19.25 2017-09-27 mdata/M230/rom/objset/stgpv266.farc\r\n;      2232182  10:55.11 2017-09-25 mdata/M230/rom/objset/stgpv266hrc.farc\r\n;      4411867  11:49.20 2017-09-25 mdata/M230/rom/objset/stgpv266s01.farc\r\n;     13198530  08:19.24 2017-09-27 mdata/M230/rom/objset/stgpv266s02.farc\r\n;        79489  07:44.12 2017-09-25 mdata/M230/rom/objset/stgpv266s03.farc\r\n;         1382  07:44.12 2017-09-25 mdata/M230/rom/objset/stgpv266s04.farc\r\n;         2668  07:46.59 2017-09-25 mdata/M230/rom/objset/stgpv266s05.farc\r\n;        50824  06:55.10 2017-10-10 mdata/M230/rom/script/pv_044_easy.dsc\r\n;        61256  06:55.10 2017-10-10 mdata/M230/rom/script/pv_044_extreme.dsc\r\n;        69928  09:49.18 2017-10-12 mdata/M230/rom/script/pv_044_extreme_1.dsc\r\n;        57176  06:55.10 2017-10-10 mdata/M230/rom/script/pv_044_hard.dsc\r\n;        53288  06:55.10 2017-10-10 mdata/M230/rom/script/pv_044_normal.dsc\r\n;        27612  06:59.35 2017-10-10 mdata/M230/rom/script/pv_091_easy.dsc\r\n;        58708  06:59.35 2017-10-10 mdata/M230/rom/script/pv_091_extreme.dsc\r\n;        73828  09:49.18 2017-10-12 mdata/M230/rom/script/pv_091_extreme_1.dsc\r\n;        48500  06:59.35 2017-10-10 mdata/M230/rom/script/pv_091_hard.dsc\r\n;        43484  06:59.35 2017-10-10 mdata/M230/rom/script/pv_091_normal.dsc\r\n;        24584  07:02.35 2017-10-10 mdata/M230/rom/script/pv_204_easy.dsc\r\n;        33528  07:02.35 2017-10-10 mdata/M230/rom/script/pv_204_extreme.dsc\r\n;        49280  07:02.35 2017-10-10 mdata/M230/rom/script/pv_204_extreme_1.dsc\r\n;        28680  07:02.35 2017-10-10 mdata/M230/rom/script/pv_204_hard.dsc\r\n;        27224  07:02.35 2017-10-10 mdata/M230/rom/script/pv_204_normal.dsc\r\n;        24504  07:06.01 2017-10-10 mdata/M230/rom/script/pv_215_extreme.dsc\r\n;        38872  07:06.01 2017-10-10 mdata/M230/rom/script/pv_215_extreme_1.dsc\r\n;        20600  07:06.01 2017-10-10 mdata/M230/rom/script/pv_215_hard.dsc\r\n;        17784  07:06.01 2017-10-10 mdata/M230/rom/script/pv_215_normal.dsc\r\n;        37748  04:00.16 2017-09-27 mdata/M230/rom/script/pv_262_easy.dsc\r\n;        70924  04:00.16 2017-09-27 mdata/M230/rom/script/pv_262_extreme.dsc\r\n;        51884  04:00.16 2017-09-27 mdata/M230/rom/script/pv_262_hard.dsc\r\n;        42164  04:00.16 2017-09-27 mdata/M230/rom/script/pv_262_normal.dsc\r\n;        52104  10:02.47 2017-10-13 mdata/M230/rom/script/pv_266_easy.dsc\r\n;        75936  10:02.47 2017-10-13 mdata/M230/rom/script/pv_266_extreme.dsc\r\n;        72144  10:02.47 2017-10-13 mdata/M230/rom/script/pv_266_hard.dsc\r\n;        59744  10:02.47 2017-10-13 mdata/M230/rom/script/pv_266_normal.dsc\r\n;        17496  04:41.18 2017-09-25 mdata/M230/rom/script/pv_267_easy.dsc\r\n;        45552  04:41.18 2017-09-25 mdata/M230/rom/script/pv_267_extreme.dsc\r\n;        40864  04:41.18 2017-09-25 mdata/M230/rom/script/pv_267_hard.dsc\r\n;        28392  04:41.18 2017-09-25 mdata/M230/rom/script/pv_267_normal.dsc\r\n;        62840  07:10.35 2017-10-10 mdata/M230/rom/script/pv_417_extreme.dsc\r\n;        74504  07:10.35 2017-10-10 mdata/M230/rom/script/pv_417_extreme_1.dsc\r\n;        57352  07:10.35 2017-10-10 mdata/M230/rom/script/pv_417_hard.dsc\r\n;        55120  07:10.35 2017-10-10 mdata/M230/rom/script/pv_417_normal.dsc\r\n;       106984  07:13.44 2017-10-10 mdata/M230/rom/script/pv_425_extreme.dsc\r\n;       125616  07:13.44 2017-10-10 mdata/M230/rom/script/pv_425_extreme_1.dsc\r\n;       103888  07:13.44 2017-10-10 mdata/M230/rom/script/pv_425_hard.dsc\r\n;        99696  07:13.44 2017-10-10 mdata/M230/rom/script/pv_425_normal.dsc\r\n;        42188  07:16.49 2017-10-10 mdata/M230/rom/script/pv_427_easy.dsc\r\n;        49060  07:16.49 2017-10-10 mdata/M230/rom/script/pv_427_extreme.dsc\r\n;        68004  07:16.49 2017-10-10 mdata/M230/rom/script/pv_427_extreme_1.dsc\r\n;        47284  07:16.49 2017-10-10 mdata/M230/rom/script/pv_427_hard.dsc\r\n;        45636  07:16.49 2017-10-10 mdata/M230/rom/script/pv_427_normal.dsc\r\n;        63196  08:06.18 2017-09-26 mdata/M230/rom/script/pv_727_easy.dsc\r\n;        75604  08:06.18 2017-09-26 mdata/M230/rom/script/pv_727_extreme.dsc\r\n;        73068  08:06.18 2017-09-26 mdata/M230/rom/script/pv_727_hard.dsc\r\n;        68372  08:06.18 2017-09-26 mdata/M230/rom/script/pv_727_normal.dsc\r\n;         8268  11:59.47 2017-09-25 mdata/M230/rom/pv_expression/exp_PV266.bin\r\n;         1626  08:05.15 2017-09-25 mdata/M230/rom/rob/mdata_mot_db.farc\r\n;      7147482  08:05.15 2017-09-25 mdata/M230/rom/rob/mot_PV266.farc\r\n;        16576  09:39.30 2017-10-03 mdata/M230/rom/rob/mothead_PV266.bin\r\n;       698676  10:02.47 2017-10-13 mdata/M230/rom/auth_3d/CAMPV266.farc\r\n;     37622128  10:02.47 2017-10-13 mdata/M230/rom/auth_3d/EFFSTGPV266.farc\r\n;        10748  14:34.15 2017-09-25 mdata/M230/rom/auth_3d/mdata_auth_3d_db.bin\r\n;        65513  10:01.56 2017-09-25 mdata/M230/rom/skin_param/ext_skp_mikitm175_joha_outer_175__divskn.txt\r\n;       180292  10:01.56 2017-09-25 mdata/M230/rom/skin_param/ext_skp_mikitm176_joha_outer_176__divskn.txt\r\n;        80163  10:01.56 2017-09-25 mdata/M230/rom/skin_param/ext_skp_mikitm675_atam_atama_175__divskn.txt\r\n;        97791  10:01.56 2017-09-25 mdata/M230/rom/skin_param/ext_skp_mikitm676_atam_atama_176__divskn.txt\r\n;        33725  10:01.55 2017-09-25 mdata/M230/rom/skin_param/ext_skp_mikitm785_joha_ushiro_85__divskn.txt\r\n;        18141  10:23.54 2017-09-26 mdata/M230/rom/skin_param/mdata_osage_setting.txt\r\n;    146641565  09:22.31 2017-09-26 mdata/M230/rom/skin_param/mdata_sp_skp.farc\r\n;       937211  09:22.35 2017-09-26 mdata/M230/rom/skin_param/mdata_sp_skp_db.txt\r\n;     21064803  03:41.27 2017-10-04 mdata/M230/rom/sound/song/pv_266.ogg\r\n;     25096749  12:07.14 2017-10-05 mdata/M230/rom/sound/song/pv_267.ogg\r\n;       177948  04:37.57 2017-09-25 mdata/M230/rom/2d/aet_gam_pv266.bin\r\n;          652  04:38.02 2017-09-25 mdata/M230/rom/2d/mdata_aet_db.bin\r\n;        34408  12:31.51 2017-10-02 mdata/M230/rom/2d/mdata_spr_db.bin\r\n;        47138  12:31.34 2017-10-02 mdata/M230/rom/2d/spr_clt_crd0652.farc\r\n;        38180  12:31.33 2017-10-02 mdata/M230/rom/2d/spr_clt_crd0653.farc\r\n;        46010  12:31.33 2017-10-02 mdata/M230/rom/2d/spr_clt_crd0654.farc\r\n;        47297  12:31.33 2017-10-02 mdata/M230/rom/2d/spr_clt_crd0655.farc\r\n;      4449478  05:12.28 2017-09-25 mdata/M230/rom/2d/spr_gam_pv266.farc\r\n;        19164  05:26.18 2017-09-25 mdata/M230/rom/2d/spr_sel_md426cmn.farc\r\n;        42235  05:26.18 2017-09-25 mdata/M230/rom/2d/spr_sel_md427cmn.farc\r\n;       589905  05:26.18 2017-09-25 mdata/M230/rom/2d/spr_sel_pv266.farc\r\n;       262935  05:26.18 2017-09-25 mdata/M230/rom/2d/spr_sel_pv267.farc\r\n;      1704678  12:56.06 2017-09-25 mdata/M230/rom/particle/eff_PV266_thunder.farc\r\n;       349748  12:56.01 2017-09-25 mdata/M230/rom/particle/eff_pv266s01_addfloor_rouya.farc\r\n;      1918518  12:56.02 2017-09-25 mdata/M230/rom/particle/eff_pv266s01_fire.farc\r\n;       173564  12:56.02 2017-09-25 mdata/M230/rom/particle/eff_pv266s01_kuzure.farc\r\n;      1570751  12:56.03 2017-09-25 mdata/M230/rom/particle/eff_pv266s01_otimono.farc\r\n;       597558  12:56.03 2017-09-25 mdata/M230/rom/particle/eff_pv266s01_susu.farc\r\n;      3775442  12:56.04 2017-09-25 mdata/M230/rom/particle/eff_pv266s02_kirakira.farc\r\n;      3599281  12:56.05 2017-09-25 mdata/M230/rom/particle/eff_pv266s02_kirakira_stop.farc\r\n;      2693929  12:56.05 2017-09-25 mdata/M230/rom/particle/eff_pv266s02_rakka.farc\r\n;          341  09:22.05 2017-09-25 mdata/M230/rom/light_param/fog_pv266s01.txt\r\n;          341  09:22.00 2017-09-25 mdata/M230/rom/light_param/fog_pv266s02.txt\r\n;          340  09:22.00 2017-09-25 mdata/M230/rom/light_param/fog_pv266s03.txt\r\n;          323  09:22.05 2017-09-25 mdata/M230/rom/light_param/glow_pv266s01.txt\r\n;          318  09:22.00 2017-09-25 mdata/M230/rom/light_param/glow_pv266s02.txt\r\n;          319  09:22.00 2017-09-25 mdata/M230/rom/light_param/glow_pv266s03.txt\r\n;        40445  09:22.33 2017-09-25 mdata/M230/rom/light_param/light_pv266.farc\r\n;         1698  09:22.05 2017-09-25 mdata/M230/rom/light_param/light_pv266s01.txt\r\n;         1806  09:22.00 2017-09-25 mdata/M230/rom/light_param/light_pv266s02.txt\r\n;         1699  09:22.00 2017-09-25 mdata/M230/rom/light_param/light_pv266s03.txt\r\n;          129  09:32.15 2018-11-07 mdata/M270/info.txt\r\n;       264343  05:17.40 2019-01-17 mdata/M270/rom/mdata_chritm_prop.farc\r\n;        54920  11:04.04 2019-02-20 mdata/M270/rom/mdata_gm_collection_card_tbl.farc\r\n;        22204  11:04.18 2019-02-20 mdata/M270/rom/mdata_gm_module_tbl.farc\r\n;       314876  09:49.48 2019-02-22 mdata/M270/rom/mdata_pv_db.txt\r\n;      1615003  13:05.50 2019-02-22 mdata/M270/rom/mdata_pv_field.txt\r\n;        55821  07:37.11 2018-12-19 mdata/M270/rom/mdata_rob_sleeve_data.txt\r\n;         2392  09:49.02 2019-02-20 mdata/M270/rom/osage_play_data/mdata_opd_db.txt\r\n;     23998503  09:49.05 2019-02-20 mdata/M270/rom/osage_play_data/mikitm177_joha_outer_177__divskn.farc\r\n;     13958428  09:49.05 2019-02-20 mdata/M270/rom/osage_play_data/mikitm178_joha_outer_178__divskn.farc\r\n;     23998355  09:49.05 2019-02-20 mdata/M270/rom/osage_play_data/mikitm179_joha_outer_179__divskn.farc\r\n;     14482744  09:49.05 2019-02-20 mdata/M270/rom/osage_play_data/mikitm677_atam_atama_177__divskn.farc\r\n;      8514135  09:49.05 2019-02-20 mdata/M270/rom/osage_play_data/mikitm678_atam_atama_178__divskn.farc\r\n;     14482724  09:49.05 2019-02-20 mdata/M270/rom/osage_play_data/mikitm679_atam_atama_179__divskn.farc\r\n;      7611325  09:49.06 2019-02-20 mdata/M270/rom/osage_play_data/mikitm786_joha_ushiro_86__divskn.farc\r\n;       236114  09:46.12 2019-02-19 mdata/M270/rom/photo_print/card/CLT_CRD0656_01.jpg\r\n;       236866  09:46.04 2019-02-19 mdata/M270/rom/photo_print/card/CLT_CRD0657_01.jpg\r\n;       238289  09:45.55 2019-02-19 mdata/M270/rom/photo_print/card/CLT_CRD0658_01.jpg\r\n;       921644  11:41.19 2019-02-14 mdata/M270/rom/photo_print/stamp/module/stamp_md_sub_428_00.tga\r\n;       921644  11:41.20 2019-02-14 mdata/M270/rom/photo_print/stamp/module/stamp_md_sub_429_00.tga\r\n;       921644  11:41.21 2019-02-14 mdata/M270/rom/photo_print/stamp/module/stamp_md_sub_430_00.tga\r\n;        74848  09:49.26 2019-02-14 mdata/M270/rom/objset/mdata_obj_db.bin\r\n;        50656  09:49.27 2019-02-14 mdata/M270/rom/objset/mdata_tex_db.bin\r\n;      7934180  09:49.26 2019-02-14 mdata/M270/rom/objset/mikitm177.farc\r\n;      7168839  09:49.26 2019-02-14 mdata/M270/rom/objset/mikitm178.farc\r\n;      8992497  09:49.26 2019-02-14 mdata/M270/rom/objset/mikitm179.farc\r\n;       258158  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm477.farc\r\n;       129490  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm478.farc\r\n;      3239727  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm677.farc\r\n;      3229377  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm678.farc\r\n;      3237869  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm679.farc\r\n;        29898  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm774.farc\r\n;      1201167  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm786.farc\r\n;        25424  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm789.farc\r\n;       276291  09:49.25 2019-02-14 mdata/M270/rom/objset/mikitm792.farc\r\n;       440406  09:49.24 2019-02-14 mdata/M270/rom/objset/mikitm976.farc\r\n;       459908  09:49.24 2019-02-14 mdata/M270/rom/objset/mikitm977.farc\r\n;        35156  11:35.55 2019-02-22 mdata/M270/rom/script/pv_016_easy.dsc\r\n;        44564  11:35.55 2019-02-22 mdata/M270/rom/script/pv_016_extreme.dsc\r\n;        62560  04:45.35 2019-02-27 mdata/M270/rom/script/pv_016_extreme_1.dsc\r\n;        39244  11:35.55 2019-02-22 mdata/M270/rom/script/pv_016_hard.dsc\r\n;        24052  04:31.49 2019-02-25 mdata/M270/rom/script/pv_020_easy.dsc\r\n;        32004  04:31.49 2019-02-25 mdata/M270/rom/script/pv_020_extreme.dsc\r\n;        70088  04:45.35 2019-02-27 mdata/M270/rom/script/pv_020_extreme_1.dsc\r\n;        28988  04:31.49 2019-02-25 mdata/M270/rom/script/pv_020_hard.dsc\r\n;        28860  04:31.49 2019-02-25 mdata/M270/rom/script/pv_020_normal.dsc\r\n;        33944  11:43.34 2019-02-22 mdata/M270/rom/script/pv_086_easy.dsc\r\n;        42416  11:43.34 2019-02-22 mdata/M270/rom/script/pv_086_extreme.dsc\r\n;        53312  04:45.35 2019-02-27 mdata/M270/rom/script/pv_086_extreme_1.dsc\r\n;        40824  11:43.34 2019-02-22 mdata/M270/rom/script/pv_086_hard.dsc\r\n;        37024  11:43.34 2019-02-22 mdata/M270/rom/script/pv_086_normal.dsc\r\n;        29568  08:47.27 2019-02-20 mdata/M270/rom/script/pv_219_easy.dsc\r\n;        46352  08:47.27 2019-02-20 mdata/M270/rom/script/pv_219_extreme.dsc\r\n;        50088  08:47.27 2019-02-20 mdata/M270/rom/script/pv_219_extreme_1.dsc\r\n;        39968  08:47.27 2019-02-20 mdata/M270/rom/script/pv_219_hard.dsc\r\n;        35960  08:47.27 2019-02-20 mdata/M270/rom/script/pv_219_normal.dsc\r\n;        39788  11:47.05 2019-02-22 mdata/M270/rom/script/pv_225_easy.dsc\r\n;        54404  11:47.05 2019-02-22 mdata/M270/rom/script/pv_225_extreme.dsc\r\n;        70916  04:45.35 2019-02-27 mdata/M270/rom/script/pv_225_extreme_1.dsc\r\n;        51964  11:47.05 2019-02-22 mdata/M270/rom/script/pv_225_hard.dsc\r\n;        48644  11:47.05 2019-02-22 mdata/M270/rom/script/pv_225_normal.dsc\r\n;        49168  11:50.58 2019-02-22 mdata/M270/rom/script/pv_410_easy.dsc\r\n;        56744  11:50.58 2019-02-22 mdata/M270/rom/script/pv_410_extreme.dsc\r\n;        69084  11:50.58 2019-02-22 mdata/M270/rom/script/pv_410_extreme_1.dsc\r\n;        54936  11:50.58 2019-02-22 mdata/M270/rom/script/pv_410_hard.dsc\r\n;        50984  11:50.58 2019-02-22 mdata/M270/rom/script/pv_410_normal.dsc\r\n;        88552  11:55.23 2019-02-22 mdata/M270/rom/script/pv_441_extreme.dsc\r\n;       121832  04:45.35 2019-02-27 mdata/M270/rom/script/pv_441_extreme_1.dsc\r\n;        86768  11:55.23 2019-02-22 mdata/M270/rom/script/pv_441_hard.dsc\r\n;        79160  11:55.23 2019-02-22 mdata/M270/rom/script/pv_441_normal.dsc\r\n;        63196  05:20.09 2019-01-23 mdata/M270/rom/script/pv_727_easy.dsc\r\n;        75604  05:20.09 2019-01-23 mdata/M270/rom/script/pv_727_extreme.dsc\r\n;        73068  05:20.09 2019-01-23 mdata/M270/rom/script/pv_727_hard.dsc\r\n;        68372  05:20.09 2019-01-23 mdata/M270/rom/script/pv_727_normal.dsc\r\n;        10976  10:23.58 2019-02-21 mdata/M270/rom/rob/mothead_PV002.bin\r\n;        10976  11:45.40 2019-01-23 mdata/M270/rom/rob/mothead_PV020.bin\r\n;        91680  11:18.46 2019-02-21 mdata/M270/rom/rob/mothead_PV044.bin\r\n;        11616  08:52.14 2019-01-31 mdata/M270/rom/rob/mothead_PV065.bin\r\n;        44800  04:57.01 2019-02-05 mdata/M270/rom/rob/mothead_PV081.bin\r\n;        17888  14:38.54 2019-02-21 mdata/M270/rom/rob/mothead_PV205.bin\r\n;        24096  11:45.29 2019-03-04 mdata/M270/rom/rob/mothead_PV240.bin\r\n;        28512  14:47.27 2019-02-21 mdata/M270/rom/rob/mothead_PV262.bin\r\n;        19808  14:27.46 2019-02-21 mdata/M270/rom/rob/mothead_PV604.bin\r\n;        19200  11:22.21 2019-03-04 mdata/M270/rom/rob/mothead_PV605.bin\r\n;        15584  07:48.53 2019-02-25 mdata/M270/rom/rob/mothead_PV618.bin\r\n;       120192  15:36.09 2019-02-21 mdata/M270/rom/rob/mothead_PV637.bin\r\n;        85824  09:41.39 2019-02-21 mdata/M270/rom/rob/mothead_PV739.bin\r\n;        10496  11:27.57 2019-01-20 mdata/M270/rom/rob/rob_mot_tbl.bin\r\n;       254354  09:48.26 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm177_joha_outer_177__divskn.txt\r\n;       198912  09:48.26 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm178_joha_outer_178__divskn.txt\r\n;       254354  09:48.25 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm179_joha_outer_179__divskn.txt\r\n;        66442  09:48.25 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm677_atam_atama_177__divskn.txt\r\n;        36600  09:48.25 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm678_atam_atama_178__divskn.txt\r\n;        66442  09:48.25 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm679_atam_atama_179__divskn.txt\r\n;        56760  09:48.24 2019-02-14 mdata/M270/rom/skin_param/ext_skp_mikitm786_joha_ushiro_86__divskn.txt\r\n;        18345  07:35.44 2018-12-19 mdata/M270/rom/skin_param/mdata_osage_setting.txt\r\n;    228823578  06:46.25 2019-03-05 mdata/M270/rom/skin_param/mdata_sp_skp.farc\r\n;      1494383  06:46.25 2019-03-05 mdata/M270/rom/skin_param/mdata_sp_skp_db.txt\r\n;        73488  13:25.56 2019-02-20 mdata/M270/rom/2d/mdata_spr_db.bin\r\n;        45750  13:25.03 2019-02-20 mdata/M270/rom/2d/spr_clt_crd0656.farc\r\n;        45847  13:25.03 2019-02-20 mdata/M270/rom/2d/spr_clt_crd0657.farc\r\n;        46205  13:25.03 2019-02-20 mdata/M270/rom/2d/spr_clt_crd0658.farc\r\n;        31127  12:19.47 2019-02-14 mdata/M270/rom/2d/spr_sel_md428cmn.farc\r\n;        32570  12:19.47 2019-02-14 mdata/M270/rom/2d/spr_sel_md429cmn.farc\r\n;        31127  12:19.47 2019-02-14 mdata/M270/rom/2d/spr_sel_md430cmn.farc\r\n;           87  11:29.57 2017-10-23 mdata/M240/info.txt\r\n;       196001  10:06.57 2017-11-02 mdata/M240/rom/mdata_pv_db.txt\r\n;      1120195  05:17.38 2017-11-02 mdata/M240/rom/mdata_pv_field.txt\r\n;       259892  12:09.11 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0000_01.jpg\r\n;       260162  12:09.11 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0003_01.jpg\r\n;       257852  12:09.12 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0004_01.jpg\r\n;       240627  12:09.12 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0005_01.jpg\r\n;       248987  12:09.13 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0006_01.jpg\r\n;       257898  12:09.13 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0007_01.jpg\r\n;       244116  12:09.14 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0008_01.jpg\r\n;       237280  12:09.15 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0009_01.jpg\r\n;       241633  12:09.15 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0010_01.jpg\r\n;       249890  12:09.16 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0011_01.jpg\r\n;       252611  12:09.16 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0012_01.jpg\r\n;       255925  12:09.17 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0013_01.jpg\r\n;       251227  12:09.17 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0014_01.jpg\r\n;       259220  12:09.18 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0015_01.jpg\r\n;       255599  12:09.18 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0016_01.jpg\r\n;       258076  12:09.19 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0017_01.jpg\r\n;       246428  12:09.20 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0018_01.jpg\r\n;       256944  12:09.20 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0019_01.jpg\r\n;       252205  12:09.21 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0020_01.jpg\r\n;       247319  12:09.21 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0021_01.jpg\r\n;       259679  12:09.22 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0022_01.jpg\r\n;       266117  12:09.22 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0023_01.jpg\r\n;       261180  12:09.23 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0024_01.jpg\r\n;       256770  12:09.24 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0025_01.jpg\r\n;       253424  12:09.24 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0026_01.jpg\r\n;       257119  12:09.25 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0027_01.jpg\r\n;       270670  12:09.25 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0028_01.jpg\r\n;       245446  12:09.26 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0029_01.jpg\r\n;       248755  12:09.26 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0030_01.jpg\r\n;       264979  12:09.27 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0031_01.jpg\r\n;       249951  12:09.27 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0032_01.jpg\r\n;       257406  12:09.28 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0033_01.jpg\r\n;       252663  12:09.29 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0034_01.jpg\r\n;       253262  12:09.29 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0035_01.jpg\r\n;       258439  12:09.30 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0036_01.jpg\r\n;       261515  12:09.30 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0037_01.jpg\r\n;       257332  12:09.31 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0038_01.jpg\r\n;       248559  12:09.31 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0039_01.jpg\r\n;       243712  12:09.32 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0046_01.jpg\r\n;       247717  12:09.32 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0047_01.jpg\r\n;       255872  12:09.33 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0053_01.jpg\r\n;       242589  12:09.33 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0054_01.jpg\r\n;       251695  12:09.34 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0055_01.jpg\r\n;       249808  12:09.34 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0056_01.jpg\r\n;       262308  12:09.35 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0057_01.jpg\r\n;       255595  12:09.36 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0059_01.jpg\r\n;       260806  12:09.36 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0065_01.jpg\r\n;       254379  12:09.37 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0068_01.jpg\r\n;       256502  12:09.37 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0069_01.jpg\r\n;       257615  12:09.38 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0070_01.jpg\r\n;       251085  12:09.38 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0072_01.jpg\r\n;       262136  12:09.39 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0073_01.jpg\r\n;       264924  12:09.39 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0078_01.jpg\r\n;       258342  12:09.40 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0079_01.jpg\r\n;       246821  12:09.41 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0088_01.jpg\r\n;       248120  12:09.41 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0089_01.jpg\r\n;       240925  12:09.42 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0090_01.jpg\r\n;       253823  12:09.42 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0091_01.jpg\r\n;       258510  12:09.43 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0102_01.jpg\r\n;       248814  12:09.43 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0103_01.jpg\r\n;       256311  12:09.44 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0107_01.jpg\r\n;       240966  12:09.44 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0108_01.jpg\r\n;       246525  12:09.45 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0115_01.jpg\r\n;       256813  12:09.45 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0118_01.jpg\r\n;       250922  12:09.46 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0121_01.jpg\r\n;       244105  12:09.47 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0124_01.jpg\r\n;       252695  12:09.47 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0129_01.jpg\r\n;       255757  12:09.48 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0132_01.jpg\r\n;       247053  12:09.48 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0133_01.jpg\r\n;       255095  12:09.49 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0136_01.jpg\r\n;       248360  12:09.49 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0139_01.jpg\r\n;       257130  12:09.50 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0146_01.jpg\r\n;       261014  12:09.50 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0147_01.jpg\r\n;       258605  12:09.51 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0148_01.jpg\r\n;       258748  12:09.52 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0152_01.jpg\r\n;       249857  12:09.52 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0153_01.jpg\r\n;       236147  12:09.53 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0156_01.jpg\r\n;       242395  12:09.53 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0157_01.jpg\r\n;       257793  12:09.54 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0158_01.jpg\r\n;       267733  12:09.54 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0160_01.jpg\r\n;       274725  12:09.55 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0161_01.jpg\r\n;       263043  12:09.55 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0165_01.jpg\r\n;       251205  12:09.56 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0166_01.jpg\r\n;       240749  12:09.56 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0169_01.jpg\r\n;       242430  12:09.57 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0170_01.jpg\r\n;       248576  12:09.58 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0175_01.jpg\r\n;       269849  12:09.58 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0177_01.jpg\r\n;       265476  12:09.59 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0183_01.jpg\r\n;       251703  12:09.59 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0188_01.jpg\r\n;       250450  12:10.00 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0192_01.jpg\r\n;       258743  12:10.00 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0198_01.jpg\r\n;       275290  12:10.01 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0202_01.jpg\r\n;       256866  12:10.02 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0209_01.jpg\r\n;       265230  12:10.02 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0212_01.jpg\r\n;       248073  12:10.03 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0213_01.jpg\r\n;       265727  12:10.03 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0214_01.jpg\r\n;       264183  12:10.04 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0215_01.jpg\r\n;       256214  12:10.04 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0221_01.jpg\r\n;       262491  12:10.05 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0228_01.jpg\r\n;       248554  12:10.05 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0229_01.jpg\r\n;       253930  12:10.06 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0231_01.jpg\r\n;       257525  12:10.07 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0235_01.jpg\r\n;       261841  12:10.07 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0236_01.jpg\r\n;       250581  12:10.08 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0237_01.jpg\r\n;       270351  12:10.08 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0238_01.jpg\r\n;       264725  12:10.09 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0239_01.jpg\r\n;       250792  12:10.09 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0246_01.jpg\r\n;       252945  12:10.10 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0247_01.jpg\r\n;       253389  12:10.10 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0420_01.jpg\r\n;       239319  12:10.11 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0421_01.jpg\r\n;       269927  12:10.12 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0432_01.jpg\r\n;       245812  12:10.12 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0440_01.jpg\r\n;       258572  12:10.13 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0441_01.jpg\r\n;       266802  12:10.13 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0442_01.jpg\r\n;       271333  12:10.14 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0443_01.jpg\r\n;       257604  12:10.14 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0444_01.jpg\r\n;       243513  12:10.15 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0445_01.jpg\r\n;       264380  12:10.15 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0447_01.jpg\r\n;       264810  12:10.16 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0469_01.jpg\r\n;       248341  12:10.16 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0471_01.jpg\r\n;       247179  12:10.17 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0491_01.jpg\r\n;       238763  12:10.17 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0492_01.jpg\r\n;       222739  12:10.18 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0493_01.jpg\r\n;       260277  12:10.18 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0505_01.jpg\r\n;       255155  12:10.19 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0506_01.jpg\r\n;       260993  12:10.19 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0510_01.jpg\r\n;       239676  12:10.20 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0511_01.jpg\r\n;       269265  12:10.20 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0512_01.jpg\r\n;       239780  12:10.21 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0517_01.jpg\r\n;       239526  12:10.21 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0518_01.jpg\r\n;       250983  12:10.22 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0524_01.jpg\r\n;       265406  12:10.22 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0525_01.jpg\r\n;       253634  12:10.23 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0526_01.jpg\r\n;       257260  12:10.23 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0528_01.jpg\r\n;       255445  12:10.24 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0537_01.jpg\r\n;       278419  12:10.24 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0538_01.jpg\r\n;       263755  12:10.25 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0539_01.jpg\r\n;       236324  12:10.25 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0543_01.jpg\r\n;       258771  12:10.26 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0544_01.jpg\r\n;       268404  12:10.26 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0545_01.jpg\r\n;       260208  12:10.27 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0547_01.jpg\r\n;       244862  12:10.27 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0557_01.jpg\r\n;       241814  12:10.28 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0558_01.jpg\r\n;       246265  12:10.29 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0559_01.jpg\r\n;       259765  12:10.29 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0560_01.jpg\r\n;       252241  12:10.29 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0566_01.jpg\r\n;       260829  12:10.30 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0575_01.jpg\r\n;       238366  12:10.30 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0578_01.jpg\r\n;       264394  12:10.31 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0581_01.jpg\r\n;       243213  12:10.32 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0582_01.jpg\r\n;       259478  12:10.32 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0589_01.jpg\r\n;       255405  12:10.33 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0590_01.jpg\r\n;       289479  12:10.33 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0595_01.jpg\r\n;       233834  12:10.34 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0598_01.jpg\r\n;       279899  12:10.34 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0602_01.jpg\r\n;       243064  12:10.35 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0604_01.jpg\r\n;       259365  12:10.35 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0607_01.jpg\r\n;       256626  12:10.36 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0608_01.jpg\r\n;       242792  12:10.36 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0609_01.jpg\r\n;       251554  12:10.37 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0611_01.jpg\r\n;       268779  12:10.37 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0620_01.jpg\r\n;       264944  12:10.38 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0621_01.jpg\r\n;       241924  12:10.38 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0622_01.jpg\r\n;       256553  12:10.39 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0631_01.jpg\r\n;       257450  12:10.39 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0637_01.jpg\r\n;       275433  12:10.40 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0643_01.jpg\r\n;       251037  12:10.40 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0644_01.jpg\r\n;       247356  12:10.40 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0646_01.jpg\r\n;       259050  12:10.41 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0654_01.jpg\r\n;       290144  12:10.42 2017-10-31 mdata/M240/rom/photo_print/card/CLT_CRD0655_01.jpg\r\n;       489484  14:43.42 2017-10-30 mdata/M240/rom/photo_print/stamp/stamp030_02.tga\r\n;     93470704  03:38.07 2017-08-29 mdata/M240/rom/movie/adv_sega_cm.wmv\r\n;        49984  10:17.25 2017-11-07 mdata/M240/rom/script/pv_042_easy.dsc\r\n;        68224  10:17.25 2017-11-07 mdata/M240/rom/script/pv_042_extreme.dsc\r\n;        83112  10:17.25 2017-11-07 mdata/M240/rom/script/pv_042_extreme_1.dsc\r\n;        59856  10:17.25 2017-11-07 mdata/M240/rom/script/pv_042_hard.dsc\r\n;        55752  10:17.25 2017-11-07 mdata/M240/rom/script/pv_042_normal.dsc\r\n;        33208  09:38.28 2017-11-02 mdata/M240/rom/script/pv_048_easy.dsc\r\n;        40920  09:38.28 2017-11-02 mdata/M240/rom/script/pv_048_extreme.dsc\r\n;        56756  09:38.28 2017-11-02 mdata/M240/rom/script/pv_048_extreme_1.dsc\r\n;        38744  09:38.28 2017-11-02 mdata/M240/rom/script/pv_048_hard.dsc\r\n;        36176  09:38.28 2017-11-02 mdata/M240/rom/script/pv_048_normal.dsc\r\n;        50900  14:01.37 2017-11-07 mdata/M240/rom/script/pv_227_extreme.dsc\r\n;        87588  14:01.37 2017-11-07 mdata/M240/rom/script/pv_227_extreme_1.dsc\r\n;        45636  14:01.37 2017-11-07 mdata/M240/rom/script/pv_227_hard.dsc\r\n;        41812  14:01.37 2017-11-07 mdata/M240/rom/script/pv_227_normal.dsc\r\n;        52104  12:10.04 2017-10-30 mdata/M240/rom/script/pv_266_easy.dsc\r\n;        75936  12:10.04 2017-10-30 mdata/M240/rom/script/pv_266_extreme.dsc\r\n;        72144  12:10.04 2017-10-30 mdata/M240/rom/script/pv_266_hard.dsc\r\n;        59744  12:10.04 2017-10-30 mdata/M240/rom/script/pv_266_normal.dsc\r\n;       328784  09:40.08 2017-10-31 mdata/M240/rom/2d/aet_sel_module.bin\r\n;        62260  09:40.08 2017-10-31 mdata/M240/rom/2d/aet_sel_qst.bin\r\n;          888  09:40.12 2017-10-31 mdata/M240/rom/2d/mdata_aet_db.bin\r\n;        72664  11:19.49 2017-11-01 mdata/M240/rom/2d/mdata_spr_db.bin\r\n;        45752  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0000.farc\r\n;        45962  05:07.14 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0003.farc\r\n;        45935  05:07.02 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0004.farc\r\n;        45370  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0005.farc\r\n;        45960  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0006.farc\r\n;        46197  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0007.farc\r\n;        45394  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0008.farc\r\n;        45097  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0009.farc\r\n;        45459  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0010.farc\r\n;        45744  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0011.farc\r\n;        45722  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0012.farc\r\n;        45864  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0013.farc\r\n;        45588  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0014.farc\r\n;        46014  05:07.11 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0015.farc\r\n;        45895  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0016.farc\r\n;        46030  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0017.farc\r\n;        46047  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0018.farc\r\n;        46159  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0019.farc\r\n;        45526  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0020.farc\r\n;        44802  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0021.farc\r\n;        46029  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0022.farc\r\n;        46179  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0023.farc\r\n;        46023  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0024.farc\r\n;        45792  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0025.farc\r\n;        45881  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0026.farc\r\n;        45561  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0027.farc\r\n;        45897  05:07.03 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0028.farc\r\n;        45355  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0029.farc\r\n;        45601  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0030.farc\r\n;        46241  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0031.farc\r\n;        45975  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0032.farc\r\n;        46025  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0033.farc\r\n;        45828  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0034.farc\r\n;        45817  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0035.farc\r\n;        45845  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0036.farc\r\n;        46197  05:07.04 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0037.farc\r\n;        45978  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0038.farc\r\n;        45563  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0039.farc\r\n;        45671  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0046.farc\r\n;        45628  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0047.farc\r\n;        46345  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0053.farc\r\n;        45434  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0054.farc\r\n;        45576  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0055.farc\r\n;        45585  05:07.05 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0056.farc\r\n;        46218  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0057.farc\r\n;        45963  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0059.farc\r\n;        46080  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0065.farc\r\n;        45669  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0068.farc\r\n;        46084  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0069.farc\r\n;        46172  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0070.farc\r\n;        45270  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0072.farc\r\n;        46600  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0073.farc\r\n;        45855  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0078.farc\r\n;        45929  05:07.06 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0079.farc\r\n;        45483  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0088.farc\r\n;        45962  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0089.farc\r\n;        45833  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0090.farc\r\n;        45783  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0091.farc\r\n;        45683  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0102.farc\r\n;        45588  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0103.farc\r\n;        45915  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0107.farc\r\n;        45594  05:07.07 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0108.farc\r\n;        45921  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0115.farc\r\n;        45888  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0118.farc\r\n;        45500  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0121.farc\r\n;        45563  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0124.farc\r\n;        45895  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0129.farc\r\n;        45970  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0132.farc\r\n;        45851  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0133.farc\r\n;        45954  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0136.farc\r\n;        45766  05:07.08 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0139.farc\r\n;        45985  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0146.farc\r\n;        46213  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0147.farc\r\n;        45907  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0148.farc\r\n;        45911  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0152.farc\r\n;        45620  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0153.farc\r\n;        45116  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0156.farc\r\n;        45876  04:43.25 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0157.farc\r\n;        46170  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0158.farc\r\n;        46508  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0160.farc\r\n;        46608  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0161.farc\r\n;        46304  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0165.farc\r\n;        46490  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0166.farc\r\n;        44771  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0169.farc\r\n;        45286  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0170.farc\r\n;        45970  04:43.25 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0175.farc\r\n;        46377  04:43.25 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0177.farc\r\n;        46223  04:43.25 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0183.farc\r\n;        45788  04:43.25 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0188.farc\r\n;        45939  05:07.12 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0192.farc\r\n;        46035  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0198.farc\r\n;        46377  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0202.farc\r\n;        45888  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0209.farc\r\n;        46122  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0212.farc\r\n;        45899  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0213.farc\r\n;        46412  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0214.farc\r\n;        46282  04:50.15 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0215.farc\r\n;        46425  04:50.15 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0221.farc\r\n;        46143  04:50.15 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0228.farc\r\n;        46465  04:50.15 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0229.farc\r\n;        45659  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0231.farc\r\n;        46608  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0235.farc\r\n;        46168  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0236.farc\r\n;        45669  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0237.farc\r\n;        47028  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0238.farc\r\n;        46663  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0239.farc\r\n;        45605  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0246.farc\r\n;        44995  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0247.farc\r\n;        45934  04:43.27 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0420.farc\r\n;        45460  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0421.farc\r\n;        46280  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0432.farc\r\n;        45432  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0440.farc\r\n;        46125  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0441.farc\r\n;        46412  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0442.farc\r\n;        46400  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0443.farc\r\n;        46171  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0444.farc\r\n;        44758  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0445.farc\r\n;        46609  04:43.28 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0447.farc\r\n;        46446  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0469.farc\r\n;        44170  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0471.farc\r\n;        45779  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0491.farc\r\n;        45804  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0492.farc\r\n;        42653  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0493.farc\r\n;        46291  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0505.farc\r\n;        46005  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0506.farc\r\n;        45846  04:43.29 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0510.farc\r\n;        44360  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0511.farc\r\n;        46579  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0512.farc\r\n;        45051  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0517.farc\r\n;        45096  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0518.farc\r\n;        45915  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0524.farc\r\n;        46252  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0525.farc\r\n;        45815  04:43.30 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0526.farc\r\n;        46238  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0528.farc\r\n;        45580  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0537.farc\r\n;        46481  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0538.farc\r\n;        46214  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0539.farc\r\n;        45687  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0543.farc\r\n;        46325  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0544.farc\r\n;        45970  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0545.farc\r\n;        46613  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0547.farc\r\n;        45605  04:43.31 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0557.farc\r\n;        45253  04:43.32 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0558.farc\r\n;        45806  04:43.32 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0559.farc\r\n;        46386  04:43.32 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0560.farc\r\n;        45684  04:43.23 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0566.farc\r\n;        46092  04:43.23 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0575.farc\r\n;        45284  04:43.23 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0578.farc\r\n;        46388  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0581.farc\r\n;        45822  04:43.24 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0582.farc\r\n;        45949  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0589.farc\r\n;        46036  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0590.farc\r\n;        46956  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0595.farc\r\n;        44684  05:07.09 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0598.farc\r\n;        46497  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0602.farc\r\n;        46232  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0604.farc\r\n;        45671  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0607.farc\r\n;        46056  05:07.13 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0608.farc\r\n;        45471  04:43.25 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0609.farc\r\n;        45769  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0611.farc\r\n;        46816  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0620.farc\r\n;        46355  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0621.farc\r\n;        45563  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0622.farc\r\n;        46178  05:07.10 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0631.farc\r\n;        46074  11:18.57 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0637.farc\r\n;        47196  11:18.57 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0643.farc\r\n;        45865  11:18.57 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0644.farc\r\n;        45234  11:18.58 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0646.farc\r\n;        46010  11:18.58 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0654.farc\r\n;        47294  11:18.58 2017-11-01 mdata/M240/rom/2d/spr_clt_crd0655.farc\r\n;        24398  14:07.35 2017-10-31 mdata/M240/rom/2d/spr_sel_mdrmikcmn.farc\r\n;      3370784  10:31.58 2017-10-31 mdata/M240/rom/2d/spr_sel_module.farc\r\n;       358000  14:07.35 2017-10-31 mdata/M240/rom/2d/spr_sel_qst.farc\r\n;          101  15:29.30 2018-04-02 mdata/M250/info.txt\r\n;       251522  19:54.02 2018-04-10 mdata/M250/rom/mdata_pv_db.txt\r\n;       251522  17:16.14 2018-04-04 mdata/M250/rom/mdata_pv_db.txt.bak\r\n;      1450594  15:29.32 2018-04-02 mdata/M250/rom/mdata_pv_field.txt\r\n;        43372  15:29.32 2018-04-02 mdata/M250/rom/script/pv_012_extreme.dsc\r\n;        72736  19:53.20 2018-04-10 mdata/M250/rom/script/pv_012_extreme_1.dsc\r\n;        38092  15:29.32 2018-04-02 mdata/M250/rom/script/pv_012_hard.dsc\r\n;        34388  15:29.32 2018-04-02 mdata/M250/rom/script/pv_012_normal.dsc\r\n;        70560  15:29.32 2018-04-02 mdata/M250/rom/script/pv_220_easy.dsc\r\n;        97376  15:29.32 2018-04-02 mdata/M250/rom/script/pv_220_extreme.dsc\r\n;       112624  19:53.20 2018-04-10 mdata/M250/rom/script/pv_220_extreme_1.dsc\r\n;        89016  15:29.32 2018-04-02 mdata/M250/rom/script/pv_220_hard.dsc\r\n;        78672  15:29.32 2018-04-02 mdata/M250/rom/script/pv_220_normal.dsc\r\n;        60092  15:29.32 2018-04-02 mdata/M250/rom/script/pv_435_extreme.dsc\r\n;        65708  19:53.20 2018-04-10 mdata/M250/rom/script/pv_435_extreme_1.dsc\r\n;        55100  15:29.32 2018-04-02 mdata/M250/rom/script/pv_435_hard.dsc\r\n;        48556  15:29.32 2018-04-02 mdata/M250/rom/script/pv_435_normal.dsc\r\n;        41140  15:29.32 2018-04-02 mdata/M250/rom/script/pv_600_easy.dsc\r\n;        58820  15:29.32 2018-04-02 mdata/M250/rom/script/pv_600_extreme.dsc\r\n;        67132  19:53.20 2018-04-10 mdata/M250/rom/script/pv_600_extreme_1.dsc\r\n;        57996  15:29.32 2018-04-02 mdata/M250/rom/script/pv_600_hard.dsc\r\n;        47532  15:29.32 2018-04-02 mdata/M250/rom/script/pv_600_normal.dsc\r\n;        29472  15:29.32 2018-04-02 mdata/M250/rom/script/pv_605_easy.dsc\r\n;        46432  15:29.32 2018-04-02 mdata/M250/rom/script/pv_605_extreme.dsc\r\n;        50768  19:53.20 2018-04-10 mdata/M250/rom/script/pv_605_extreme_1.dsc\r\n;        39560  15:29.32 2018-04-02 mdata/M250/rom/script/pv_605_hard.dsc\r\n;        33664  15:29.32 2018-04-02 mdata/M250/rom/script/pv_605_normal.dsc\r\n;        44400  15:29.32 2018-04-02 mdata/M250/rom/script/pv_615_easy.dsc\r\n;        57088  15:29.32 2018-04-02 mdata/M250/rom/script/pv_615_extreme.dsc\r\n;        76344  21:12.32 2018-04-05 mdata/M250/rom/script/pv_615_extreme_1.dsc\r\n;        52320  15:29.32 2018-04-02 mdata/M250/rom/script/pv_615_hard.dsc\r\n;        48848  15:29.32 2018-04-02 mdata/M250/rom/script/pv_615_normal.dsc\r\n;        85436  15:29.32 2018-04-02 mdata/M250/rom/script/pv_616_easy.dsc\r\n;       114964  15:29.32 2018-04-02 mdata/M250/rom/script/pv_616_extreme.dsc\r\n;       121044  19:53.20 2018-04-10 mdata/M250/rom/script/pv_616_extreme_1.dsc\r\n;       107420  15:29.32 2018-04-02 mdata/M250/rom/script/pv_616_hard.dsc\r\n;        95452  15:29.32 2018-04-02 mdata/M250/rom/script/pv_616_normal.dsc\r\n;        62732  15:29.32 2018-04-02 mdata/M250/rom/script/pv_617_extreme.dsc\r\n;        73044  21:12.32 2018-04-05 mdata/M250/rom/script/pv_617_extreme_1.dsc\r\n;        58876  15:29.32 2018-04-02 mdata/M250/rom/script/pv_617_hard.dsc\r\n;        49740  15:29.32 2018-04-02 mdata/M250/rom/script/pv_617_normal.dsc\r\n;        60636  15:29.32 2018-04-02 mdata/M250/rom/script/pv_625_extreme.dsc\r\n;        74340  19:53.20 2018-04-10 mdata/M250/rom/script/pv_625_extreme_1.dsc\r\n;        48852  15:29.32 2018-04-02 mdata/M250/rom/script/pv_625_hard.dsc\r\n;        43860  15:29.32 2018-04-02 mdata/M250/rom/script/pv_625_normal.dsc\r\n;        47196  15:29.32 2018-04-02 mdata/M250/rom/script/pv_639_extreme.dsc\r\n;        71972  19:53.20 2018-04-10 mdata/M250/rom/script/pv_639_extreme_1.dsc\r\n;        45332  15:29.32 2018-04-02 mdata/M250/rom/script/pv_639_hard.dsc\r\n;        41732  15:29.32 2018-04-02 mdata/M250/rom/script/pv_639_normal.dsc\r\n;          115  14:57.58 2018-09-07 mdata/M260/info.txt\r\n;       281667  14:57.58 2018-09-07 mdata/M260/rom/mdata_pv_db.txt\r\n;      1599596  14:57.58 2018-09-07 mdata/M260/rom/mdata_pv_field.txt\r\n;        44932  14:57.58 2018-09-07 mdata/M260/rom/script/pv_213_easy.dsc\r\n;        57324  14:57.58 2018-09-07 mdata/M260/rom/script/pv_213_extreme.dsc\r\n;        69108  16:22.20 2018-09-10 mdata/M260/rom/script/pv_213_extreme_1.dsc\r\n;        53324  14:57.58 2018-09-07 mdata/M260/rom/script/pv_213_hard.dsc\r\n;        47348  14:57.58 2018-09-07 mdata/M260/rom/script/pv_213_normal.dsc\r\n;        58104  14:57.58 2018-09-07 mdata/M260/rom/script/pv_412_extreme.dsc\r\n;        82036  16:22.20 2018-09-10 mdata/M260/rom/script/pv_412_extreme_1.dsc\r\n;        54888  14:57.58 2018-09-07 mdata/M260/rom/script/pv_412_hard.dsc\r\n;        51784  14:57.58 2018-09-07 mdata/M260/rom/script/pv_412_normal.dsc\r\n;        48424  14:57.58 2018-09-07 mdata/M260/rom/script/pv_602_easy.dsc\r\n;        60096  14:57.58 2018-09-07 mdata/M260/rom/script/pv_602_extreme.dsc\r\n;        82928  16:22.20 2018-09-10 mdata/M260/rom/script/pv_602_extreme_1.dsc\r\n;        57800  14:57.58 2018-09-07 mdata/M260/rom/script/pv_602_hard.dsc\r\n;        52544  14:57.58 2018-09-07 mdata/M260/rom/script/pv_602_normal.dsc\r\n;        42696  14:57.58 2018-09-07 mdata/M260/rom/script/pv_613_easy.dsc\r\n;        63224  14:57.58 2018-09-07 mdata/M260/rom/script/pv_613_extreme.dsc\r\n;        71984  16:22.20 2018-09-10 mdata/M260/rom/script/pv_613_extreme_1.dsc\r\n;        56440  14:57.58 2018-09-07 mdata/M260/rom/script/pv_613_hard.dsc\r\n;        48344  14:57.58 2018-09-07 mdata/M260/rom/script/pv_613_normal.dsc\r\n;        28920  14:57.58 2018-09-07 mdata/M260/rom/script/pv_638_easy.dsc\r\n;        40312  14:57.58 2018-09-07 mdata/M260/rom/script/pv_638_extreme.dsc\r\n;        60216  16:22.20 2018-09-10 mdata/M260/rom/script/pv_638_extreme_1.dsc\r\n;        38816  14:57.58 2018-09-07 mdata/M260/rom/script/pv_638_hard.dsc\r\n;        34952  14:57.58 2018-09-07 mdata/M260/rom/script/pv_638_normal.dsc\r\n;        39812  14:57.58 2018-09-07 mdata/M260/rom/script/pv_730_easy.dsc\r\n;        50116  14:57.58 2018-09-07 mdata/M260/rom/script/pv_730_extreme.dsc\r\n;        79020  16:22.20 2018-09-10 mdata/M260/rom/script/pv_730_extreme_1.dsc\r\n;        47948  14:57.58 2018-09-07 mdata/M260/rom/script/pv_730_hard.dsc\r\n;        42404  14:57.58 2018-09-07 mdata/M260/rom/script/pv_730_normal.dsc\r\n;          143  15:22.32 2021-10-14 mdata/M271/info.txt\r\n;        75136  15:22.32 2021-10-14 mdata/M271/rom/objset/mdata_obj_db.bin\r\n;        50912  15:22.32 2021-10-14 mdata/M271/rom/objset/mdata_tex_db.bin\r\n;      3814265  15:22.32 2021-10-14 mdata/M271/rom/objset/stgd2pv208.farc\r\n;        13552  15:22.32 2021-10-14 mdata/M271/rom/objset/stgd2pv208s01.farc\r\nmdata/M215/info.txt D2D971B8\r\nmdata/M215/rom/objset/mdata_obj_db.bin 46C9B86E\r\nmdata/M215/rom/objset/mdata_tex_db.bin D160D1D0\r\nmdata/M215/rom/objset/meiitm809.farc D8722468\r\nmdata/M215/rom/objset/meiitm823.farc 3C428B97\r\nmdata/M220/info.txt 8F94F729\r\nmdata/M220/rom/mdata_chritm_prop.farc 19A678CF\r\nmdata/M220/rom/mdata_gm_collection_card_tbl.farc 2C75349E\r\nmdata/M220/rom/mdata_gm_module_tbl.farc 632CCABB\r\nmdata/M220/rom/mdata_pv_db.txt 9E122C68\r\nmdata/M220/rom/mdata_pv_field.txt 05C5661F\r\nmdata/M220/rom/mdata_rob_sleeve_data.txt 3FC5CE63\r\nmdata/M220/rom/mdata_stage_data.bin 5E2554B6\r\nmdata/M220/rom/osage_play_data/kaiitm043_joha_outer_43__divskn.farc 608B729F\r\nmdata/M220/rom/osage_play_data/kaiitm044_joha_outer_44__divskn.farc 7E265562\r\nmdata/M220/rom/osage_play_data/kaiitm543_atam_atama_43__divskn.farc AE2F0AC7\r\nmdata/M220/rom/osage_play_data/kaiitm544_atam_atama_44__divskn.farc 7B1AFF68\r\nmdata/M220/rom/osage_play_data/kaiitm708_atam_zujo_08__divskn.farc E3FD0A2D\r\nmdata/M220/rom/osage_play_data/lenitm041_joha_outer_41__divskn.farc BC462BAA\r\nmdata/M220/rom/osage_play_data/lenitm541_atam_atama_41__divskn.farc 4DAEB987\r\nmdata/M220/rom/osage_play_data/lukitm043_joha_outer_43__divskn.farc 9B83ED9B\r\nmdata/M220/rom/osage_play_data/lukitm543_atam_atama_43__divskn.farc AE058EBB\r\nmdata/M220/rom/osage_play_data/mdata_opd_db.txt 2B478DE7\r\nmdata/M220/rom/osage_play_data/meiitm034_joha_outer_34__divskn.farc A63ED287\r\nmdata/M220/rom/osage_play_data/meiitm534_atam_atama_34__divskn.farc CB8AA613\r\nmdata/M220/rom/osage_play_data/mikitm171_joha_outer_171__divskn.farc 91FEF0AE\r\nmdata/M220/rom/osage_play_data/mikitm172_joha_outer_172__divskn.farc CD36C72C\r\nmdata/M220/rom/osage_play_data/mikitm174_joha_outer_174__divskn.farc 8EB48C97\r\nmdata/M220/rom/osage_play_data/mikitm671_atam_atama_171__divskn.farc 5376FD44\r\nmdata/M220/rom/osage_play_data/mikitm672_atam_atama_172__divskn.farc F82F4706\r\nmdata/M220/rom/osage_play_data/mikitm674_atam_atama_174__divskn.farc 2CD9D41F\r\nmdata/M220/rom/osage_play_data/rinitm042_joha_outer_42__divskn.farc B8AC3F86\r\nmdata/M220/rom/osage_play_data/rinitm049_joha_outer_49__divskn.farc C260900C\r\nmdata/M220/rom/osage_play_data/rinitm542_atam_atama_42__divskn.farc 8A7E70A1\r\nmdata/M220/rom/osage_play_data/rinitm549_atam_atama_49__divskn.farc FAF1E895\r\nmdata/M220/rom/osage_play_data/rinitm722_atam_zujo_22__divskn.farc FB64A29A\r\nmdata/M220/rom/osage_play_data/rinitm778_joha_ushiro_78__divskn.farc EB80659E\r\nmdata/M220/rom/photo_print/card/CLT_CRD0634_01.jpg 18A29C90\r\nmdata/M220/rom/photo_print/card/CLT_CRD0635_01.jpg 4F4541AE\r\nmdata/M220/rom/photo_print/card/CLT_CRD0636_01.jpg 2C324544\r\nmdata/M220/rom/photo_print/card/CLT_CRD0637_01.jpg A495760D\r\nmdata/M220/rom/photo_print/card/CLT_CRD0638_01.jpg 2034F271\r\nmdata/M220/rom/photo_print/card/CLT_CRD0639_01.jpg 038020B5\r\nmdata/M220/rom/photo_print/card/CLT_CRD0640_01.jpg 1399FE55\r\nmdata/M220/rom/photo_print/card/CLT_CRD0641_01.jpg 0419729D\r\nmdata/M220/rom/photo_print/card/CLT_CRD0642_01.jpg 332F0712\r\nmdata/M220/rom/photo_print/card/CLT_CRD0643_01.jpg DADDAA27\r\nmdata/M220/rom/photo_print/card/CLT_CRD0644_01.jpg 5ED64CAF\r\nmdata/M220/rom/photo_print/card/CLT_CRD0645_01.jpg 66711547\r\nmdata/M220/rom/photo_print/card/CLT_CRD0646_01.jpg AD1A71C7\r\nmdata/M220/rom/photo_print/card/CLT_CRD0647_01.jpg 3298895A\r\nmdata/M220/rom/photo_print/card/CLT_CRD0648_01.jpg 4D3C5CCA\r\nmdata/M220/rom/photo_print/card/CLT_CRD0649_01.jpg 9ACEC957\r\nmdata/M220/rom/photo_print/card/CLT_CRD0650_01.jpg A67A9C4A\r\nmdata/M220/rom/photo_print/card/CLT_CRD0651_01.jpg 869F05EE\r\nmdata/M220/rom/photo_print/stamp/pv/stamp_pv254_logo254_00.tga FB52CFF9\r\nmdata/M220/rom/photo_print/stamp/pv/stamp_pv263_logo263_00.tga 964A12F1\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_399_00.tga FEF855A4\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_413_00.tga 648DA0C3\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_414_00.tga 561E612D\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_415_00.tga E4E35B2E\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_416_00.tga CDB7589E\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_417_00.tga 7AECE108\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_418_00.tga 2570A9C8\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_419_00.tga 91338E0A\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_424_00.tga B513766D\r\nmdata/M220/rom/photo_print/stamp/module/stamp_md_sub_425_00.tga 6730C678\r\nmdata/M220/rom/objset/kaiitm003.farc 992FD293\r\nmdata/M220/rom/objset/kaiitm032.farc C769632E\r\nmdata/M220/rom/objset/kaiitm043.farc AFE6498B\r\nmdata/M220/rom/objset/kaiitm044.farc 19131E35\r\nmdata/M220/rom/objset/kaiitm332.farc 35078154\r\nmdata/M220/rom/objset/kaiitm343.farc C76B4BF9\r\nmdata/M220/rom/objset/kaiitm344.farc F6915374\r\nmdata/M220/rom/objset/kaiitm543.farc C8F5B5F4\r\nmdata/M220/rom/objset/kaiitm544.farc 59CE14A7\r\nmdata/M220/rom/objset/kaiitm705.farc 2AA068CD\r\nmdata/M220/rom/objset/kaiitm708.farc 5A478EF0\r\nmdata/M220/rom/objset/kaiitm709.farc 39A08422\r\nmdata/M220/rom/objset/kaiitm730.farc 653EAE15\r\nmdata/M220/rom/objset/kaiitm731.farc 12A6009A\r\nmdata/M220/rom/objset/kaiitm832.farc 95CFDEAB\r\nmdata/M220/rom/objset/kaiitm843.farc 9E1994CC\r\nmdata/M220/rom/objset/kaiitm844.farc 6FC91D9E\r\nmdata/M220/rom/objset/lenitm038.farc 0477ABB9\r\nmdata/M220/rom/objset/lenitm041.farc 734F50FA\r\nmdata/M220/rom/objset/lenitm341.farc 1F62BFB8\r\nmdata/M220/rom/objset/lenitm541.farc 5AFA2A05\r\nmdata/M220/rom/objset/lenitm705.farc 9DE0708A\r\nmdata/M220/rom/objset/lenitm841.farc C20FF5A6\r\nmdata/M220/rom/objset/lukitm043.farc 784498F4\r\nmdata/M220/rom/objset/lukitm343.farc F5E1D2F1\r\nmdata/M220/rom/objset/lukitm543.farc 59749405\r\nmdata/M220/rom/objset/lukitm707.farc F31D804C\r\nmdata/M220/rom/objset/lukitm843.farc 07D4C27B\r\nmdata/M220/rom/objset/mdata_obj_db.bin B4D6F27B\r\nmdata/M220/rom/objset/mdata_tex_db.bin 9B867055\r\nmdata/M220/rom/objset/meiitm034.farc 8B42492E\r\nmdata/M220/rom/objset/meiitm334.farc C6EC143A\r\nmdata/M220/rom/objset/meiitm534.farc 0746D41D\r\nmdata/M220/rom/objset/meiitm708.farc A37D88D5\r\nmdata/M220/rom/objset/meiitm809.farc DAEDB2A8\r\nmdata/M220/rom/objset/meiitm823.farc 20B65D04\r\nmdata/M220/rom/objset/meiitm834.farc F5179837\r\nmdata/M220/rom/objset/mikitm143.farc B155D5BE\r\nmdata/M220/rom/objset/mikitm171.farc 5C89B443\r\nmdata/M220/rom/objset/mikitm172.farc 651EDF8C\r\nmdata/M220/rom/objset/mikitm174.farc 7071AF6C\r\nmdata/M220/rom/objset/mikitm443.farc B05AFAFD\r\nmdata/M220/rom/objset/mikitm471.farc 4313BB91\r\nmdata/M220/rom/objset/mikitm472.farc F76E21AF\r\nmdata/M220/rom/objset/mikitm474.farc 0F323797\r\nmdata/M220/rom/objset/mikitm643.farc DF784802\r\nmdata/M220/rom/objset/mikitm671.farc C31A371C\r\nmdata/M220/rom/objset/mikitm672.farc 3CB0A519\r\nmdata/M220/rom/objset/mikitm674.farc 3FF43BB7\r\nmdata/M220/rom/objset/mikitm730.farc 5617AA87\r\nmdata/M220/rom/objset/mikitm731.farc 30ECB337\r\nmdata/M220/rom/objset/mikitm739.farc CB97AFCD\r\nmdata/M220/rom/objset/mikitm943.farc 87ECAC73\r\nmdata/M220/rom/objset/mikitm971.farc 91A87F13\r\nmdata/M220/rom/objset/mikitm972.farc ACDB0BBC\r\nmdata/M220/rom/objset/mikitm974.farc 8912F7AE\r\nmdata/M220/rom/objset/rinitm042.farc 57DA4584\r\nmdata/M220/rom/objset/rinitm045.farc 69BCD69C\r\nmdata/M220/rom/objset/rinitm049.farc D55232D0\r\nmdata/M220/rom/objset/rinitm342.farc 0EF6BF4C\r\nmdata/M220/rom/objset/rinitm349.farc E5BC7D82\r\nmdata/M220/rom/objset/rinitm542.farc FFCF56B0\r\nmdata/M220/rom/objset/rinitm549.farc 316D0BA3\r\nmdata/M220/rom/objset/rinitm722.farc C5387543\r\nmdata/M220/rom/objset/rinitm723.farc FB4D5B0D\r\nmdata/M220/rom/objset/rinitm778.farc 222DF88B\r\nmdata/M220/rom/objset/rinitm842.farc 3421405B\r\nmdata/M220/rom/objset/rinitm849.farc D09F13B1\r\nmdata/M220/rom/objset/stgpv254.farc 89D42D51\r\nmdata/M220/rom/objset/stgpv254s01.farc 74E3401A\r\nmdata/M220/rom/objset/stgpv254s02.farc B3CFA1CA\r\nmdata/M220/rom/objset/stgpv254s03.farc E837ABD4\r\nmdata/M220/rom/objset/stgpv254s04.farc C65B4366\r\nmdata/M220/rom/objset/stgpv254s05.farc 181C0082\r\nmdata/M220/rom/objset/stgpv254s08.farc E5AC2CBF\r\nmdata/M220/rom/objset/stgpv254s09.farc 310019B5\r\nmdata/M220/rom/objset/stgpv254s12.farc 983D01FF\r\nmdata/M220/rom/objset/stgpv254s13.farc B853A846\r\nmdata/M220/rom/objset/stgpv254s17.farc B5C55F89\r\nmdata/M220/rom/objset/stgpv263.farc C4CAE4E6\r\nmdata/M220/rom/objset/stgpv263hrc.farc 689EA935\r\nmdata/M220/rom/objset/stgpv263s01.farc 8D8DC17B\r\nmdata/M220/rom/objset/stgpv263s02.farc 19FB91F1\r\nmdata/M220/rom/objset/stgpv263s03.farc D3C4234E\r\nmdata/M220/rom/objset/stgpv263s04.farc 3ECCDE63\r\nmdata/M220/rom/objset/stgpv263s05.farc 4DD684B8\r\nmdata/M220/rom/objset/stgpv263s06.farc 14142C5E\r\nmdata/M220/rom/objset/stgpv263s07.farc 8C967CC7\r\nmdata/M220/rom/objset/stgpv263s08.farc E0511C96\r\nmdata/M220/rom/objset/stgpv263s09.farc D78E02CC\r\nmdata/M220/rom/objset/stgpv263s10.farc 0B9004E5\r\nmdata/M220/rom/objset/stgpv263s11.farc BF51AFD6\r\nmdata/M220/rom/objset/stgpv263s12.farc 391F6DBC\r\nmdata/M220/rom/script/pv_041_easy.dsc A1F88E8F\r\nmdata/M220/rom/script/pv_041_extreme.dsc 915265B2\r\nmdata/M220/rom/script/pv_041_extreme_1.dsc C9F7A38C\r\nmdata/M220/rom/script/pv_041_hard.dsc CC7E57CD\r\nmdata/M220/rom/script/pv_041_normal.dsc 4D128B77\r\nmdata/M220/rom/script/pv_218_extreme.dsc FAE7FCE2\r\nmdata/M220/rom/script/pv_218_extreme_1.dsc 1CB9C344\r\nmdata/M220/rom/script/pv_218_hard.dsc A0C8490D\r\nmdata/M220/rom/script/pv_218_normal.dsc 4CFD150A\r\nmdata/M220/rom/script/pv_222_extreme.dsc AEFD27B7\r\nmdata/M220/rom/script/pv_222_extreme_1.dsc 63FE28A2\r\nmdata/M220/rom/script/pv_222_hard.dsc ABD26AD2\r\nmdata/M220/rom/script/pv_222_normal.dsc AC727BDA\r\nmdata/M220/rom/script/pv_254_easy.dsc 522E952A\r\nmdata/M220/rom/script/pv_254_extreme.dsc FAA6F7BA\r\nmdata/M220/rom/script/pv_254_hard.dsc F43A72B3\r\nmdata/M220/rom/script/pv_254_normal.dsc 6202DB31\r\nmdata/M220/rom/script/pv_263_easy.dsc F0BC9784\r\nmdata/M220/rom/script/pv_263_extreme.dsc 42BCCD8C\r\nmdata/M220/rom/script/pv_263_hard.dsc B54D508A\r\nmdata/M220/rom/script/pv_263_normal.dsc 9B78AEAB\r\nmdata/M220/rom/script/pv_431_extreme.dsc C3A1D64D\r\nmdata/M220/rom/script/pv_431_extreme_1.dsc 45D0C375\r\nmdata/M220/rom/script/pv_431_hard.dsc 29A7E005\r\nmdata/M220/rom/script/pv_431_normal.dsc 10A9FD23\r\nmdata/M220/rom/script/pv_602_easy.dsc E9C3E018\r\nmdata/M220/rom/script/pv_602_extreme.dsc 753D7E14\r\nmdata/M220/rom/script/pv_602_hard.dsc AE1CCD96\r\nmdata/M220/rom/script/pv_602_normal.dsc DD7F4831\r\nmdata/M220/rom/script/pv_630_easy.dsc D63ABCC9\r\nmdata/M220/rom/script/pv_630_extreme.dsc 90BF7F1A\r\nmdata/M220/rom/script/pv_630_hard.dsc 64E70773\r\nmdata/M220/rom/script/pv_630_normal.dsc 3FC53755\r\nmdata/M220/rom/pv_expression/exp_PV254.bin 71E13554\r\nmdata/M220/rom/pv_expression/exp_PV263.bin 10DF65C7\r\nmdata/M220/rom/rob/mdata_mot_db.farc D93D85E1\r\nmdata/M220/rom/rob/mot_PV254.farc 9507D56A\r\nmdata/M220/rom/rob/mot_PV263.farc BF250E85\r\nmdata/M220/rom/rob/mot_PV728.farc 16449FB2\r\nmdata/M220/rom/rob/mothead_PV254.bin 9D8A024F\r\nmdata/M220/rom/rob/mothead_PV263.bin D7694B59\r\nmdata/M220/rom/auth_3d/CAMPV254.farc 625CB441\r\nmdata/M220/rom/auth_3d/CAMPV263.farc 305A260A\r\nmdata/M220/rom/auth_3d/EFFSTGPV254.farc 302FB880\r\nmdata/M220/rom/auth_3d/EFFSTGPV263.farc 7DD3C87D\r\nmdata/M220/rom/auth_3d/mdata_auth_3d_db.bin 79FB6630\r\nmdata/M220/rom/skin_param/ext_skp_kaiitm043_joha_outer_43__divskn.txt 9633EB75\r\nmdata/M220/rom/skin_param/ext_skp_kaiitm044_joha_outer_44__divskn.txt 6F873B6A\r\nmdata/M220/rom/skin_param/ext_skp_kaiitm543_atam_atama_43__divskn.txt F90064C4\r\nmdata/M220/rom/skin_param/ext_skp_kaiitm544_atam_atama_44__divskn.txt 4A4C23E4\r\nmdata/M220/rom/skin_param/ext_skp_kaiitm708_atam_zujo_08__divskn.txt 52322115\r\nmdata/M220/rom/skin_param/ext_skp_lenitm041_joha_outer_41__divskn.txt F1E5A686\r\nmdata/M220/rom/skin_param/ext_skp_lenitm541_atam_atama_41__divskn.txt 92F68624\r\nmdata/M220/rom/skin_param/ext_skp_lukitm043_joha_outer_43__divskn.txt C77F8E35\r\nmdata/M220/rom/skin_param/ext_skp_lukitm543_atam_atama_43__divskn.txt B282F070\r\nmdata/M220/rom/skin_param/ext_skp_meiitm034_joha_outer_34__divskn.txt 354D0ED8\r\nmdata/M220/rom/skin_param/ext_skp_meiitm534_atam_atama_34__divskn.txt 8CC0FA0B\r\nmdata/M220/rom/skin_param/ext_skp_mikitm171_joha_outer_171__divskn.txt 489DEC9C\r\nmdata/M220/rom/skin_param/ext_skp_mikitm172_joha_outer_172__divskn.txt CBA3E86C\r\nmdata/M220/rom/skin_param/ext_skp_mikitm174_joha_outer_174__divskn.txt 281A50C6\r\nmdata/M220/rom/skin_param/ext_skp_mikitm671_atam_atama_171__divskn.txt 92175D84\r\nmdata/M220/rom/skin_param/ext_skp_mikitm672_atam_atama_172__divskn.txt 3D08F5C5\r\nmdata/M220/rom/skin_param/ext_skp_mikitm674_atam_atama_174__divskn.txt 1181EB67\r\nmdata/M220/rom/skin_param/ext_skp_rinitm042_joha_outer_42__divskn.txt 3203A637\r\nmdata/M220/rom/skin_param/ext_skp_rinitm049_joha_outer_49__divskn.txt 43EEAA8B\r\nmdata/M220/rom/skin_param/ext_skp_rinitm542_atam_atama_42__divskn.txt 93F65521\r\nmdata/M220/rom/skin_param/ext_skp_rinitm549_atam_atama_49__divskn.txt 8A849C3A\r\nmdata/M220/rom/skin_param/ext_skp_rinitm722_atam_zujo_22__divskn.txt BB680410\r\nmdata/M220/rom/skin_param/ext_skp_rinitm778_joha_ushiro_78__divskn.txt 3646DA93\r\nmdata/M220/rom/skin_param/mdata_osage_setting.txt 8B1E9C77\r\nmdata/M220/rom/skin_param/mdata_sp_skp.farc FBA755F8\r\nmdata/M220/rom/skin_param/mdata_sp_skp_db.txt C4618957\r\nmdata/M220/rom/stage_param/star_pv254s01.txt C36D7ADE\r\nmdata/M220/rom/stage_param/star_pv254s02.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s03.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s05.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s06.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s07.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s09.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s13.txt 2345F878\r\nmdata/M220/rom/stage_param/star_pv254s17.txt 84F0A87C\r\nmdata/M220/rom/sound/song/pv_254.ogg ED0FF001\r\nmdata/M220/rom/sound/song/pv_263.ogg CE3207D5\r\nmdata/M220/rom/sound/song/pv_263_kai.ogg C998CD56\r\nmdata/M220/rom/sound/song/pv_263_len.ogg 15A13F47\r\nmdata/M220/rom/sound/song/pv_263_luk.ogg 07ED8CF9\r\nmdata/M220/rom/sound/song/pv_263_mei.ogg 75482355\r\nmdata/M220/rom/sound/song/pv_263_rin.ogg 75B8AD37\r\nmdata/M220/rom/2d/aet_gam_pv254.bin B1ECE908\r\nmdata/M220/rom/2d/aet_gam_pv255.bin 317B458A\r\nmdata/M220/rom/2d/aet_gam_pv263.bin BAE96059\r\nmdata/M220/rom/2d/aet_gam_pv724.bin AEEBB308\r\nmdata/M220/rom/2d/aet_gam_pv832.bin 4352A46F\r\nmdata/M220/rom/2d/aet_gam_skin739.bin 6DB67ECF\r\nmdata/M220/rom/2d/mdata_aet_db.bin 0ABA1074\r\nmdata/M220/rom/2d/mdata_spr_db.bin 34AB39A0\r\nmdata/M220/rom/2d/spr_clt_crd0634.farc EF27272A\r\nmdata/M220/rom/2d/spr_clt_crd0635.farc BC0DA4AB\r\nmdata/M220/rom/2d/spr_clt_crd0636.farc 96DBE784\r\nmdata/M220/rom/2d/spr_clt_crd0637.farc 1DD8D9F9\r\nmdata/M220/rom/2d/spr_clt_crd0638.farc 71B88B75\r\nmdata/M220/rom/2d/spr_clt_crd0639.farc 53EA3B68\r\nmdata/M220/rom/2d/spr_clt_crd0640.farc BA4D176E\r\nmdata/M220/rom/2d/spr_clt_crd0641.farc F32D26A6\r\nmdata/M220/rom/2d/spr_clt_crd0642.farc E28FB3A3\r\nmdata/M220/rom/2d/spr_clt_crd0643.farc 6CD3F607\r\nmdata/M220/rom/2d/spr_clt_crd0644.farc E1E4CB8D\r\nmdata/M220/rom/2d/spr_clt_crd0645.farc A12A4CFB\r\nmdata/M220/rom/2d/spr_clt_crd0646.farc B5A22CF6\r\nmdata/M220/rom/2d/spr_clt_crd0647.farc 85D7F6DE\r\nmdata/M220/rom/2d/spr_clt_crd0648.farc 3FCFDEF5\r\nmdata/M220/rom/2d/spr_clt_crd0649.farc 4E9EA1C7\r\nmdata/M220/rom/2d/spr_clt_crd0650.farc C383249B\r\nmdata/M220/rom/2d/spr_clt_crd0651.farc D30CF20E\r\nmdata/M220/rom/2d/spr_gam_pv254.farc 6DFA3C8A\r\nmdata/M220/rom/2d/spr_gam_pv255.farc 139E64C0\r\nmdata/M220/rom/2d/spr_gam_pv263.farc 4773401D\r\nmdata/M220/rom/2d/spr_gam_pv724.farc 64F7DDB2\r\nmdata/M220/rom/2d/spr_gam_pv832.farc 13E45DD4\r\nmdata/M220/rom/2d/spr_gam_skin739.farc FD2DF145\r\nmdata/M220/rom/2d/spr_sel_md399cmn.farc 0DBCA5DD\r\nmdata/M220/rom/2d/spr_sel_md413cmn.farc BFF045A1\r\nmdata/M220/rom/2d/spr_sel_md414cmn.farc 6175FE09\r\nmdata/M220/rom/2d/spr_sel_md415cmn.farc BB5FC217\r\nmdata/M220/rom/2d/spr_sel_md416cmn.farc A4A740CC\r\nmdata/M220/rom/2d/spr_sel_md417cmn.farc 7152DA68\r\nmdata/M220/rom/2d/spr_sel_md418cmn.farc 9A6CBFBE\r\nmdata/M220/rom/2d/spr_sel_md419cmn.farc 7AD00D9A\r\nmdata/M220/rom/2d/spr_sel_md424cmn.farc 4BADFEF7\r\nmdata/M220/rom/2d/spr_sel_md425cmn.farc 2E10E30E\r\nmdata/M220/rom/2d/spr_sel_pv254.farc 9EF12FF9\r\nmdata/M220/rom/2d/spr_sel_pv263.farc 362E04DE\r\nmdata/M220/rom/particle/eff_pv254_c34_korobi.farc E5FD55BC\r\nmdata/M220/rom/particle/eff_pv254_c36_korobi.farc 71028680\r\nmdata/M220/rom/particle/eff_pv254_c37_kusarakka.farc E70BFBFB\r\nmdata/M220/rom/particle/eff_pv254_c43_onibi.farc F2C2F716\r\nmdata/M220/rom/particle/eff_pv254_jinja_tourou.farc 792568EC\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura.farc A31A2AC5\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura_cut15.farc 42D64D48\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura_cut31.farc 75E184EA\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura_cut39.farc DEC97C30\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura_cut42.farc D19F1ADC\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura_cut44.farc A0AED811\r\nmdata/M220/rom/particle/eff_pv254_kirakira_aura_test.farc 541ACAC8\r\nmdata/M220/rom/particle/eff_pv254_lightball_cut29.farc 1806F4BB\r\nmdata/M220/rom/particle/eff_pv254_moon.farc 805D6016\r\nmdata/M220/rom/particle/eff_pv254_nagarebosi_cut11.farc 9083CEE8\r\nmdata/M220/rom/particle/eff_pv254_rakka.farc 070537B8\r\nmdata/M220/rom/particle/eff_pv254s01_hotaru.farc 0B958F99\r\nmdata/M220/rom/particle/eff_pv254S04_spirit.farc D34064B8\r\nmdata/M220/rom/light_param/fog_pv254s01.txt 6BBEA2F7\r\nmdata/M220/rom/light_param/fog_pv254s02.txt 3533E95C\r\nmdata/M220/rom/light_param/fog_pv254s03.txt 5F8365CF\r\nmdata/M220/rom/light_param/fog_pv254s05.txt CFC54D6A\r\nmdata/M220/rom/light_param/fog_pv254s06.txt 3533E95C\r\nmdata/M220/rom/light_param/fog_pv254s07.txt 3533E95C\r\nmdata/M220/rom/light_param/fog_pv254s08.txt 8A6C2003\r\nmdata/M220/rom/light_param/fog_pv254s09.txt F5E222E3\r\nmdata/M220/rom/light_param/fog_pv254s13.txt 256E2188\r\nmdata/M220/rom/light_param/fog_pv263s01.txt 2EC61590\r\nmdata/M220/rom/light_param/fog_pv263s03.txt 24850A30\r\nmdata/M220/rom/light_param/fog_pv263s07.txt 24850A30\r\nmdata/M220/rom/light_param/fog_pv263s10.txt DD388043\r\nmdata/M220/rom/light_param/fog_pv263s11.txt 24B0147F\r\nmdata/M220/rom/light_param/glow_pv254s01.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s02.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s03.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s05.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s06.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s07.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s08.txt 8C5E3474\r\nmdata/M220/rom/light_param/glow_pv254s09.txt 203B6B00\r\nmdata/M220/rom/light_param/glow_pv254s13.txt B8714142\r\nmdata/M220/rom/light_param/glow_pv254s17.txt 4D966286\r\nmdata/M220/rom/light_param/glow_pv263s01.txt 1B5A25A3\r\nmdata/M220/rom/light_param/glow_pv263s03.txt C323E52E\r\nmdata/M220/rom/light_param/glow_pv263s05.txt 00AC9A9D\r\nmdata/M220/rom/light_param/glow_pv263s07.txt 14CF86DB\r\nmdata/M220/rom/light_param/glow_pv263s10.txt E2CE1EBA\r\nmdata/M220/rom/light_param/glow_pv263s11.txt 2C0BEC0A\r\nmdata/M220/rom/light_param/light_pv254.farc D8B86BC4\r\nmdata/M220/rom/light_param/light_pv254s01.txt E30814AD\r\nmdata/M220/rom/light_param/light_pv254s02.txt 8696E506\r\nmdata/M220/rom/light_param/light_pv254s03.txt 9EF238FE\r\nmdata/M220/rom/light_param/light_pv254s05.txt E04E1E8C\r\nmdata/M220/rom/light_param/light_pv254s06.txt 8696E506\r\nmdata/M220/rom/light_param/light_pv254s07.txt 8696E506\r\nmdata/M220/rom/light_param/light_pv254s08.txt 61F90327\r\nmdata/M220/rom/light_param/light_pv254s09.txt 6859F65F\r\nmdata/M220/rom/light_param/light_pv254s12.txt D9C9F464\r\nmdata/M220/rom/light_param/light_pv254s13.txt 61E94D55\r\nmdata/M220/rom/light_param/light_pv254s17.txt 2DABAE85\r\nmdata/M220/rom/light_param/light_pv263.farc 9F5072A6\r\nmdata/M220/rom/light_param/light_pv263s01.txt F2D08731\r\nmdata/M220/rom/light_param/light_pv263s03.txt 1E5C5925\r\nmdata/M220/rom/light_param/light_pv263s04.txt C11081E7\r\nmdata/M220/rom/light_param/light_pv263s07.txt D02EB2FB\r\nmdata/M220/rom/light_param/light_pv263s10.txt 0813CB75\r\nmdata/M220/rom/light_param/wind_pv254s01.txt 96B6ABBF\r\nmdata/M220/rom/light_param/wind_pv254s02.txt B5D0A9C0\r\nmdata/M220/rom/light_param/wind_pv254s06.txt 96B6ABBF\r\nmdata/M220/rom/light_param/wind_pv254s17.txt 96B6ABBF\r\nmdata/M220/rom/light_param/wind_pv263s01.txt 23B0225D\r\nmdata/M220/rom/light_param/wind_pv263s02.txt 76424932\r\nmdata/M220/rom/light_param/wind_pv263s06.txt E6E50A7F\r\nmdata/M220/rom/light_param/wind_pv263s09.txt BBD4F24D\r\nmdata/M220/rom/light_param/wind_pv263s12.txt E6E50A7F\r\nmdata/M230/info.txt F337A2AF\r\nmdata/M230/rom/mdata_chritm_prop.farc 60946254\r\nmdata/M230/rom/mdata_gm_collection_card_tbl.farc 6D5B32AD\r\nmdata/M230/rom/mdata_gm_module_tbl.farc 583B1E5A\r\nmdata/M230/rom/mdata_pv_db.txt 7C2B381D\r\nmdata/M230/rom/mdata_pv_field.txt 68F9A0A7\r\nmdata/M230/rom/mdata_rob_sleeve_data.txt F42908F8\r\nmdata/M230/rom/mdata_stage_data.bin EB4F10AA\r\nmdata/M230/rom/osage_play_data/mdata_opd_db.txt 91DB233E\r\nmdata/M230/rom/osage_play_data/mikitm175_joha_outer_175__divskn.farc E169B7CD\r\nmdata/M230/rom/osage_play_data/mikitm176_joha_outer_176__divskn.farc 224F09DF\r\nmdata/M230/rom/osage_play_data/mikitm675_atam_atama_175__divskn.farc 10DBF133\r\nmdata/M230/rom/osage_play_data/mikitm676_atam_atama_176__divskn.farc 58E3DE4E\r\nmdata/M230/rom/osage_play_data/mikitm785_joha_ushiro_85__divskn.farc 941C863A\r\nmdata/M230/rom/photo_print/card/CLT_CRD0652_01.jpg 195B82A6\r\nmdata/M230/rom/photo_print/card/CLT_CRD0653_01.jpg B57519DD\r\nmdata/M230/rom/photo_print/card/CLT_CRD0654_01.jpg 35421C6B\r\nmdata/M230/rom/photo_print/card/CLT_CRD0655_01.jpg 98C75E4D\r\nmdata/M230/rom/photo_print/stamp/pv/stamp_pv266_logo266_00.tga B6B6DDA3\r\nmdata/M230/rom/photo_print/stamp/pv/stamp_pv267_logo267_00.tga D1E8A487\r\nmdata/M230/rom/photo_print/stamp/module/stamp_md_sub_426_00.tga 6F84F7FF\r\nmdata/M230/rom/photo_print/stamp/module/stamp_md_sub_427_00.tga 3B451943\r\nmdata/M230/rom/movie/adv_sega_cm.wmv 6657DB68\r\nmdata/M230/rom/movie/pv_267.wmv 35151951\r\nmdata/M230/rom/objset/mdata_obj_db.bin 6C646EBB\r\nmdata/M230/rom/objset/mdata_tex_db.bin 81D3F44E\r\nmdata/M230/rom/objset/mikitm175.farc BE1788C0\r\nmdata/M230/rom/objset/mikitm176.farc 27C9179A\r\nmdata/M230/rom/objset/mikitm475.farc 138DCB3B\r\nmdata/M230/rom/objset/mikitm675.farc FAF32C93\r\nmdata/M230/rom/objset/mikitm676.farc D66A2D96\r\nmdata/M230/rom/objset/mikitm785.farc A0DA6C5F\r\nmdata/M230/rom/objset/mikitm975.farc 77C6B7A9\r\nmdata/M230/rom/objset/stgpv266.farc 6CEC35B9\r\nmdata/M230/rom/objset/stgpv266hrc.farc 3E7C4F4F\r\nmdata/M230/rom/objset/stgpv266s01.farc B89EEE48\r\nmdata/M230/rom/objset/stgpv266s02.farc 1DA6305A\r\nmdata/M230/rom/objset/stgpv266s03.farc C3795BAF\r\nmdata/M230/rom/objset/stgpv266s04.farc C04BE16E\r\nmdata/M230/rom/objset/stgpv266s05.farc F7B66F13\r\nmdata/M230/rom/script/pv_044_easy.dsc AA1D3A2A\r\nmdata/M230/rom/script/pv_044_extreme.dsc 8BBE512E\r\nmdata/M230/rom/script/pv_044_extreme_1.dsc 9EBA5D81\r\nmdata/M230/rom/script/pv_044_hard.dsc CA851FAC\r\nmdata/M230/rom/script/pv_044_normal.dsc C52CC30C\r\nmdata/M230/rom/script/pv_091_easy.dsc 2C44962E\r\nmdata/M230/rom/script/pv_091_extreme.dsc E3FDA25B\r\nmdata/M230/rom/script/pv_091_extreme_1.dsc 9F74895E\r\nmdata/M230/rom/script/pv_091_hard.dsc 97C8A053\r\nmdata/M230/rom/script/pv_091_normal.dsc 381652B1\r\nmdata/M230/rom/script/pv_204_easy.dsc 03BC3A1A\r\nmdata/M230/rom/script/pv_204_extreme.dsc 408BC49D\r\nmdata/M230/rom/script/pv_204_extreme_1.dsc 54945392\r\nmdata/M230/rom/script/pv_204_hard.dsc 400519C7\r\nmdata/M230/rom/script/pv_204_normal.dsc EFAB9F24\r\nmdata/M230/rom/script/pv_215_extreme.dsc 8BFC1581\r\nmdata/M230/rom/script/pv_215_extreme_1.dsc 311F128B\r\nmdata/M230/rom/script/pv_215_hard.dsc FE94AE7A\r\nmdata/M230/rom/script/pv_215_normal.dsc 84F165B7\r\nmdata/M230/rom/script/pv_262_easy.dsc AEB3B4B4\r\nmdata/M230/rom/script/pv_262_extreme.dsc B296A886\r\nmdata/M230/rom/script/pv_262_hard.dsc F3F81BC6\r\nmdata/M230/rom/script/pv_262_normal.dsc B9C6EAC1\r\nmdata/M230/rom/script/pv_266_easy.dsc 6E56682A\r\nmdata/M230/rom/script/pv_266_extreme.dsc 7629FF82\r\nmdata/M230/rom/script/pv_266_hard.dsc 07439DAA\r\nmdata/M230/rom/script/pv_266_normal.dsc FED217AC\r\nmdata/M230/rom/script/pv_267_easy.dsc 2DB0B161\r\nmdata/M230/rom/script/pv_267_extreme.dsc 6CD5BAE7\r\nmdata/M230/rom/script/pv_267_hard.dsc 971A54E4\r\nmdata/M230/rom/script/pv_267_normal.dsc 1783F081\r\nmdata/M230/rom/script/pv_417_extreme.dsc 3F846113\r\nmdata/M230/rom/script/pv_417_extreme_1.dsc A2B331C1\r\nmdata/M230/rom/script/pv_417_hard.dsc 9DB0E949\r\nmdata/M230/rom/script/pv_417_normal.dsc 01EABDBE\r\nmdata/M230/rom/script/pv_425_extreme.dsc A497E66C\r\nmdata/M230/rom/script/pv_425_extreme_1.dsc B9E08F2C\r\nmdata/M230/rom/script/pv_425_hard.dsc 1879895C\r\nmdata/M230/rom/script/pv_425_normal.dsc 5AE0021E\r\nmdata/M230/rom/script/pv_427_easy.dsc 6E327597\r\nmdata/M230/rom/script/pv_427_extreme.dsc DC05244B\r\nmdata/M230/rom/script/pv_427_extreme_1.dsc 9FC8AC7F\r\nmdata/M230/rom/script/pv_427_hard.dsc 745F6D1E\r\nmdata/M230/rom/script/pv_427_normal.dsc CCA73ED3\r\nmdata/M230/rom/script/pv_727_easy.dsc C8255222\r\nmdata/M230/rom/script/pv_727_extreme.dsc D3E0B33E\r\nmdata/M230/rom/script/pv_727_hard.dsc 7F978EB0\r\nmdata/M230/rom/script/pv_727_normal.dsc C5EF78AC\r\nmdata/M230/rom/pv_expression/exp_PV266.bin 4BFEB54A\r\nmdata/M230/rom/rob/mdata_mot_db.farc AD88D1C6\r\nmdata/M230/rom/rob/mot_PV266.farc 69180AC2\r\nmdata/M230/rom/rob/mothead_PV266.bin 5CD178A8\r\nmdata/M230/rom/auth_3d/CAMPV266.farc 1385A1BA\r\nmdata/M230/rom/auth_3d/EFFSTGPV266.farc 14626DB6\r\nmdata/M230/rom/auth_3d/mdata_auth_3d_db.bin C160868B\r\nmdata/M230/rom/skin_param/ext_skp_mikitm175_joha_outer_175__divskn.txt 38E582C6\r\nmdata/M230/rom/skin_param/ext_skp_mikitm176_joha_outer_176__divskn.txt C6E0DB57\r\nmdata/M230/rom/skin_param/ext_skp_mikitm675_atam_atama_175__divskn.txt 107CC956\r\nmdata/M230/rom/skin_param/ext_skp_mikitm676_atam_atama_176__divskn.txt A0A9F5CE\r\nmdata/M230/rom/skin_param/ext_skp_mikitm785_joha_ushiro_85__divskn.txt BFD79F10\r\nmdata/M230/rom/skin_param/mdata_osage_setting.txt 9762BF6C\r\nmdata/M230/rom/skin_param/mdata_sp_skp.farc B409C5B3\r\nmdata/M230/rom/skin_param/mdata_sp_skp_db.txt 9F3D0AC2\r\nmdata/M230/rom/sound/song/pv_266.ogg 18BB70A8\r\nmdata/M230/rom/sound/song/pv_267.ogg DA9D426F\r\nmdata/M230/rom/2d/aet_gam_pv266.bin 3C3DFB4E\r\nmdata/M230/rom/2d/mdata_aet_db.bin 12B1F3BD\r\nmdata/M230/rom/2d/mdata_spr_db.bin 327CBFB0\r\nmdata/M230/rom/2d/spr_clt_crd0652.farc 705C56EB\r\nmdata/M230/rom/2d/spr_clt_crd0653.farc A3D18732\r\nmdata/M230/rom/2d/spr_clt_crd0654.farc 98A06216\r\nmdata/M230/rom/2d/spr_clt_crd0655.farc CD6F0F2F\r\nmdata/M230/rom/2d/spr_gam_pv266.farc 3E94C6F3\r\nmdata/M230/rom/2d/spr_sel_md426cmn.farc 0822AF39\r\nmdata/M230/rom/2d/spr_sel_md427cmn.farc 5D6431D5\r\nmdata/M230/rom/2d/spr_sel_pv266.farc F389389F\r\nmdata/M230/rom/2d/spr_sel_pv267.farc B6DD2831\r\nmdata/M230/rom/particle/eff_PV266_thunder.farc 58675E1C\r\nmdata/M230/rom/particle/eff_pv266s01_addfloor_rouya.farc D99E8518\r\nmdata/M230/rom/particle/eff_pv266s01_fire.farc F1E4C947\r\nmdata/M230/rom/particle/eff_pv266s01_kuzure.farc 49CD8E1D\r\nmdata/M230/rom/particle/eff_pv266s01_otimono.farc 09B94884\r\nmdata/M230/rom/particle/eff_pv266s01_susu.farc E4071592\r\nmdata/M230/rom/particle/eff_pv266s02_kirakira.farc 60DF0764\r\nmdata/M230/rom/particle/eff_pv266s02_kirakira_stop.farc A1957DC2\r\nmdata/M230/rom/particle/eff_pv266s02_rakka.farc 324C01A8\r\nmdata/M230/rom/light_param/fog_pv266s01.txt 573B0F33\r\nmdata/M230/rom/light_param/fog_pv266s02.txt 55B03272\r\nmdata/M230/rom/light_param/fog_pv266s03.txt 59EBB550\r\nmdata/M230/rom/light_param/glow_pv266s01.txt DC617978\r\nmdata/M230/rom/light_param/glow_pv266s02.txt ED31DFF8\r\nmdata/M230/rom/light_param/glow_pv266s03.txt D0A0DFE7\r\nmdata/M230/rom/light_param/light_pv266.farc F3F07DDE\r\nmdata/M230/rom/light_param/light_pv266s01.txt 1ED1C364\r\nmdata/M230/rom/light_param/light_pv266s02.txt A1B4FBE9\r\nmdata/M230/rom/light_param/light_pv266s03.txt 3716233F\r\nmdata/M270/info.txt FEDB2043\r\nmdata/M270/rom/mdata_chritm_prop.farc 1957777B\r\nmdata/M270/rom/mdata_gm_collection_card_tbl.farc C4864064\r\nmdata/M270/rom/mdata_gm_module_tbl.farc FA2369B3\r\nmdata/M270/rom/mdata_pv_db.txt 54A2D1F2\r\nmdata/M270/rom/mdata_pv_field.txt 960B6262\r\nmdata/M270/rom/mdata_rob_sleeve_data.txt 72BB4249\r\nmdata/M270/rom/osage_play_data/mdata_opd_db.txt 77B4CEE2\r\nmdata/M270/rom/osage_play_data/mikitm177_joha_outer_177__divskn.farc 8D637D84\r\nmdata/M270/rom/osage_play_data/mikitm178_joha_outer_178__divskn.farc 8DA5A305\r\nmdata/M270/rom/osage_play_data/mikitm179_joha_outer_179__divskn.farc D994CC1A\r\nmdata/M270/rom/osage_play_data/mikitm677_atam_atama_177__divskn.farc 1BB31002\r\nmdata/M270/rom/osage_play_data/mikitm678_atam_atama_178__divskn.farc 99916FFC\r\nmdata/M270/rom/osage_play_data/mikitm679_atam_atama_179__divskn.farc AC0C3EC3\r\nmdata/M270/rom/osage_play_data/mikitm786_joha_ushiro_86__divskn.farc B3ACDF1B\r\nmdata/M270/rom/photo_print/card/CLT_CRD0656_01.jpg E25422DC\r\nmdata/M270/rom/photo_print/card/CLT_CRD0657_01.jpg 309286A5\r\nmdata/M270/rom/photo_print/card/CLT_CRD0658_01.jpg 96A2CFE6\r\nmdata/M270/rom/photo_print/stamp/module/stamp_md_sub_428_00.tga EA98809F\r\nmdata/M270/rom/photo_print/stamp/module/stamp_md_sub_429_00.tga 9835C7F0\r\nmdata/M270/rom/photo_print/stamp/module/stamp_md_sub_430_00.tga B8E71DE4\r\nmdata/M270/rom/objset/mdata_obj_db.bin 5D06E3EC\r\nmdata/M270/rom/objset/mdata_tex_db.bin 37348FF6\r\nmdata/M270/rom/objset/mikitm177.farc 6A4244B9\r\nmdata/M270/rom/objset/mikitm178.farc 4BB8FEC6\r\nmdata/M270/rom/objset/mikitm179.farc 2B6F128A\r\nmdata/M270/rom/objset/mikitm477.farc 0E2694CF\r\nmdata/M270/rom/objset/mikitm478.farc B0D3C783\r\nmdata/M270/rom/objset/mikitm677.farc E8882D28\r\nmdata/M270/rom/objset/mikitm678.farc C0E73A31\r\nmdata/M270/rom/objset/mikitm679.farc 123F9BED\r\nmdata/M270/rom/objset/mikitm774.farc C4E518C7\r\nmdata/M270/rom/objset/mikitm786.farc 9C719B6A\r\nmdata/M270/rom/objset/mikitm789.farc C9D11CFC\r\nmdata/M270/rom/objset/mikitm792.farc A6427F8D\r\nmdata/M270/rom/objset/mikitm976.farc B25472D4\r\nmdata/M270/rom/objset/mikitm977.farc 90B07618\r\nmdata/M270/rom/script/pv_016_easy.dsc A5F48A04\r\nmdata/M270/rom/script/pv_016_extreme.dsc 37E9181F\r\nmdata/M270/rom/script/pv_016_extreme_1.dsc 4EBEA835\r\nmdata/M270/rom/script/pv_016_hard.dsc 1A78289B\r\nmdata/M270/rom/script/pv_020_easy.dsc E9B939FD\r\nmdata/M270/rom/script/pv_020_extreme.dsc 30F6DC25\r\nmdata/M270/rom/script/pv_020_extreme_1.dsc 77B68160\r\nmdata/M270/rom/script/pv_020_hard.dsc 6B553F1B\r\nmdata/M270/rom/script/pv_020_normal.dsc ACE6B7FC\r\nmdata/M270/rom/script/pv_086_easy.dsc E532CD14\r\nmdata/M270/rom/script/pv_086_extreme.dsc 3727578D\r\nmdata/M270/rom/script/pv_086_extreme_1.dsc B2237E36\r\nmdata/M270/rom/script/pv_086_hard.dsc 1C97DDAF\r\nmdata/M270/rom/script/pv_086_normal.dsc E4B630E3\r\nmdata/M270/rom/script/pv_219_easy.dsc BCF12AC4\r\nmdata/M270/rom/script/pv_219_extreme.dsc F120F3E9\r\nmdata/M270/rom/script/pv_219_extreme_1.dsc 5263AC66\r\nmdata/M270/rom/script/pv_219_hard.dsc DD48E899\r\nmdata/M270/rom/script/pv_219_normal.dsc 1B5902E9\r\nmdata/M270/rom/script/pv_225_easy.dsc 038EB300\r\nmdata/M270/rom/script/pv_225_extreme.dsc 2729F052\r\nmdata/M270/rom/script/pv_225_extreme_1.dsc C694DF0D\r\nmdata/M270/rom/script/pv_225_hard.dsc 56F457BD\r\nmdata/M270/rom/script/pv_225_normal.dsc D7EB305F\r\nmdata/M270/rom/script/pv_410_easy.dsc 7B65EC13\r\nmdata/M270/rom/script/pv_410_extreme.dsc CA798B16\r\nmdata/M270/rom/script/pv_410_extreme_1.dsc 5B59BD93\r\nmdata/M270/rom/script/pv_410_hard.dsc 34BB2BA4\r\nmdata/M270/rom/script/pv_410_normal.dsc 8D73F595\r\nmdata/M270/rom/script/pv_441_extreme.dsc 20788505\r\nmdata/M270/rom/script/pv_441_extreme_1.dsc 2EDB518F\r\nmdata/M270/rom/script/pv_441_hard.dsc E3404CBD\r\nmdata/M270/rom/script/pv_441_normal.dsc AE923292\r\nmdata/M270/rom/script/pv_727_easy.dsc 4ED4FAAF\r\nmdata/M270/rom/script/pv_727_extreme.dsc 5A10BB8C\r\nmdata/M270/rom/script/pv_727_hard.dsc 2B2FA143\r\nmdata/M270/rom/script/pv_727_normal.dsc 2AC37404\r\nmdata/M270/rom/rob/mothead_PV002.bin 12214A3A\r\nmdata/M270/rom/rob/mothead_PV020.bin 336CB1D4\r\nmdata/M270/rom/rob/mothead_PV044.bin E1435397\r\nmdata/M270/rom/rob/mothead_PV065.bin 0A329F5C\r\nmdata/M270/rom/rob/mothead_PV081.bin E9955111\r\nmdata/M270/rom/rob/mothead_PV205.bin DE2DDC7E\r\nmdata/M270/rom/rob/mothead_PV240.bin 0328D80B\r\nmdata/M270/rom/rob/mothead_PV262.bin D21C107B\r\nmdata/M270/rom/rob/mothead_PV604.bin 87FD04D2\r\nmdata/M270/rom/rob/mothead_PV605.bin B8105DE9\r\nmdata/M270/rom/rob/mothead_PV618.bin 1D511C5B\r\nmdata/M270/rom/rob/mothead_PV637.bin 449310C6\r\nmdata/M270/rom/rob/mothead_PV739.bin 8EE3AC6A\r\nmdata/M270/rom/rob/rob_mot_tbl.bin 38345C72\r\nmdata/M270/rom/skin_param/ext_skp_mikitm177_joha_outer_177__divskn.txt 0D5E67EE\r\nmdata/M270/rom/skin_param/ext_skp_mikitm178_joha_outer_178__divskn.txt A5BF1B50\r\nmdata/M270/rom/skin_param/ext_skp_mikitm179_joha_outer_179__divskn.txt 0D5E67EE\r\nmdata/M270/rom/skin_param/ext_skp_mikitm677_atam_atama_177__divskn.txt 0F3DBB7E\r\nmdata/M270/rom/skin_param/ext_skp_mikitm678_atam_atama_178__divskn.txt F98B6487\r\nmdata/M270/rom/skin_param/ext_skp_mikitm679_atam_atama_179__divskn.txt 0F3DBB7E\r\nmdata/M270/rom/skin_param/ext_skp_mikitm786_joha_ushiro_86__divskn.txt 0567E3E5\r\nmdata/M270/rom/skin_param/mdata_osage_setting.txt 3367EBAE\r\nmdata/M270/rom/skin_param/mdata_sp_skp.farc E6045F82\r\nmdata/M270/rom/skin_param/mdata_sp_skp_db.txt 5CE9689D\r\nmdata/M270/rom/2d/mdata_spr_db.bin 93BA0BFA\r\nmdata/M270/rom/2d/spr_clt_crd0656.farc 9D021A52\r\nmdata/M270/rom/2d/spr_clt_crd0657.farc 58B3F4E0\r\nmdata/M270/rom/2d/spr_clt_crd0658.farc 37210F68\r\nmdata/M270/rom/2d/spr_sel_md428cmn.farc 40740CD2\r\nmdata/M270/rom/2d/spr_sel_md429cmn.farc 86E17421\r\nmdata/M270/rom/2d/spr_sel_md430cmn.farc EA1F8169\r\nmdata/M240/info.txt 544A7115\r\nmdata/M240/rom/mdata_pv_db.txt CB892C33\r\nmdata/M240/rom/mdata_pv_field.txt E67DBC36\r\nmdata/M240/rom/photo_print/card/CLT_CRD0000_01.jpg 92110EDF\r\nmdata/M240/rom/photo_print/card/CLT_CRD0003_01.jpg B25CA717\r\nmdata/M240/rom/photo_print/card/CLT_CRD0004_01.jpg 2746079E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0005_01.jpg 53FC4180\r\nmdata/M240/rom/photo_print/card/CLT_CRD0006_01.jpg F8F18E60\r\nmdata/M240/rom/photo_print/card/CLT_CRD0007_01.jpg 00569D6D\r\nmdata/M240/rom/photo_print/card/CLT_CRD0008_01.jpg B4C6C2EA\r\nmdata/M240/rom/photo_print/card/CLT_CRD0009_01.jpg A0290A79\r\nmdata/M240/rom/photo_print/card/CLT_CRD0010_01.jpg B1DB2EF9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0011_01.jpg 113D48DD\r\nmdata/M240/rom/photo_print/card/CLT_CRD0012_01.jpg 8C371D38\r\nmdata/M240/rom/photo_print/card/CLT_CRD0013_01.jpg 0917E76A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0014_01.jpg 5E556625\r\nmdata/M240/rom/photo_print/card/CLT_CRD0015_01.jpg F4306B16\r\nmdata/M240/rom/photo_print/card/CLT_CRD0016_01.jpg 445D04BA\r\nmdata/M240/rom/photo_print/card/CLT_CRD0017_01.jpg 37EA0B1F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0018_01.jpg 489B92AD\r\nmdata/M240/rom/photo_print/card/CLT_CRD0019_01.jpg 2C01CE1B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0020_01.jpg 7023A7FF\r\nmdata/M240/rom/photo_print/card/CLT_CRD0021_01.jpg 77595D75\r\nmdata/M240/rom/photo_print/card/CLT_CRD0022_01.jpg 5DA35089\r\nmdata/M240/rom/photo_print/card/CLT_CRD0023_01.jpg C65AA76D\r\nmdata/M240/rom/photo_print/card/CLT_CRD0024_01.jpg 1AD57D6E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0025_01.jpg F40AD5A0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0026_01.jpg 6BE52F97\r\nmdata/M240/rom/photo_print/card/CLT_CRD0027_01.jpg 6954D011\r\nmdata/M240/rom/photo_print/card/CLT_CRD0028_01.jpg 8BD92472\r\nmdata/M240/rom/photo_print/card/CLT_CRD0029_01.jpg 7739A57D\r\nmdata/M240/rom/photo_print/card/CLT_CRD0030_01.jpg 0727490C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0031_01.jpg 78BF80CE\r\nmdata/M240/rom/photo_print/card/CLT_CRD0032_01.jpg A0F0D1D0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0033_01.jpg 23B7CEBE\r\nmdata/M240/rom/photo_print/card/CLT_CRD0034_01.jpg CA716251\r\nmdata/M240/rom/photo_print/card/CLT_CRD0035_01.jpg 77D6F5A0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0036_01.jpg 8D8BB573\r\nmdata/M240/rom/photo_print/card/CLT_CRD0037_01.jpg 40196840\r\nmdata/M240/rom/photo_print/card/CLT_CRD0038_01.jpg 74333A1E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0039_01.jpg 54886CD5\r\nmdata/M240/rom/photo_print/card/CLT_CRD0046_01.jpg 4899AE36\r\nmdata/M240/rom/photo_print/card/CLT_CRD0047_01.jpg 639B8AAE\r\nmdata/M240/rom/photo_print/card/CLT_CRD0053_01.jpg C86EECBE\r\nmdata/M240/rom/photo_print/card/CLT_CRD0054_01.jpg 27D2488B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0055_01.jpg 12AA166C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0056_01.jpg 18636C0B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0057_01.jpg E9D83986\r\nmdata/M240/rom/photo_print/card/CLT_CRD0059_01.jpg F72444DB\r\nmdata/M240/rom/photo_print/card/CLT_CRD0065_01.jpg 6788171B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0068_01.jpg 8BBC6DB9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0069_01.jpg BC890A47\r\nmdata/M240/rom/photo_print/card/CLT_CRD0070_01.jpg 5BE57F4A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0072_01.jpg 86CBF536\r\nmdata/M240/rom/photo_print/card/CLT_CRD0073_01.jpg BCE103BF\r\nmdata/M240/rom/photo_print/card/CLT_CRD0078_01.jpg 6BD6519A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0079_01.jpg 921D24FD\r\nmdata/M240/rom/photo_print/card/CLT_CRD0088_01.jpg F38A71C9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0089_01.jpg 37122D8C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0090_01.jpg C93FB926\r\nmdata/M240/rom/photo_print/card/CLT_CRD0091_01.jpg 8F6BAB45\r\nmdata/M240/rom/photo_print/card/CLT_CRD0102_01.jpg 6C200927\r\nmdata/M240/rom/photo_print/card/CLT_CRD0103_01.jpg 0F892732\r\nmdata/M240/rom/photo_print/card/CLT_CRD0107_01.jpg 95920219\r\nmdata/M240/rom/photo_print/card/CLT_CRD0108_01.jpg 4F48839F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0115_01.jpg 3975A36F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0118_01.jpg D01BDEA3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0121_01.jpg 67757FB6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0124_01.jpg 68416D35\r\nmdata/M240/rom/photo_print/card/CLT_CRD0129_01.jpg FC1C6D4B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0132_01.jpg 86E3F0E6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0133_01.jpg 32E0448A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0136_01.jpg 76CAED24\r\nmdata/M240/rom/photo_print/card/CLT_CRD0139_01.jpg DDEF3EA8\r\nmdata/M240/rom/photo_print/card/CLT_CRD0146_01.jpg 3CDA354A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0147_01.jpg 02BAE7A5\r\nmdata/M240/rom/photo_print/card/CLT_CRD0148_01.jpg 95E81CF3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0152_01.jpg 1E7CA5AF\r\nmdata/M240/rom/photo_print/card/CLT_CRD0153_01.jpg 324107F3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0156_01.jpg FAEBFFB3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0157_01.jpg A4A7DC7F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0158_01.jpg 678EF528\r\nmdata/M240/rom/photo_print/card/CLT_CRD0160_01.jpg F86ABD80\r\nmdata/M240/rom/photo_print/card/CLT_CRD0161_01.jpg 311508E6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0165_01.jpg A2248866\r\nmdata/M240/rom/photo_print/card/CLT_CRD0166_01.jpg 685E425A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0169_01.jpg 0C887938\r\nmdata/M240/rom/photo_print/card/CLT_CRD0170_01.jpg 693905A2\r\nmdata/M240/rom/photo_print/card/CLT_CRD0175_01.jpg 60190BA4\r\nmdata/M240/rom/photo_print/card/CLT_CRD0177_01.jpg 610C3F75\r\nmdata/M240/rom/photo_print/card/CLT_CRD0183_01.jpg 6C288EC4\r\nmdata/M240/rom/photo_print/card/CLT_CRD0188_01.jpg 5089ABAD\r\nmdata/M240/rom/photo_print/card/CLT_CRD0192_01.jpg EDEFA8F1\r\nmdata/M240/rom/photo_print/card/CLT_CRD0198_01.jpg 0FE54CB3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0202_01.jpg F7B746B9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0209_01.jpg CFABB355\r\nmdata/M240/rom/photo_print/card/CLT_CRD0212_01.jpg 52E113B0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0213_01.jpg 445E518B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0214_01.jpg D532DD6D\r\nmdata/M240/rom/photo_print/card/CLT_CRD0215_01.jpg 8346D52E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0221_01.jpg A2AD798A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0228_01.jpg 104CA09C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0229_01.jpg 4C6EA4E6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0231_01.jpg 3D5C2D15\r\nmdata/M240/rom/photo_print/card/CLT_CRD0235_01.jpg 82EBC51B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0236_01.jpg 82B1C491\r\nmdata/M240/rom/photo_print/card/CLT_CRD0237_01.jpg FC6D24E0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0238_01.jpg 0F034037\r\nmdata/M240/rom/photo_print/card/CLT_CRD0239_01.jpg 15F6BFE4\r\nmdata/M240/rom/photo_print/card/CLT_CRD0246_01.jpg F394EF6E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0247_01.jpg 272E0A38\r\nmdata/M240/rom/photo_print/card/CLT_CRD0420_01.jpg EA91059F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0421_01.jpg 896CF259\r\nmdata/M240/rom/photo_print/card/CLT_CRD0432_01.jpg 2BDB9721\r\nmdata/M240/rom/photo_print/card/CLT_CRD0440_01.jpg AD8BA3F9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0441_01.jpg 7CD27C5F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0442_01.jpg 55730CF0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0443_01.jpg E307693A\r\nmdata/M240/rom/photo_print/card/CLT_CRD0444_01.jpg 0C386F48\r\nmdata/M240/rom/photo_print/card/CLT_CRD0445_01.jpg E3F97E97\r\nmdata/M240/rom/photo_print/card/CLT_CRD0447_01.jpg 7B51A8C4\r\nmdata/M240/rom/photo_print/card/CLT_CRD0469_01.jpg 1A78DA5F\r\nmdata/M240/rom/photo_print/card/CLT_CRD0471_01.jpg 6F3E0C40\r\nmdata/M240/rom/photo_print/card/CLT_CRD0491_01.jpg 0AE22353\r\nmdata/M240/rom/photo_print/card/CLT_CRD0492_01.jpg 4C7B7E1E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0493_01.jpg 3AEB5CC9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0505_01.jpg 8872D9BE\r\nmdata/M240/rom/photo_print/card/CLT_CRD0506_01.jpg 72FC9A5C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0510_01.jpg 6D54B1BB\r\nmdata/M240/rom/photo_print/card/CLT_CRD0511_01.jpg 664125C8\r\nmdata/M240/rom/photo_print/card/CLT_CRD0512_01.jpg 313F4CCA\r\nmdata/M240/rom/photo_print/card/CLT_CRD0517_01.jpg 7D0510BC\r\nmdata/M240/rom/photo_print/card/CLT_CRD0518_01.jpg D5B6B325\r\nmdata/M240/rom/photo_print/card/CLT_CRD0524_01.jpg 9AB849B6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0525_01.jpg 783FF0C4\r\nmdata/M240/rom/photo_print/card/CLT_CRD0526_01.jpg 15F1564B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0528_01.jpg E3FEF7C0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0537_01.jpg 8A62D3B2\r\nmdata/M240/rom/photo_print/card/CLT_CRD0538_01.jpg F9C9B471\r\nmdata/M240/rom/photo_print/card/CLT_CRD0539_01.jpg 1942FBE6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0543_01.jpg FA155329\r\nmdata/M240/rom/photo_print/card/CLT_CRD0544_01.jpg 07A963E5\r\nmdata/M240/rom/photo_print/card/CLT_CRD0545_01.jpg 02DCC87E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0547_01.jpg AD0C897C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0557_01.jpg 00F7D7A3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0558_01.jpg 85FC9453\r\nmdata/M240/rom/photo_print/card/CLT_CRD0559_01.jpg E85396B3\r\nmdata/M240/rom/photo_print/card/CLT_CRD0560_01.jpg 525E7CDA\r\nmdata/M240/rom/photo_print/card/CLT_CRD0566_01.jpg 58E8F681\r\nmdata/M240/rom/photo_print/card/CLT_CRD0575_01.jpg D93CD6BF\r\nmdata/M240/rom/photo_print/card/CLT_CRD0578_01.jpg 82DEBA45\r\nmdata/M240/rom/photo_print/card/CLT_CRD0581_01.jpg 2C399C97\r\nmdata/M240/rom/photo_print/card/CLT_CRD0582_01.jpg 5EE21A45\r\nmdata/M240/rom/photo_print/card/CLT_CRD0589_01.jpg 9DF5D5C6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0590_01.jpg 4AF12642\r\nmdata/M240/rom/photo_print/card/CLT_CRD0595_01.jpg 2DE31143\r\nmdata/M240/rom/photo_print/card/CLT_CRD0598_01.jpg 09275F8C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0602_01.jpg CAA665C9\r\nmdata/M240/rom/photo_print/card/CLT_CRD0604_01.jpg 590E815E\r\nmdata/M240/rom/photo_print/card/CLT_CRD0607_01.jpg 8E16D41B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0608_01.jpg 9E03327B\r\nmdata/M240/rom/photo_print/card/CLT_CRD0609_01.jpg 0D5F9B57\r\nmdata/M240/rom/photo_print/card/CLT_CRD0611_01.jpg FBE3E8E6\r\nmdata/M240/rom/photo_print/card/CLT_CRD0620_01.jpg 0A7531D0\r\nmdata/M240/rom/photo_print/card/CLT_CRD0621_01.jpg B003CC97\r\nmdata/M240/rom/photo_print/card/CLT_CRD0622_01.jpg 56C94A2C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0631_01.jpg EA887058\r\nmdata/M240/rom/photo_print/card/CLT_CRD0637_01.jpg 49A90187\r\nmdata/M240/rom/photo_print/card/CLT_CRD0643_01.jpg 8C2CDF0C\r\nmdata/M240/rom/photo_print/card/CLT_CRD0644_01.jpg 998FC985\r\nmdata/M240/rom/photo_print/card/CLT_CRD0646_01.jpg B5DF7CED\r\nmdata/M240/rom/photo_print/card/CLT_CRD0654_01.jpg 1D521E74\r\nmdata/M240/rom/photo_print/card/CLT_CRD0655_01.jpg 4739C2CA\r\nmdata/M240/rom/photo_print/stamp/stamp030_02.tga 4CB3FB8A\r\nmdata/M240/rom/movie/adv_sega_cm.wmv 63C38E0E\r\nmdata/M240/rom/script/pv_042_easy.dsc 5EA918A7\r\nmdata/M240/rom/script/pv_042_extreme.dsc 07B247D4\r\nmdata/M240/rom/script/pv_042_extreme_1.dsc F1445ACA\r\nmdata/M240/rom/script/pv_042_hard.dsc 3258AFAB\r\nmdata/M240/rom/script/pv_042_normal.dsc C47E1700\r\nmdata/M240/rom/script/pv_048_easy.dsc 543B8FCA\r\nmdata/M240/rom/script/pv_048_extreme.dsc DA2E3577\r\nmdata/M240/rom/script/pv_048_extreme_1.dsc C1EC279E\r\nmdata/M240/rom/script/pv_048_hard.dsc B5A9A935\r\nmdata/M240/rom/script/pv_048_normal.dsc 4D750B82\r\nmdata/M240/rom/script/pv_227_extreme.dsc 32FE60A1\r\nmdata/M240/rom/script/pv_227_extreme_1.dsc 474E294F\r\nmdata/M240/rom/script/pv_227_hard.dsc 7AC87CB1\r\nmdata/M240/rom/script/pv_227_normal.dsc BBEE850F\r\nmdata/M240/rom/script/pv_266_easy.dsc 49485124\r\nmdata/M240/rom/script/pv_266_extreme.dsc 7629FF82\r\nmdata/M240/rom/script/pv_266_hard.dsc 07439DAA\r\nmdata/M240/rom/script/pv_266_normal.dsc FED217AC\r\nmdata/M240/rom/2d/aet_sel_module.bin A926F5DB\r\nmdata/M240/rom/2d/aet_sel_qst.bin C51EDE22\r\nmdata/M240/rom/2d/mdata_aet_db.bin 5C5587C3\r\nmdata/M240/rom/2d/mdata_spr_db.bin 81319D64\r\nmdata/M240/rom/2d/spr_clt_crd0000.farc FAAC3ED9\r\nmdata/M240/rom/2d/spr_clt_crd0003.farc 901DCA8A\r\nmdata/M240/rom/2d/spr_clt_crd0004.farc DA8DEC29\r\nmdata/M240/rom/2d/spr_clt_crd0005.farc F136C16C\r\nmdata/M240/rom/2d/spr_clt_crd0006.farc 1BC9A4B8\r\nmdata/M240/rom/2d/spr_clt_crd0007.farc B4BE1728\r\nmdata/M240/rom/2d/spr_clt_crd0008.farc 63960A61\r\nmdata/M240/rom/2d/spr_clt_crd0009.farc 1A5C83C6\r\nmdata/M240/rom/2d/spr_clt_crd0010.farc 8DFCC02D\r\nmdata/M240/rom/2d/spr_clt_crd0011.farc 921C4E20\r\nmdata/M240/rom/2d/spr_clt_crd0012.farc 624F8441\r\nmdata/M240/rom/2d/spr_clt_crd0013.farc 2E415B66\r\nmdata/M240/rom/2d/spr_clt_crd0014.farc 7CD41037\r\nmdata/M240/rom/2d/spr_clt_crd0015.farc 4EC2EA70\r\nmdata/M240/rom/2d/spr_clt_crd0016.farc 651C0996\r\nmdata/M240/rom/2d/spr_clt_crd0017.farc 50FF0738\r\nmdata/M240/rom/2d/spr_clt_crd0018.farc 9EBD0000\r\nmdata/M240/rom/2d/spr_clt_crd0019.farc 78DA39BE\r\nmdata/M240/rom/2d/spr_clt_crd0020.farc 8C013B12\r\nmdata/M240/rom/2d/spr_clt_crd0021.farc 34F1AB45\r\nmdata/M240/rom/2d/spr_clt_crd0022.farc 214DCBB2\r\nmdata/M240/rom/2d/spr_clt_crd0023.farc 5A297BB7\r\nmdata/M240/rom/2d/spr_clt_crd0024.farc 213A8F00\r\nmdata/M240/rom/2d/spr_clt_crd0025.farc 16A99C87\r\nmdata/M240/rom/2d/spr_clt_crd0026.farc 0D6AF764\r\nmdata/M240/rom/2d/spr_clt_crd0027.farc 59D468E3\r\nmdata/M240/rom/2d/spr_clt_crd0028.farc CA4D9DC7\r\nmdata/M240/rom/2d/spr_clt_crd0029.farc 822BE887\r\nmdata/M240/rom/2d/spr_clt_crd0030.farc 16845491\r\nmdata/M240/rom/2d/spr_clt_crd0031.farc 2CE821BE\r\nmdata/M240/rom/2d/spr_clt_crd0032.farc BC3FDA5B\r\nmdata/M240/rom/2d/spr_clt_crd0033.farc 04C2981A\r\nmdata/M240/rom/2d/spr_clt_crd0034.farc C131AD7E\r\nmdata/M240/rom/2d/spr_clt_crd0035.farc 3698204D\r\nmdata/M240/rom/2d/spr_clt_crd0036.farc B85A8CA0\r\nmdata/M240/rom/2d/spr_clt_crd0037.farc 05EB1B5B\r\nmdata/M240/rom/2d/spr_clt_crd0038.farc F01A7F51\r\nmdata/M240/rom/2d/spr_clt_crd0039.farc 8A2922E0\r\nmdata/M240/rom/2d/spr_clt_crd0046.farc 0D6C1E08\r\nmdata/M240/rom/2d/spr_clt_crd0047.farc 19CDD679\r\nmdata/M240/rom/2d/spr_clt_crd0053.farc 71926429\r\nmdata/M240/rom/2d/spr_clt_crd0054.farc BEC5E6BD\r\nmdata/M240/rom/2d/spr_clt_crd0055.farc 6D5B31FB\r\nmdata/M240/rom/2d/spr_clt_crd0056.farc 7AD3BDF8\r\nmdata/M240/rom/2d/spr_clt_crd0057.farc 8FC84CD0\r\nmdata/M240/rom/2d/spr_clt_crd0059.farc 680DBA29\r\nmdata/M240/rom/2d/spr_clt_crd0065.farc 9EC890EB\r\nmdata/M240/rom/2d/spr_clt_crd0068.farc 800906A9\r\nmdata/M240/rom/2d/spr_clt_crd0069.farc BDA8AA15\r\nmdata/M240/rom/2d/spr_clt_crd0070.farc EE846757\r\nmdata/M240/rom/2d/spr_clt_crd0072.farc 1882649F\r\nmdata/M240/rom/2d/spr_clt_crd0073.farc 25BE87EA\r\nmdata/M240/rom/2d/spr_clt_crd0078.farc C74341A3\r\nmdata/M240/rom/2d/spr_clt_crd0079.farc 31E1FAAE\r\nmdata/M240/rom/2d/spr_clt_crd0088.farc 185FE152\r\nmdata/M240/rom/2d/spr_clt_crd0089.farc 8BFE7AB2\r\nmdata/M240/rom/2d/spr_clt_crd0090.farc 7AE5D2F4\r\nmdata/M240/rom/2d/spr_clt_crd0091.farc BEC5B71E\r\nmdata/M240/rom/2d/spr_clt_crd0102.farc ECF077C2\r\nmdata/M240/rom/2d/spr_clt_crd0103.farc 6F8019D0\r\nmdata/M240/rom/2d/spr_clt_crd0107.farc 0AA7DE6C\r\nmdata/M240/rom/2d/spr_clt_crd0108.farc 4CCF6E06\r\nmdata/M240/rom/2d/spr_clt_crd0115.farc 351A231E\r\nmdata/M240/rom/2d/spr_clt_crd0118.farc 386EDB6A\r\nmdata/M240/rom/2d/spr_clt_crd0121.farc 5604587A\r\nmdata/M240/rom/2d/spr_clt_crd0124.farc EC418EFC\r\nmdata/M240/rom/2d/spr_clt_crd0129.farc 49C6B7DD\r\nmdata/M240/rom/2d/spr_clt_crd0132.farc 0BF3B964\r\nmdata/M240/rom/2d/spr_clt_crd0133.farc 32C25BD9\r\nmdata/M240/rom/2d/spr_clt_crd0136.farc 037DB34E\r\nmdata/M240/rom/2d/spr_clt_crd0139.farc 9A1EE584\r\nmdata/M240/rom/2d/spr_clt_crd0146.farc D88D3C08\r\nmdata/M240/rom/2d/spr_clt_crd0147.farc E6ED1E50\r\nmdata/M240/rom/2d/spr_clt_crd0148.farc B3F20005\r\nmdata/M240/rom/2d/spr_clt_crd0152.farc 376AEDA6\r\nmdata/M240/rom/2d/spr_clt_crd0153.farc 0324D665\r\nmdata/M240/rom/2d/spr_clt_crd0156.farc 3DD8074C\r\nmdata/M240/rom/2d/spr_clt_crd0157.farc DC6DA4DB\r\nmdata/M240/rom/2d/spr_clt_crd0158.farc A6AFB37C\r\nmdata/M240/rom/2d/spr_clt_crd0160.farc 60EB1511\r\nmdata/M240/rom/2d/spr_clt_crd0161.farc 3898D6D8\r\nmdata/M240/rom/2d/spr_clt_crd0165.farc AF41B64E\r\nmdata/M240/rom/2d/spr_clt_crd0166.farc 00818124\r\nmdata/M240/rom/2d/spr_clt_crd0169.farc 4A4F0D75\r\nmdata/M240/rom/2d/spr_clt_crd0170.farc 7170283B\r\nmdata/M240/rom/2d/spr_clt_crd0175.farc 469828FD\r\nmdata/M240/rom/2d/spr_clt_crd0177.farc 6DCE2827\r\nmdata/M240/rom/2d/spr_clt_crd0183.farc 1FEE5F36\r\nmdata/M240/rom/2d/spr_clt_crd0188.farc 6230EF78\r\nmdata/M240/rom/2d/spr_clt_crd0192.farc FA48647E\r\nmdata/M240/rom/2d/spr_clt_crd0198.farc 76BF62E3\r\nmdata/M240/rom/2d/spr_clt_crd0202.farc 00498FC7\r\nmdata/M240/rom/2d/spr_clt_crd0209.farc 6EBF668E\r\nmdata/M240/rom/2d/spr_clt_crd0212.farc 9AAAC37B\r\nmdata/M240/rom/2d/spr_clt_crd0213.farc 74E182BB\r\nmdata/M240/rom/2d/spr_clt_crd0214.farc 90212CD5\r\nmdata/M240/rom/2d/spr_clt_crd0215.farc 25445F88\r\nmdata/M240/rom/2d/spr_clt_crd0221.farc E2364537\r\nmdata/M240/rom/2d/spr_clt_crd0228.farc 341CC528\r\nmdata/M240/rom/2d/spr_clt_crd0229.farc 3C7C77A2\r\nmdata/M240/rom/2d/spr_clt_crd0231.farc 35C954C0\r\nmdata/M240/rom/2d/spr_clt_crd0235.farc 07AB66AF\r\nmdata/M240/rom/2d/spr_clt_crd0236.farc 9F47C411\r\nmdata/M240/rom/2d/spr_clt_crd0237.farc 0EC86F41\r\nmdata/M240/rom/2d/spr_clt_crd0238.farc 702FAED8\r\nmdata/M240/rom/2d/spr_clt_crd0239.farc 10F43A82\r\nmdata/M240/rom/2d/spr_clt_crd0246.farc 8055CEEB\r\nmdata/M240/rom/2d/spr_clt_crd0247.farc FEEADEFF\r\nmdata/M240/rom/2d/spr_clt_crd0420.farc 60C95389\r\nmdata/M240/rom/2d/spr_clt_crd0421.farc C8E3D6B1\r\nmdata/M240/rom/2d/spr_clt_crd0432.farc C922DF22\r\nmdata/M240/rom/2d/spr_clt_crd0440.farc D215B4C4\r\nmdata/M240/rom/2d/spr_clt_crd0441.farc 535A6F0D\r\nmdata/M240/rom/2d/spr_clt_crd0442.farc 59D60D06\r\nmdata/M240/rom/2d/spr_clt_crd0443.farc 9EF59B51\r\nmdata/M240/rom/2d/spr_clt_crd0444.farc B9CDA993\r\nmdata/M240/rom/2d/spr_clt_crd0445.farc F6AF1571\r\nmdata/M240/rom/2d/spr_clt_crd0447.farc 816F8F04\r\nmdata/M240/rom/2d/spr_clt_crd0469.farc F7C7C99E\r\nmdata/M240/rom/2d/spr_clt_crd0471.farc 653EF857\r\nmdata/M240/rom/2d/spr_clt_crd0491.farc CCA3D87A\r\nmdata/M240/rom/2d/spr_clt_crd0492.farc 7A84C96F\r\nmdata/M240/rom/2d/spr_clt_crd0493.farc A6C4A8FF\r\nmdata/M240/rom/2d/spr_clt_crd0505.farc 661BE1EB\r\nmdata/M240/rom/2d/spr_clt_crd0506.farc 837B1C7F\r\nmdata/M240/rom/2d/spr_clt_crd0510.farc D31DF876\r\nmdata/M240/rom/2d/spr_clt_crd0511.farc 3452F958\r\nmdata/M240/rom/2d/spr_clt_crd0512.farc 1F280C33\r\nmdata/M240/rom/2d/spr_clt_crd0517.farc 12118557\r\nmdata/M240/rom/2d/spr_clt_crd0518.farc FE073CE0\r\nmdata/M240/rom/2d/spr_clt_crd0524.farc 87A52749\r\nmdata/M240/rom/2d/spr_clt_crd0525.farc 54E4D510\r\nmdata/M240/rom/2d/spr_clt_crd0526.farc 66F2380C\r\nmdata/M240/rom/2d/spr_clt_crd0528.farc B4426B85\r\nmdata/M240/rom/2d/spr_clt_crd0537.farc 604BBE23\r\nmdata/M240/rom/2d/spr_clt_crd0538.farc CE7FCC97\r\nmdata/M240/rom/2d/spr_clt_crd0539.farc 991369AC\r\nmdata/M240/rom/2d/spr_clt_crd0543.farc EBC2DFC8\r\nmdata/M240/rom/2d/spr_clt_crd0544.farc 834A13CA\r\nmdata/M240/rom/2d/spr_clt_crd0545.farc E18A540D\r\nmdata/M240/rom/2d/spr_clt_crd0547.farc 285559B8\r\nmdata/M240/rom/2d/spr_clt_crd0557.farc 4560BCCA\r\nmdata/M240/rom/2d/spr_clt_crd0558.farc E3C00C4D\r\nmdata/M240/rom/2d/spr_clt_crd0559.farc DAC0D3B1\r\nmdata/M240/rom/2d/spr_clt_crd0560.farc 76BBD5F1\r\nmdata/M240/rom/2d/spr_clt_crd0566.farc DE8BB6C3\r\nmdata/M240/rom/2d/spr_clt_crd0575.farc E27BC41D\r\nmdata/M240/rom/2d/spr_clt_crd0578.farc E8F3D35B\r\nmdata/M240/rom/2d/spr_clt_crd0581.farc 547133F2\r\nmdata/M240/rom/2d/spr_clt_crd0582.farc 9051C8D1\r\nmdata/M240/rom/2d/spr_clt_crd0589.farc C6AA3CF2\r\nmdata/M240/rom/2d/spr_clt_crd0590.farc 95F7857E\r\nmdata/M240/rom/2d/spr_clt_crd0595.farc 267F45E0\r\nmdata/M240/rom/2d/spr_clt_crd0598.farc E4E84F3B\r\nmdata/M240/rom/2d/spr_clt_crd0602.farc B6FB5971\r\nmdata/M240/rom/2d/spr_clt_crd0604.farc 229839A3\r\nmdata/M240/rom/2d/spr_clt_crd0607.farc 21625D35\r\nmdata/M240/rom/2d/spr_clt_crd0608.farc 13E62B6C\r\nmdata/M240/rom/2d/spr_clt_crd0609.farc DB7C255F\r\nmdata/M240/rom/2d/spr_clt_crd0611.farc 82928DB3\r\nmdata/M240/rom/2d/spr_clt_crd0620.farc 250FEEF5\r\nmdata/M240/rom/2d/spr_clt_crd0621.farc 6727ABE5\r\nmdata/M240/rom/2d/spr_clt_crd0622.farc AED2C43D\r\nmdata/M240/rom/2d/spr_clt_crd0631.farc 8373297A\r\nmdata/M240/rom/2d/spr_clt_crd0637.farc 694A0106\r\nmdata/M240/rom/2d/spr_clt_crd0643.farc 69EA8849\r\nmdata/M240/rom/2d/spr_clt_crd0644.farc C5CB5CAA\r\nmdata/M240/rom/2d/spr_clt_crd0646.farc F762BFA9\r\nmdata/M240/rom/2d/spr_clt_crd0654.farc D383E518\r\nmdata/M240/rom/2d/spr_clt_crd0655.farc 50B72282\r\nmdata/M240/rom/2d/spr_sel_mdrmikcmn.farc 133DD7F0\r\nmdata/M240/rom/2d/spr_sel_module.farc 0A6332E6\r\nmdata/M240/rom/2d/spr_sel_qst.farc BA817C8A\r\nmdata/M250/info.txt 5769FB37\r\nmdata/M250/rom/mdata_pv_db.txt 494CA00A\r\nmdata/M250/rom/mdata_pv_db.txt.bak FBEFC5CA\r\nmdata/M250/rom/mdata_pv_field.txt 3DC5401D\r\nmdata/M250/rom/script/pv_012_extreme.dsc 796C708E\r\nmdata/M250/rom/script/pv_012_extreme_1.dsc 34D9697F\r\nmdata/M250/rom/script/pv_012_hard.dsc 136785CF\r\nmdata/M250/rom/script/pv_012_normal.dsc FF693CA0\r\nmdata/M250/rom/script/pv_220_easy.dsc EFA9E5EA\r\nmdata/M250/rom/script/pv_220_extreme.dsc 2C9BFA5D\r\nmdata/M250/rom/script/pv_220_extreme_1.dsc 4B8177B4\r\nmdata/M250/rom/script/pv_220_hard.dsc 735A4DFC\r\nmdata/M250/rom/script/pv_220_normal.dsc 1F48A811\r\nmdata/M250/rom/script/pv_435_extreme.dsc 3DCA160D\r\nmdata/M250/rom/script/pv_435_extreme_1.dsc F465D9E9\r\nmdata/M250/rom/script/pv_435_hard.dsc 94865B92\r\nmdata/M250/rom/script/pv_435_normal.dsc 957ED391\r\nmdata/M250/rom/script/pv_600_easy.dsc B2D1BF25\r\nmdata/M250/rom/script/pv_600_extreme.dsc 94F6C9A4\r\nmdata/M250/rom/script/pv_600_extreme_1.dsc A2EA35BA\r\nmdata/M250/rom/script/pv_600_hard.dsc 5E63204E\r\nmdata/M250/rom/script/pv_600_normal.dsc A8E7C500\r\nmdata/M250/rom/script/pv_605_easy.dsc 0BA84D51\r\nmdata/M250/rom/script/pv_605_extreme.dsc 55EDAB30\r\nmdata/M250/rom/script/pv_605_extreme_1.dsc AF0B149A\r\nmdata/M250/rom/script/pv_605_hard.dsc 29B15118\r\nmdata/M250/rom/script/pv_605_normal.dsc 56D21C93\r\nmdata/M250/rom/script/pv_615_easy.dsc 0028FDEE\r\nmdata/M250/rom/script/pv_615_extreme.dsc FB70BAFA\r\nmdata/M250/rom/script/pv_615_extreme_1.dsc D4E7498A\r\nmdata/M250/rom/script/pv_615_hard.dsc CA581E62\r\nmdata/M250/rom/script/pv_615_normal.dsc B1976F72\r\nmdata/M250/rom/script/pv_616_easy.dsc 3D3BE048\r\nmdata/M250/rom/script/pv_616_extreme.dsc D19D0FF5\r\nmdata/M250/rom/script/pv_616_extreme_1.dsc A6F03EC6\r\nmdata/M250/rom/script/pv_616_hard.dsc CA18960F\r\nmdata/M250/rom/script/pv_616_normal.dsc C927455F\r\nmdata/M250/rom/script/pv_617_extreme.dsc 3CE78EDB\r\nmdata/M250/rom/script/pv_617_extreme_1.dsc A78F90A5\r\nmdata/M250/rom/script/pv_617_hard.dsc E780ADD6\r\nmdata/M250/rom/script/pv_617_normal.dsc DE865F01\r\nmdata/M250/rom/script/pv_625_extreme.dsc 4A16766A\r\nmdata/M250/rom/script/pv_625_extreme_1.dsc 29B8BC7D\r\nmdata/M250/rom/script/pv_625_hard.dsc 0FAD740F\r\nmdata/M250/rom/script/pv_625_normal.dsc FB16AA4B\r\nmdata/M250/rom/script/pv_639_extreme.dsc 643B97FF\r\nmdata/M250/rom/script/pv_639_extreme_1.dsc B6D8D06D\r\nmdata/M250/rom/script/pv_639_hard.dsc 78318B00\r\nmdata/M250/rom/script/pv_639_normal.dsc 29BE261A\r\nmdata/M260/info.txt 2F693E39\r\nmdata/M260/rom/mdata_pv_db.txt 6D95B081\r\nmdata/M260/rom/mdata_pv_field.txt 8FDEC694\r\nmdata/M260/rom/script/pv_213_easy.dsc DC41A5A5\r\nmdata/M260/rom/script/pv_213_extreme.dsc CB05EE3C\r\nmdata/M260/rom/script/pv_213_extreme_1.dsc C1B123A3\r\nmdata/M260/rom/script/pv_213_hard.dsc 59A4B2BA\r\nmdata/M260/rom/script/pv_213_normal.dsc 39A3B85F\r\nmdata/M260/rom/script/pv_412_extreme.dsc A48E0388\r\nmdata/M260/rom/script/pv_412_extreme_1.dsc A68EF58A\r\nmdata/M260/rom/script/pv_412_hard.dsc CB624198\r\nmdata/M260/rom/script/pv_412_normal.dsc 02BF645C\r\nmdata/M260/rom/script/pv_602_easy.dsc E9C3E018\r\nmdata/M260/rom/script/pv_602_extreme.dsc 753D7E14\r\nmdata/M260/rom/script/pv_602_extreme_1.dsc DA105312\r\nmdata/M260/rom/script/pv_602_hard.dsc AE1CCD96\r\nmdata/M260/rom/script/pv_602_normal.dsc DD7F4831\r\nmdata/M260/rom/script/pv_613_easy.dsc D94A6422\r\nmdata/M260/rom/script/pv_613_extreme.dsc CE628CA6\r\nmdata/M260/rom/script/pv_613_extreme_1.dsc 48E3C1F5\r\nmdata/M260/rom/script/pv_613_hard.dsc 1DD06CE7\r\nmdata/M260/rom/script/pv_613_normal.dsc A2C75A7B\r\nmdata/M260/rom/script/pv_638_easy.dsc BED6C494\r\nmdata/M260/rom/script/pv_638_extreme.dsc 65180ED8\r\nmdata/M260/rom/script/pv_638_extreme_1.dsc A2FFDB36\r\nmdata/M260/rom/script/pv_638_hard.dsc 62989EB2\r\nmdata/M260/rom/script/pv_638_normal.dsc 4AC28AF1\r\nmdata/M260/rom/script/pv_730_easy.dsc 826C1846\r\nmdata/M260/rom/script/pv_730_extreme.dsc 8ABCE140\r\nmdata/M260/rom/script/pv_730_extreme_1.dsc C56C3515\r\nmdata/M260/rom/script/pv_730_hard.dsc 62F64B99\r\nmdata/M260/rom/script/pv_730_normal.dsc 07C0F154\r\nmdata/M271/info.txt ED5F46A7\r\nmdata/M271/rom/objset/mdata_obj_db.bin EE6937E7\r\nmdata/M271/rom/objset/mdata_tex_db.bin 4E964215\r\nmdata/M271/rom/objset/stgd2pv208.farc 4A9B65A9\r\nmdata/M271/rom/objset/stgd2pv208s01.farc ECBE7E9C\r\n"
  },
  {
    "path": "source-code/dependencies/GPUModel/GPUModel.h",
    "content": "/*\nSimple header for detecting Nvidia GPU models\n*/\n#pragma once\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n#include <windows.h>\n#include <string>\n#include <stdio.h>\n#pragma comment(lib, \"advapi32\")\nnamespace GPUModel\n{\n\tstd::wstring ExePath() {\n\t\tWCHAR buffer[MAX_PATH];\n\t\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\t\treturn std::wstring(buffer);\n\t}\n\n\tstd::wstring DirPath() {\n\t\tstd::wstring exepath = ExePath();\n\t\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\n\t\treturn exepath.substr(0, pos);\n\t}\n\n\tstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\config.ini\";\n\tLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\n\n\tvoid*(*NvAPI_QueryInterface)(unsigned int offset) = NULL;\n\tint(*NvAPI_Initialize)() = NULL;\n\tint(*NvAPI_Unload)() = NULL;\n\tint(*NvAPI_EnumPhysicalGPUs)(int64_t** handle, int* count) = NULL;\n\tint(*NvAPI_GPU_GetShortName)(int64_t* handle, char* name) = NULL;\n\n\t// returns the nvidia GPU die/chip name if one is installed, else \"AMD\" if an AMD driver is found, else \"Unknown\"\n\t// note that the used GL context may differ\n\tstd::string getGpuName()\n\t{\n\t\t// detected model can be overridden -- 0: Kepler, 1: Maxwell, 2: Turing, 3: Ampere, 4: Ada Lovelace, 5: Blackwell\n\t\tint nGPUModel = GetPrivateProfileIntW(L\"gpu\", L\"model\", -1, CONFIG_FILE);\n\t\tif (nGPUModel >= 0 && nGPUModel <= 4)\n\t\t{\n\t\t\tstd::string arch;\n\t\t\tswitch (nGPUModel)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tarch = \"GK000\";\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tarch = \"GM000\";\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tarch = \"TU000\";\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tarch = \"GA000\";\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tarch = \"AD000\";\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tarch = \"GB000\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tprintf(\"[GPUModel] GPU Model override: %s\\n\", arch.c_str());\n\t\t\treturn arch;\n\t\t}\n\n\t\tstd::string non_nv_name = \"Unknown\";\n\n\t\t// detect installed AMD driver\n\t\t//DWORD dwAttrib = GetFileAttributesW(L\"amdgfxinfo64.dll\");\n\t\t//if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))\n\t\tstruct stat buffer; // for some reason winapi version wasn't working\n\t\tif (stat(\"amdgfxinfo64.dll\", &buffer) == 0)\n\t\t{\n\t\t\tnon_nv_name = \"AMD\";\n\t\t}\n\n\t\tprintf(\"[GPUModel] Checking GPU model\\n\");\n\t\tHMODULE hdlNvapi = LoadLibraryW(L\"nvapi64.dll\");\n\n\t\tif (hdlNvapi == NULL)\n\t\t\treturn non_nv_name;\n\n\t\tNvAPI_QueryInterface = (void* (*)(unsigned int offset))GetProcAddress(hdlNvapi, \"nvapi_QueryInterface\");\n\t\tif (NvAPI_QueryInterface == nullptr)\n\t\t\treturn non_nv_name;\n\n\t\tNvAPI_Initialize = (int(*)())NvAPI_QueryInterface(0x0150E828);\n\t\tNvAPI_Unload = (int(*)()) NvAPI_QueryInterface(0xD22BDD7E);\n\t\tNvAPI_EnumPhysicalGPUs = (int(*)(int64_t * *handle, int* count))NvAPI_QueryInterface(0xE5AC921F);\n\t\tNvAPI_GPU_GetShortName = (int(*)(int64_t * handle, char* name))NvAPI_QueryInterface(0xD988F0F3);\n\n\t\tif (NvAPI_Initialize == nullptr ||\n\t\t\tNvAPI_Unload == nullptr ||\n\t\t\tNvAPI_EnumPhysicalGPUs == nullptr ||\n\t\t\tNvAPI_GPU_GetShortName == nullptr)\n\t\t\treturn non_nv_name;\n\n\t\tint64_t* hdlGpu[64] = { 0 };\n\t\tint nGpu = 0;\n\n\t\tNvAPI_Initialize();\n\t\tNvAPI_EnumPhysicalGPUs(hdlGpu, &nGpu);\n\n\t\t//printf(\"[ShaderPatch] nGpu: %d\\n\", nGpu);\n\t\tif (nGpu < 1)\n\t\t{\n\t\t\tNvAPI_Unload();\n\t\t\treturn non_nv_name;\n\t\t}\n\n\t\tchar nameBuf[64];\n\t\tNvAPI_GPU_GetShortName(hdlGpu[0], nameBuf);\n\t\tNvAPI_Unload();\n\n\t\treturn std::string(nameBuf);\n\t}\n}"
  },
  {
    "path": "source-code/dependencies/PluginConfigApi/PluginConfigApi.h",
    "content": "/*\nPD Loader Launcher Plugin Information Structs\n*/\n\n#pragma once\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n#include <windows.h>\n#include <vector>\n\n// resolution class to store and sort the width and height easily\nclass resolution\n{\npublic:\n\tunsigned int width;\n\tunsigned int height;\n\n\tresolution()\n\t{\n\t\twidth = 0;\n\t\theight = 0;\n\t}\n\n\tresolution(unsigned int width, unsigned int height)\n\t{\n\t\tresolution::width = width;\n\t\tresolution::height = height;\n\t}\n\n\tbool operator ==(const resolution &res2)\n\t{\n\t\treturn width == res2.width && height == res2.height;\n\t}\n\n\t// in comparisons width takes priority because it's usually displayed first\n\tbool operator <(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height < res2.height;\n\t\telse\n\t\t\treturn width < res2.width;\n\t}\n\tbool operator >(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height > res2.height;\n\t\telse\n\t\t\treturn width > res2.width;\n\t}\n};\n\nnamespace PluginConfig\n{\n#pragma pack(push, 1)\n\tenum ConfigType {\n\t\tCONFIG_BOOLEAN,\n\t\tCONFIG_NUMERIC,\n\t\tCONFIG_STRING,\n\t\tCONFIG_DROPDOWN_INDEX,\n\t\tCONFIG_DROPDOWN_TEXT,\n\t\tCONFIG_DROPDOWN_NUMBER,\n\t\tCONFIG_RESOLUTION,\n\t\tCONFIG_GROUP_START,\n\t\tCONFIG_GROUP_END,\n\t\tCONFIG_BUTTON,\n\t\tCONFIG_SPACER\n\t};\n\n\tstruct PluginConfigBooleanData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tbool defaultVal;\n\t\tbool saveAsString;\n\t};\n\n\tstruct PluginConfigNumericData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tint minVal;\n\t\tint maxVal;\n\t};\n\n\tstruct PluginConfigStringData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownIndexData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t};\n\n\tstruct PluginConfigDropdownTextData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t\tbool editable;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownNumberData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<int> valueInts;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigResolutionData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniVarName2;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tresolution defaultVal;\n\t\tstd::vector<resolution> valueResolutions;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigGroupData\n\t{\n\t\tLPCWSTR name;\n\t\tint height;\n\t};\n\n\tstruct PluginConfigButtonData {\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tvoid(*func)();\n\t};\n\n\tstruct PluginConfigSpacerData {\n\t\tint height;\n\t};\n\n\tstruct PluginConfigOption\n\t{\n\t\tConfigType cfgType;\n\t\tvoid* data;\n\t};\n\n\tstruct PluginConfigArray\n\t{\n\t\tint len;\n\t\tPluginConfigOption* options;\n\t};\n#pragma pack(pop)\n\n\t// note: this is actually the build date of PluginConfigApi -- make sure this isn't cached for CI\n\textern \"C\" __declspec(dllexport) LPCWSTR GetBuildDate(void)\n\t{\n\t\tWCHAR utf16buf[128];\n\t\tMultiByteToWideChar(CP_UTF8, 0, __DATE__, -1, utf16buf, 128);\n\t\treturn _wcsdup(utf16buf);\n\t}\n}"
  },
  {
    "path": "source-code/dependencies/WineVer/WineVer.h",
    "content": "/*\nSimple header for detecting version of Wine\n*/\n\nnamespace WineVer\n{\n\t#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n\t#include <windows.h>\n\t#include <string>\n\t#include <stdio.h>\n\t#pragma comment(lib, \"advapi32\")\n\n\tstd::string getWineVer()\n\t{\n\t\tHMODULE hntdll = LoadLibraryW(L\"ntdll.dll\");\n\t\t\n\t\tif (hntdll == NULL)\n\t\t\treturn \"\";\n\t\t\n\t\tchar*(WINAPI * wine_get_version)() = (char*(WINAPI*)())GetProcAddress(hntdll, \"wine_get_version\");\n\t\tif (wine_get_version)\n\t\t{\n\t\t\t//puts(\"Wine detected.\");\n\t\t\t//printf(\"Running on Wine... %s\\n\", wine_get_version());\n\t\t\treturn std::string(wine_get_version());\n\t\t}\n\t\treturn \"\";\n\t}\n}"
  },
  {
    "path": "source-code/dependencies/detours/include/detours.h",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Core Detours Functionality (detours.h of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#pragma once\n#ifndef _DETOURS_H_\n#define _DETOURS_H_\n\n#define DETOURS_VERSION     0x4c0c1   // 0xMAJORcMINORcPATCH\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n#ifdef DETOURS_INTERNAL\n\n#define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS 1\n#define _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE 1\n\n#pragma warning(disable:4068) // unknown pragma (suppress)\n\n#if _MSC_VER >= 1900\n#pragma warning(push)\n#pragma warning(disable:4091) // empty typedef\n#endif\n\n#include <windows.h>\n#if (_MSC_VER < 1310)\n#else\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#endif\n\n#endif // DETOURS_INTERNAL\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n#undef DETOURS_X64\n#undef DETOURS_X86\n#undef DETOURS_IA64\n#undef DETOURS_ARM\n#undef DETOURS_ARM64\n#undef DETOURS_BITS\n#undef DETOURS_32BIT\n#undef DETOURS_64BIT\n\n#if defined(_X86_)\n#define DETOURS_X86\n#define DETOURS_OPTION_BITS 64\n\n#elif defined(_AMD64_)\n#define DETOURS_X64\n#define DETOURS_OPTION_BITS 32\n\n#elif defined(_IA64_)\n#define DETOURS_IA64\n#define DETOURS_OPTION_BITS 32\n\n#elif defined(_ARM_)\n#define DETOURS_ARM\n\n#elif defined(_ARM64_)\n#define DETOURS_ARM64\n\n#else\n#error Unknown architecture (x86, amd64, ia64, arm, arm64)\n#endif\n\n#ifdef _WIN64\n#undef DETOURS_32BIT\n#define DETOURS_64BIT 1\n#define DETOURS_BITS 64\n// If all 64bit kernels can run one and only one 32bit architecture.\n//#define DETOURS_OPTION_BITS 32\n#else\n#define DETOURS_32BIT 1\n#undef DETOURS_64BIT\n#define DETOURS_BITS 32\n// If all 64bit kernels can run one and only one 32bit architecture.\n//#define DETOURS_OPTION_BITS 32\n#endif\n\n#define VER_DETOURS_BITS    DETOUR_STRINGIFY(DETOURS_BITS)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n#if (_MSC_VER < 1299)\ntypedef LONG LONG_PTR;\ntypedef ULONG ULONG_PTR;\n#endif\n\n///////////////////////////////////////////////// SAL 2.0 Annotations w/o SAL.\n//\n//  These definitions are include so that Detours will build even if the\n//  compiler doesn't have full SAL 2.0 support.\n//\n#ifndef DETOURS_DONT_REMOVE_SAL_20\n\n#ifdef DETOURS_TEST_REMOVE_SAL_20\n#undef _Analysis_assume_\n#undef _Benign_race_begin_\n#undef _Benign_race_end_\n#undef _Field_range_\n#undef _Field_size_\n#undef _In_\n#undef _In_bytecount_\n#undef _In_count_\n#undef _In_opt_\n#undef _In_opt_bytecount_\n#undef _In_opt_count_\n#undef _In_opt_z_\n#undef _In_range_\n#undef _In_reads_\n#undef _In_reads_bytes_\n#undef _In_reads_opt_\n#undef _In_reads_opt_bytes_\n#undef _In_reads_or_z_\n#undef _In_z_\n#undef _Inout_\n#undef _Inout_opt_\n#undef _Inout_z_count_\n#undef _Out_\n#undef _Out_opt_\n#undef _Out_writes_\n#undef _Outptr_result_maybenull_\n#undef _Readable_bytes_\n#undef _Success_\n#undef _Writable_bytes_\n#undef _Pre_notnull_\n#endif\n\n#if defined(_Deref_out_opt_z_) && !defined(_Outptr_result_maybenull_)\n#define _Outptr_result_maybenull_ _Deref_out_opt_z_\n#endif\n\n#if defined(_In_count_) && !defined(_In_reads_)\n#define _In_reads_(x) _In_count_(x)\n#endif\n\n#if defined(_In_opt_count_) && !defined(_In_reads_opt_)\n#define _In_reads_opt_(x) _In_opt_count_(x)\n#endif\n\n#if defined(_In_opt_bytecount_) && !defined(_In_reads_opt_bytes_)\n#define _In_reads_opt_bytes_(x) _In_opt_bytecount_(x)\n#endif\n\n#if defined(_In_bytecount_) && !defined(_In_reads_bytes_)\n#define _In_reads_bytes_(x) _In_bytecount_(x)\n#endif\n\n#ifndef _In_\n#define _In_\n#endif\n\n#ifndef _In_bytecount_\n#define _In_bytecount_(x)\n#endif\n\n#ifndef _In_count_\n#define _In_count_(x)\n#endif\n\n#ifndef _In_opt_\n#define _In_opt_\n#endif\n\n#ifndef _In_opt_bytecount_\n#define _In_opt_bytecount_(x)\n#endif\n\n#ifndef _In_opt_count_\n#define _In_opt_count_(x)\n#endif\n\n#ifndef _In_opt_z_\n#define _In_opt_z_\n#endif\n\n#ifndef _In_range_\n#define _In_range_(x,y)\n#endif\n\n#ifndef _In_reads_\n#define _In_reads_(x)\n#endif\n\n#ifndef _In_reads_bytes_\n#define _In_reads_bytes_(x)\n#endif\n\n#ifndef _In_reads_opt_\n#define _In_reads_opt_(x)\n#endif\n\n#ifndef _In_reads_opt_bytes_\n#define _In_reads_opt_bytes_(x)\n#endif\n\n#ifndef _In_reads_or_z_\n#define _In_reads_or_z_\n#endif\n\n#ifndef _In_z_\n#define _In_z_\n#endif\n\n#ifndef _Inout_\n#define _Inout_\n#endif\n\n#ifndef _Inout_opt_\n#define _Inout_opt_\n#endif\n\n#ifndef _Inout_z_count_\n#define _Inout_z_count_(x)\n#endif\n\n#ifndef _Out_\n#define _Out_\n#endif\n\n#ifndef _Out_opt_\n#define _Out_opt_\n#endif\n\n#ifndef _Out_writes_\n#define _Out_writes_(x)\n#endif\n\n#ifndef _Outptr_result_maybenull_\n#define _Outptr_result_maybenull_\n#endif\n\n#ifndef _Writable_bytes_\n#define _Writable_bytes_(x)\n#endif\n\n#ifndef _Readable_bytes_\n#define _Readable_bytes_(x)\n#endif\n\n#ifndef _Success_\n#define _Success_(x)\n#endif\n\n#ifndef _Pre_notnull_\n#define _Pre_notnull_\n#endif\n\n#ifdef DETOURS_INTERNAL\n\n#pragma warning(disable:4615) // unknown warning type (suppress with older compilers)\n\n#ifndef _Benign_race_begin_\n#define _Benign_race_begin_\n#endif\n\n#ifndef _Benign_race_end_\n#define _Benign_race_end_\n#endif\n\n#ifndef _Field_size_\n#define _Field_size_(x)\n#endif\n\n#ifndef _Field_range_\n#define _Field_range_(x,y)\n#endif\n\n#ifndef _Analysis_assume_\n#define _Analysis_assume_(x)\n#endif\n\n#endif // DETOURS_INTERNAL\n#endif // DETOURS_DONT_REMOVE_SAL_20\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#ifndef GUID_DEFINED\n#define GUID_DEFINED\ntypedef struct  _GUID\n{\n    DWORD Data1;\n    WORD Data2;\n    WORD Data3;\n    BYTE Data4[ 8 ];\n} GUID;\n\n#ifdef INITGUID\n#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\\n        const GUID name \\\n                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }\n#else\n#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\\n    const GUID name\n#endif // INITGUID\n#endif // !GUID_DEFINED\n\n#if defined(__cplusplus)\n#ifndef _REFGUID_DEFINED\n#define _REFGUID_DEFINED\n#define REFGUID             const GUID &\n#endif // !_REFGUID_DEFINED\n#else // !__cplusplus\n#ifndef _REFGUID_DEFINED\n#define _REFGUID_DEFINED\n#define REFGUID             const GUID * const\n#endif // !_REFGUID_DEFINED\n#endif // !__cplusplus\n\n#ifndef ARRAYSIZE\n#define ARRAYSIZE(x)    (sizeof(x)/sizeof(x[0]))\n#endif\n\n//\n//////////////////////////////////////////////////////////////////////////////\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/////////////////////////////////////////////////// Instruction Target Macros.\n//\n#define DETOUR_INSTRUCTION_TARGET_NONE          ((PVOID)0)\n#define DETOUR_INSTRUCTION_TARGET_DYNAMIC       ((PVOID)(LONG_PTR)-1)\n#define DETOUR_SECTION_HEADER_SIGNATURE         0x00727444   // \"Dtr\\0\"\n\nextern const GUID DETOUR_EXE_RESTORE_GUID;\nextern const GUID DETOUR_EXE_HELPER_GUID;\n\n#define DETOUR_TRAMPOLINE_SIGNATURE             0x21727444  // Dtr!\ntypedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;\n\n/////////////////////////////////////////////////////////// Binary Structures.\n//\n#pragma pack(push, 8)\ntypedef struct _DETOUR_SECTION_HEADER\n{\n    DWORD       cbHeaderSize;\n    DWORD       nSignature;\n    DWORD       nDataOffset;\n    DWORD       cbDataSize;\n\n    DWORD       nOriginalImportVirtualAddress;\n    DWORD       nOriginalImportSize;\n    DWORD       nOriginalBoundImportVirtualAddress;\n    DWORD       nOriginalBoundImportSize;\n\n    DWORD       nOriginalIatVirtualAddress;\n    DWORD       nOriginalIatSize;\n    DWORD       nOriginalSizeOfImage;\n    DWORD       cbPrePE;\n\n    DWORD       nOriginalClrFlags;\n    DWORD       reserved1;\n    DWORD       reserved2;\n    DWORD       reserved3;\n\n    // Followed by cbPrePE bytes of data.\n} DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER;\n\ntypedef struct _DETOUR_SECTION_RECORD\n{\n    DWORD       cbBytes;\n    DWORD       nReserved;\n    GUID        guid;\n} DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD;\n\ntypedef struct _DETOUR_CLR_HEADER\n{\n    // Header versioning\n    ULONG                   cb;\n    USHORT                  MajorRuntimeVersion;\n    USHORT                  MinorRuntimeVersion;\n\n    // Symbol table and startup information\n    IMAGE_DATA_DIRECTORY    MetaData;\n    ULONG                   Flags;\n\n    // Followed by the rest of the IMAGE_COR20_HEADER\n} DETOUR_CLR_HEADER, *PDETOUR_CLR_HEADER;\n\ntypedef struct _DETOUR_EXE_RESTORE\n{\n    DWORD               cb;\n    DWORD               cbidh;\n    DWORD               cbinh;\n    DWORD               cbclr;\n\n    PBYTE               pidh;\n    PBYTE               pinh;\n    PBYTE               pclr;\n\n    IMAGE_DOS_HEADER    idh;\n    union {\n        IMAGE_NT_HEADERS    inh;        // all environments have this\n#ifdef IMAGE_NT_OPTIONAL_HDR32_MAGIC    // some environments do not have this\n        IMAGE_NT_HEADERS32  inh32;\n#endif\n#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC    // some environments do not have this\n        IMAGE_NT_HEADERS64  inh64;\n#endif\n#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC    // some environments do not have this\n        BYTE                raw[sizeof(IMAGE_NT_HEADERS64) +\n                                sizeof(IMAGE_SECTION_HEADER) * 32];\n#else\n        BYTE                raw[0x108 + sizeof(IMAGE_SECTION_HEADER) * 32];\n#endif\n    };\n    DETOUR_CLR_HEADER   clr;\n\n} DETOUR_EXE_RESTORE, *PDETOUR_EXE_RESTORE;\n\n#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC\nC_ASSERT(sizeof(IMAGE_NT_HEADERS64) == 0x108);\n#endif\n\n// The size can change, but assert for clarity due to the muddying #ifdefs.\n#ifdef _WIN64\nC_ASSERT(sizeof(DETOUR_EXE_RESTORE) == 0x688);\n#else\nC_ASSERT(sizeof(DETOUR_EXE_RESTORE) == 0x678);\n#endif\n\ntypedef struct _DETOUR_EXE_HELPER\n{\n    DWORD               cb;\n    DWORD               pid;\n    DWORD               nDlls;\n    CHAR                rDlls[4];\n} DETOUR_EXE_HELPER, *PDETOUR_EXE_HELPER;\n\n#pragma pack(pop)\n\n#define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \\\n{ \\\n      sizeof(DETOUR_SECTION_HEADER),\\\n      DETOUR_SECTION_HEADER_SIGNATURE,\\\n      sizeof(DETOUR_SECTION_HEADER),\\\n      (cbSectionSize),\\\n      \\\n      0,\\\n      0,\\\n      0,\\\n      0,\\\n      \\\n      0,\\\n      0,\\\n      0,\\\n      0,\\\n}\n\n/////////////////////////////////////////////////////////////// Helper Macros.\n//\n#define DETOURS_STRINGIFY(x)    DETOURS_STRINGIFY_(x)\n#define DETOURS_STRINGIFY_(x)    #x\n\n///////////////////////////////////////////////////////////// Binary Typedefs.\n//\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(\n    _In_opt_ PVOID pContext,\n    _In_opt_ LPCSTR pszFile,\n    _Outptr_result_maybenull_ LPCSTR *ppszOutFile);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(\n    _In_opt_ PVOID pContext,\n    _In_ LPCSTR pszOrigFile,\n    _In_ LPCSTR pszFile,\n    _Outptr_result_maybenull_ LPCSTR *ppszOutFile);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(\n    _In_opt_ PVOID pContext,\n    _In_ ULONG nOrigOrdinal,\n    _In_ ULONG nOrdinal,\n    _Out_ ULONG *pnOutOrdinal,\n    _In_opt_ LPCSTR pszOrigSymbol,\n    _In_opt_ LPCSTR pszSymbol,\n    _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_COMMIT_CALLBACK)(\n    _In_opt_ PVOID pContext);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_ENUMERATE_EXPORT_CALLBACK)(_In_opt_ PVOID pContext,\n                                                             _In_ ULONG nOrdinal,\n                                                             _In_opt_ LPCSTR pszName,\n                                                             _In_opt_ PVOID pCode);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FILE_CALLBACK)(_In_opt_ PVOID pContext,\n                                                        _In_opt_ HMODULE hModule,\n                                                        _In_opt_ LPCSTR pszFile);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK)(_In_opt_ PVOID pContext,\n                                                        _In_ DWORD nOrdinal,\n                                                        _In_opt_ LPCSTR pszFunc,\n                                                        _In_opt_ PVOID pvFunc);\n\n// Same as PF_DETOUR_IMPORT_FUNC_CALLBACK but extra indirection on last parameter.\ntypedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK_EX)(_In_opt_ PVOID pContext,\n                                                           _In_ DWORD nOrdinal,\n                                                           _In_opt_ LPCSTR pszFunc,\n                                                           _In_opt_ PVOID* ppvFunc);\n\ntypedef VOID * PDETOUR_BINARY;\ntypedef VOID * PDETOUR_LOADED_BINARY;\n\n//////////////////////////////////////////////////////////// Transaction APIs.\n//\nLONG WINAPI DetourTransactionBegin(VOID);\nLONG WINAPI DetourTransactionAbort(VOID);\nLONG WINAPI DetourTransactionCommit(VOID);\nLONG WINAPI DetourTransactionCommitEx(_Out_opt_ PVOID **pppFailedPointer);\n\nLONG WINAPI DetourUpdateThread(_In_ HANDLE hThread);\n\nLONG WINAPI DetourAttach(_Inout_ PVOID *ppPointer,\n                         _In_ PVOID pDetour);\n\nLONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,\n                           _In_ PVOID pDetour,\n                           _Out_opt_ PDETOUR_TRAMPOLINE *ppRealTrampoline,\n                           _Out_opt_ PVOID *ppRealTarget,\n                           _Out_opt_ PVOID *ppRealDetour);\n\nLONG WINAPI DetourDetach(_Inout_ PVOID *ppPointer,\n                         _In_ PVOID pDetour);\n\nBOOL WINAPI DetourSetIgnoreTooSmall(_In_ BOOL fIgnore);\nBOOL WINAPI DetourSetRetainRegions(_In_ BOOL fRetain);\nPVOID WINAPI DetourSetSystemRegionLowerBound(_In_ PVOID pSystemRegionLowerBound);\nPVOID WINAPI DetourSetSystemRegionUpperBound(_In_ PVOID pSystemRegionUpperBound);\n\n////////////////////////////////////////////////////////////// Code Functions.\n//\nPVOID WINAPI DetourFindFunction(_In_ LPCSTR pszModule,\n                                _In_ LPCSTR pszFunction);\nPVOID WINAPI DetourCodeFromPointer(_In_ PVOID pPointer,\n                                   _Out_opt_ PVOID *ppGlobals);\nPVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,\n                                   _Inout_opt_ PVOID *ppDstPool,\n                                   _In_ PVOID pSrc,\n                                   _Out_opt_ PVOID *ppTarget,\n                                   _Out_opt_ LONG *plExtra);\nBOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,\n                                _In_ BOOL fLimitReferencesToModule);\nPVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,\n                                                  _Out_ PDWORD pcbAllocatedSize);\n\n///////////////////////////////////////////////////// Loaded Binary Functions.\n//\nHMODULE WINAPI DetourGetContainingModule(_In_ PVOID pvAddr);\nHMODULE WINAPI DetourEnumerateModules(_In_opt_ HMODULE hModuleLast);\nPVOID WINAPI DetourGetEntryPoint(_In_opt_ HMODULE hModule);\nULONG WINAPI DetourGetModuleSize(_In_opt_ HMODULE hModule);\nBOOL WINAPI DetourEnumerateExports(_In_ HMODULE hModule,\n                                   _In_opt_ PVOID pContext,\n                                   _In_ PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport);\nBOOL WINAPI DetourEnumerateImports(_In_opt_ HMODULE hModule,\n                                   _In_opt_ PVOID pContext,\n                                   _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,\n                                   _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc);\n\nBOOL WINAPI DetourEnumerateImportsEx(_In_opt_ HMODULE hModule,\n                                     _In_opt_ PVOID pContext,\n                                     _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,\n                                     _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK_EX pfImportFuncEx);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourFindPayload(_In_opt_ HMODULE hModule,\n                               _In_ REFGUID rguid,\n                               _Out_ DWORD *pcbData);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourFindPayloadEx(_In_ REFGUID rguid,\n                                 _Out_ DWORD * pcbData);\n\nDWORD WINAPI DetourGetSizeOfPayloads(_In_opt_ HMODULE hModule);\n\n///////////////////////////////////////////////// Persistent Binary Functions.\n//\n\nPDETOUR_BINARY WINAPI DetourBinaryOpen(_In_ HANDLE hFile);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourBinaryEnumeratePayloads(_In_ PDETOUR_BINARY pBinary,\n                                           _Out_opt_ GUID *pGuid,\n                                           _Out_ DWORD *pcbData,\n                                           _Inout_ DWORD *pnIterator);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourBinaryFindPayload(_In_ PDETOUR_BINARY pBinary,\n                                     _In_ REFGUID rguid,\n                                     _Out_ DWORD *pcbData);\n\nPVOID WINAPI DetourBinarySetPayload(_In_ PDETOUR_BINARY pBinary,\n                                    _In_ REFGUID rguid,\n                                    _In_reads_opt_(cbData) PVOID pData,\n                                    _In_ DWORD cbData);\nBOOL WINAPI DetourBinaryDeletePayload(_In_ PDETOUR_BINARY pBinary, _In_ REFGUID rguid);\nBOOL WINAPI DetourBinaryPurgePayloads(_In_ PDETOUR_BINARY pBinary);\nBOOL WINAPI DetourBinaryResetImports(_In_ PDETOUR_BINARY pBinary);\nBOOL WINAPI DetourBinaryEditImports(_In_ PDETOUR_BINARY pBinary,\n                                    _In_opt_ PVOID pContext,\n                                    _In_opt_ PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway,\n                                    _In_opt_ PF_DETOUR_BINARY_FILE_CALLBACK pfFile,\n                                    _In_opt_ PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol,\n                                    _In_opt_ PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommit);\nBOOL WINAPI DetourBinaryWrite(_In_ PDETOUR_BINARY pBinary, _In_ HANDLE hFile);\nBOOL WINAPI DetourBinaryClose(_In_ PDETOUR_BINARY pBinary);\n\n/////////////////////////////////////////////////// Create Process & Load Dll.\n//\ntypedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA)(\n    _In_opt_ LPCSTR lpApplicationName,\n    _Inout_opt_ LPSTR lpCommandLine,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n    _In_ BOOL bInheritHandles,\n    _In_ DWORD dwCreationFlags,\n    _In_opt_ LPVOID lpEnvironment,\n    _In_opt_ LPCSTR lpCurrentDirectory,\n    _In_ LPSTARTUPINFOA lpStartupInfo,\n    _Out_ LPPROCESS_INFORMATION lpProcessInformation);\n\ntypedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW)(\n    _In_opt_ LPCWSTR lpApplicationName,\n    _Inout_opt_ LPWSTR lpCommandLine,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n    _In_ BOOL bInheritHandles,\n    _In_ DWORD dwCreationFlags,\n    _In_opt_ LPVOID lpEnvironment,\n    _In_opt_ LPCWSTR lpCurrentDirectory,\n    _In_ LPSTARTUPINFOW lpStartupInfo,\n    _Out_ LPPROCESS_INFORMATION lpProcessInformation);\n\nBOOL WINAPI DetourCreateProcessWithDllA(_In_opt_ LPCSTR lpApplicationName,\n                                        _Inout_opt_ LPSTR lpCommandLine,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                        _In_ BOOL bInheritHandles,\n                                        _In_ DWORD dwCreationFlags,\n                                        _In_opt_ LPVOID lpEnvironment,\n                                        _In_opt_ LPCSTR lpCurrentDirectory,\n                                        _In_ LPSTARTUPINFOA lpStartupInfo,\n                                        _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                        _In_ LPCSTR lpDllName,\n                                        _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourCreateProcessWithDllW(_In_opt_ LPCWSTR lpApplicationName,\n                                        _Inout_opt_ LPWSTR lpCommandLine,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                        _In_ BOOL bInheritHandles,\n                                        _In_ DWORD dwCreationFlags,\n                                        _In_opt_ LPVOID lpEnvironment,\n                                        _In_opt_ LPCWSTR lpCurrentDirectory,\n                                        _In_ LPSTARTUPINFOW lpStartupInfo,\n                                        _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                        _In_ LPCSTR lpDllName,\n                                        _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourCreateProcessWithDll      DetourCreateProcessWithDllW\n#define PDETOUR_CREATE_PROCESS_ROUTINE  PDETOUR_CREATE_PROCESS_ROUTINEW\n#else\n#define DetourCreateProcessWithDll      DetourCreateProcessWithDllA\n#define PDETOUR_CREATE_PROCESS_ROUTINE  PDETOUR_CREATE_PROCESS_ROUTINEA\n#endif // !UNICODE\n\nBOOL WINAPI DetourCreateProcessWithDllExA(_In_opt_ LPCSTR lpApplicationName,\n                                          _Inout_opt_ LPSTR lpCommandLine,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                          _In_ BOOL bInheritHandles,\n                                          _In_ DWORD dwCreationFlags,\n                                          _In_opt_ LPVOID lpEnvironment,\n                                          _In_opt_ LPCSTR lpCurrentDirectory,\n                                          _In_ LPSTARTUPINFOA lpStartupInfo,\n                                          _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                          _In_ LPCSTR lpDllName,\n                                          _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourCreateProcessWithDllExW(_In_opt_ LPCWSTR lpApplicationName,\n                                          _Inout_opt_  LPWSTR lpCommandLine,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                          _In_ BOOL bInheritHandles,\n                                          _In_ DWORD dwCreationFlags,\n                                          _In_opt_ LPVOID lpEnvironment,\n                                          _In_opt_ LPCWSTR lpCurrentDirectory,\n                                          _In_ LPSTARTUPINFOW lpStartupInfo,\n                                          _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                          _In_ LPCSTR lpDllName,\n                                          _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourCreateProcessWithDllEx    DetourCreateProcessWithDllExW\n#else\n#define DetourCreateProcessWithDllEx    DetourCreateProcessWithDllExA\n#endif // !UNICODE\n\nBOOL WINAPI DetourCreateProcessWithDllsA(_In_opt_ LPCSTR lpApplicationName,\n                                         _Inout_opt_ LPSTR lpCommandLine,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                         _In_ BOOL bInheritHandles,\n                                         _In_ DWORD dwCreationFlags,\n                                         _In_opt_ LPVOID lpEnvironment,\n                                         _In_opt_ LPCSTR lpCurrentDirectory,\n                                         _In_ LPSTARTUPINFOA lpStartupInfo,\n                                         _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                         _In_ DWORD nDlls,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourCreateProcessWithDllsW(_In_opt_ LPCWSTR lpApplicationName,\n                                         _Inout_opt_ LPWSTR lpCommandLine,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                         _In_ BOOL bInheritHandles,\n                                         _In_ DWORD dwCreationFlags,\n                                         _In_opt_ LPVOID lpEnvironment,\n                                         _In_opt_ LPCWSTR lpCurrentDirectory,\n                                         _In_ LPSTARTUPINFOW lpStartupInfo,\n                                         _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                         _In_ DWORD nDlls,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourCreateProcessWithDlls     DetourCreateProcessWithDllsW\n#else\n#define DetourCreateProcessWithDlls     DetourCreateProcessWithDllsA\n#endif // !UNICODE\n\nBOOL WINAPI DetourProcessViaHelperA(_In_ DWORD dwTargetPid,\n                                    _In_ LPCSTR lpDllName,\n                                    _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourProcessViaHelperW(_In_ DWORD dwTargetPid,\n                                    _In_ LPCSTR lpDllName,\n                                    _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourProcessViaHelper          DetourProcessViaHelperW\n#else\n#define DetourProcessViaHelper          DetourProcessViaHelperA\n#endif // !UNICODE\n\nBOOL WINAPI DetourProcessViaHelperDllsA(_In_ DWORD dwTargetPid,\n                                        _In_ DWORD nDlls,\n                                        _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                        _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,\n                                        _In_ DWORD nDlls,\n                                        _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                        _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourProcessViaHelperDlls      DetourProcessViaHelperDllsW\n#else\n#define DetourProcessViaHelperDlls      DetourProcessViaHelperDllsA\n#endif // !UNICODE\n\nBOOL WINAPI DetourUpdateProcessWithDll(_In_ HANDLE hProcess,\n                                       _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                       _In_ DWORD nDlls);\n\nBOOL WINAPI DetourUpdateProcessWithDllEx(_In_ HANDLE hProcess,\n                                         _In_ HMODULE hImage,\n                                         _In_ BOOL bIs32Bit,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_ DWORD nDlls);\n\nBOOL WINAPI DetourCopyPayloadToProcess(_In_ HANDLE hProcess,\n                                       _In_ REFGUID rguid,\n                                       _In_reads_bytes_(cbData) PVOID pvData,\n                                       _In_ DWORD cbData);\nBOOL WINAPI DetourRestoreAfterWith(VOID);\nBOOL WINAPI DetourRestoreAfterWithEx(_In_reads_bytes_(cbData) PVOID pvData,\n                                     _In_ DWORD cbData);\nBOOL WINAPI DetourIsHelperProcess(VOID);\nVOID CALLBACK DetourFinishHelperProcess(_In_ HWND,\n                                        _In_ HINSTANCE,\n                                        _In_ LPSTR,\n                                        _In_ INT);\n\n//\n//////////////////////////////////////////////////////////////////////////////\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n\n//////////////////////////////////////////////// Detours Internal Definitions.\n//\n#ifdef __cplusplus\n#ifdef DETOURS_INTERNAL\n\n#define NOTHROW\n// #define NOTHROW (nothrow)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#if (_MSC_VER < 1299)\n#include <imagehlp.h>\ntypedef IMAGEHLP_MODULE IMAGEHLP_MODULE64;\ntypedef PIMAGEHLP_MODULE PIMAGEHLP_MODULE64;\ntypedef IMAGEHLP_SYMBOL SYMBOL_INFO;\ntypedef PIMAGEHLP_SYMBOL PSYMBOL_INFO;\n\nstatic inline\nLONG InterlockedCompareExchange(_Inout_ LONG *ptr, _In_ LONG nval, _In_ LONG oval)\n{\n    return (LONG)::InterlockedCompareExchange((PVOID*)ptr, (PVOID)nval, (PVOID)oval);\n}\n#else\n#pragma warning(push)\n#pragma warning(disable:4091) // empty typedef\n#include <dbghelp.h>\n#pragma warning(pop)\n#endif\n\n#ifdef IMAGEAPI // defined by DBGHELP.H\ntypedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(_In_ LPAPI_VERSION AppVersion);\n\ntypedef BOOL (NTAPI *PF_SymInitialize)(_In_ HANDLE hProcess,\n                                       _In_opt_ LPCSTR UserSearchPath,\n                                       _In_ BOOL fInvadeProcess);\ntypedef DWORD (NTAPI *PF_SymSetOptions)(_In_ DWORD SymOptions);\ntypedef DWORD (NTAPI *PF_SymGetOptions)(VOID);\ntypedef DWORD64 (NTAPI *PF_SymLoadModule64)(_In_ HANDLE hProcess,\n                                            _In_opt_ HANDLE hFile,\n                                            _In_ LPSTR ImageName,\n                                            _In_opt_ LPSTR ModuleName,\n                                            _In_ DWORD64 BaseOfDll,\n                                            _In_opt_ DWORD SizeOfDll);\ntypedef BOOL (NTAPI *PF_SymGetModuleInfo64)(_In_ HANDLE hProcess,\n                                            _In_ DWORD64 qwAddr,\n                                            _Out_ PIMAGEHLP_MODULE64 ModuleInfo);\ntypedef BOOL (NTAPI *PF_SymFromName)(_In_ HANDLE hProcess,\n                                     _In_ LPSTR Name,\n                                     _Out_ PSYMBOL_INFO Symbol);\n\ntypedef struct _DETOUR_SYM_INFO\n{\n    HANDLE                  hProcess;\n    HMODULE                 hDbgHelp;\n    PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx;\n    PF_SymInitialize        pfSymInitialize;\n    PF_SymSetOptions        pfSymSetOptions;\n    PF_SymGetOptions        pfSymGetOptions;\n    PF_SymLoadModule64      pfSymLoadModule64;\n    PF_SymGetModuleInfo64   pfSymGetModuleInfo64;\n    PF_SymFromName          pfSymFromName;\n} DETOUR_SYM_INFO, *PDETOUR_SYM_INFO;\n\nPDETOUR_SYM_INFO DetourLoadImageHlp(VOID);\n\n#endif // IMAGEAPI\n\n#if defined(_INC_STDIO) && !defined(_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS)\n#error detours.h must be included before stdio.h (or at least define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS earlier)\n#endif\n#define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS 1\n\n#ifndef DETOUR_TRACE\n#if DETOUR_DEBUG\n#define DETOUR_TRACE(x) printf x\n#define DETOUR_BREAK()  __debugbreak()\n#include <stdio.h>\n#include <limits.h>\n#else\n#define DETOUR_TRACE(x)\n#define DETOUR_BREAK()\n#endif\n#endif\n\n#if 1 || defined(DETOURS_IA64)\n\n//\n// IA64 instructions are 41 bits, 3 per bundle, plus 5 bit bundle template => 128 bits per bundle.\n//\n\n#define DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE (3)\n\n#define DETOUR_IA64_TEMPLATE_OFFSET (0)\n#define DETOUR_IA64_TEMPLATE_SIZE   (5)\n\n#define DETOUR_IA64_INSTRUCTION_SIZE (41)\n#define DETOUR_IA64_INSTRUCTION0_OFFSET (DETOUR_IA64_TEMPLATE_SIZE)\n#define DETOUR_IA64_INSTRUCTION1_OFFSET (DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTION_SIZE)\n#define DETOUR_IA64_INSTRUCTION2_OFFSET (DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTION_SIZE + DETOUR_IA64_INSTRUCTION_SIZE)\n\nC_ASSERT(DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE * DETOUR_IA64_INSTRUCTION_SIZE == 128);\n\n__declspec(align(16)) struct DETOUR_IA64_BUNDLE\n{\n  public:\n    union\n    {\n        BYTE    data[16];\n        UINT64  wide[2];\n    };\n\n    enum {\n        A_UNIT  = 1u,\n        I_UNIT  = 2u,\n        M_UNIT  = 3u,\n        B_UNIT  = 4u,\n        F_UNIT  = 5u,\n        L_UNIT  = 6u,\n        X_UNIT  = 7u,\n    };\n    struct DETOUR_IA64_METADATA\n    {\n        ULONG       nTemplate       : 8;    // Instruction template.\n        ULONG       nUnit0          : 4;    // Unit for slot 0\n        ULONG       nUnit1          : 4;    // Unit for slot 1\n        ULONG       nUnit2          : 4;    // Unit for slot 2\n    };\n\n  protected:\n    static const DETOUR_IA64_METADATA s_rceCopyTable[33];\n\n    UINT RelocateBundle(_Inout_ DETOUR_IA64_BUNDLE* pDst, _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const;\n\n    bool RelocateInstruction(_Inout_ DETOUR_IA64_BUNDLE* pDst,\n                             _In_ BYTE slot,\n                             _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const;\n\n    // 120 112 104 96 88 80 72 64 56 48 40 32 24 16  8  0\n    //  f.  e.  d. c. b. a. 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.\n\n    //                                      00\n    // f.e. d.c. b.a. 9.8. 7.6. 5.4. 3.2. 1.0.\n    // 0000 0000 0000 0000 0000 0000 0000 001f : Template [4..0]\n    // 0000 0000 0000 0000 0000 03ff ffff ffe0 : Zero [ 41..  5]\n    // 0000 0000 0000 0000 0000 3c00 0000 0000 : Zero [ 45.. 42]\n    // 0000 0000 0007 ffff ffff c000 0000 0000 : One  [ 82.. 46]\n    // 0000 0000 0078 0000 0000 0000 0000 0000 : One  [ 86.. 83]\n    // 0fff ffff ff80 0000 0000 0000 0000 0000 : Two  [123.. 87]\n    // f000 0000 0000 0000 0000 0000 0000 0000 : Two  [127..124]\n    BYTE    GetTemplate() const;\n    // Get 4 bit opcodes.\n    BYTE    GetInst0() const;\n    BYTE    GetInst1() const;\n    BYTE    GetInst2() const;\n    BYTE    GetUnit(BYTE slot) const;\n    BYTE    GetUnit0() const;\n    BYTE    GetUnit1() const;\n    BYTE    GetUnit2() const;\n    // Get 37 bit data.\n    UINT64  GetData0() const;\n    UINT64  GetData1() const;\n    UINT64  GetData2() const;\n\n    // Get/set the full 41 bit instructions.\n    UINT64  GetInstruction(BYTE slot) const;\n    UINT64  GetInstruction0() const;\n    UINT64  GetInstruction1() const;\n    UINT64  GetInstruction2() const;\n    void    SetInstruction(BYTE slot, UINT64 instruction);\n    void    SetInstruction0(UINT64 instruction);\n    void    SetInstruction1(UINT64 instruction);\n    void    SetInstruction2(UINT64 instruction);\n\n    // Get/set bitfields.\n    static UINT64 GetBits(UINT64 Value, UINT64 Offset, UINT64 Count);\n    static UINT64 SetBits(UINT64 Value, UINT64 Offset, UINT64 Count, UINT64 Field);\n\n    // Get specific read-only fields.\n    static UINT64 GetOpcode(UINT64 instruction); // 4bit opcode\n    static UINT64 GetX(UINT64 instruction); // 1bit opcode extension\n    static UINT64 GetX3(UINT64 instruction); // 3bit opcode extension\n    static UINT64 GetX6(UINT64 instruction); // 6bit opcode extension\n\n    // Get/set specific fields.\n    static UINT64 GetImm7a(UINT64 instruction);\n    static UINT64 SetImm7a(UINT64 instruction, UINT64 imm7a);\n    static UINT64 GetImm13c(UINT64 instruction);\n    static UINT64 SetImm13c(UINT64 instruction, UINT64 imm13c);\n    static UINT64 GetSignBit(UINT64 instruction);\n    static UINT64 SetSignBit(UINT64 instruction, UINT64 signBit);\n    static UINT64 GetImm20a(UINT64 instruction);\n    static UINT64 SetImm20a(UINT64 instruction, UINT64 imm20a);\n    static UINT64 GetImm20b(UINT64 instruction);\n    static UINT64 SetImm20b(UINT64 instruction, UINT64 imm20b);\n\n    static UINT64 SignExtend(UINT64 Value, UINT64 Offset);\n\n    BOOL    IsMovlGp() const;\n\n    VOID    SetInst(BYTE Slot, BYTE nInst);\n    VOID    SetInst0(BYTE nInst);\n    VOID    SetInst1(BYTE nInst);\n    VOID    SetInst2(BYTE nInst);\n    VOID    SetData(BYTE Slot, UINT64 nData);\n    VOID    SetData0(UINT64 nData);\n    VOID    SetData1(UINT64 nData);\n    VOID    SetData2(UINT64 nData);\n    BOOL    SetNop(BYTE Slot);\n    BOOL    SetNop0();\n    BOOL    SetNop1();\n    BOOL    SetNop2();\n\n  public:\n    BOOL    IsBrl() const;\n    VOID    SetBrl();\n    VOID    SetBrl(UINT64 target);\n    UINT64  GetBrlTarget() const;\n    VOID    SetBrlTarget(UINT64 target);\n    VOID    SetBrlImm(UINT64 imm);\n    UINT64  GetBrlImm() const;\n\n    UINT64  GetMovlGp() const;\n    VOID    SetMovlGp(UINT64 gp);\n\n    VOID    SetStop();\n\n    UINT    Copy(_Out_ DETOUR_IA64_BUNDLE *pDst, _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra = NULL) const;\n};\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_ARM\n\n#define DETOURS_PFUNC_TO_PBYTE(p)  ((PBYTE)(((ULONG_PTR)(p)) & ~(ULONG_PTR)1))\n#define DETOURS_PBYTE_TO_PFUNC(p)  ((PBYTE)(((ULONG_PTR)(p)) | (ULONG_PTR)1))\n\n#endif // DETOURS_ARM\n\n//////////////////////////////////////////////////////////////////////////////\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n#define DETOUR_OFFLINE_LIBRARY(x)                                       \\\nPVOID WINAPI DetourCopyInstruction##x(_In_opt_ PVOID pDst,              \\\n                                      _Inout_opt_ PVOID *ppDstPool,     \\\n                                      _In_ PVOID pSrc,                  \\\n                                      _Out_opt_ PVOID *ppTarget,        \\\n                                      _Out_opt_ LONG *plExtra);         \\\n                                                                        \\\nBOOL WINAPI DetourSetCodeModule##x(_In_ HMODULE hModule,                \\\n                                   _In_ BOOL fLimitReferencesToModule); \\\n\nDETOUR_OFFLINE_LIBRARY(X86)\nDETOUR_OFFLINE_LIBRARY(X64)\nDETOUR_OFFLINE_LIBRARY(ARM)\nDETOUR_OFFLINE_LIBRARY(ARM64)\nDETOUR_OFFLINE_LIBRARY(IA64)\n\n#undef DETOUR_OFFLINE_LIBRARY\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Helpers for manipulating page protection.\n//\n\n_Success_(return != FALSE)\nBOOL WINAPI DetourVirtualProtectSameExecuteEx(_In_  HANDLE hProcess,\n                                              _In_  PVOID pAddress,\n                                              _In_  SIZE_T nSize,\n                                              _In_  DWORD dwNewProtect,\n                                              _Out_ PDWORD pdwOldProtect);\n\n_Success_(return != FALSE)\nBOOL WINAPI DetourVirtualProtectSameExecute(_In_  PVOID pAddress,\n                                            _In_  SIZE_T nSize,\n                                            _In_  DWORD dwNewProtect,\n                                            _Out_ PDWORD pdwOldProtect);\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n\n//////////////////////////////////////////////////////////////////////////////\n\n#define MM_ALLOCATION_GRANULARITY 0x10000\n\n//////////////////////////////////////////////////////////////////////////////\n\n#endif // DETOURS_INTERNAL\n#endif // __cplusplus\n\n#endif // _DETOURS_H_\n//\n////////////////////////////////////////////////////////////////  End of File.\n"
  },
  {
    "path": "source-code/dependencies/detours/include/detver.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Common version parameters.\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#define _USING_V110_SDK71_ 1\n#include \"winver.h\"\n#if 0\n#include <windows.h>\n#include <detours.h>\n#else\n#ifndef DETOURS_STRINGIFY\n#define DETOURS_STRINGIFY(x)    DETOURS_STRINGIFY_(x)\n#define DETOURS_STRINGIFY_(x)    #x\n#endif\n\n#define VER_FILEFLAGSMASK   0x3fL\n#define VER_FILEFLAGS       0x0L\n#define VER_FILEOS          0x00040004L\n#define VER_FILETYPE        0x00000002L\n#define VER_FILESUBTYPE     0x00000000L\n#endif\n#define VER_DETOURS_BITS    DETOUR_STRINGIFY(DETOURS_BITS)\n"
  },
  {
    "path": "source-code/dependencies/detours/include/syelog.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (syelog.h of syelog.lib)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#pragma once\n#ifndef _SYELOGD_H_\n#define _SYELOGD_H_\n#include <stdarg.h>\n\n#pragma pack(push, 1)\n#pragma warning(push)\n#pragma warning(disable: 4200)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//\n#define SYELOG_PIPE_NAMEA       \"\\\\\\\\.\\\\pipe\\\\syelog\"\n#define SYELOG_PIPE_NAMEW       L\"\\\\\\\\.\\\\pipe\\\\syelog\"\n#ifdef UNICODE\n#define SYELOG_PIPE_NAME        SYELOG_PIPE_NAMEW\n#else\n#define SYELOG_PIPE_NAME        SYELOG_PIPE_NAMEA\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#define SYELOG_MAXIMUM_MESSAGE  4086    // 4096 - sizeof(header stuff)\n\ntypedef struct _SYELOG_MESSAGE\n{\n    USHORT      nBytes;\n    BYTE        nFacility;\n    BYTE        nSeverity;\n    DWORD       nProcessId;\n    FILETIME    ftOccurance;\n    BOOL        fTerminate;\n    CHAR        szMessage[SYELOG_MAXIMUM_MESSAGE];\n} SYELOG_MESSAGE, *PSYELOG_MESSAGE;\n\n\n// Facility Codes.\n//\n#define SYELOG_FACILITY_KERNEL          0x10            // OS Kernel\n#define SYELOG_FACILITY_SECURITY        0x20            // OS Security\n#define SYELOG_FACILITY_LOGGING         0x30            // OS Logging-internal\n#define SYELOG_FACILITY_SERVICE         0x40            // User-mode system daemon\n#define SYELOG_FACILITY_APPLICATION     0x50            // User-mode application\n#define SYELOG_FACILITY_USER            0x60            // User self-generated.\n#define SYELOG_FACILITY_LOCAL0          0x70            // Locally defined.\n#define SYELOG_FACILITY_LOCAL1          0x71            // Locally defined.\n#define SYELOG_FACILITY_LOCAL2          0x72            // Locally defined.\n#define SYELOG_FACILITY_LOCAL3          0x73            // Locally defined.\n#define SYELOG_FACILITY_LOCAL4          0x74            // Locally defined.\n#define SYELOG_FACILITY_LOCAL5          0x75            // Locally defined.\n#define SYELOG_FACILITY_LOCAL6          0x76            // Locally defined.\n#define SYELOG_FACILITY_LOCAL7          0x77            // Locally defined.\n#define SYELOG_FACILITY_LOCAL8          0x78            // Locally defined.\n#define SYELOG_FACILITY_LOCAL9          0x79            // Locally defined.\n\n// Severity Codes.\n//\n#define SYELOG_SEVERITY_FATAL           0x00            // System is dead.\n#define SYELOG_SEVERITY_ALERT           0x10            // Take action immediately.\n#define SYELOG_SEVERITY_CRITICAL        0x20            // Critical condition.\n#define SYELOG_SEVERITY_ERROR           0x30            // Error\n#define SYELOG_SEVERITY_WARNING         0x40            // Warning\n#define SYELOG_SEVERITY_NOTICE          0x50            // Significant condition.\n#define SYELOG_SEVERITY_INFORMATION     0x60            // Informational\n#define SYELOG_SEVERITY_AUDIT_FAIL      0x66            // Audit Failed\n#define SYELOG_SEVERITY_AUDIT_PASS      0x67            // Audit Succeeeded\n#define SYELOG_SEVERITY_DEBUG           0x70            // Debugging\n\n// Logging Functions.\n//\nVOID SyelogOpen(PCSTR pszIdentifier, BYTE nFacility);\nVOID Syelog(BYTE nSeverity, PCSTR pszMsgf, ...);\nVOID SyelogV(BYTE nSeverity, PCSTR pszMsgf, va_list args);\nVOID SyelogClose(BOOL fTerminate);\n\n#pragma warning(pop)\n#pragma pack(pop)\n\n#endif //  _SYELOGD_H_\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "source-code/dependencies/freeglut/include/GL/freeglut.h",
    "content": "#ifndef  __FREEGLUT_H__\n#define  __FREEGLUT_H__\n\n/*\n * freeglut.h\n *\n * The freeglut library include file\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"freeglut_std.h\"\n#include \"freeglut_ext.h\"\n\n/*** END OF FILE ***/\n\n#endif /* __FREEGLUT_H__ */\n"
  },
  {
    "path": "source-code/dependencies/freeglut/include/GL/freeglut_ext.h",
    "content": "#ifndef  __FREEGLUT_EXT_H__\n#define  __FREEGLUT_EXT_H__\n\n/*\n * freeglut_ext.h\n *\n * The non-GLUT-compatible extensions to the freeglut library include file\n *\n * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\n * Written by Pawel W. Olszta, <olszta@sourceforge.net>\n * Creation date: Thu Dec 2 1999\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\n/*\n * Additional GLUT Key definitions for the Special key function\n */\n#define GLUT_KEY_NUM_LOCK           0x006D\n#define GLUT_KEY_BEGIN              0x006E\n#define GLUT_KEY_DELETE             0x006F\n#define GLUT_KEY_SHIFT_L            0x0070\n#define GLUT_KEY_SHIFT_R            0x0071\n#define GLUT_KEY_CTRL_L             0x0072\n#define GLUT_KEY_CTRL_R             0x0073\n#define GLUT_KEY_ALT_L              0x0074\n#define GLUT_KEY_ALT_R              0x0075\n\n/*\n * GLUT API Extension macro definitions -- behaviour when the user clicks on an \"x\" to close a window\n */\n#define GLUT_ACTION_EXIT                         0\n#define GLUT_ACTION_GLUTMAINLOOP_RETURNS         1\n#define GLUT_ACTION_CONTINUE_EXECUTION           2\n\n/*\n * Create a new rendering context when the user opens a new window?\n */\n#define GLUT_CREATE_NEW_CONTEXT                  0\n#define GLUT_USE_CURRENT_CONTEXT                 1\n\n/*\n * Direct/Indirect rendering context options (has meaning only in Unix/X11)\n */\n#define GLUT_FORCE_INDIRECT_CONTEXT              0\n#define GLUT_ALLOW_DIRECT_CONTEXT                1\n#define GLUT_TRY_DIRECT_CONTEXT                  2\n#define GLUT_FORCE_DIRECT_CONTEXT                3\n\n/*\n * GLUT API Extension macro definitions -- the glutGet parameters\n */\n#define  GLUT_INIT_STATE                    0x007C\n\n#define  GLUT_ACTION_ON_WINDOW_CLOSE        0x01F9\n\n#define  GLUT_WINDOW_BORDER_WIDTH           0x01FA\n#define  GLUT_WINDOW_BORDER_HEIGHT          0x01FB\n#define  GLUT_WINDOW_HEADER_HEIGHT          0x01FB  /* Docs say it should always have been GLUT_WINDOW_BORDER_HEIGHT, keep this for backward compatibility */\n\n#define  GLUT_VERSION                       0x01FC\n\n#define  GLUT_RENDERING_CONTEXT             0x01FD\n#define  GLUT_DIRECT_RENDERING              0x01FE\n\n#define  GLUT_FULL_SCREEN                   0x01FF\n\n#define  GLUT_SKIP_STALE_MOTION_EVENTS      0x0204\n\n#define  GLUT_GEOMETRY_VISUALIZE_NORMALS    0x0205\n\n#define  GLUT_STROKE_FONT_DRAW_JOIN_DOTS    0x0206  /* Draw dots between line segments of stroke fonts? */\n\n#define  GLUT_ALLOW_NEGATIVE_WINDOW_POSITION 0x0207 /* GLUT doesn't allow negative window positions by default */\n\n#define  GLUT_WINDOW_SRGB                   0x007D\n\n/*\n * New tokens for glutInitDisplayMode.\n * Only one GLUT_AUXn bit may be used at a time.\n * Value 0x0400 is defined in OpenGLUT.\n */\n#define  GLUT_AUX                           0x1000\n\n#define  GLUT_AUX1                          0x1000\n#define  GLUT_AUX2                          0x2000\n#define  GLUT_AUX3                          0x4000\n#define  GLUT_AUX4                          0x8000\n\n/*\n * Context-related flags, see fg_state.c\n * Set the requested OpenGL version\n */\n#define  GLUT_INIT_MAJOR_VERSION            0x0200\n#define  GLUT_INIT_MINOR_VERSION            0x0201\n#define  GLUT_INIT_FLAGS                    0x0202\n#define  GLUT_INIT_PROFILE                  0x0203\n\n/*\n * Flags for glutInitContextFlags, see fg_init.c\n */\n#define  GLUT_DEBUG                         0x0001\n#define  GLUT_FORWARD_COMPATIBLE            0x0002\n\n\n/*\n * Flags for glutInitContextProfile, see fg_init.c\n */\n#define GLUT_CORE_PROFILE                   0x0001\n#define\tGLUT_COMPATIBILITY_PROFILE          0x0002\n\n/*\n* GLUT API Extension macro definitions -- Spaceball button definitions\n*/\n\n#define  GLUT_SPACEBALL_BUTTON_A            0x0001\n#define  GLUT_SPACEBALL_BUTTON_B            0x0002\n#define  GLUT_SPACEBALL_BUTTON_C            0x0004\n#define  GLUT_SPACEBALL_BUTTON_D            0x0008\n#define  GLUT_SPACEBALL_BUTTON_E            0x0010\n\n/*\n * Process loop function, see fg_main.c\n */\nFGAPI void    FGAPIENTRY glutMainLoopEvent( void );\nFGAPI void    FGAPIENTRY glutLeaveMainLoop( void );\nFGAPI void    FGAPIENTRY glutExit         ( void );\n\n/*\n * Window management functions, see fg_window.c\n */\nFGAPI void    FGAPIENTRY glutFullScreenToggle( void );\nFGAPI void    FGAPIENTRY glutLeaveFullScreen( void );\n\n/*\n * Menu functions\n */\nFGAPI void    FGAPIENTRY glutSetMenuFont( int menuID, void* font );\n\n/*\n * Window-specific callback functions, see fg_callbacks.c\n */\nFGAPI void    FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) );\nFGAPI void    FGAPIENTRY glutPositionFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutCloseFunc( void (* callback)( void ) );\nFGAPI void    FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) );\n/* And also a destruction callback for menus */\nFGAPI void    FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) );\n\n/*\n * State setting and retrieval functions, see fg_state.c\n */\nFGAPI void    FGAPIENTRY glutSetOption ( GLenum option_flag, int value );\nFGAPI int *   FGAPIENTRY glutGetModeValues(GLenum mode, int * size);\n/* A.Donev: User-data manipulation */\nFGAPI void*   FGAPIENTRY glutGetWindowData( void );\nFGAPI void    FGAPIENTRY glutSetWindowData(void* data);\nFGAPI void*   FGAPIENTRY glutGetMenuData( void );\nFGAPI void    FGAPIENTRY glutSetMenuData(void* data);\n\n/*\n * Font stuff, see fg_font.c\n */\nFGAPI int     FGAPIENTRY glutBitmapHeight( void* font );\nFGAPI GLfloat FGAPIENTRY glutStrokeHeight( void* font );\nFGAPI void    FGAPIENTRY glutBitmapString( void* font, const unsigned char *string );\nFGAPI void    FGAPIENTRY glutStrokeString( void* font, const unsigned char *string );\n\n/*\n * Geometry functions, see fg_geometry.c\n */\nFGAPI void    FGAPIENTRY glutWireRhombicDodecahedron( void );\nFGAPI void    FGAPIENTRY glutSolidRhombicDodecahedron( void );\nFGAPI void    FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, double offset[3], double scale );\nFGAPI void    FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, double offset[3], double scale );\nFGAPI void    FGAPIENTRY glutWireCylinder( double radius, double height, GLint slices, GLint stacks);\nFGAPI void    FGAPIENTRY glutSolidCylinder( double radius, double height, GLint slices, GLint stacks);\n\n/*\n * Rest of functions for rendering Newell's teaset, found in fg_teapot.c\n * NB: front facing polygons have clockwise winding, not counter clockwise\n */\nFGAPI void    FGAPIENTRY glutWireTeacup( double size );\nFGAPI void    FGAPIENTRY glutSolidTeacup( double size );\nFGAPI void    FGAPIENTRY glutWireTeaspoon( double size );\nFGAPI void    FGAPIENTRY glutSolidTeaspoon( double size );\n\n/*\n * Extension functions, see fg_ext.c\n */\ntypedef void (*GLUTproc)();\nFGAPI GLUTproc FGAPIENTRY glutGetProcAddress( const char *procName );\n\n/*\n * Multi-touch/multi-pointer extensions\n */\n\n#define GLUT_HAS_MULTI 1\n\n/* TODO: add device_id parameter,\n   cf. http://sourceforge.net/mailarchive/forum.php?thread_name=20120518071314.GA28061%40perso.beuc.net&forum_name=freeglut-developer */\nFGAPI void FGAPIENTRY glutMultiEntryFunc( void (* callback)( int, int ) );\nFGAPI void FGAPIENTRY glutMultiButtonFunc( void (* callback)( int, int, int, int, int ) );\nFGAPI void FGAPIENTRY glutMultiMotionFunc( void (* callback)( int, int, int ) );\nFGAPI void FGAPIENTRY glutMultiPassiveFunc( void (* callback)( int, int, int ) );\n\n/*\n * Joystick functions, see fg_joystick.c\n */\n/* USE OF THESE FUNCTIONS IS DEPRECATED !!!!! */\n/* If you have a serious need for these functions in your application, please either\n * contact the \"freeglut\" developer community at freeglut-developer@lists.sourceforge.net,\n * switch to the OpenGLUT library, or else port your joystick functionality over to PLIB's\n * \"js\" library.\n */\nint     glutJoystickGetNumAxes( int ident );\nint     glutJoystickGetNumButtons( int ident );\nint     glutJoystickNotWorking( int ident );\nfloat   glutJoystickGetDeadBand( int ident, int axis );\nvoid    glutJoystickSetDeadBand( int ident, int axis, float db );\nfloat   glutJoystickGetSaturation( int ident, int axis );\nvoid    glutJoystickSetSaturation( int ident, int axis, float st );\nvoid    glutJoystickSetMinRange( int ident, float *axes );\nvoid    glutJoystickSetMaxRange( int ident, float *axes );\nvoid    glutJoystickSetCenter( int ident, float *axes );\nvoid    glutJoystickGetMinRange( int ident, float *axes );\nvoid    glutJoystickGetMaxRange( int ident, float *axes );\nvoid    glutJoystickGetCenter( int ident, float *axes );\n\n/*\n * Initialization functions, see fg_init.c\n */\n/* to get the typedef for va_list */\n#include <stdarg.h>\nFGAPI void    FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion );\nFGAPI void    FGAPIENTRY glutInitContextFlags( int flags );\nFGAPI void    FGAPIENTRY glutInitContextProfile( int profile );\nFGAPI void    FGAPIENTRY glutInitErrorFunc( void (* callback)( const char *fmt, va_list ap ) );\nFGAPI void    FGAPIENTRY glutInitWarningFunc( void (* callback)( const char *fmt, va_list ap ) );\n\n/* OpenGL >= 2.0 support */\nFGAPI void    FGAPIENTRY glutSetVertexAttribCoord3( GLint attrib );\nFGAPI void    FGAPIENTRY glutSetVertexAttribNormal( GLint attrib );\nFGAPI void    FGAPIENTRY glutSetVertexAttribTexCoord2( GLint attrib );\n\n/* Mobile platforms lifecycle */\nFGAPI void    FGAPIENTRY glutInitContextFunc( void (* callback)( void ) );\nFGAPI void    FGAPIENTRY glutAppStatusFunc( void (* callback)( int ) );\n/* state flags that can be passed to callback set by glutAppStatusFunc */\n#define GLUT_APPSTATUS_PAUSE                0x0001\n#define GLUT_APPSTATUS_RESUME               0x0002\n\n/*\n * GLUT API macro definitions -- the display mode definitions\n */\n#define  GLUT_CAPTIONLESS                   0x0400\n#define  GLUT_BORDERLESS                    0x0800\n#define  GLUT_SRGB                          0x1000\n\n/* User-argument callbacks and implementation */\n#include \"freeglut_ucall.h\"\n\n#ifdef __cplusplus\n    }\n#endif\n\n/*** END OF FILE ***/\n\n#endif /* __FREEGLUT_EXT_H__ */\n"
  },
  {
    "path": "source-code/dependencies/freeglut/include/GL/freeglut_std.h",
    "content": "#ifndef  __FREEGLUT_STD_H__\n#define  __FREEGLUT_STD_H__\n\n/*\n * freeglut_std.h\n *\n * The GLUT-compatible part of the freeglut library include file\n *\n * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\n * Written by Pawel W. Olszta, <olszta@sourceforge.net>\n * Creation date: Thu Dec 2 1999\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\n/*\n * Under windows, we have to differentiate between static and dynamic libraries\n */\n#ifdef _WIN32\n/* #pragma may not be supported by some compilers.\n * Discussion by FreeGLUT developers suggests that\n * Visual C++ specific code involving pragmas may\n * need to move to a separate header.  24th Dec 2003\n */\n\n/* Define FREEGLUT_LIB_PRAGMAS to 1 to include library\n * pragmas or to 0 to exclude library pragmas.\n * The default behavior depends on the compiler/platform.\n */\n#   ifndef FREEGLUT_LIB_PRAGMAS\n#       if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(_WIN32_WCE)\n#           define FREEGLUT_LIB_PRAGMAS 1\n#       else\n#           define FREEGLUT_LIB_PRAGMAS 0\n#       endif\n#   endif\n\n#  ifndef WIN32_LEAN_AND_MEAN\n#    define WIN32_LEAN_AND_MEAN 1\n#  endif\n#  ifndef NOMINMAX\n#    define NOMINMAX\n#  endif\n#   include <windows.h>\n\n/* Windows static library */\n#   ifdef FREEGLUT_STATIC\n\n#       define FGAPI\n#       define FGAPIENTRY\n\n        /* Link with Win32 static freeglut lib */\n#       if FREEGLUT_LIB_PRAGMAS\n#           ifdef NDEBUG\n#              pragma comment (lib, \"freeglut_static.lib\")\n#           else\n#              pragma comment (lib, \"freeglut_staticd.lib\")\n#           endif\n#       endif\n\n/* Windows shared library (DLL) */\n#   else\n\n#       define FGAPIENTRY __stdcall\n#       if defined(FREEGLUT_EXPORTS)\n#           define FGAPI __declspec(dllexport)\n#       else\n#           define FGAPI __declspec(dllimport)\n\n            /* Link with Win32 shared freeglut lib */\n#           if FREEGLUT_LIB_PRAGMAS\n#               ifdef NDEBUG\n#                   pragma comment (lib, \"freeglut.lib\")\n#               else\n#                   pragma comment (lib, \"freeglutd.lib\")\n#               endif\n#           endif\n\n#       endif\n\n#   endif\n\n/* Drag in other Windows libraries as required by FreeGLUT */\n#   if FREEGLUT_LIB_PRAGMAS\n#       pragma comment (lib, \"glu32.lib\")    /* link OpenGL Utility lib     */\n#       pragma comment (lib, \"opengl32.lib\") /* link Microsoft OpenGL lib   */\n#       pragma comment (lib, \"gdi32.lib\")    /* link Windows GDI lib        */\n#       pragma comment (lib, \"winmm.lib\")    /* link Windows MultiMedia lib */\n#       pragma comment (lib, \"user32.lib\")   /* link Windows user lib       */\n#   endif\n\n#else\n\n/* Non-Windows definition of FGAPI and FGAPIENTRY  */\n#        define FGAPI\n#        define FGAPIENTRY\n\n#endif\n\n/*\n * The freeglut and GLUT API versions\n */\n#define  FREEGLUT             1\n#define  GLUT_API_VERSION     4\n#define  GLUT_XLIB_IMPLEMENTATION 13\n/* Deprecated:\n   cf. http://sourceforge.net/mailarchive/forum.php?thread_name=CABcAi1hw7cr4xtigckaGXB5X8wddLfMcbA_rZ3NAuwMrX_zmsw%40mail.gmail.com&forum_name=freeglut-developer */\n#define  FREEGLUT_VERSION_2_0 1\n\n/*\n * Always include OpenGL and GLU headers\n */\n/* Note: FREEGLUT_GLES is only used to cleanly bootstrap headers\n   inclusion here; use GLES constants directly\n   (e.g. GL_ES_VERSION_2_0) for all other needs */\n#ifdef FREEGLUT_GLES\n#   include <EGL/egl.h>\n#   include <GLES/gl.h>\n#   include <GLES2/gl2.h>\n#elif __APPLE__\n#   include <OpenGL/gl.h>\n#   include <OpenGL/glu.h>\n#else\n#   include <GL/gl.h>\n#   include <GL/glu.h>\n#endif\n\n/*\n * GLUT API macro definitions -- the special key codes:\n */\n#define  GLUT_KEY_F1                        0x0001\n#define  GLUT_KEY_F2                        0x0002\n#define  GLUT_KEY_F3                        0x0003\n#define  GLUT_KEY_F4                        0x0004\n#define  GLUT_KEY_F5                        0x0005\n#define  GLUT_KEY_F6                        0x0006\n#define  GLUT_KEY_F7                        0x0007\n#define  GLUT_KEY_F8                        0x0008\n#define  GLUT_KEY_F9                        0x0009\n#define  GLUT_KEY_F10                       0x000A\n#define  GLUT_KEY_F11                       0x000B\n#define  GLUT_KEY_F12                       0x000C\n#define  GLUT_KEY_LEFT                      0x0064\n#define  GLUT_KEY_UP                        0x0065\n#define  GLUT_KEY_RIGHT                     0x0066\n#define  GLUT_KEY_DOWN                      0x0067\n#define  GLUT_KEY_PAGE_UP                   0x0068\n#define  GLUT_KEY_PAGE_DOWN                 0x0069\n#define  GLUT_KEY_HOME                      0x006A\n#define  GLUT_KEY_END                       0x006B\n#define  GLUT_KEY_INSERT                    0x006C\n\n/*\n * GLUT API macro definitions -- mouse state definitions\n */\n#define  GLUT_LEFT_BUTTON                   0x0000\n#define  GLUT_MIDDLE_BUTTON                 0x0001\n#define  GLUT_RIGHT_BUTTON                  0x0002\n#define  GLUT_DOWN                          0x0000\n#define  GLUT_UP                            0x0001\n#define  GLUT_LEFT                          0x0000\n#define  GLUT_ENTERED                       0x0001\n\n/*\n * GLUT API macro definitions -- the display mode definitions\n */\n#define  GLUT_RGB                           0x0000\n#define  GLUT_RGBA                          0x0000\n#define  GLUT_INDEX                         0x0001\n#define  GLUT_SINGLE                        0x0000\n#define  GLUT_DOUBLE                        0x0002\n#define  GLUT_ACCUM                         0x0004\n#define  GLUT_ALPHA                         0x0008\n#define  GLUT_DEPTH                         0x0010\n#define  GLUT_STENCIL                       0x0020\n#define  GLUT_MULTISAMPLE                   0x0080\n#define  GLUT_STEREO                        0x0100\n#define  GLUT_LUMINANCE                     0x0200\n\n/*\n * GLUT API macro definitions -- windows and menu related definitions\n */\n#define  GLUT_MENU_NOT_IN_USE               0x0000\n#define  GLUT_MENU_IN_USE                   0x0001\n#define  GLUT_NOT_VISIBLE                   0x0000\n#define  GLUT_VISIBLE                       0x0001\n#define  GLUT_HIDDEN                        0x0000\n#define  GLUT_FULLY_RETAINED                0x0001\n#define  GLUT_PARTIALLY_RETAINED            0x0002\n#define  GLUT_FULLY_COVERED                 0x0003\n\n/*\n * GLUT API macro definitions -- fonts definitions\n *\n * Steve Baker suggested to make it binary compatible with GLUT:\n */\n#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WATCOMC__)\n#   define  GLUT_STROKE_ROMAN               ((void *)0x0000)\n#   define  GLUT_STROKE_MONO_ROMAN          ((void *)0x0001)\n#   define  GLUT_BITMAP_9_BY_15             ((void *)0x0002)\n#   define  GLUT_BITMAP_8_BY_13             ((void *)0x0003)\n#   define  GLUT_BITMAP_TIMES_ROMAN_10      ((void *)0x0004)\n#   define  GLUT_BITMAP_TIMES_ROMAN_24      ((void *)0x0005)\n#   define  GLUT_BITMAP_HELVETICA_10        ((void *)0x0006)\n#   define  GLUT_BITMAP_HELVETICA_12        ((void *)0x0007)\n#   define  GLUT_BITMAP_HELVETICA_18        ((void *)0x0008)\n#else\n    /*\n     * I don't really know if it's a good idea... But here it goes:\n     */\n    extern void* glutStrokeRoman;\n    extern void* glutStrokeMonoRoman;\n    extern void* glutBitmap9By15;\n    extern void* glutBitmap8By13;\n    extern void* glutBitmapTimesRoman10;\n    extern void* glutBitmapTimesRoman24;\n    extern void* glutBitmapHelvetica10;\n    extern void* glutBitmapHelvetica12;\n    extern void* glutBitmapHelvetica18;\n\n    /*\n     * Those pointers will be used by following definitions:\n     */\n#   define  GLUT_STROKE_ROMAN               ((void *) &glutStrokeRoman)\n#   define  GLUT_STROKE_MONO_ROMAN          ((void *) &glutStrokeMonoRoman)\n#   define  GLUT_BITMAP_9_BY_15             ((void *) &glutBitmap9By15)\n#   define  GLUT_BITMAP_8_BY_13             ((void *) &glutBitmap8By13)\n#   define  GLUT_BITMAP_TIMES_ROMAN_10      ((void *) &glutBitmapTimesRoman10)\n#   define  GLUT_BITMAP_TIMES_ROMAN_24      ((void *) &glutBitmapTimesRoman24)\n#   define  GLUT_BITMAP_HELVETICA_10        ((void *) &glutBitmapHelvetica10)\n#   define  GLUT_BITMAP_HELVETICA_12        ((void *) &glutBitmapHelvetica12)\n#   define  GLUT_BITMAP_HELVETICA_18        ((void *) &glutBitmapHelvetica18)\n#endif\n\n/*\n * GLUT API macro definitions -- the glutGet parameters\n */\n#define  GLUT_WINDOW_X                      0x0064\n#define  GLUT_WINDOW_Y                      0x0065\n#define  GLUT_WINDOW_WIDTH                  0x0066\n#define  GLUT_WINDOW_HEIGHT                 0x0067\n#define  GLUT_WINDOW_BUFFER_SIZE            0x0068\n#define  GLUT_WINDOW_STENCIL_SIZE           0x0069\n#define  GLUT_WINDOW_DEPTH_SIZE             0x006A\n#define  GLUT_WINDOW_RED_SIZE               0x006B\n#define  GLUT_WINDOW_GREEN_SIZE             0x006C\n#define  GLUT_WINDOW_BLUE_SIZE              0x006D\n#define  GLUT_WINDOW_ALPHA_SIZE             0x006E\n#define  GLUT_WINDOW_ACCUM_RED_SIZE         0x006F\n#define  GLUT_WINDOW_ACCUM_GREEN_SIZE       0x0070\n#define  GLUT_WINDOW_ACCUM_BLUE_SIZE        0x0071\n#define  GLUT_WINDOW_ACCUM_ALPHA_SIZE       0x0072\n#define  GLUT_WINDOW_DOUBLEBUFFER           0x0073\n#define  GLUT_WINDOW_RGBA                   0x0074\n#define  GLUT_WINDOW_PARENT                 0x0075\n#define  GLUT_WINDOW_NUM_CHILDREN           0x0076\n#define  GLUT_WINDOW_COLORMAP_SIZE          0x0077\n#define  GLUT_WINDOW_NUM_SAMPLES            0x0078\n#define  GLUT_WINDOW_STEREO                 0x0079\n#define  GLUT_WINDOW_CURSOR                 0x007A\n\n#define  GLUT_SCREEN_WIDTH                  0x00C8\n#define  GLUT_SCREEN_HEIGHT                 0x00C9\n#define  GLUT_SCREEN_WIDTH_MM               0x00CA\n#define  GLUT_SCREEN_HEIGHT_MM              0x00CB\n#define  GLUT_MENU_NUM_ITEMS                0x012C\n#define  GLUT_DISPLAY_MODE_POSSIBLE         0x0190\n#define  GLUT_INIT_WINDOW_X                 0x01F4\n#define  GLUT_INIT_WINDOW_Y                 0x01F5\n#define  GLUT_INIT_WINDOW_WIDTH             0x01F6\n#define  GLUT_INIT_WINDOW_HEIGHT            0x01F7\n#define  GLUT_INIT_DISPLAY_MODE             0x01F8\n#define  GLUT_ELAPSED_TIME                  0x02BC\n#define  GLUT_WINDOW_FORMAT_ID              0x007B\n\n/*\n * GLUT API macro definitions -- the glutDeviceGet parameters\n */\n#define  GLUT_HAS_KEYBOARD                  0x0258\n#define  GLUT_HAS_MOUSE                     0x0259\n#define  GLUT_HAS_SPACEBALL                 0x025A\n#define  GLUT_HAS_DIAL_AND_BUTTON_BOX       0x025B\n#define  GLUT_HAS_TABLET                    0x025C\n#define  GLUT_NUM_MOUSE_BUTTONS             0x025D\n#define  GLUT_NUM_SPACEBALL_BUTTONS         0x025E\n#define  GLUT_NUM_BUTTON_BOX_BUTTONS        0x025F\n#define  GLUT_NUM_DIALS                     0x0260\n#define  GLUT_NUM_TABLET_BUTTONS            0x0261\n#define  GLUT_DEVICE_IGNORE_KEY_REPEAT      0x0262\n#define  GLUT_DEVICE_KEY_REPEAT             0x0263\n#define  GLUT_HAS_JOYSTICK                  0x0264\n#define  GLUT_OWNS_JOYSTICK                 0x0265\n#define  GLUT_JOYSTICK_BUTTONS              0x0266\n#define  GLUT_JOYSTICK_AXES                 0x0267\n#define  GLUT_JOYSTICK_POLL_RATE            0x0268\n\n/*\n * GLUT API macro definitions -- the glutLayerGet parameters\n */\n#define  GLUT_OVERLAY_POSSIBLE              0x0320\n#define  GLUT_LAYER_IN_USE                  0x0321\n#define  GLUT_HAS_OVERLAY                   0x0322\n#define  GLUT_TRANSPARENT_INDEX             0x0323\n#define  GLUT_NORMAL_DAMAGED                0x0324\n#define  GLUT_OVERLAY_DAMAGED               0x0325\n\n/*\n * GLUT API macro definitions -- the glutVideoResizeGet parameters\n */\n#define  GLUT_VIDEO_RESIZE_POSSIBLE         0x0384\n#define  GLUT_VIDEO_RESIZE_IN_USE           0x0385\n#define  GLUT_VIDEO_RESIZE_X_DELTA          0x0386\n#define  GLUT_VIDEO_RESIZE_Y_DELTA          0x0387\n#define  GLUT_VIDEO_RESIZE_WIDTH_DELTA      0x0388\n#define  GLUT_VIDEO_RESIZE_HEIGHT_DELTA     0x0389\n#define  GLUT_VIDEO_RESIZE_X                0x038A\n#define  GLUT_VIDEO_RESIZE_Y                0x038B\n#define  GLUT_VIDEO_RESIZE_WIDTH            0x038C\n#define  GLUT_VIDEO_RESIZE_HEIGHT           0x038D\n\n/*\n * GLUT API macro definitions -- the glutUseLayer parameters\n */\n#define  GLUT_NORMAL                        0x0000\n#define  GLUT_OVERLAY                       0x0001\n\n/*\n * GLUT API macro definitions -- the glutGetModifiers parameters\n */\n#define  GLUT_ACTIVE_SHIFT                  0x0001\n#define  GLUT_ACTIVE_CTRL                   0x0002\n#define  GLUT_ACTIVE_ALT                    0x0004\n\n/*\n * GLUT API macro definitions -- the glutSetCursor parameters\n */\n#define  GLUT_CURSOR_RIGHT_ARROW            0x0000\n#define  GLUT_CURSOR_LEFT_ARROW             0x0001\n#define  GLUT_CURSOR_INFO                   0x0002\n#define  GLUT_CURSOR_DESTROY                0x0003\n#define  GLUT_CURSOR_HELP                   0x0004\n#define  GLUT_CURSOR_CYCLE                  0x0005\n#define  GLUT_CURSOR_SPRAY                  0x0006\n#define  GLUT_CURSOR_WAIT                   0x0007\n#define  GLUT_CURSOR_TEXT                   0x0008\n#define  GLUT_CURSOR_CROSSHAIR              0x0009\n#define  GLUT_CURSOR_UP_DOWN                0x000A\n#define  GLUT_CURSOR_LEFT_RIGHT             0x000B\n#define  GLUT_CURSOR_TOP_SIDE               0x000C\n#define  GLUT_CURSOR_BOTTOM_SIDE            0x000D\n#define  GLUT_CURSOR_LEFT_SIDE              0x000E\n#define  GLUT_CURSOR_RIGHT_SIDE             0x000F\n#define  GLUT_CURSOR_TOP_LEFT_CORNER        0x0010\n#define  GLUT_CURSOR_TOP_RIGHT_CORNER       0x0011\n#define  GLUT_CURSOR_BOTTOM_RIGHT_CORNER    0x0012\n#define  GLUT_CURSOR_BOTTOM_LEFT_CORNER     0x0013\n#define  GLUT_CURSOR_INHERIT                0x0064\n#define  GLUT_CURSOR_NONE                   0x0065\n#define  GLUT_CURSOR_FULL_CROSSHAIR         0x0066\n\n/*\n * GLUT API macro definitions -- RGB color component specification definitions\n */\n#define  GLUT_RED                           0x0000\n#define  GLUT_GREEN                         0x0001\n#define  GLUT_BLUE                          0x0002\n\n/*\n * GLUT API macro definitions -- additional keyboard and joystick definitions\n */\n#define  GLUT_KEY_REPEAT_OFF                0x0000\n#define  GLUT_KEY_REPEAT_ON                 0x0001\n#define  GLUT_KEY_REPEAT_DEFAULT            0x0002\n\n#define  GLUT_JOYSTICK_BUTTON_A             0x0001\n#define  GLUT_JOYSTICK_BUTTON_B             0x0002\n#define  GLUT_JOYSTICK_BUTTON_C             0x0004\n#define  GLUT_JOYSTICK_BUTTON_D             0x0008\n\n/*\n * GLUT API macro definitions -- game mode definitions\n */\n#define  GLUT_GAME_MODE_ACTIVE              0x0000\n#define  GLUT_GAME_MODE_POSSIBLE            0x0001\n#define  GLUT_GAME_MODE_WIDTH               0x0002\n#define  GLUT_GAME_MODE_HEIGHT              0x0003\n#define  GLUT_GAME_MODE_PIXEL_DEPTH         0x0004\n#define  GLUT_GAME_MODE_REFRESH_RATE        0x0005\n#define  GLUT_GAME_MODE_DISPLAY_CHANGED     0x0006\n\n/*\n * Initialization functions, see fglut_init.c\n */\nFGAPI void    FGAPIENTRY glutInit( int* pargc, char** argv );\nFGAPI void    FGAPIENTRY glutInitWindowPosition( int x, int y );\nFGAPI void    FGAPIENTRY glutInitWindowSize( int width, int height );\nFGAPI void    FGAPIENTRY glutInitDisplayMode( unsigned int displayMode );\nFGAPI void    FGAPIENTRY glutInitDisplayString( const char* displayMode );\n\n/*\n * Process loop function, see fg_main.c\n */\nFGAPI void    FGAPIENTRY glutMainLoop( void );\n\n/*\n * Window management functions, see fg_window.c\n */\nFGAPI int     FGAPIENTRY glutCreateWindow( const char* title );\nFGAPI int     FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height );\nFGAPI void    FGAPIENTRY glutDestroyWindow( int window );\nFGAPI void    FGAPIENTRY glutSetWindow( int window );\nFGAPI int     FGAPIENTRY glutGetWindow( void );\nFGAPI void    FGAPIENTRY glutSetWindowTitle( const char* title );\nFGAPI void    FGAPIENTRY glutSetIconTitle( const char* title );\nFGAPI void    FGAPIENTRY glutReshapeWindow( int width, int height );\nFGAPI void    FGAPIENTRY glutFitWindowSizeToDesktop(int width, int height);\nFGAPI void    FGAPIENTRY glutPositionWindow( int x, int y );\nFGAPI void    FGAPIENTRY glutShowWindow( void );\nFGAPI void    FGAPIENTRY glutHideWindow( void );\nFGAPI void    FGAPIENTRY glutIconifyWindow( void );\nFGAPI void    FGAPIENTRY glutPushWindow( void );\nFGAPI void    FGAPIENTRY glutPopWindow( void );\nFGAPI void    FGAPIENTRY glutFullScreen( void );\n\n/*\n * Display-related functions, see fg_display.c\n */\nFGAPI void    FGAPIENTRY glutPostWindowRedisplay( int window );\nFGAPI void    FGAPIENTRY glutPostRedisplay( void );\nFGAPI void    FGAPIENTRY glutSwapBuffers( void );\n\n/*\n * Mouse cursor functions, see fg_cursor.c\n */\nFGAPI void    FGAPIENTRY glutWarpPointer( int x, int y );\nFGAPI void    FGAPIENTRY glutSetCursor( int cursor );\n\n/*\n * Overlay stuff, see fg_overlay.c\n */\nFGAPI void    FGAPIENTRY glutEstablishOverlay( void );\nFGAPI void    FGAPIENTRY glutRemoveOverlay( void );\nFGAPI void    FGAPIENTRY glutUseLayer( GLenum layer );\nFGAPI void    FGAPIENTRY glutPostOverlayRedisplay( void );\nFGAPI void    FGAPIENTRY glutPostWindowOverlayRedisplay( int window );\nFGAPI void    FGAPIENTRY glutShowOverlay( void );\nFGAPI void    FGAPIENTRY glutHideOverlay( void );\n\n/*\n * Menu stuff, see fg_menu.c\n */\nFGAPI int     FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) );\nFGAPI void    FGAPIENTRY glutDestroyMenu( int menu );\nFGAPI int     FGAPIENTRY glutGetMenu( void );\nFGAPI void    FGAPIENTRY glutSetMenu( int menu );\nFGAPI void    FGAPIENTRY glutAddMenuEntry( const char* label, int value );\nFGAPI void    FGAPIENTRY glutAddSubMenu( const char* label, int subMenu );\nFGAPI void    FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value );\nFGAPI void    FGAPIENTRY glutChangeToSubMenu( int item, const char* label, int value );\nFGAPI void    FGAPIENTRY glutRemoveMenuItem( int item );\nFGAPI void    FGAPIENTRY glutAttachMenu( int button );\nFGAPI void    FGAPIENTRY glutDetachMenu( int button );\n\n/*\n * Global callback functions, see fg_callbacks.c\n */\nFGAPI void    FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value );\nFGAPI void    FGAPIENTRY glutIdleFunc( void (* callback)( void ) );\n\n/*\n * Window-specific callback functions, see fg_callbacks.c\n */\nFGAPI void    FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) );\nFGAPI void    FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) );\nFGAPI void    FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) );\nFGAPI void    FGAPIENTRY glutDisplayFunc( void (* callback)( void ) );\nFGAPI void    FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) );\nFGAPI void    FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutEntryFunc( void (* callback)( int ) );\n\nFGAPI void    FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) );\nFGAPI void    FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) );\nFGAPI void    FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval );\nFGAPI void    FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) );\nFGAPI void    FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) );\nFGAPI void    FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) );\nFGAPI void    FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) );\n\nFGAPI void    FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) );\nFGAPI void    FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) );\nFGAPI void    FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) );\nFGAPI void    FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) );\n\n/*\n * State setting and retrieval functions, see fg_state.c\n */\nFGAPI int     FGAPIENTRY glutGet( GLenum query );\nFGAPI int     FGAPIENTRY glutDeviceGet( GLenum query );\nFGAPI int     FGAPIENTRY glutGetModifiers( void );\nFGAPI int     FGAPIENTRY glutLayerGet( GLenum query );\n\n/*\n * Font stuff, see fg_font.c\n */\nFGAPI void    FGAPIENTRY glutBitmapCharacter( void* font, int character );\nFGAPI int     FGAPIENTRY glutBitmapWidth( void* font, int character );\nFGAPI void    FGAPIENTRY glutStrokeCharacter( void* font, int character );\nFGAPI int     FGAPIENTRY glutStrokeWidth( void* font, int character );\nFGAPI GLfloat FGAPIENTRY glutStrokeWidthf( void* font, int character ); /* GLUT 3.8 */\nFGAPI int     FGAPIENTRY glutBitmapLength( void* font, const unsigned char* string );\nFGAPI int     FGAPIENTRY glutStrokeLength( void* font, const unsigned char* string );\nFGAPI GLfloat FGAPIENTRY glutStrokeLengthf( void* font, const unsigned char *string ); /* GLUT 3.8 */\n\n/*\n * Geometry functions, see fg_geometry.c\n */\n\nFGAPI void    FGAPIENTRY glutWireCube( double size );\nFGAPI void    FGAPIENTRY glutSolidCube( double size );\nFGAPI void    FGAPIENTRY glutWireSphere( double radius, GLint slices, GLint stacks );\nFGAPI void    FGAPIENTRY glutSolidSphere( double radius, GLint slices, GLint stacks );\nFGAPI void    FGAPIENTRY glutWireCone( double base, double height, GLint slices, GLint stacks );\nFGAPI void    FGAPIENTRY glutSolidCone( double base, double height, GLint slices, GLint stacks );\nFGAPI void    FGAPIENTRY glutWireTorus( double innerRadius, double outerRadius, GLint sides, GLint rings );\nFGAPI void    FGAPIENTRY glutSolidTorus( double innerRadius, double outerRadius, GLint sides, GLint rings );\nFGAPI void    FGAPIENTRY glutWireDodecahedron( void );\nFGAPI void    FGAPIENTRY glutSolidDodecahedron( void );\nFGAPI void    FGAPIENTRY glutWireOctahedron( void );\nFGAPI void    FGAPIENTRY glutSolidOctahedron( void );\nFGAPI void    FGAPIENTRY glutWireTetrahedron( void );\nFGAPI void    FGAPIENTRY glutSolidTetrahedron( void );\nFGAPI void    FGAPIENTRY glutWireIcosahedron( void );\nFGAPI void    FGAPIENTRY glutSolidIcosahedron( void );\n\n/*\n * Teapot rendering functions, found in fg_teapot.c\n * NB: front facing polygons have clockwise winding, not counter clockwise\n */\nFGAPI void    FGAPIENTRY glutWireTeapot( double size );\nFGAPI void    FGAPIENTRY glutSolidTeapot( double size );\n\n/*\n * Game mode functions, see fg_gamemode.c\n */\nFGAPI void    FGAPIENTRY glutGameModeString( const char* string );\nFGAPI int     FGAPIENTRY glutEnterGameMode( void );\nFGAPI void    FGAPIENTRY glutLeaveGameMode( void );\nFGAPI int     FGAPIENTRY glutGameModeGet( GLenum query );\n\n/*\n * Video resize functions, see fg_videoresize.c\n */\nFGAPI int     FGAPIENTRY glutVideoResizeGet( GLenum query );\nFGAPI void    FGAPIENTRY glutSetupVideoResizing( void );\nFGAPI void    FGAPIENTRY glutStopVideoResizing( void );\nFGAPI void    FGAPIENTRY glutVideoResize( int x, int y, int width, int height );\nFGAPI void    FGAPIENTRY glutVideoPan( int x, int y, int width, int height );\n\n/*\n * Colormap functions, see fg_misc.c\n */\nFGAPI void    FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue );\nFGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component );\nFGAPI void    FGAPIENTRY glutCopyColormap( int window );\n\n/*\n * Misc keyboard and joystick functions, see fg_misc.c\n */\nFGAPI void    FGAPIENTRY glutIgnoreKeyRepeat( int ignore );\nFGAPI void    FGAPIENTRY glutSetKeyRepeat( int repeatMode );\nFGAPI void    FGAPIENTRY glutForceJoystickFunc( void );\n\n/*\n * Misc functions, see fg_misc.c\n */\nFGAPI int     FGAPIENTRY glutExtensionSupported( const char* extension );\nFGAPI void    FGAPIENTRY glutReportErrors( void );\n\n/* Comment from glut.h of classic GLUT:\n\n   Win32 has an annoying issue where there are multiple C run-time\n   libraries (CRTs).  If the executable is linked with a different CRT\n   from the GLUT DLL, the GLUT DLL will not share the same CRT static\n   data seen by the executable.  In particular, atexit callbacks registered\n   in the executable will not be called if GLUT calls its (different)\n   exit routine).  GLUT is typically built with the\n   \"/MD\" option (the CRT with multithreading DLL support), but the Visual\n   C++ linker default is \"/ML\" (the single threaded CRT).\n\n   One workaround to this issue is requiring users to always link with\n   the same CRT as GLUT is compiled with.  That requires users supply a\n   non-standard option.  GLUT 3.7 has its own built-in workaround where\n   the executable's \"exit\" function pointer is covertly passed to GLUT.\n   GLUT then calls the executable's exit function pointer to ensure that\n   any \"atexit\" calls registered by the application are called if GLUT\n   needs to exit.\n\n   Note that the __glut*WithExit routines should NEVER be called directly.\n   To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */\n\n/* to get the prototype for exit() */\n#include <stdlib.h>\n\n#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__)\nFGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));\nFGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));\nFGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int));\n#ifndef FREEGLUT_BUILDING_LIB\n#if defined(__GNUC__)\n#define FGUNUSED __attribute__((unused))\n#else\n#define FGUNUSED\n#endif\nstatic void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }\n#define glutInit glutInit_ATEXIT_HACK\nstatic int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }\n#define glutCreateWindow glutCreateWindow_ATEXIT_HACK\nstatic int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); }\n#define glutCreateMenu glutCreateMenu_ATEXIT_HACK\n#endif\n#endif\n\n#ifdef __cplusplus\n    }\n#endif\n\n/*** END OF FILE ***/\n\n#endif /* __FREEGLUT_STD_H__ */\n\n"
  },
  {
    "path": "source-code/dependencies/freeglut/include/GL/freeglut_ucall.h",
    "content": "#ifndef  __FREEGLUT_UCALL_H__\n#define  __FREEGLUT_UCALL_H__\n\n/*\n * freeglut_ucall.h\n *\n * Callbacks with user data arguments.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\n/*\n * Menu stuff, see fg_menu.c\n */\nFGAPI int  FGAPIENTRY glutCreateMenuUcall( void (* callback)( int menu, void* user_data ), void* user_data );\n\n/*\n * Global callback functions, see fg_callbacks.c\n */\nFGAPI void FGAPIENTRY glutTimerFuncUcall( unsigned int time, void (* callback)( int, void* ), int value, void* user_data );\nFGAPI void FGAPIENTRY glutIdleFuncUcall( void (* callback)( void* ), void* user_data );\n\n/*\n * Window-specific callback functions, see fg_callbacks.c\n */\nFGAPI void FGAPIENTRY glutKeyboardFuncUcall( void (* callback)( unsigned char, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutSpecialFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutReshapeFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutVisibilityFuncUcall( void (* callback)( int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutDisplayFuncUcall( void (* callback)( void* ), void* user_data );\nFGAPI void FGAPIENTRY glutMouseFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutPassiveMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutEntryFuncUcall( void (* callback)( int, void* ), void* user_data );\n\nFGAPI void FGAPIENTRY glutKeyboardUpFuncUcall( void (* callback)( unsigned char, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutSpecialUpFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutJoystickFuncUcall( void (* callback)( unsigned int, int, int, int, void* ), int pollInterval, void* user_data );\nFGAPI void FGAPIENTRY glutMenuStatusFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutOverlayDisplayFuncUcall( void (* callback)( void* ), void* user_data );\nFGAPI void FGAPIENTRY glutWindowStatusFuncUcall( void (* callback)( int, void* ), void* user_data );\n\nFGAPI void FGAPIENTRY glutSpaceballMotionFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutSpaceballRotateFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutSpaceballButtonFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutButtonBoxFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutDialsFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutTabletMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutTabletButtonFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data );\n\nFGAPI void FGAPIENTRY glutMouseWheelFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutPositionFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutCloseFuncUcall( void (* callback)( void* ), void* user_data );\nFGAPI void FGAPIENTRY glutWMCloseFuncUcall( void (* callback)( void* ), void* user_data );\nFGAPI void FGAPIENTRY glutMenuDestroyFuncUcall( void (* callback)( void* ), void* user_data );\n\n/*\n * Multi-touch/multi-pointer extensions\n */\nFGAPI void FGAPIENTRY glutMultiEntryFuncUcall( void (* callback)( int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutMultiButtonFuncUcall( void (* callback)( int, int, int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutMultiMotionFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\nFGAPI void FGAPIENTRY glutMultiPassiveFuncUcall( void (* callback)( int, int, int, void* ), void* user_data );\n\n/*\n * Initialization functions, see fg_init.c\n */\n#include <stdarg.h>\nFGAPI void FGAPIENTRY glutInitErrorFuncUcall( void (* callback)( const char *fmt, va_list ap, void* user_data ), void* user_data );\nFGAPI void FGAPIENTRY glutInitWarningFuncUcall( void (* callback)( const char *fmt, va_list ap, void* user_data ), void* user_data );\n\n/* Mobile platforms lifecycle */\nFGAPI void FGAPIENTRY glutInitContextFuncUcall( void (* callback)( void* ), void* user_data );\nFGAPI void FGAPIENTRY glutAppStatusFuncUcall( void (* callback)( int, void* ), void* user_data );\n\n/*\n * Continued \"hack\" from GLUT applied to Ucall functions.\n * For more info, see bottom of freeglut_std.h\n */\n\n/* to get the prototype for exit() */\n#include <stdlib.h>\n\n#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__)\nFGAPI int FGAPIENTRY __glutCreateMenuUcallWithExit(void(*func)(int, void*), void(__cdecl *exitfunc)(int), void* user_data);\n#ifndef FREEGLUT_BUILDING_LIB\n#if defined(__GNUC__)\n#define FGUNUSED __attribute__((unused))\n#else\n#define FGUNUSED\n#endif\nstatic int FGAPIENTRY FGUNUSED glutCreateMenuUcall_ATEXIT_HACK(void(*func)(int, void*), void* user_data) { return __glutCreateMenuUcallWithExit(func, exit, user_data); }\n#define glutCreateMenuUcall glutCreateMenuUcall_ATEXIT_HACK\n#endif\n#endif\n\n#ifdef __cplusplus\n    }\n#endif\n\n/*** END OF FILE ***/\n\n#endif /* __FREEGLUT_UCALL_H__ */\n\n"
  },
  {
    "path": "source-code/dependencies/freeglut/include/GL/glut.h",
    "content": "#ifndef  __GLUT_H__\n#define  __GLUT_H__\n\n/*\n * glut.h\n *\n * The freeglut library include file\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"freeglut_std.h\"\n\n/*** END OF FILE ***/\n\n#endif /* __GLUT_H__ */\n"
  },
  {
    "path": "source-code/dependencies/simpleini/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Ww][Ii][Nn]32/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# ASP.NET Scaffolding\nScaffoldingReadMe.txt\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Coverlet is a free, cross platform Code Coverage Tool\ncoverage*[.json, .xml, .info]\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n# Fody - auto-generated XML schema\nFodyWeavers.xsd\n"
  },
  {
    "path": "source-code/dependencies/simpleini/.travis.yml",
    "content": "language: cpp\n\nos:\n  - linux\n  - osx\n\ncompiler:\n  - gcc\n  - clang\n\nscript:\n  - make all\n  - make test\n"
  },
  {
    "path": "source-code/dependencies/simpleini/ConvertUTF.c",
    "content": "/*\n * Copyright 2001-2004 Unicode, Inc.\n * \n * Disclaimer\n * \n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n * \n * Limitations on Rights to Redistribute This Code\n * \n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n */\n\n/* ---------------------------------------------------------------------\n\n    Conversions between UTF32, UTF-16, and UTF-8. Source code file.\n    Author: Mark E. Davis, 1994.\n    Rev History: Rick McGowan, fixes & updates May 2001.\n    Sept 2001: fixed const & error conditions per\n\tmods suggested by S. Parent & A. Lillich.\n    June 2002: Tim Dodd added detection and handling of incomplete\n\tsource sequences, enhanced error detection, added casts\n\tto eliminate compiler warnings.\n    July 2003: slight mods to back out aggressive FFFE detection.\n    Jan 2004: updated switches in from-UTF8 conversions.\n    Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.\n\n    See the header file \"ConvertUTF.h\" for complete documentation.\n\n------------------------------------------------------------------------ */\n\n\n#include \"ConvertUTF.h\"\n#ifdef CVTUTF_DEBUG\n#include <stdio.h>\n#endif\n\nstatic const int halfShift  = 10; /* used for shifting by 10 bits */\n\nstatic const UTF32 halfBase = 0x0010000UL;\nstatic const UTF32 halfMask = 0x3FFUL;\n\n#define UNI_SUR_HIGH_START  (UTF32)0xD800\n#define UNI_SUR_HIGH_END    (UTF32)0xDBFF\n#define UNI_SUR_LOW_START   (UTF32)0xDC00\n#define UNI_SUR_LOW_END     (UTF32)0xDFFF\n#define false\t   0\n#define true\t    1\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF32toUTF16 (\n\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF32* source = *sourceStart;\n    UTF16* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch;\n\tif (target >= targetEnd) {\n\t    result = targetExhausted; break;\n\t}\n\tch = *source++;\n\tif (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */\n\t    /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\tif (flags == strictConversion) {\n\t\t    --source; /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t} else {\n\t\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t\t}\n\t    } else {\n\t\t*target++ = (UTF16)ch; /* normal case */\n\t    }\n\t} else if (ch > UNI_MAX_LEGAL_UTF32) {\n\t    if (flags == strictConversion) {\n\t\tresult = sourceIllegal;\n\t    } else {\n\t\t*target++ = UNI_REPLACEMENT_CHAR;\n\t    }\n\t} else {\n\t    /* target is a character in range 0xFFFF - 0x10FFFF. */\n\t    if (target + 1 >= targetEnd) {\n\t\t--source; /* Back up source pointer! */\n\t\tresult = targetExhausted; break;\n\t    }\n\t    ch -= halfBase;\n\t    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);\n\t    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);\n\t}\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF16toUTF32 (\n\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF16* source = *sourceStart;\n    UTF32* target = *targetStart;\n    UTF32 ch, ch2;\n    while (source < sourceEnd) {\n\tconst UTF16* oldSource = source; /*  In case we have to back up because of target overflow. */\n\tch = *source++;\n\t/* If we have a surrogate pair, convert to UTF32 first. */\n\tif (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {\n\t    /* If the 16 bits following the high surrogate are in the source buffer... */\n\t    if (source < sourceEnd) {\n\t\tch2 = *source;\n\t\t/* If it's a low surrogate, convert to UTF32. */\n\t\tif (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {\n\t\t    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)\n\t\t\t+ (ch2 - UNI_SUR_LOW_START) + halfBase;\n\t\t    ++source;\n\t\t} else if (flags == strictConversion) { /* it's an unpaired high surrogate */\n\t\t    --source; /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t}\n\t    } else { /* We don't have the 16 bits following the high surrogate. */\n\t\t--source; /* return to the high surrogate */\n\t\tresult = sourceExhausted;\n\t\tbreak;\n\t    }\n\t} else if (flags == strictConversion) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {\n\t\t--source; /* return to the illegal value itself */\n\t\tresult = sourceIllegal;\n\t\tbreak;\n\t    }\n\t}\n\tif (target >= targetEnd) {\n\t    source = oldSource; /* Back up source pointer! */\n\t    result = targetExhausted; break;\n\t}\n\t*target++ = ch;\n    }\n    *sourceStart = source;\n    *targetStart = target;\n#ifdef CVTUTF_DEBUG\nif (result == sourceIllegal) {\n    fprintf(stderr, \"ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\\n\", ch, ch2);\n    fflush(stderr);\n}\n#endif\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Index into the table below with the first byte of a UTF-8 sequence to\n * get the number of trailing bytes that are supposed to follow it.\n * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is\n * left as-is for anyone who may want to do such conversion, which was\n * allowed in earlier algorithms.\n */\nstatic const char trailingBytesForUTF8[256] = {\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5\n};\n\n/*\n * Magic values subtracted from a buffer value during UTF8 conversion.\n * This table contains as many values as there might be trailing bytes\n * in a UTF-8 sequence.\n */\nstatic const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, \n\t\t     0x03C82080UL, 0xFA082080UL, 0x82082080UL };\n\n/*\n * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed\n * into the first byte, depending on how many bytes follow.  There are\n * as many entries in this table as there are UTF-8 sequence types.\n * (I.e., one byte sequence, two byte... etc.). Remember that sequencs\n * for *legal* UTF-8 will be 4 or fewer bytes total.\n */\nstatic const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n/* --------------------------------------------------------------------- */\n\n/* The interface converts a whole buffer to avoid function-call overhead.\n * Constants have been gathered. Loops & conditionals have been removed as\n * much as possible for efficiency, in favor of drop-through switches.\n * (See \"Note A\" at the bottom of the file for equivalent code.)\n * If your compiler supports it, the \"isLegalUTF8\" call can be turned\n * into an inline function.\n */\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF16toUTF8 (\n\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF16* source = *sourceStart;\n    UTF8* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch;\n\tunsigned short bytesToWrite = 0;\n\tconst UTF32 byteMask = 0xBF;\n\tconst UTF32 byteMark = 0x80; \n\tconst UTF16* oldSource = source; /* In case we have to back up because of target overflow. */\n\tch = *source++;\n\t/* If we have a surrogate pair, convert to UTF32 first. */\n\tif (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {\n\t    /* If the 16 bits following the high surrogate are in the source buffer... */\n\t    if (source < sourceEnd) {\n\t\tUTF32 ch2 = *source;\n\t\t/* If it's a low surrogate, convert to UTF32. */\n\t\tif (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {\n\t\t    ch = ((ch - UNI_SUR_HIGH_START) << halfShift)\n\t\t\t+ (ch2 - UNI_SUR_LOW_START) + halfBase;\n\t\t    ++source;\n\t\t} else if (flags == strictConversion) { /* it's an unpaired high surrogate */\n\t\t    --source; /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t}\n\t    } else { /* We don't have the 16 bits following the high surrogate. */\n\t\t--source; /* return to the high surrogate */\n\t\tresult = sourceExhausted;\n\t\tbreak;\n\t    }\n\t} else if (flags == strictConversion) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {\n\t\t--source; /* return to the illegal value itself */\n\t\tresult = sourceIllegal;\n\t\tbreak;\n\t    }\n\t}\n\t/* Figure out how many bytes the result will require */\n\tif (ch < (UTF32)0x80) {\t     bytesToWrite = 1;\n\t} else if (ch < (UTF32)0x800) {     bytesToWrite = 2;\n\t} else if (ch < (UTF32)0x10000) {   bytesToWrite = 3;\n\t} else if (ch < (UTF32)0x110000) {  bytesToWrite = 4;\n\t} else {\t\t\t    bytesToWrite = 3;\n\t\t\t\t\t    ch = UNI_REPLACEMENT_CHAR;\n\t}\n\n\ttarget += bytesToWrite;\n\tif (target > targetEnd) {\n\t    source = oldSource; /* Back up source pointer! */\n\t    target -= bytesToWrite; result = targetExhausted; break;\n\t}\n\tswitch (bytesToWrite) { /* note: everything falls through. */\n\t    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 1: *--target =  (UTF8)(ch | firstByteMark[bytesToWrite]);\n\t}\n\ttarget += bytesToWrite;\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Utility routine to tell whether a sequence of bytes is legal UTF-8.\n * This must be called with the length pre-determined by the first byte.\n * If not calling this from ConvertUTF8to*, then the length can be set by:\n *  length = trailingBytesForUTF8[*source]+1;\n * and the sequence is illegal right away if there aren't that many bytes\n * available.\n * If presented with a length > 4, this returns false.  The Unicode\n * definition of UTF-8 goes up to 4-byte sequences.\n */\n\nstatic Boolean isLegalUTF8(const UTF8 *source, int length) {\n    UTF8 a;\n    const UTF8 *srcptr = source+length;\n    switch (length) {\n    default: return false;\n\t/* Everything else falls through when \"true\"... */\n    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;\n    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;\n    case 2: if ((a = (*--srcptr)) > 0xBF) return false;\n\n\tswitch (*source) {\n\t    /* no fall-through in this inner switch */\n\t    case 0xE0: if (a < 0xA0) return false; break;\n\t    case 0xED: if (a > 0x9F) return false; break;\n\t    case 0xF0: if (a < 0x90) return false; break;\n\t    case 0xF4: if (a > 0x8F) return false; break;\n\t    default:   if (a < 0x80) return false;\n\t}\n\n    case 1: if (*source >= 0x80 && *source < 0xC2) return false;\n    }\n    if (*source > 0xF4) return false;\n    return true;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Exported function to return whether a UTF-8 sequence is legal or not.\n * This is not used here; it's just exported.\n */\nBoolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {\n    int length = trailingBytesForUTF8[*source]+1;\n    if (source+length > sourceEnd) {\n\treturn false;\n    }\n    return isLegalUTF8(source, length);\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF8toUTF16 (\n\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF8* source = *sourceStart;\n    UTF16* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch = 0;\n\tunsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n\tif (source + extraBytesToRead >= sourceEnd) {\n\t    result = sourceExhausted; break;\n\t}\n\t/* Do this check whether lenient or strict */\n\tif (! isLegalUTF8(source, extraBytesToRead+1)) {\n\t    result = sourceIllegal;\n\t    break;\n\t}\n\t/*\n\t * The cases all fall through. See \"Note A\" below.\n\t */\n\tswitch (extraBytesToRead) {\n\t    case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t    case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t    case 3: ch += *source++; ch <<= 6;\n\t    case 2: ch += *source++; ch <<= 6;\n\t    case 1: ch += *source++; ch <<= 6;\n\t    case 0: ch += *source++;\n\t}\n\tch -= offsetsFromUTF8[extraBytesToRead];\n\n\tif (target >= targetEnd) {\n\t    source -= (extraBytesToRead+1); /* Back up source pointer! */\n\t    result = targetExhausted; break;\n\t}\n\tif (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\tif (flags == strictConversion) {\n\t\t    source -= (extraBytesToRead+1); /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t} else {\n\t\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t\t}\n\t    } else {\n\t\t*target++ = (UTF16)ch; /* normal case */\n\t    }\n\t} else if (ch > UNI_MAX_UTF16) {\n\t    if (flags == strictConversion) {\n\t\tresult = sourceIllegal;\n\t\tsource -= (extraBytesToRead+1); /* return to the start */\n\t\tbreak; /* Bail out; shouldn't continue */\n\t    } else {\n\t\t*target++ = UNI_REPLACEMENT_CHAR;\n\t    }\n\t} else {\n\t    /* target is a character in range 0xFFFF - 0x10FFFF. */\n\t    if (target + 1 >= targetEnd) {\n\t\tsource -= (extraBytesToRead+1); /* Back up source pointer! */\n\t\tresult = targetExhausted; break;\n\t    }\n\t    ch -= halfBase;\n\t    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);\n\t    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);\n\t}\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF32toUTF8 (\n\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF32* source = *sourceStart;\n    UTF8* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch;\n\tunsigned short bytesToWrite = 0;\n\tconst UTF32 byteMask = 0xBF;\n\tconst UTF32 byteMark = 0x80; \n\tch = *source++;\n\tif (flags == strictConversion ) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\t--source; /* return to the illegal value itself */\n\t\tresult = sourceIllegal;\n\t\tbreak;\n\t    }\n\t}\n\t/*\n\t * Figure out how many bytes the result will require. Turn any\n\t * illegally large UTF32 things (> Plane 17) into replacement chars.\n\t */\n\tif (ch < (UTF32)0x80) {\t     bytesToWrite = 1;\n\t} else if (ch < (UTF32)0x800) {     bytesToWrite = 2;\n\t} else if (ch < (UTF32)0x10000) {   bytesToWrite = 3;\n\t} else if (ch <= UNI_MAX_LEGAL_UTF32) {  bytesToWrite = 4;\n\t} else {\t\t\t    bytesToWrite = 3;\n\t\t\t\t\t    ch = UNI_REPLACEMENT_CHAR;\n\t\t\t\t\t    result = sourceIllegal;\n\t}\n\t\n\ttarget += bytesToWrite;\n\tif (target > targetEnd) {\n\t    --source; /* Back up source pointer! */\n\t    target -= bytesToWrite; result = targetExhausted; break;\n\t}\n\tswitch (bytesToWrite) { /* note: everything falls through. */\n\t    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);\n\t}\n\ttarget += bytesToWrite;\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF8toUTF32 (\n\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {\n    ConversionResult result = conversionOK;\n    const UTF8* source = *sourceStart;\n    UTF32* target = *targetStart;\n    while (source < sourceEnd) {\n\tUTF32 ch = 0;\n\tunsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n\tif (source + extraBytesToRead >= sourceEnd) {\n\t    result = sourceExhausted; break;\n\t}\n\t/* Do this check whether lenient or strict */\n\tif (! isLegalUTF8(source, extraBytesToRead+1)) {\n\t    result = sourceIllegal;\n\t    break;\n\t}\n\t/*\n\t * The cases all fall through. See \"Note A\" below.\n\t */\n\tswitch (extraBytesToRead) {\n\t    case 5: ch += *source++; ch <<= 6;\n\t    case 4: ch += *source++; ch <<= 6;\n\t    case 3: ch += *source++; ch <<= 6;\n\t    case 2: ch += *source++; ch <<= 6;\n\t    case 1: ch += *source++; ch <<= 6;\n\t    case 0: ch += *source++;\n\t}\n\tch -= offsetsFromUTF8[extraBytesToRead];\n\n\tif (target >= targetEnd) {\n\t    source -= (extraBytesToRead+1); /* Back up the source pointer! */\n\t    result = targetExhausted; break;\n\t}\n\tif (ch <= UNI_MAX_LEGAL_UTF32) {\n\t    /*\n\t     * UTF-16 surrogate values are illegal in UTF-32, and anything\n\t     * over Plane 17 (> 0x10FFFF) is illegal.\n\t     */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n\t\tif (flags == strictConversion) {\n\t\t    source -= (extraBytesToRead+1); /* return to the illegal value itself */\n\t\t    result = sourceIllegal;\n\t\t    break;\n\t\t} else {\n\t\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t\t}\n\t    } else {\n\t\t*target++ = ch;\n\t    }\n\t} else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */\n\t    result = sourceIllegal;\n\t    *target++ = UNI_REPLACEMENT_CHAR;\n\t}\n    }\n    *sourceStart = source;\n    *targetStart = target;\n    return result;\n}\n\n/* ---------------------------------------------------------------------\n\n    Note A.\n    The fall-through switches in UTF-8 reading code save a\n    temp variable, some decrements & conditionals.  The switches\n    are equivalent to the following loop:\n\t{\n\t    int tmpBytesToRead = extraBytesToRead+1;\n\t    do {\n\t\tch += *source++;\n\t\t--tmpBytesToRead;\n\t\tif (tmpBytesToRead) ch <<= 6;\n\t    } while (tmpBytesToRead > 0);\n\t}\n    In UTF-8 writing code, the switches on \"bytesToWrite\" are\n    similarly unrolled loops.\n\n   --------------------------------------------------------------------- */\n"
  },
  {
    "path": "source-code/dependencies/simpleini/ConvertUTF.h",
    "content": "/*\n * Copyright 2001-2004 Unicode, Inc.\n * \n * Disclaimer\n * \n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n * \n * Limitations on Rights to Redistribute This Code\n * \n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n */\n\n/* ---------------------------------------------------------------------\n\n    Conversions between UTF32, UTF-16, and UTF-8.  Header file.\n\n    Several funtions are included here, forming a complete set of\n    conversions between the three formats.  UTF-7 is not included\n    here, but is handled in a separate source file.\n\n    Each of these routines takes pointers to input buffers and output\n    buffers.  The input buffers are const.\n\n    Each routine converts the text between *sourceStart and sourceEnd,\n    putting the result into the buffer between *targetStart and\n    targetEnd. Note: the end pointers are *after* the last item: e.g. \n    *(sourceEnd - 1) is the last item.\n\n    The return result indicates whether the conversion was successful,\n    and if not, whether the problem was in the source or target buffers.\n    (Only the first encountered problem is indicated.)\n\n    After the conversion, *sourceStart and *targetStart are both\n    updated to point to the end of last text successfully converted in\n    the respective buffers.\n\n    Input parameters:\n\tsourceStart - pointer to a pointer to the source buffer.\n\t\tThe contents of this are modified on return so that\n\t\tit points at the next thing to be converted.\n\ttargetStart - similarly, pointer to pointer to the target buffer.\n\tsourceEnd, targetEnd - respectively pointers to the ends of the\n\t\ttwo buffers, for overflow checking only.\n\n    These conversion functions take a ConversionFlags argument. When this\n    flag is set to strict, both irregular sequences and isolated surrogates\n    will cause an error.  When the flag is set to lenient, both irregular\n    sequences and isolated surrogates are converted.\n\n    Whether the flag is strict or lenient, all illegal sequences will cause\n    an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,\n    or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code\n    must check for illegal sequences.\n\n    When the flag is set to lenient, characters over 0x10FFFF are converted\n    to the replacement character; otherwise (when the flag is set to strict)\n    they constitute an error.\n\n    Output parameters:\n\tThe value \"sourceIllegal\" is returned from some routines if the input\n\tsequence is malformed.  When \"sourceIllegal\" is returned, the source\n\tvalue will point to the illegal value that caused the problem. E.g.,\n\tin UTF-8 when a sequence is malformed, it points to the start of the\n\tmalformed sequence.  \n\n    Author: Mark E. Davis, 1994.\n    Rev History: Rick McGowan, fixes & updates May 2001.\n\t\t Fixes & updates, Sept 2001.\n\n------------------------------------------------------------------------ */\n\n/* ---------------------------------------------------------------------\n    The following 4 definitions are compiler-specific.\n    The C standard does not guarantee that wchar_t has at least\n    16 bits, so wchar_t is no less portable than unsigned short!\n    All should be unsigned values to avoid sign extension during\n    bit mask & shift operations.\n------------------------------------------------------------------------ */\n\ntypedef unsigned int\tUTF32;\t/* at least 32 bits */\ntypedef unsigned short\tUTF16;\t/* at least 16 bits */\ntypedef unsigned char\tUTF8;\t/* typically 8 bits */\ntypedef unsigned char\tBoolean; /* 0 or 1 */\n\n/* Some fundamental constants */\n#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD\n#define UNI_MAX_BMP (UTF32)0x0000FFFF\n#define UNI_MAX_UTF16 (UTF32)0x0010FFFF\n#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF\n#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF\n\ntypedef enum {\n\tconversionOK, \t\t/* conversion successful */\n\tsourceExhausted,\t/* partial character in source, but hit end */\n\ttargetExhausted,\t/* insuff. room in target for conversion */\n\tsourceIllegal\t\t/* source sequence is illegal/malformed */\n} ConversionResult;\n\ntypedef enum {\n\tstrictConversion = 0,\n\tlenientConversion\n} ConversionFlags;\n\n/* This is for C++ and does no harm in C */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nConversionResult ConvertUTF8toUTF16 (\n\t\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\t\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF16toUTF8 (\n\t\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\t\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);\n\t\t\nConversionResult ConvertUTF8toUTF32 (\n\t\tconst UTF8** sourceStart, const UTF8* sourceEnd, \n\t\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF32toUTF8 (\n\t\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\t\tUTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);\n\t\t\nConversionResult ConvertUTF16toUTF32 (\n\t\tconst UTF16** sourceStart, const UTF16* sourceEnd, \n\t\tUTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF32toUTF16 (\n\t\tconst UTF32** sourceStart, const UTF32* sourceEnd, \n\t\tUTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);\n\nBoolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);\n\n#ifdef __cplusplus\n}\n#endif\n\n/* --------------------------------------------------------------------- */\n"
  },
  {
    "path": "source-code/dependencies/simpleini/LICENCE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2006-2013 Brodie Thiesfield\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "source-code/dependencies/simpleini/Makefile",
    "content": "help:\n\t@echo This makefile is just for the test program \\(use \\\"make clean all test\\\"\\)\n\t@echo Just include the SimpleIni.h header file to use it.\n\ninstall:\n\t@echo No install required. Just include the SimpleIni.h header file to use it.\n\nTOPTARGETS := all clean test\n\nSUBDIRS := tests\n\n$(TOPTARGETS): $(SUBDIRS)\n$(SUBDIRS):\n\t$(MAKE) -C $@ $(MAKECMDGOALS)\n\n.PHONY: $(TOPTARGETS) $(SUBDIRS)\n"
  },
  {
    "path": "source-code/dependencies/simpleini/README.md",
    "content": "simpleini\n=========\n\n[![Build Status](https://api.travis-ci.org/brofield/simpleini.svg?branch=master)](https://travis-ci.org/brofield/simpleini)\n\nA cross-platform library that provides a simple API to read and write INI-style configuration files. It supports data files in ASCII, MBCS and Unicode. It is designed explicitly to be portable to any platform and has been tested on Windows, WinCE and Linux. Released as open-source and free using the MIT licence.\n\n# Feature Summary\n\n- MIT Licence allows free use in all software (including GPL and commercial)\n- multi-platform (Windows 95 to Windows 10, Windows CE, Linux, Unix)\n- loading and saving of INI-style configuration files\n- configuration files can have any newline format on all platforms\n- liberal acceptance of file format\n  * key/values with no section\n  * removal of whitespace around sections, keys and values\n- support for multi-line values (values with embedded newline characters)\n- optional support for multiple keys with the same name\n- optional case-insensitive sections and keys (for ASCII characters only)\n- saves files with sections and keys in the same order as they were loaded\n- preserves comments on the file, section and keys where possible\n- supports both char or wchar_t programming interfaces\n- supports both MBCS (system locale) and UTF-8 file encodings\n- system locale does not need to be UTF-8 on Linux/Unix to load UTF-8 file\n- support for non-ASCII characters in section, keys, values and comments\n- support for non-standard character types or file encodings via user-written converter classes\n- support for adding/modifying values programmatically\n- should compile with no warnings in most compilers\n\n# Documentation\n\nFull documentation of the interface is available in doxygen format.\n\n# Examples\n\nThese snippets are included with the distribution in the automatic tests as ts-snippets.cpp.\n\n### SIMPLE USAGE\n\n```c++\n\t// simple demonstration\n\n\tCSimpleIniA ini;\n\tini.SetUnicode();\n\n\tSI_Error rc = ini.LoadFile(\"example.ini\");\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_OK);\n\n\tconst char* pv;\n\tpv = ini.GetValue(\"section\", \"key\", \"default\");\n\tASSERT_STREQ(pv, \"value\");\n\n\tini.SetValue(\"section\", \"key\", \"newvalue\");\n\n\tpv = ini.GetValue(\"section\", \"key\", \"default\");\n\tASSERT_STREQ(pv, \"newvalue\");\n```\n\n### LOADING DATA\n\n```c++\n\t// load from a data file\n\tCSimpleIniA ini;\n\tSI_Error rc = ini.LoadFile(\"example.ini\");\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_OK);\n\n\t// load from a string\n\tconst std::string example = \"[section]\\nkey = value\\n\";\n\tCSimpleIniA ini;\n\tSI_Error rc = ini.LoadData(example);\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_OK);\n```\n\n### GETTING SECTIONS AND KEYS\n\n```c++\n\t// get all sections\n\tCSimpleIniA::TNamesDepend sections;\n\tini.GetAllSections(sections);\n\n\t// get all keys in a section\n\tCSimpleIniA::TNamesDepend keys;\n\tini.GetAllKeys(\"section1\", keys);\n```\n\n### GETTING VALUES\n\n```c++\n\t// get the value of a key that doesn't exist\n\tconst char* pv;\n\tpv = ini.GetValue(\"section1\", \"key99\");\n\tASSERT_EQ(pv, nullptr);\n\n\t// get the value of a key that does exist\n\tpv = ini.GetValue(\"section1\", \"key1\");\n\tASSERT_STREQ(pv, \"value1\");\n\n\t// get the value of a key which may have multiple \n\t// values. If hasMultiple is true, then there are\n\t// multiple values and just one value has been returned\n\tbool hasMulti;\n\tpv = ini.GetValue(\"section1\", \"key1\", nullptr, &hasMulti);\n\tASSERT_STREQ(pv, \"value1\");\n\tASSERT_EQ(hasMulti, false);\n\n\tpv = ini.GetValue(\"section1\", \"key2\", nullptr, &hasMulti);\n\tASSERT_STREQ(pv, \"value2.1\");\n\tASSERT_EQ(hasMulti, true);\n\n\t// get all values of a key with multiple values\n\tCSimpleIniA::TNamesDepend values;\n\tini.GetAllValues(\"section1\", \"key2\", values);\n\n\t// sort the values into a known order, in this case we want\n\t// the original load order\n\tvalues.sort(CSimpleIniA::Entry::LoadOrder());\n\n\t// output all of the items\n\tCSimpleIniA::TNamesDepend::const_iterator it;\n\tfor (it = values.begin(); it != values.end(); ++it) {\n\t\tprintf(\"value = '%s'\\n\", it->pItem);\n\t}\n```\n\n### MODIFYING DATA\n\n```c++\n\t// add a new section \n\trc = ini.SetValue(\"section1\", nullptr, nullptr);\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_INSERTED); \n\n\t// not an error to add one that already exists\n\trc = ini.SetValue(\"section1\", nullptr, nullptr);\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_UPDATED);\n\n\t// get the value of a key that doesn't exist\n\tconst char* pv;\n\tpv = ini.GetValue(\"section2\", \"key1\", \"default-value\");\n\tASSERT_STREQ(pv, \"default-value\");\n\n\t// adding a key (the section will be added if needed)\n\trc = ini.SetValue(\"section2\", \"key1\", \"value1\");\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_INSERTED);\n\n\t// ensure it is set to expected value\n\tpv = ini.GetValue(\"section2\", \"key1\", nullptr);\n\tASSERT_STREQ(pv, \"value1\");\n\n\t// change the value of a key\n\trc = ini.SetValue(\"section2\", \"key1\", \"value2\");\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_UPDATED);\n\n\t// ensure it is set to expected value\n\tpv = ini.GetValue(\"section2\", \"key1\", nullptr);\n\tASSERT_STREQ(pv, \"value2\");\n```\n\n### DELETING DATA\n\n```c++\n\t// deleting a key from a section. Optionally the entire\n\t// section may be deleted if it is now empty.\n\tbool done, deleteSectionIfEmpty = true;\n\tdone = ini.Delete(\"section1\", \"key1\", deleteSectionIfEmpty);\n\tASSERT_EQ(done, true);\n\tdone = ini.Delete(\"section1\", \"key1\");\n\tASSERT_EQ(done, false);\n\n\t// deleting an entire section and all keys in it\n\tdone = ini.Delete(\"section2\", nullptr);\n\tASSERT_EQ(done, true);\n\tdone = ini.Delete(\"section2\", nullptr);\n\tASSERT_EQ(done, false);\n```\n\n### SAVING DATA\n\n```c++\n\t// save the data to a string\n\tstd::string data;\n\trc = ini.Save(data);\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_OK);\n\n\t// save the data back to the file\n\trc = ini.SaveFile(\"example2.ini\");\n\tif (rc < 0) { /* handle error */ };\n\tASSERT_EQ(rc, SI_OK);\n```\n"
  },
  {
    "path": "source-code/dependencies/simpleini/SimpleIni.h",
    "content": "/** @mainpage\n\n    <table>\n        <tr><th>Library     <td>SimpleIni\n        <tr><th>File        <td>SimpleIni.h\n        <tr><th>Author      <td>Brodie Thiesfield [brofield at gmail dot com]\n        <tr><th>Source      <td>https://github.com/brofield/simpleini\n        <tr><th>Version     <td>4.17\n    </table>\n\n    Jump to the @link CSimpleIniTempl CSimpleIni @endlink interface documentation.\n\n    @section intro INTRODUCTION\n\n    This component allows an INI-style configuration file to be used on both\n    Windows and Linux/Unix. It is fast, simple and source code using this\n    component will compile unchanged on either OS.\n\n\n    @section features FEATURES\n\n    - MIT Licence allows free use in all software (including GPL and commercial)\n    - multi-platform (Windows CE/9x/NT..10/etc, Linux, MacOSX, Unix)\n    - loading and saving of INI-style configuration files\n    - configuration files can have any newline format on all platforms\n    - liberal acceptance of file format\n        - key/values with no section\n        - removal of whitespace around sections, keys and values\n    - support for multi-line values (values with embedded newline characters)\n    - optional support for multiple keys with the same name\n    - optional case-insensitive sections and keys (for ASCII characters only)\n    - saves files with sections and keys in the same order as they were loaded\n    - preserves comments on the file, section and keys where possible.\n    - supports both char or wchar_t programming interfaces\n    - supports both MBCS (system locale) and UTF-8 file encodings\n    - system locale does not need to be UTF-8 on Linux/Unix to load UTF-8 file\n    - support for non-ASCII characters in section, keys, values and comments\n    - support for non-standard character types or file encodings\n      via user-written converter classes\n    - support for adding/modifying values programmatically\n    - compiles cleanly in the following compilers:\n        - Windows/VC6 (warning level 3)\n        - Windows/VC.NET 2003 (warning level 4)\n        - Windows/VC 2005 (warning level 4)\n        - Linux/gcc (-Wall)\n\n\n    @section usage USAGE SUMMARY\n\n    -#  Define the appropriate symbol for the converter you wish to use and\n        include the SimpleIni.h header file. If no specific converter is defined\n        then the default converter is used. The default conversion mode uses\n        SI_CONVERT_WIN32 on Windows and SI_CONVERT_GENERIC on all other\n        platforms. If you are using ICU then SI_CONVERT_ICU is supported on all\n        platforms.\n    -#  Declare an instance the appropriate class. Note that the following\n        definitions are just shortcuts for commonly used types. Other types\n        (PRUnichar, unsigned short, unsigned char) are also possible.\n        <table>\n            <tr><th>Interface   <th>Case-sensitive  <th>Load UTF-8  <th>Load MBCS   <th>Typedef\n        <tr><th>SI_CONVERT_GENERIC\n            <tr><td>char        <td>No              <td>Yes         <td>Yes #1      <td>CSimpleIniA\n            <tr><td>char        <td>Yes             <td>Yes         <td>Yes         <td>CSimpleIniCaseA\n            <tr><td>wchar_t     <td>No              <td>Yes         <td>Yes         <td>CSimpleIniW\n            <tr><td>wchar_t     <td>Yes             <td>Yes         <td>Yes         <td>CSimpleIniCaseW\n        <tr><th>SI_CONVERT_WIN32\n            <tr><td>char        <td>No              <td>No #2       <td>Yes         <td>CSimpleIniA\n            <tr><td>char        <td>Yes             <td>Yes         <td>Yes         <td>CSimpleIniCaseA\n            <tr><td>wchar_t     <td>No              <td>Yes         <td>Yes         <td>CSimpleIniW\n            <tr><td>wchar_t     <td>Yes             <td>Yes         <td>Yes         <td>CSimpleIniCaseW\n        <tr><th>SI_CONVERT_ICU\n            <tr><td>char        <td>No              <td>Yes         <td>Yes         <td>CSimpleIniA\n            <tr><td>char        <td>Yes             <td>Yes         <td>Yes         <td>CSimpleIniCaseA\n            <tr><td>UChar       <td>No              <td>Yes         <td>Yes         <td>CSimpleIniW\n            <tr><td>UChar       <td>Yes             <td>Yes         <td>Yes         <td>CSimpleIniCaseW\n        </table>\n        #1  On Windows you are better to use CSimpleIniA with SI_CONVERT_WIN32.<br>\n        #2  Only affects Windows. On Windows this uses MBCS functions and\n            so may fold case incorrectly leading to uncertain results.\n    -# Call LoadData() or LoadFile() to load and parse the INI configuration file\n    -# Access and modify the data of the file using the following functions\n        <table>\n            <tr><td>GetAllSections  <td>Return all section names\n            <tr><td>GetAllKeys      <td>Return all key names within a section\n            <tr><td>GetAllValues    <td>Return all values within a section & key\n            <tr><td>GetSection      <td>Return all key names and values in a section\n            <tr><td>GetSectionSize  <td>Return the number of keys in a section\n            <tr><td>GetValue        <td>Return a value for a section & key\n            <tr><td>SetValue        <td>Add or update a value for a section & key\n            <tr><td>Delete          <td>Remove a section, or a key from a section\n        </table>\n    -# Call Save() or SaveFile() to save the INI configuration data\n\n    @section iostreams IO STREAMS\n\n    SimpleIni supports reading from and writing to STL IO streams. Enable this\n    by defining SI_SUPPORT_IOSTREAMS before including the SimpleIni.h header\n    file. Ensure that if the streams are backed by a file (e.g. ifstream or\n    ofstream) then the flag ios_base::binary has been used when the file was\n    opened.\n\n    @section multiline MULTI-LINE VALUES\n\n    Values that span multiple lines are created using the following format.\n\n        <pre>\n        key = <<<ENDTAG\n        .... multiline value ....\n        ENDTAG\n        </pre>\n\n    Note the following:\n    - The text used for ENDTAG can be anything and is used to find\n      where the multi-line text ends.\n    - The newline after ENDTAG in the start tag, and the newline\n      before ENDTAG in the end tag is not included in the data value.\n    - The ending tag must be on it's own line with no whitespace before\n      or after it.\n    - The multi-line value is modified at load so that each line in the value\n      is delimited by a single '\\\\n' character on all platforms. At save time\n      it will be converted into the newline format used by the current\n      platform.\n\n    @section comments COMMENTS\n\n    Comments are preserved in the file within the following restrictions:\n    - Every file may have a single \"file comment\". It must start with the\n      first character in the file, and will end with the first non-comment\n      line in the file.\n    - Every section may have a single \"section comment\". It will start\n      with the first comment line following the file comment, or the last\n      data entry. It ends at the beginning of the section.\n    - Every key may have a single \"key comment\". This comment will start\n      with the first comment line following the section start, or the file\n      comment if there is no section name.\n    - Comments are set at the time that the file, section or key is first\n      created. The only way to modify a comment on a section or a key is to\n      delete that entry and recreate it with the new comment. There is no\n      way to change the file comment.\n\n    @section save SAVE ORDER\n\n    The sections and keys are written out in the same order as they were\n    read in from the file. Sections and keys added to the data after the\n    file has been loaded will be added to the end of the file when it is\n    written. There is no way to specify the location of a section or key\n    other than in first-created, first-saved order.\n\n    @section notes NOTES\n\n    - To load UTF-8 data on Windows 95, you need to use Microsoft Layer for\n      Unicode, or SI_CONVERT_GENERIC, or SI_CONVERT_ICU.\n    - When using SI_CONVERT_GENERIC, ConvertUTF.c must be compiled and linked.\n    - When using SI_CONVERT_ICU, ICU header files must be on the include\n      path and icuuc.lib must be linked in.\n    - To load a UTF-8 file on Windows AND expose it with SI_CHAR == char,\n      you should use SI_CONVERT_GENERIC.\n    - The collation (sorting) order used for sections and keys returned from\n      iterators is NOT DEFINED. If collation order of the text is important\n      then it should be done yourself by either supplying a replacement\n      SI_STRLESS class, or by sorting the strings external to this library.\n    - Usage of the <mbstring.h> header on Windows can be disabled by defining\n      SI_NO_MBCS. This is defined automatically on Windows CE platforms.\n    - Not thread-safe so manage your own locking\n\n    @section contrib CONTRIBUTIONS\n    \n    - 2010/05/03: Tobias Gehrig: added GetDoubleValue()\n\n    @section licence MIT LICENCE\n\n    The licence text below is the boilerplate \"MIT Licence\" used from:\n    http://www.opensource.org/licenses/mit-license.php\n\n    Copyright (c) 2006-2012, Brodie Thiesfield\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is furnished\n    to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#ifndef INCLUDED_SimpleIni_h\n#define INCLUDED_SimpleIni_h\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n// Disable these warnings in MSVC:\n//  4127 \"conditional expression is constant\" as the conversion classes trigger\n//  it with the statement if (sizeof(SI_CHAR) == sizeof(char)). This test will\n//  be optimized away in a release build.\n//  4503 'insert' : decorated name length exceeded, name was truncated\n//  4702 \"unreachable code\" as the MS STL header causes it in release mode.\n//  Again, the code causing the warning will be cleaned up by the compiler.\n//  4786 \"identifier truncated to 256 characters\" as this is thrown hundreds\n//  of times VC6 as soon as STL is used.\n#ifdef _MSC_VER\n# pragma warning (push)\n# pragma warning (disable: 4127 4503 4702 4786)\n#endif\n\n#include <cstring>\n#include <cstdlib>\n#include <string>\n#include <map>\n#include <list>\n#include <algorithm>\n#include <stdio.h>\n\n#ifdef SI_SUPPORT_IOSTREAMS\n# include <iostream>\n#endif // SI_SUPPORT_IOSTREAMS\n\n#ifdef _DEBUG\n# ifndef assert\n#  include <cassert>\n# endif\n# define SI_ASSERT(x)   assert(x)\n#else\n# define SI_ASSERT(x)\n#endif\n\nenum SI_Error {\n    SI_OK       =  0,   //!< No error\n    SI_UPDATED  =  1,   //!< An existing value was updated\n    SI_INSERTED =  2,   //!< A new value was inserted\n\n    // note: test for any error with (retval < 0)\n    SI_FAIL     = -1,   //!< Generic failure\n    SI_NOMEM    = -2,   //!< Out of memory error\n    SI_FILE     = -3    //!< File error (see errno for detail error)\n};\n\n#define SI_UTF8_SIGNATURE     \"\\xEF\\xBB\\xBF\"\n\n#ifdef _WIN32\n# define SI_NEWLINE_A   \"\\r\\n\"\n# define SI_NEWLINE_W   L\"\\r\\n\"\n#else // !_WIN32\n# define SI_NEWLINE_A   \"\\n\"\n# define SI_NEWLINE_W   L\"\\n\"\n#endif // _WIN32\n\n#if defined(SI_CONVERT_ICU)\n# include <unicode/ustring.h>\n#endif\n\n#if defined(_WIN32)\n# define SI_HAS_WIDE_FILE\n# define SI_WCHAR_T     wchar_t\n#elif defined(SI_CONVERT_ICU)\n# define SI_HAS_WIDE_FILE\n# define SI_WCHAR_T     UChar\n#endif\n\n\n// ---------------------------------------------------------------------------\n//                              MAIN TEMPLATE CLASS\n// ---------------------------------------------------------------------------\n\n/** Simple INI file reader.\n\n    This can be instantiated with the choice of unicode or native characterset,\n    and case sensitive or insensitive comparisons of section and key names.\n    The supported combinations are pre-defined with the following typedefs:\n\n    <table>\n        <tr><th>Interface   <th>Case-sensitive  <th>Typedef\n        <tr><td>char        <td>No              <td>CSimpleIniA\n        <tr><td>char        <td>Yes             <td>CSimpleIniCaseA\n        <tr><td>wchar_t     <td>No              <td>CSimpleIniW\n        <tr><td>wchar_t     <td>Yes             <td>CSimpleIniCaseW\n    </table>\n\n    Note that using other types for the SI_CHAR is supported. For instance,\n    unsigned char, unsigned short, etc. Note that where the alternative type\n    is a different size to char/wchar_t you may need to supply new helper\n    classes for SI_STRLESS and SI_CONVERTER.\n */\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nclass CSimpleIniTempl\n{\npublic:\n    typedef SI_CHAR SI_CHAR_T;\n\n    /** key entry */\n    struct Entry {\n        const SI_CHAR * pItem;\n        const SI_CHAR * pComment;\n        int             nOrder;\n\n        Entry(const SI_CHAR * a_pszItem = NULL, int a_nOrder = 0)\n            : pItem(a_pszItem)\n            , pComment(NULL)\n            , nOrder(a_nOrder)\n        { }\n        Entry(const SI_CHAR * a_pszItem, const SI_CHAR * a_pszComment, int a_nOrder)\n            : pItem(a_pszItem)\n            , pComment(a_pszComment)\n            , nOrder(a_nOrder)\n        { }\n        Entry(const Entry & rhs) { operator=(rhs); }\n        Entry & operator=(const Entry & rhs) {\n            pItem    = rhs.pItem;\n            pComment = rhs.pComment;\n            nOrder   = rhs.nOrder;\n            return *this;\n        }\n\n#if defined(_MSC_VER) && _MSC_VER <= 1200\n        /** STL of VC6 doesn't allow me to specify my own comparator for list::sort() */\n        bool operator<(const Entry & rhs) const { return LoadOrder()(*this, rhs); }\n        bool operator>(const Entry & rhs) const { return LoadOrder()(rhs, *this); }\n#endif\n\n        /** Strict less ordering by name of key only */\n        struct KeyOrder {\n            bool operator()(const Entry & lhs, const Entry & rhs) const {\n                const static SI_STRLESS isLess = SI_STRLESS();\n                return isLess(lhs.pItem, rhs.pItem);\n            }\n        };\n\n        /** Strict less ordering by order, and then name of key */\n        struct LoadOrder {\n            bool operator()(const Entry & lhs, const Entry & rhs) const {\n                if (lhs.nOrder != rhs.nOrder) {\n                    return lhs.nOrder < rhs.nOrder;\n                }\n                return KeyOrder()(lhs.pItem, rhs.pItem);\n            }\n        };\n    };\n\n    /** map keys to values */\n    typedef std::multimap<Entry,const SI_CHAR *,typename Entry::KeyOrder> TKeyVal;\n\n    /** map sections to key/value map */\n    typedef std::map<Entry,TKeyVal,typename Entry::KeyOrder> TSection;\n\n    /** set of dependent string pointers. Note that these pointers are\n        dependent on memory owned by CSimpleIni.\n    */\n    typedef std::list<Entry> TNamesDepend;\n\n    /** interface definition for the OutputWriter object to pass to Save()\n        in order to output the INI file data.\n    */\n    class OutputWriter {\n    public:\n        OutputWriter() { }\n        virtual ~OutputWriter() { }\n        virtual void Write(const char * a_pBuf) = 0;\n    private:\n        OutputWriter(const OutputWriter &);             // disable\n        OutputWriter & operator=(const OutputWriter &); // disable\n    };\n\n    /** OutputWriter class to write the INI data to a file */\n    class FileWriter : public OutputWriter {\n        FILE * m_file;\n    public:\n        FileWriter(FILE * a_file) : m_file(a_file) { }\n        void Write(const char * a_pBuf) {\n            fputs(a_pBuf, m_file);\n        }\n    private:\n        FileWriter(const FileWriter &);             // disable\n        FileWriter & operator=(const FileWriter &); // disable\n    };\n\n    /** OutputWriter class to write the INI data to a string */\n    class StringWriter : public OutputWriter {\n        std::string & m_string;\n    public:\n        StringWriter(std::string & a_string) : m_string(a_string) { }\n        void Write(const char * a_pBuf) {\n            m_string.append(a_pBuf);\n        }\n    private:\n        StringWriter(const StringWriter &);             // disable\n        StringWriter & operator=(const StringWriter &); // disable\n    };\n\n#ifdef SI_SUPPORT_IOSTREAMS\n    /** OutputWriter class to write the INI data to an ostream */\n    class StreamWriter : public OutputWriter {\n        std::ostream & m_ostream;\n    public:\n        StreamWriter(std::ostream & a_ostream) : m_ostream(a_ostream) { }\n        void Write(const char * a_pBuf) {\n            m_ostream << a_pBuf;\n        }\n    private:\n        StreamWriter(const StreamWriter &);             // disable\n        StreamWriter & operator=(const StreamWriter &); // disable\n    };\n#endif // SI_SUPPORT_IOSTREAMS\n\n    /** Characterset conversion utility class to convert strings to the\n        same format as is used for the storage.\n    */\n    class Converter : private SI_CONVERTER {\n    public:\n        Converter(bool a_bStoreIsUtf8) : SI_CONVERTER(a_bStoreIsUtf8) {\n            m_scratch.resize(1024);\n        }\n        Converter(const Converter & rhs) { operator=(rhs); }\n        Converter & operator=(const Converter & rhs) {\n            m_scratch = rhs.m_scratch;\n            return *this;\n        }\n        bool ConvertToStore(const SI_CHAR * a_pszString) {\n            size_t uLen = SI_CONVERTER::SizeToStore(a_pszString);\n            if (uLen == (size_t)(-1)) {\n                return false;\n            }\n            while (uLen > m_scratch.size()) {\n                m_scratch.resize(m_scratch.size() * 2);\n            }\n            return SI_CONVERTER::ConvertToStore(\n                a_pszString,\n                const_cast<char*>(m_scratch.data()),\n                m_scratch.size());\n        }\n        const char * Data() { return m_scratch.data(); }\n    private:\n        std::string m_scratch;\n    };\n\npublic:\n    /*-----------------------------------------------------------------------*/\n\n    /** Default constructor.\n\n        @param a_bIsUtf8     See the method SetUnicode() for details.\n        @param a_bMultiKey   See the method SetMultiKey() for details.\n        @param a_bMultiLine  See the method SetMultiLine() for details.\n     */\n    CSimpleIniTempl(\n        bool a_bIsUtf8    = false,\n        bool a_bMultiKey  = false,\n        bool a_bMultiLine = false\n        );\n\n    /** Destructor */\n    ~CSimpleIniTempl();\n\n    /** Deallocate all memory stored by this object */\n    void Reset();\n\n    /** Has any data been loaded */\n    bool IsEmpty() const { return m_data.empty(); }\n\n    /*-----------------------------------------------------------------------*/\n    /** @{ @name Settings */\n\n    /** Set the storage format of the INI data. This affects both the loading\n        and saving of the INI data using all of the Load/Save API functions.\n        This value cannot be changed after any INI data has been loaded.\n\n        If the file is not set to Unicode (UTF-8), then the data encoding is\n        assumed to be the OS native encoding. This encoding is the system\n        locale on Linux/Unix and the legacy MBCS encoding on Windows NT/2K/XP.\n        If the storage format is set to Unicode then the file will be loaded\n        as UTF-8 encoded data regardless of the native file encoding. If\n        SI_CHAR == char then all of the char* parameters take and return UTF-8\n        encoded data regardless of the system locale.\n\n        \\param a_bIsUtf8     Assume UTF-8 encoding for the source?\n     */\n    void SetUnicode(bool a_bIsUtf8 = true) {\n        if (!m_pData) m_bStoreIsUtf8 = a_bIsUtf8;\n    }\n\n    /** Get the storage format of the INI data. */\n    bool IsUnicode() const { return m_bStoreIsUtf8; }\n\n    /** Should multiple identical keys be permitted in the file. If set to false\n        then the last value encountered will be used as the value of the key.\n        If set to true, then all values will be available to be queried. For\n        example, with the following input:\n\n        <pre>\n        [section]\n        test=value1\n        test=value2\n        </pre>\n\n        Then with SetMultiKey(true), both of the values \"value1\" and \"value2\"\n        will be returned for the key test. If SetMultiKey(false) is used, then\n        the value for \"test\" will only be \"value2\". This value may be changed\n        at any time.\n\n        \\param a_bAllowMultiKey  Allow multi-keys in the source?\n     */\n    void SetMultiKey(bool a_bAllowMultiKey = true) {\n        m_bAllowMultiKey = a_bAllowMultiKey;\n    }\n\n    /** Get the storage format of the INI data. */\n    bool IsMultiKey() const { return m_bAllowMultiKey; }\n\n    /** Should data values be permitted to span multiple lines in the file. If\n        set to false then the multi-line construct <<<TAG as a value will be\n        returned as is instead of loading the data. This value may be changed\n        at any time.\n\n        \\param a_bAllowMultiLine     Allow multi-line values in the source?\n     */\n    void SetMultiLine(bool a_bAllowMultiLine = true) {\n        m_bAllowMultiLine = a_bAllowMultiLine;\n    }\n\n    /** Query the status of multi-line data */\n    bool IsMultiLine() const { return m_bAllowMultiLine; }\n\n    /** Should spaces be added around the equals sign when writing key/value\n        pairs out. When true, the result will be \"key = value\". When false, \n        the result will be \"key=value\". This value may be changed at any time.\n\n        \\param a_bSpaces     Add spaces around the equals sign?\n     */\n    void SetSpaces(bool a_bSpaces = true) {\n        m_bSpaces = a_bSpaces;\n    }\n\n    /** Query the status of spaces output */\n    bool UsingSpaces() const { return m_bSpaces; }\n    \n    /*-----------------------------------------------------------------------*/\n    /** @}\n        @{ @name Loading INI Data */\n\n    /** Load an INI file from disk into memory\n\n        @param a_pszFile    Path of the file to be loaded. This will be passed\n                            to fopen() and so must be a valid path for the\n                            current platform.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error LoadFile(\n        const char * a_pszFile\n        );\n\n#ifdef SI_HAS_WIDE_FILE\n    /** Load an INI file from disk into memory\n\n        @param a_pwszFile   Path of the file to be loaded in UTF-16.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error LoadFile(\n        const SI_WCHAR_T * a_pwszFile\n        );\n#endif // SI_HAS_WIDE_FILE\n\n    /** Load the file from a file pointer.\n\n        @param a_fpFile     Valid file pointer to read the file data from. The\n                            file will be read until end of file.\n\n        @return SI_Error    See error definitions\n    */\n    SI_Error LoadFile(\n        FILE * a_fpFile\n        );\n\n#ifdef SI_SUPPORT_IOSTREAMS\n    /** Load INI file data from an istream.\n\n        @param a_istream    Stream to read from\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error LoadData(\n        std::istream & a_istream\n        );\n#endif // SI_SUPPORT_IOSTREAMS\n\n    /** Load INI file data direct from a std::string\n\n        @param a_strData    Data to be loaded\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error LoadData(const std::string & a_strData) {\n        return LoadData(a_strData.c_str(), a_strData.size());\n    }\n\n    /** Load INI file data direct from memory\n\n        @param a_pData      Data to be loaded\n        @param a_uDataLen   Length of the data in bytes\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error LoadData(\n        const char *    a_pData,\n        size_t          a_uDataLen\n        );\n\n    /*-----------------------------------------------------------------------*/\n    /** @}\n        @{ @name Saving INI Data */\n\n    /** Save an INI file from memory to disk\n\n        @param a_pszFile    Path of the file to be saved. This will be passed\n                            to fopen() and so must be a valid path for the\n                            current platform.\n\n        @param a_bAddSignature  Prepend the UTF-8 BOM if the output data is\n                            in UTF-8 format. If it is not UTF-8 then\n                            this parameter is ignored.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error SaveFile(\n        const char *    a_pszFile,\n        bool            a_bAddSignature = true\n        ) const;\n\n#ifdef SI_HAS_WIDE_FILE\n    /** Save an INI file from memory to disk\n\n        @param a_pwszFile   Path of the file to be saved in UTF-16.\n\n        @param a_bAddSignature  Prepend the UTF-8 BOM if the output data is\n                            in UTF-8 format. If it is not UTF-8 then\n                            this parameter is ignored.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error SaveFile(\n        const SI_WCHAR_T *  a_pwszFile,\n        bool                a_bAddSignature = true\n        ) const;\n#endif // _WIN32\n\n    /** Save the INI data to a file. See Save() for details.\n\n        @param a_pFile      Handle to a file. File should be opened for\n                            binary output.\n\n        @param a_bAddSignature  Prepend the UTF-8 BOM if the output data is in\n                            UTF-8 format. If it is not UTF-8 then this value is\n                            ignored. Do not set this to true if anything has\n                            already been written to the file.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error SaveFile(\n        FILE *  a_pFile,\n        bool    a_bAddSignature = false\n        ) const;\n\n    /** Save the INI data. The data will be written to the output device\n        in a format appropriate to the current data, selected by:\n\n        <table>\n            <tr><th>SI_CHAR     <th>FORMAT\n            <tr><td>char        <td>same format as when loaded (MBCS or UTF-8)\n            <tr><td>wchar_t     <td>UTF-8\n            <tr><td>other       <td>UTF-8\n        </table>\n\n        Note that comments from the original data is preserved as per the\n        documentation on comments. The order of the sections and values\n        from the original file will be preserved.\n\n        Any data prepended or appended to the output device must use the the\n        same format (MBCS or UTF-8). You may use the GetConverter() method to\n        convert text to the correct format regardless of the output format\n        being used by SimpleIni.\n\n        To add a BOM to UTF-8 data, write it out manually at the very beginning\n        like is done in SaveFile when a_bUseBOM is true.\n\n        @param a_oOutput    Output writer to write the data to.\n\n        @param a_bAddSignature  Prepend the UTF-8 BOM if the output data is in\n                            UTF-8 format. If it is not UTF-8 then this value is\n                            ignored. Do not set this to true if anything has\n                            already been written to the OutputWriter.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error Save(\n        OutputWriter &  a_oOutput,\n        bool            a_bAddSignature = false\n        ) const;\n\n#ifdef SI_SUPPORT_IOSTREAMS\n    /** Save the INI data to an ostream. See Save() for details.\n\n        @param a_ostream    String to have the INI data appended to.\n\n        @param a_bAddSignature  Prepend the UTF-8 BOM if the output data is in\n                            UTF-8 format. If it is not UTF-8 then this value is\n                            ignored. Do not set this to true if anything has\n                            already been written to the stream.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error Save(\n        std::ostream &  a_ostream,\n        bool            a_bAddSignature = false\n        ) const\n    {\n        StreamWriter writer(a_ostream);\n        return Save(writer, a_bAddSignature);\n    }\n#endif // SI_SUPPORT_IOSTREAMS\n\n    /** Append the INI data to a string. See Save() for details.\n\n        @param a_sBuffer    String to have the INI data appended to.\n\n        @param a_bAddSignature  Prepend the UTF-8 BOM if the output data is in\n                            UTF-8 format. If it is not UTF-8 then this value is\n                            ignored. Do not set this to true if anything has\n                            already been written to the string.\n\n        @return SI_Error    See error definitions\n     */\n    SI_Error Save(\n        std::string &   a_sBuffer,\n        bool            a_bAddSignature = false\n        ) const\n    {\n        StringWriter writer(a_sBuffer);\n        return Save(writer, a_bAddSignature);\n    }\n\n    /*-----------------------------------------------------------------------*/\n    /** @}\n        @{ @name Accessing INI Data */\n\n    /** Retrieve all section names. The list is returned as an STL vector of\n        names and can be iterated or searched as necessary. Note that the\n        sort order of the returned strings is NOT DEFINED. You can sort\n        the names into the load order if desired. Search this file for \".sort\"\n        for an example.\n\n        NOTE! This structure contains only pointers to strings. The actual\n        string data is stored in memory owned by CSimpleIni. Ensure that the\n        CSimpleIni object is not destroyed or Reset() while these pointers\n        are in use!\n\n        @param a_names          Vector that will receive all of the section\n                                 names. See note above!\n     */\n    void GetAllSections(\n        TNamesDepend & a_names\n        ) const;\n\n    /** Retrieve all unique key names in a section. The sort order of the\n        returned strings is NOT DEFINED. You can sort the names into the load \n        order if desired. Search this file for \".sort\" for an example. Only \n        unique key names are returned.\n\n        NOTE! This structure contains only pointers to strings. The actual\n        string data is stored in memory owned by CSimpleIni. Ensure that the\n        CSimpleIni object is not destroyed or Reset() while these strings\n        are in use!\n\n        @param a_pSection       Section to request data for\n        @param a_names          List that will receive all of the key\n                                 names. See note above!\n\n        @return true            Section was found.\n        @return false           Matching section was not found.\n     */\n    bool GetAllKeys(\n        const SI_CHAR * a_pSection,\n        TNamesDepend &  a_names\n        ) const;\n\n    /** Retrieve all values for a specific key. This method can be used when\n        multiple keys are both enabled and disabled. Note that the sort order \n        of the returned strings is NOT DEFINED. You can sort the names into \n        the load order if desired. Search this file for \".sort\" for an example.\n\n        NOTE! The returned values are pointers to string data stored in memory\n        owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed\n        or Reset while you are using this pointer!\n\n        @param a_pSection       Section to search\n        @param a_pKey           Key to search for\n        @param a_values         List to return if the key is not found\n\n        @return true            Key was found.\n        @return false           Matching section/key was not found.\n     */\n    bool GetAllValues(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        TNamesDepend &  a_values\n        ) const;\n\n    /** Query the number of keys in a specific section. Note that if multiple\n        keys are enabled, then this value may be different to the number of\n        keys returned by GetAllKeys.\n\n        @param a_pSection       Section to request data for\n\n        @return -1              Section does not exist in the file\n        @return >=0             Number of keys in the section\n     */\n    int GetSectionSize(\n        const SI_CHAR * a_pSection\n        ) const;\n\n    /** Retrieve all key and value pairs for a section. The data is returned\n        as a pointer to an STL map and can be iterated or searched as\n        desired. Note that multiple entries for the same key may exist when\n        multiple keys have been enabled.\n\n        NOTE! This structure contains only pointers to strings. The actual\n        string data is stored in memory owned by CSimpleIni. Ensure that the\n        CSimpleIni object is not destroyed or Reset() while these strings\n        are in use!\n\n        @param a_pSection       Name of the section to return\n        @return boolean         Was a section matching the supplied\n                                name found.\n     */\n    const TKeyVal * GetSection(\n        const SI_CHAR * a_pSection\n        ) const;\n\n    /** Retrieve the value for a specific key. If multiple keys are enabled\n        (see SetMultiKey) then only the first value associated with that key\n        will be returned, see GetAllValues for getting all values with multikey.\n\n        NOTE! The returned value is a pointer to string data stored in memory\n        owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed\n        or Reset while you are using this pointer!\n\n        @param a_pSection       Section to search\n        @param a_pKey           Key to search for\n        @param a_pDefault       Value to return if the key is not found\n        @param a_pHasMultiple   Optionally receive notification of if there are\n                                multiple entries for this key.\n\n        @return a_pDefault      Key was not found in the section\n        @return other           Value of the key\n     */\n    const SI_CHAR * GetValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        const SI_CHAR * a_pDefault     = NULL,\n        bool *          a_pHasMultiple = NULL\n        ) const;\n\n    /** Retrieve a numeric value for a specific key. If multiple keys are enabled\n        (see SetMultiKey) then only the first value associated with that key\n        will be returned, see GetAllValues for getting all values with multikey.\n\n        @param a_pSection       Section to search\n        @param a_pKey           Key to search for\n        @param a_nDefault       Value to return if the key is not found\n        @param a_pHasMultiple   Optionally receive notification of if there are\n                                multiple entries for this key.\n\n        @return a_nDefault      Key was not found in the section\n        @return other           Value of the key\n     */\n    long GetLongValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        long            a_nDefault     = 0,\n        bool *          a_pHasMultiple = NULL\n        ) const;\n\n    /** Retrieve a numeric value for a specific key. If multiple keys are enabled\n        (see SetMultiKey) then only the first value associated with that key\n        will be returned, see GetAllValues for getting all values with multikey.\n\n        @param a_pSection       Section to search\n        @param a_pKey           Key to search for\n        @param a_nDefault       Value to return if the key is not found\n        @param a_pHasMultiple   Optionally receive notification of if there are\n                                multiple entries for this key.\n\n        @return a_nDefault      Key was not found in the section\n        @return other           Value of the key\n     */\n    double GetDoubleValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        double          a_nDefault     = 0,\n        bool *          a_pHasMultiple = NULL\n        ) const;\n\n    /** Retrieve a boolean value for a specific key. If multiple keys are enabled\n        (see SetMultiKey) then only the first value associated with that key\n        will be returned, see GetAllValues for getting all values with multikey.\n\n        Strings starting with \"t\", \"y\", \"on\" or \"1\" are returned as logically true.\n        Strings starting with \"f\", \"n\", \"of\" or \"0\" are returned as logically false.\n        For all other values the default is returned. Character comparisons are \n        case-insensitive.\n\n        @param a_pSection       Section to search\n        @param a_pKey           Key to search for\n        @param a_bDefault       Value to return if the key is not found\n        @param a_pHasMultiple   Optionally receive notification of if there are\n                                multiple entries for this key.\n\n        @return a_nDefault      Key was not found in the section\n        @return other           Value of the key\n     */\n    bool GetBoolValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        bool            a_bDefault     = false,\n        bool *          a_pHasMultiple = NULL\n        ) const;\n\n    /** Add or update a section or value. This will always insert\n        when multiple keys are enabled.\n\n        @param a_pSection   Section to add or update\n        @param a_pKey       Key to add or update. Set to NULL to\n                            create an empty section.\n        @param a_pValue     Value to set. Set to NULL to create an\n                            empty section.\n        @param a_pComment   Comment to be associated with the section or the\n                            key. If a_pKey is NULL then it will be associated\n                            with the section, otherwise the key. Note that a\n                            comment may be set ONLY when the section or key is\n                            first created (i.e. when this function returns the\n                            value SI_INSERTED). If you wish to create a section\n                            with a comment then you need to create the section\n                            separately to the key. The comment string must be\n                            in full comment form already (have a comment\n                            character starting every line).\n        @param a_bForceReplace  Should all existing values in a multi-key INI\n                            file be replaced with this entry. This option has\n                            no effect if not using multi-key files. The \n                            difference between Delete/SetValue and SetValue\n                            with a_bForceReplace = true, is that the load \n                            order and comment will be preserved this way.\n\n        @return SI_Error    See error definitions\n        @return SI_UPDATED  Value was updated\n        @return SI_INSERTED Value was inserted\n     */\n    SI_Error SetValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        const SI_CHAR * a_pValue,\n        const SI_CHAR * a_pComment      = NULL,\n        bool            a_bForceReplace = false\n        )\n    {\n        return AddEntry(a_pSection, a_pKey, a_pValue, a_pComment, a_bForceReplace, true);\n    }\n\n    /** Add or update a numeric value. This will always insert\n        when multiple keys are enabled.\n\n        @param a_pSection   Section to add or update\n        @param a_pKey       Key to add or update. \n        @param a_nValue     Value to set. \n        @param a_pComment   Comment to be associated with the key. See the \n                            notes on SetValue() for comments.\n        @param a_bUseHex    By default the value will be written to the file \n                            in decimal format. Set this to true to write it \n                            as hexadecimal.\n        @param a_bForceReplace  Should all existing values in a multi-key INI\n                            file be replaced with this entry. This option has\n                            no effect if not using multi-key files. The \n                            difference between Delete/SetLongValue and \n                            SetLongValue with a_bForceReplace = true, is that \n                            the load order and comment will be preserved this \n                            way.\n\n        @return SI_Error    See error definitions\n        @return SI_UPDATED  Value was updated\n        @return SI_INSERTED Value was inserted\n     */\n    SI_Error SetLongValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        long            a_nValue,\n        const SI_CHAR * a_pComment      = NULL,\n        bool            a_bUseHex       = false,\n        bool            a_bForceReplace = false\n        );\n\n    /** Add or update a double value. This will always insert\n        when multiple keys are enabled.\n\n        @param a_pSection   Section to add or update\n        @param a_pKey       Key to add or update. \n        @param a_nValue     Value to set. \n        @param a_pComment   Comment to be associated with the key. See the \n                            notes on SetValue() for comments.\n        @param a_bForceReplace  Should all existing values in a multi-key INI\n                            file be replaced with this entry. This option has\n                            no effect if not using multi-key files. The \n                            difference between Delete/SetDoubleValue and \n                            SetDoubleValue with a_bForceReplace = true, is that \n                            the load order and comment will be preserved this \n                            way.\n\n        @return SI_Error    See error definitions\n        @return SI_UPDATED  Value was updated\n        @return SI_INSERTED Value was inserted\n     */\n    SI_Error SetDoubleValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        double          a_nValue,\n        const SI_CHAR * a_pComment      = NULL,\n        bool            a_bForceReplace = false\n        );\n\n    /** Add or update a boolean value. This will always insert\n        when multiple keys are enabled.\n\n        @param a_pSection   Section to add or update\n        @param a_pKey       Key to add or update. \n        @param a_bValue     Value to set. \n        @param a_pComment   Comment to be associated with the key. See the \n                            notes on SetValue() for comments.\n        @param a_bForceReplace  Should all existing values in a multi-key INI\n                            file be replaced with this entry. This option has\n                            no effect if not using multi-key files. The \n                            difference between Delete/SetBoolValue and \n                            SetBoolValue with a_bForceReplace = true, is that \n                            the load order and comment will be preserved this \n                            way.\n\n        @return SI_Error    See error definitions\n        @return SI_UPDATED  Value was updated\n        @return SI_INSERTED Value was inserted\n     */\n    SI_Error SetBoolValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        bool            a_bValue,\n        const SI_CHAR * a_pComment      = NULL,\n        bool            a_bForceReplace = false\n        );\n\n    /** Delete an entire section, or a key from a section. Note that the\n        data returned by GetSection is invalid and must not be used after\n        anything has been deleted from that section using this method.\n        Note when multiple keys is enabled, this will delete all keys with\n        that name; to selectively delete individual key/values, use\n        DeleteValue.\n\n        @param a_pSection       Section to delete key from, or if\n                                a_pKey is NULL, the section to remove.\n        @param a_pKey           Key to remove from the section. Set to\n                                NULL to remove the entire section.\n        @param a_bRemoveEmpty   If the section is empty after this key has\n                                been deleted, should the empty section be\n                                removed?\n\n        @return true            Key or section was deleted.\n        @return false           Key or section was not found.\n     */\n    bool Delete(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        bool            a_bRemoveEmpty = false\n        );\n\n    /** Delete an entire section, or a key from a section. If value is\n        provided, only remove keys with the value. Note that the data\n        returned by GetSection is invalid and must not be used after\n        anything has been deleted from that section using this method.\n        Note when multiple keys is enabled, all keys with the value will\n        be deleted.\n\n        @param a_pSection       Section to delete key from, or if\n                                a_pKey is NULL, the section to remove.\n        @param a_pKey           Key to remove from the section. Set to\n                                NULL to remove the entire section.\n        @param a_pValue         Value of key to remove from the section.\n                                Set to NULL to remove all keys.\n        @param a_bRemoveEmpty   If the section is empty after this key has\n                                been deleted, should the empty section be\n                                removed?\n\n        @return true            Key/value or section was deleted.\n        @return false           Key/value or section was not found.\n     */\n    bool DeleteValue(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        const SI_CHAR * a_pValue,\n        bool            a_bRemoveEmpty = false\n        );\n\n    /*-----------------------------------------------------------------------*/\n    /** @}\n        @{ @name Converter */\n\n    /** Return a conversion object to convert text to the same encoding\n        as is used by the Save(), SaveFile() and SaveString() functions.\n        Use this to prepare the strings that you wish to append or prepend\n        to the output INI data.\n     */\n    Converter GetConverter() const {\n        return Converter(m_bStoreIsUtf8);\n    }\n\n    /*-----------------------------------------------------------------------*/\n    /** @} */\n\nprivate:\n    // copying is not permitted\n    CSimpleIniTempl(const CSimpleIniTempl &); // disabled\n    CSimpleIniTempl & operator=(const CSimpleIniTempl &); // disabled\n\n    /** Parse the data looking for a file comment and store it if found.\n    */\n    SI_Error FindFileComment(\n        SI_CHAR *&      a_pData,\n        bool            a_bCopyStrings\n        );\n\n    /** Parse the data looking for the next valid entry. The memory pointed to\n        by a_pData is modified by inserting NULL characters. The pointer is\n        updated to the current location in the block of text.\n    */\n    bool FindEntry(\n        SI_CHAR *&  a_pData,\n        const SI_CHAR *&  a_pSection,\n        const SI_CHAR *&  a_pKey,\n        const SI_CHAR *&  a_pVal,\n        const SI_CHAR *&  a_pComment\n        ) const;\n\n    /** Add the section/key/value to our data.\n\n        @param a_pSection   Section name. Sections will be created if they\n                            don't already exist.\n        @param a_pKey       Key name. May be NULL to create an empty section.\n                            Existing entries will be updated. New entries will\n                            be created.\n        @param a_pValue     Value for the key.\n        @param a_pComment   Comment to be associated with the section or the\n                            key. If a_pKey is NULL then it will be associated\n                            with the section, otherwise the key. This must be\n                            a string in full comment form already (have a\n                            comment character starting every line).\n        @param a_bForceReplace  Should all existing values in a multi-key INI\n                            file be replaced with this entry. This option has\n                            no effect if not using multi-key files. The \n                            difference between Delete/AddEntry and AddEntry\n                            with a_bForceReplace = true, is that the load \n                            order and comment will be preserved this way.\n        @param a_bCopyStrings   Should copies of the strings be made or not.\n                            If false then the pointers will be used as is.\n    */\n    SI_Error AddEntry(\n        const SI_CHAR * a_pSection,\n        const SI_CHAR * a_pKey,\n        const SI_CHAR * a_pValue,\n        const SI_CHAR * a_pComment,\n        bool            a_bForceReplace,\n        bool            a_bCopyStrings\n        );\n\n    /** Is the supplied character a whitespace character? */\n    inline bool IsSpace(SI_CHAR ch) const {\n        return (ch == ' ' || ch == '\\t' || ch == '\\r' || ch == '\\n');\n    }\n\n    /** Does the supplied character start a comment line? */\n    inline bool IsComment(SI_CHAR ch) const {\n        return (ch == ';' || ch == '#');\n    }\n\n\n    /** Skip over a newline character (or characters) for either DOS or UNIX */\n    inline void SkipNewLine(SI_CHAR *& a_pData) const {\n        a_pData += (*a_pData == '\\r' && *(a_pData+1) == '\\n') ? 2 : 1;\n    }\n\n    /** Make a copy of the supplied string, replacing the original pointer */\n    SI_Error CopyString(const SI_CHAR *& a_pString);\n\n    /** Delete a string from the copied strings buffer if necessary */\n    void DeleteString(const SI_CHAR * a_pString);\n\n    /** Internal use of our string comparison function */\n    bool IsLess(const SI_CHAR * a_pLeft, const SI_CHAR * a_pRight) const {\n        const static SI_STRLESS isLess = SI_STRLESS();\n        return isLess(a_pLeft, a_pRight);\n    }\n\n    bool IsMultiLineTag(const SI_CHAR * a_pData) const;\n    bool IsMultiLineData(const SI_CHAR * a_pData) const;\n    bool LoadMultiLineText(\n        SI_CHAR *&          a_pData,\n        const SI_CHAR *&    a_pVal,\n        const SI_CHAR *     a_pTagName,\n        bool                a_bAllowBlankLinesInComment = false\n        ) const;\n    bool IsNewLineChar(SI_CHAR a_c) const;\n\n    bool OutputMultiLineText(\n        OutputWriter &  a_oOutput,\n        Converter &     a_oConverter,\n        const SI_CHAR * a_pText\n        ) const;\n\nprivate:\n    /** Copy of the INI file data in our character format. This will be\n        modified when parsed to have NULL characters added after all\n        interesting string entries. All of the string pointers to sections,\n        keys and values point into this block of memory.\n     */\n    SI_CHAR * m_pData;\n\n    /** Length of the data that we have stored. Used when deleting strings\n        to determine if the string is stored here or in the allocated string\n        buffer.\n     */\n    size_t m_uDataLen;\n\n    /** File comment for this data, if one exists. */\n    const SI_CHAR * m_pFileComment;\n\n    /** Parsed INI data. Section -> (Key -> Value). */\n    TSection m_data;\n\n    /** This vector stores allocated memory for copies of strings that have\n        been supplied after the file load. It will be empty unless SetValue()\n        has been called.\n     */\n    TNamesDepend m_strings;\n\n    /** Is the format of our datafile UTF-8 or MBCS? */\n    bool m_bStoreIsUtf8;\n\n    /** Are multiple values permitted for the same key? */\n    bool m_bAllowMultiKey;\n\n    /** Are data values permitted to span multiple lines? */\n    bool m_bAllowMultiLine;\n\n    /** Should spaces be written out surrounding the equals sign? */\n    bool m_bSpaces;\n    \n    /** Next order value, used to ensure sections and keys are output in the\n        same order that they are loaded/added.\n     */\n    int m_nOrder;\n};\n\n// ---------------------------------------------------------------------------\n//                                  IMPLEMENTATION\n// ---------------------------------------------------------------------------\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::CSimpleIniTempl(\n    bool a_bIsUtf8,\n    bool a_bAllowMultiKey,\n    bool a_bAllowMultiLine\n    )\n  : m_pData(0)\n  , m_uDataLen(0)\n  , m_pFileComment(NULL)\n  , m_bStoreIsUtf8(a_bIsUtf8)\n  , m_bAllowMultiKey(a_bAllowMultiKey)\n  , m_bAllowMultiLine(a_bAllowMultiLine)\n  , m_bSpaces(true)\n  , m_nOrder(0)\n{ }\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::~CSimpleIniTempl()\n{\n    Reset();\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nvoid\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::Reset()\n{\n    // remove all data\n    delete[] m_pData;\n    m_pData = NULL;\n    m_uDataLen = 0;\n    m_pFileComment = NULL;\n    if (!m_data.empty()) {\n        m_data.erase(m_data.begin(), m_data.end());\n    }\n\n    // remove all strings\n    if (!m_strings.empty()) {\n        typename TNamesDepend::iterator i = m_strings.begin();\n        for (; i != m_strings.end(); ++i) {\n            delete[] const_cast<SI_CHAR*>(i->pItem);\n        }\n        m_strings.erase(m_strings.begin(), m_strings.end());\n    }\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadFile(\n    const char * a_pszFile\n    )\n{\n    FILE * fp = NULL;\n#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE\n    fopen_s(&fp, a_pszFile, \"rb\");\n#else // !__STDC_WANT_SECURE_LIB__\n    fp = fopen(a_pszFile, \"rb\");\n#endif // __STDC_WANT_SECURE_LIB__\n    if (!fp) {\n        return SI_FILE;\n    }\n    SI_Error rc = LoadFile(fp);\n    fclose(fp);\n    return rc;\n}\n\n#ifdef SI_HAS_WIDE_FILE\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadFile(\n    const SI_WCHAR_T * a_pwszFile\n    )\n{\n#ifdef _WIN32\n    FILE * fp = NULL;\n#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE\n    _wfopen_s(&fp, a_pwszFile, L\"rb\");\n#else // !__STDC_WANT_SECURE_LIB__\n    fp = _wfopen(a_pwszFile, L\"rb\");\n#endif // __STDC_WANT_SECURE_LIB__\n    if (!fp) return SI_FILE;\n    SI_Error rc = LoadFile(fp);\n    fclose(fp);\n    return rc;\n#else // !_WIN32 (therefore SI_CONVERT_ICU)\n    char szFile[256];\n    u_austrncpy(szFile, a_pwszFile, sizeof(szFile));\n    return LoadFile(szFile);\n#endif // _WIN32\n}\n#endif // SI_HAS_WIDE_FILE\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadFile(\n    FILE * a_fpFile\n    )\n{\n    // load the raw file data\n    int retval = fseek(a_fpFile, 0, SEEK_END);\n    if (retval != 0) {\n        return SI_FILE;\n    }\n    long lSize = ftell(a_fpFile);\n    if (lSize < 0) {\n        return SI_FILE;\n    }\n    if (lSize == 0) {\n        return SI_OK;\n    }\n    \n    // allocate and ensure NULL terminated\n    char * pData = new(std::nothrow) char[lSize+1];\n    if (!pData) {\n        return SI_NOMEM;\n    }\n    pData[lSize] = 0;\n    \n    // load data into buffer\n    fseek(a_fpFile, 0, SEEK_SET);\n    size_t uRead = fread(pData, sizeof(char), lSize, a_fpFile);\n    if (uRead != (size_t) lSize) {\n        delete[] pData;\n        return SI_FILE;\n    }\n\n    // convert the raw data to unicode\n    SI_Error rc = LoadData(pData, uRead);\n    delete[] pData;\n    return rc;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadData(\n    const char *    a_pData,\n    size_t          a_uDataLen\n    )\n{\n    if (!a_pData) {\n        return SI_OK;\n    }\n    \n    // if the UTF-8 BOM exists, consume it and set mode to unicode, if we have\n    // already loaded data and try to change mode half-way through then this will\n    // be ignored and we will assert in debug versions\n    if (a_uDataLen >= 3 && memcmp(a_pData, SI_UTF8_SIGNATURE, 3) == 0) {\n        a_pData    += 3;\n        a_uDataLen -= 3;\n        SI_ASSERT(m_bStoreIsUtf8 || !m_pData); // we don't expect mixed mode data\n        SetUnicode();\n    }\n\n    if (a_uDataLen == 0) {\n        return SI_OK;\n    }\n\n    // determine the length of the converted data\n    SI_CONVERTER converter(m_bStoreIsUtf8);\n    size_t uLen = converter.SizeFromStore(a_pData, a_uDataLen);\n    if (uLen == (size_t)(-1)) {\n        return SI_FAIL;\n    }\n\n    // allocate memory for the data, ensure that there is a NULL\n    // terminator wherever the converted data ends\n    SI_CHAR * pData = new(std::nothrow) SI_CHAR[uLen+1];\n    if (!pData) {\n        return SI_NOMEM;\n    }\n    memset(pData, 0, sizeof(SI_CHAR)*(uLen+1));\n\n    // convert the data\n    if (!converter.ConvertFromStore(a_pData, a_uDataLen, pData, uLen)) {\n        delete[] pData;\n        return SI_FAIL;\n    }\n\n    // parse it\n    const static SI_CHAR empty = 0;\n    SI_CHAR * pWork = pData;\n    const SI_CHAR * pSection = &empty;\n    const SI_CHAR * pItem = NULL;\n    const SI_CHAR * pVal = NULL;\n    const SI_CHAR * pComment = NULL;\n\n    // We copy the strings if we are loading data into this class when we\n    // already have stored some.\n    bool bCopyStrings = (m_pData != NULL);\n\n    // find a file comment if it exists, this is a comment that starts at the\n    // beginning of the file and continues until the first blank line.\n    SI_Error rc = FindFileComment(pWork, bCopyStrings);\n    if (rc < 0) return rc;\n\n    // add every entry in the file to the data table\n    while (FindEntry(pWork, pSection, pItem, pVal, pComment)) {\n        rc = AddEntry(pSection, pItem, pVal, pComment, false, bCopyStrings);\n        if (rc < 0) return rc;\n    }\n\n    // store these strings if we didn't copy them\n    if (bCopyStrings) {\n        delete[] pData;\n    }\n    else {\n        m_pData = pData;\n        m_uDataLen = uLen+1;\n    }\n\n    return SI_OK;\n}\n\n#ifdef SI_SUPPORT_IOSTREAMS\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadData(\n    std::istream & a_istream\n    )\n{\n    std::string strData;\n    char szBuf[512];\n    do {\n        a_istream.get(szBuf, sizeof(szBuf), '\\0');\n        strData.append(szBuf);\n    }\n    while (a_istream.good());\n    return LoadData(strData);\n}\n#endif // SI_SUPPORT_IOSTREAMS\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::FindFileComment(\n    SI_CHAR *&      a_pData,\n    bool            a_bCopyStrings\n    )\n{\n    // there can only be a single file comment\n    if (m_pFileComment) {\n        return SI_OK;\n    }\n\n    // Load the file comment as multi-line text, this will modify all of\n    // the newline characters to be single \\n chars\n    if (!LoadMultiLineText(a_pData, m_pFileComment, NULL, false)) {\n        return SI_OK;\n    }\n\n    // copy the string if necessary\n    if (a_bCopyStrings) {\n        SI_Error rc = CopyString(m_pFileComment);\n        if (rc < 0) return rc;\n    }\n\n    return SI_OK;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::FindEntry(\n    SI_CHAR *&        a_pData,\n    const SI_CHAR *&  a_pSection,\n    const SI_CHAR *&  a_pKey,\n    const SI_CHAR *&  a_pVal,\n    const SI_CHAR *&  a_pComment\n    ) const\n{\n    a_pComment = NULL;\n\n    SI_CHAR * pTrail = NULL;\n    while (*a_pData) {\n        // skip spaces and empty lines\n        while (*a_pData && IsSpace(*a_pData)) {\n            ++a_pData;\n        }\n        if (!*a_pData) {\n            break;\n        }\n\n        // skip processing of comment lines but keep a pointer to\n        // the start of the comment.\n        if (IsComment(*a_pData)) {\n            LoadMultiLineText(a_pData, a_pComment, NULL, true);\n            continue;\n        }\n\n        // process section names\n        if (*a_pData == '[') {\n            // skip leading spaces\n            ++a_pData;\n            while (*a_pData && IsSpace(*a_pData)) {\n                ++a_pData;\n            }\n\n            // find the end of the section name (it may contain spaces)\n            // and convert it to lowercase as necessary\n            a_pSection = a_pData;\n            while (*a_pData && *a_pData != ']' && !IsNewLineChar(*a_pData)) {\n                ++a_pData;\n            }\n\n            // if it's an invalid line, just skip it\n            if (*a_pData != ']') {\n                continue;\n            }\n\n            // remove trailing spaces from the section\n            pTrail = a_pData - 1;\n            while (pTrail >= a_pSection && IsSpace(*pTrail)) {\n                --pTrail;\n            }\n            ++pTrail;\n            *pTrail = 0;\n\n            // skip to the end of the line\n            ++a_pData;  // safe as checked that it == ']' above\n            while (*a_pData && !IsNewLineChar(*a_pData)) {\n                ++a_pData;\n            }\n\n            a_pKey = NULL;\n            a_pVal = NULL;\n            return true;\n        }\n\n        // find the end of the key name (it may contain spaces)\n        // and convert it to lowercase as necessary\n        a_pKey = a_pData;\n        while (*a_pData && *a_pData != '=' && !IsNewLineChar(*a_pData)) {\n            ++a_pData;\n        }\n\n        // if it's an invalid line, just skip it\n        if (*a_pData != '=') {\n            continue;\n        }\n\n        // empty keys are invalid\n        if (a_pKey == a_pData) {\n            while (*a_pData && !IsNewLineChar(*a_pData)) {\n                ++a_pData;\n            }\n            continue;\n        }\n\n        // remove trailing spaces from the key\n        pTrail = a_pData - 1;\n        while (pTrail >= a_pKey && IsSpace(*pTrail)) {\n            --pTrail;\n        }\n        ++pTrail;\n        *pTrail = 0;\n\n        // skip leading whitespace on the value\n        ++a_pData;  // safe as checked that it == '=' above\n        while (*a_pData && !IsNewLineChar(*a_pData) && IsSpace(*a_pData)) {\n            ++a_pData;\n        }\n\n        // find the end of the value which is the end of this line\n        a_pVal = a_pData;\n        while (*a_pData && !IsNewLineChar(*a_pData)) {\n            ++a_pData;\n        }\n\n        // remove trailing spaces from the value\n        pTrail = a_pData - 1;\n        if (*a_pData) { // prepare for the next round\n            SkipNewLine(a_pData);\n        }\n        while (pTrail >= a_pVal && IsSpace(*pTrail)) {\n            --pTrail;\n        }\n        ++pTrail;\n        *pTrail = 0;\n\n        // check for multi-line entries\n        if (m_bAllowMultiLine && IsMultiLineTag(a_pVal)) {\n            // skip the \"<<<\" to get the tag that will end the multiline\n            const SI_CHAR * pTagName = a_pVal + 3;\n            return LoadMultiLineText(a_pData, a_pVal, pTagName);\n        }\n\n        // return the standard entry\n        return true;\n    }\n\n    return false;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::IsMultiLineTag(\n    const SI_CHAR * a_pVal\n    ) const\n{\n    // check for the \"<<<\" prefix for a multi-line entry\n    if (*a_pVal++ != '<') return false;\n    if (*a_pVal++ != '<') return false;\n    if (*a_pVal++ != '<') return false;\n    return true;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::IsMultiLineData(\n    const SI_CHAR * a_pData\n    ) const\n{\n    // data is multi-line if it has any of the following features:\n    //  * whitespace prefix\n    //  * embedded newlines\n    //  * whitespace suffix\n\n    // empty string\n    if (!*a_pData) {\n        return false;\n    }\n\n    // check for prefix\n    if (IsSpace(*a_pData)) {\n        return true;\n    }\n\n    // embedded newlines\n    while (*a_pData) {\n        if (IsNewLineChar(*a_pData)) {\n            return true;\n        }\n        ++a_pData;\n    }\n\n    // check for suffix\n    if (IsSpace(*--a_pData)) {\n        return true;\n    }\n\n    return false;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::IsNewLineChar(\n    SI_CHAR a_c\n    ) const\n{\n    return (a_c == '\\n' || a_c == '\\r');\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadMultiLineText(\n    SI_CHAR *&          a_pData,\n    const SI_CHAR *&    a_pVal,\n    const SI_CHAR *     a_pTagName,\n    bool                a_bAllowBlankLinesInComment\n    ) const\n{\n    // we modify this data to strip all newlines down to a single '\\n'\n    // character. This means that on Windows we need to strip out some\n    // characters which will make the data shorter.\n    // i.e.  LINE1-LINE1\\r\\nLINE2-LINE2\\0 will become\n    //       LINE1-LINE1\\nLINE2-LINE2\\0\n    // The pDataLine entry is the pointer to the location in memory that\n    // the current line needs to start to run following the existing one.\n    // This may be the same as pCurrLine in which case no move is needed.\n    SI_CHAR * pDataLine = a_pData;\n    SI_CHAR * pCurrLine;\n\n    // value starts at the current line\n    a_pVal = a_pData;\n\n    // find the end tag. This tag must start in column 1 and be\n    // followed by a newline. We ignore any whitespace after the end\n    // tag but not whitespace before it.\n    SI_CHAR cEndOfLineChar = *a_pData;\n    for(;;) {\n        // if we are loading comments then we need a comment character as\n        // the first character on every line\n        if (!a_pTagName && !IsComment(*a_pData)) {\n            // if we aren't allowing blank lines then we're done\n            if (!a_bAllowBlankLinesInComment) {\n                break;\n            }\n\n            // if we are allowing blank lines then we only include them\n            // in this comment if another comment follows, so read ahead\n            // to find out.\n            SI_CHAR * pCurr = a_pData;\n            int nNewLines = 0;\n            while (IsSpace(*pCurr)) {\n                if (IsNewLineChar(*pCurr)) {\n                    ++nNewLines;\n                    SkipNewLine(pCurr);\n                }\n                else {\n                    ++pCurr;\n                }\n            }\n\n            // we have a comment, add the blank lines to the output\n            // and continue processing from here\n            if (IsComment(*pCurr)) {\n                for (; nNewLines > 0; --nNewLines) *pDataLine++ = '\\n';\n                a_pData = pCurr;\n                continue;\n            }\n\n            // the comment ends here\n            break;\n        }\n\n        // find the end of this line\n        pCurrLine = a_pData;\n        while (*a_pData && !IsNewLineChar(*a_pData)) ++a_pData;\n\n        // move this line down to the location that it should be if necessary\n        if (pDataLine < pCurrLine) {\n            size_t nLen = (size_t) (a_pData - pCurrLine);\n            memmove(pDataLine, pCurrLine, nLen * sizeof(SI_CHAR));\n            pDataLine[nLen] = '\\0';\n        }\n\n        // end the line with a NULL\n        cEndOfLineChar = *a_pData;\n        *a_pData = 0;\n\n        // if are looking for a tag then do the check now. This is done before\n        // checking for end of the data, so that if we have the tag at the end\n        // of the data then the tag is removed correctly.\n        if (a_pTagName) {\n            // strip whitespace from the end of this tag\n            SI_CHAR* pc = a_pData - 1;\n            while (pc > pDataLine && IsSpace(*pc)) --pc;\n            SI_CHAR ch = *++pc;\n            *pc = 0;\n\n            if (!IsLess(pDataLine, a_pTagName) && !IsLess(a_pTagName, pDataLine)) {\n                break;\n            }\n\n            *pc = ch;\n        }\n\n        // if we are at the end of the data then we just automatically end\n        // this entry and return the current data.\n        if (!cEndOfLineChar) {\n            return true;\n        }\n\n        // otherwise we need to process this newline to ensure that it consists\n        // of just a single \\n character.\n        pDataLine += (a_pData - pCurrLine);\n        *a_pData = cEndOfLineChar;\n        SkipNewLine(a_pData);\n        *pDataLine++ = '\\n';\n    }\n\n    // if we didn't find a comment at all then return false\n    if (a_pVal == a_pData) {\n        a_pVal = NULL;\n        return false;\n    }\n\n    // the data (which ends at the end of the last line) needs to be\n    // null-terminated BEFORE before the newline character(s). If the\n    // user wants a new line in the multi-line data then they need to\n    // add an empty line before the tag.\n    *--pDataLine = '\\0';\n\n    // if looking for a tag and if we aren't at the end of the data,\n    // then move a_pData to the start of the next line.\n    if (a_pTagName && cEndOfLineChar) {\n        SI_ASSERT(IsNewLineChar(cEndOfLineChar));\n        *a_pData = cEndOfLineChar;\n        SkipNewLine(a_pData);\n    }\n\n    return true;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::CopyString(\n    const SI_CHAR *& a_pString\n    )\n{\n    size_t uLen = 0;\n    if (sizeof(SI_CHAR) == sizeof(char)) {\n        uLen = strlen((const char *)a_pString);\n    }\n    else if (sizeof(SI_CHAR) == sizeof(wchar_t)) {\n        uLen = wcslen((const wchar_t *)a_pString);\n    }\n    else {\n        for ( ; a_pString[uLen]; ++uLen) /*loop*/ ;\n    }\n    ++uLen; // NULL character\n    SI_CHAR * pCopy = new(std::nothrow) SI_CHAR[uLen];\n    if (!pCopy) {\n        return SI_NOMEM;\n    }\n    memcpy(pCopy, a_pString, sizeof(SI_CHAR)*uLen);\n    m_strings.push_back(pCopy);\n    a_pString = pCopy;\n    return SI_OK;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::AddEntry(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    const SI_CHAR * a_pValue,\n    const SI_CHAR * a_pComment,\n    bool            a_bForceReplace,\n    bool            a_bCopyStrings\n    )\n{\n    SI_Error rc;\n    bool bInserted = false;\n\n    SI_ASSERT(!a_pComment || IsComment(*a_pComment));\n\n    // if we are copying strings then make a copy of the comment now\n    // because we will need it when we add the entry.\n    if (a_bCopyStrings && a_pComment) {\n        rc = CopyString(a_pComment);\n        if (rc < 0) return rc;\n    }\n\n    // create the section entry if necessary\n    typename TSection::iterator iSection = m_data.find(a_pSection);\n    if (iSection == m_data.end()) {\n        // if the section doesn't exist then we need a copy as the\n        // string needs to last beyond the end of this function\n        if (a_bCopyStrings) {\n            rc = CopyString(a_pSection);\n            if (rc < 0) return rc;\n        }\n\n        // only set the comment if this is a section only entry\n        Entry oSection(a_pSection, ++m_nOrder);\n        if (a_pComment && (!a_pKey || !a_pValue)) {\n            oSection.pComment = a_pComment;\n        }\n\n        typename TSection::value_type oEntry(oSection, TKeyVal());\n        typedef typename TSection::iterator SectionIterator;\n        std::pair<SectionIterator,bool> i = m_data.insert(oEntry);\n        iSection = i.first;\n        bInserted = true;\n    }\n    if (!a_pKey || !a_pValue) {\n        // section only entries are specified with pItem and pVal as NULL\n        return bInserted ? SI_INSERTED : SI_UPDATED;\n    }\n\n    // check for existence of the key\n    TKeyVal & keyval = iSection->second;\n    typename TKeyVal::iterator iKey = keyval.find(a_pKey);\n    bInserted = iKey == keyval.end();\n\n    // remove all existing entries but save the load order and\n    // comment of the first entry\n    int nLoadOrder = ++m_nOrder;\n    if (iKey != keyval.end() && m_bAllowMultiKey && a_bForceReplace) {\n        const SI_CHAR * pComment = NULL;\n        while (iKey != keyval.end() && !IsLess(a_pKey, iKey->first.pItem)) {\n            if (iKey->first.nOrder < nLoadOrder) {\n                nLoadOrder = iKey->first.nOrder;\n                pComment   = iKey->first.pComment;\n            }\n            ++iKey;\n        }\n        if (pComment) {\n            DeleteString(a_pComment);\n            a_pComment = pComment;\n            CopyString(a_pComment);\n        }\n        Delete(a_pSection, a_pKey);\n        iKey = keyval.end();\n    }\n\n    // make string copies if necessary\n    bool bForceCreateNewKey = m_bAllowMultiKey && !a_bForceReplace;\n    if (a_bCopyStrings) {\n        if (bForceCreateNewKey || iKey == keyval.end()) {\n            // if the key doesn't exist then we need a copy as the\n            // string needs to last beyond the end of this function\n            // because we will be inserting the key next\n            rc = CopyString(a_pKey);\n            if (rc < 0) return rc;\n        }\n\n        // we always need a copy of the value\n        rc = CopyString(a_pValue);\n        if (rc < 0) return rc;\n    }\n\n    // create the key entry\n    if (iKey == keyval.end() || bForceCreateNewKey) {\n        Entry oKey(a_pKey, nLoadOrder);\n        if (a_pComment) {\n            oKey.pComment = a_pComment;\n        }\n        typename TKeyVal::value_type oEntry(oKey, static_cast<const SI_CHAR *>(NULL));\n        iKey = keyval.insert(oEntry);\n    }\n\n    iKey->second = a_pValue;\n    return bInserted ? SI_INSERTED : SI_UPDATED;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nconst SI_CHAR *\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    const SI_CHAR * a_pDefault,\n    bool *          a_pHasMultiple\n    ) const\n{\n    if (a_pHasMultiple) {\n        *a_pHasMultiple = false;\n    }\n    if (!a_pSection || !a_pKey) {\n        return a_pDefault;\n    }\n    typename TSection::const_iterator iSection = m_data.find(a_pSection);\n    if (iSection == m_data.end()) {\n        return a_pDefault;\n    }\n    typename TKeyVal::const_iterator iKeyVal = iSection->second.find(a_pKey);\n    if (iKeyVal == iSection->second.end()) {\n        return a_pDefault;\n    }\n\n    // check for multiple entries with the same key\n    if (m_bAllowMultiKey && a_pHasMultiple) {\n        typename TKeyVal::const_iterator iTemp = iKeyVal;\n        if (++iTemp != iSection->second.end()) {\n            if (!IsLess(a_pKey, iTemp->first.pItem)) {\n                *a_pHasMultiple = true;\n            }\n        }\n    }\n\n    return iKeyVal->second;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nlong\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetLongValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    long            a_nDefault,\n    bool *          a_pHasMultiple\n    ) const\n{\n    // return the default if we don't have a value\n    const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, NULL, a_pHasMultiple);\n    if (!pszValue || !*pszValue) return a_nDefault;\n\n    // convert to UTF-8/MBCS which for a numeric value will be the same as ASCII\n    char szValue[64] = { 0 };\n    SI_CONVERTER c(m_bStoreIsUtf8);\n    if (!c.ConvertToStore(pszValue, szValue, sizeof(szValue))) {\n        return a_nDefault;\n    }\n\n    // handle the value as hex if prefaced with \"0x\"\n    long nValue = a_nDefault;\n    char * pszSuffix = szValue;\n    if (szValue[0] == '0' && (szValue[1] == 'x' || szValue[1] == 'X')) {\n    \tif (!szValue[2]) return a_nDefault;\n        nValue = strtol(&szValue[2], &pszSuffix, 16);\n    }\n    else {\n        nValue = strtol(szValue, &pszSuffix, 10);\n    }\n\n    // any invalid strings will return the default value\n    if (*pszSuffix) { \n        return a_nDefault; \n    }\n\n    return nValue;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error \nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetLongValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    long            a_nValue,\n    const SI_CHAR * a_pComment,\n    bool            a_bUseHex,\n    bool            a_bForceReplace\n    )\n{\n    // use SetValue to create sections\n    if (!a_pSection || !a_pKey) return SI_FAIL;\n\n    // convert to an ASCII string\n    char szInput[64];\n#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE\n    sprintf_s(szInput, a_bUseHex ? \"0x%lx\" : \"%ld\", a_nValue);\n#else // !__STDC_WANT_SECURE_LIB__\n    sprintf(szInput, a_bUseHex ? \"0x%lx\" : \"%ld\", a_nValue);\n#endif // __STDC_WANT_SECURE_LIB__\n\n    // convert to output text\n    SI_CHAR szOutput[64];\n    SI_CONVERTER c(m_bStoreIsUtf8);\n    c.ConvertFromStore(szInput, strlen(szInput) + 1, \n        szOutput, sizeof(szOutput) / sizeof(SI_CHAR));\n\n    // actually add it\n    return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true);\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\ndouble\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetDoubleValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    double          a_nDefault,\n    bool *          a_pHasMultiple\n    ) const\n{\n    // return the default if we don't have a value\n    const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, NULL, a_pHasMultiple);\n    if (!pszValue || !*pszValue) return a_nDefault;\n\n    // convert to UTF-8/MBCS which for a numeric value will be the same as ASCII\n    char szValue[64] = { 0 };\n    SI_CONVERTER c(m_bStoreIsUtf8);\n    if (!c.ConvertToStore(pszValue, szValue, sizeof(szValue))) {\n        return a_nDefault;\n    }\n\n    char * pszSuffix = NULL;\n    double nValue = strtod(szValue, &pszSuffix);\n\n    // any invalid strings will return the default value\n    if (!pszSuffix || *pszSuffix) { \n        return a_nDefault; \n    }\n\n    return nValue;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error \nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetDoubleValue(\n\tconst SI_CHAR * a_pSection,\n\tconst SI_CHAR * a_pKey,\n\tdouble          a_nValue,\n\tconst SI_CHAR * a_pComment,\n\tbool            a_bForceReplace\n\t)\n{\n\t// use SetValue to create sections\n\tif (!a_pSection || !a_pKey) return SI_FAIL;\n\n\t// convert to an ASCII string\n\tchar szInput[64];\n#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE\n\tsprintf_s(szInput, \"%f\", a_nValue);\n#else // !__STDC_WANT_SECURE_LIB__\n\tsprintf(szInput, \"%f\", a_nValue);\n#endif // __STDC_WANT_SECURE_LIB__\n\n\t// convert to output text\n\tSI_CHAR szOutput[64];\n\tSI_CONVERTER c(m_bStoreIsUtf8);\n\tc.ConvertFromStore(szInput, strlen(szInput) + 1, \n\t\tszOutput, sizeof(szOutput) / sizeof(SI_CHAR));\n\n\t// actually add it\n\treturn AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true);\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetBoolValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    bool            a_bDefault,\n    bool *          a_pHasMultiple\n    ) const\n{\n    // return the default if we don't have a value\n    const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, NULL, a_pHasMultiple);\n    if (!pszValue || !*pszValue) return a_bDefault;\n\n    // we only look at the minimum number of characters\n    switch (pszValue[0]) {\n    case 't': case 'T': // true\n    case 'y': case 'Y': // yes\n    case '1':           // 1 (one)\n        return true;\n\n    case 'f': case 'F': // false\n    case 'n': case 'N': // no\n    case '0':           // 0 (zero)\n        return false;\n\n    case 'o': case 'O':\n        if (pszValue[1] == 'n' || pszValue[1] == 'N') return true;  // on\n        if (pszValue[1] == 'f' || pszValue[1] == 'F') return false; // off\n        break;\n    }\n\n    // no recognized value, return the default\n    return a_bDefault;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error \nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetBoolValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    bool            a_bValue,\n    const SI_CHAR * a_pComment,\n    bool            a_bForceReplace\n    )\n{\n    // use SetValue to create sections\n    if (!a_pSection || !a_pKey) return SI_FAIL;\n\n    // convert to an ASCII string\n    const char * pszInput = a_bValue ? \"true\" : \"false\";\n\n    // convert to output text\n    SI_CHAR szOutput[64];\n    SI_CONVERTER c(m_bStoreIsUtf8);\n    c.ConvertFromStore(pszInput, strlen(pszInput) + 1, \n        szOutput, sizeof(szOutput) / sizeof(SI_CHAR));\n\n    // actually add it\n    return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true);\n}\n    \ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetAllValues(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    TNamesDepend &  a_values\n    ) const\n{\n    a_values.clear();\n\n    if (!a_pSection || !a_pKey) {\n        return false;\n    }\n    typename TSection::const_iterator iSection = m_data.find(a_pSection);\n    if (iSection == m_data.end()) {\n        return false;\n    }\n    typename TKeyVal::const_iterator iKeyVal = iSection->second.find(a_pKey);\n    if (iKeyVal == iSection->second.end()) {\n        return false;\n    }\n\n    // insert all values for this key\n    a_values.push_back(Entry(iKeyVal->second, iKeyVal->first.pComment, iKeyVal->first.nOrder));\n    if (m_bAllowMultiKey) {\n        ++iKeyVal;\n        while (iKeyVal != iSection->second.end() && !IsLess(a_pKey, iKeyVal->first.pItem)) {\n            a_values.push_back(Entry(iKeyVal->second, iKeyVal->first.pComment, iKeyVal->first.nOrder));\n            ++iKeyVal;\n        }\n    }\n\n    return true;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nint\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetSectionSize(\n    const SI_CHAR * a_pSection\n    ) const\n{\n    if (!a_pSection) {\n        return -1;\n    }\n\n    typename TSection::const_iterator iSection = m_data.find(a_pSection);\n    if (iSection == m_data.end()) {\n        return -1;\n    }\n    const TKeyVal & section = iSection->second;\n\n    // if multi-key isn't permitted then the section size is\n    // the number of keys that we have.\n    if (!m_bAllowMultiKey || section.empty()) {\n        return (int) section.size();\n    }\n\n    // otherwise we need to count them\n    int nCount = 0;\n    const SI_CHAR * pLastKey = NULL;\n    typename TKeyVal::const_iterator iKeyVal = section.begin();\n    for (int n = 0; iKeyVal != section.end(); ++iKeyVal, ++n) {\n        if (!pLastKey || IsLess(pLastKey, iKeyVal->first.pItem)) {\n            ++nCount;\n            pLastKey = iKeyVal->first.pItem;\n        }\n    }\n    return nCount;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nconst typename CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::TKeyVal *\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetSection(\n    const SI_CHAR * a_pSection\n    ) const\n{\n    if (a_pSection) {\n        typename TSection::const_iterator i = m_data.find(a_pSection);\n        if (i != m_data.end()) {\n            return &(i->second);\n        }\n    }\n    return 0;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nvoid\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetAllSections(\n    TNamesDepend & a_names\n    ) const\n{\n    a_names.clear();\n    typename TSection::const_iterator i = m_data.begin();\n    for (int n = 0; i != m_data.end(); ++i, ++n ) {\n        a_names.push_back(i->first);\n    }\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetAllKeys(\n    const SI_CHAR * a_pSection,\n    TNamesDepend &  a_names\n    ) const\n{\n    a_names.clear();\n\n    if (!a_pSection) {\n        return false;\n    }\n\n    typename TSection::const_iterator iSection = m_data.find(a_pSection);\n    if (iSection == m_data.end()) {\n        return false;\n    }\n\n    const TKeyVal & section = iSection->second;\n    const SI_CHAR * pLastKey = NULL;\n    typename TKeyVal::const_iterator iKeyVal = section.begin();\n    for (int n = 0; iKeyVal != section.end(); ++iKeyVal, ++n ) {\n        if (!pLastKey || IsLess(pLastKey, iKeyVal->first.pItem)) {\n            a_names.push_back(iKeyVal->first);\n            pLastKey = iKeyVal->first.pItem;\n        }\n    }\n\n    return true;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SaveFile(\n    const char *    a_pszFile,\n    bool            a_bAddSignature\n    ) const\n{\n    FILE * fp = NULL;\n#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE\n    fopen_s(&fp, a_pszFile, \"wb\");\n#else // !__STDC_WANT_SECURE_LIB__\n    fp = fopen(a_pszFile, \"wb\");\n#endif // __STDC_WANT_SECURE_LIB__\n    if (!fp) return SI_FILE;\n    SI_Error rc = SaveFile(fp, a_bAddSignature);\n    fclose(fp);\n    return rc;\n}\n\n#ifdef SI_HAS_WIDE_FILE\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SaveFile(\n    const SI_WCHAR_T *  a_pwszFile,\n    bool                a_bAddSignature\n    ) const\n{\n#ifdef _WIN32\n    FILE * fp = NULL;\n#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE\n    _wfopen_s(&fp, a_pwszFile, L\"wb\");\n#else // !__STDC_WANT_SECURE_LIB__\n    fp = _wfopen(a_pwszFile, L\"wb\");\n#endif // __STDC_WANT_SECURE_LIB__\n    if (!fp) return SI_FILE;\n    SI_Error rc = SaveFile(fp, a_bAddSignature);\n    fclose(fp);\n    return rc;\n#else // !_WIN32 (therefore SI_CONVERT_ICU)\n    char szFile[256];\n    u_austrncpy(szFile, a_pwszFile, sizeof(szFile));\n    return SaveFile(szFile, a_bAddSignature);\n#endif // _WIN32\n}\n#endif // SI_HAS_WIDE_FILE\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SaveFile(\n    FILE *  a_pFile,\n    bool    a_bAddSignature\n    ) const\n{\n    FileWriter writer(a_pFile);\n    return Save(writer, a_bAddSignature);\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nSI_Error\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::Save(\n    OutputWriter &  a_oOutput,\n    bool            a_bAddSignature\n    ) const\n{\n    Converter convert(m_bStoreIsUtf8);\n\n    // add the UTF-8 signature if it is desired\n    if (m_bStoreIsUtf8 && a_bAddSignature) {\n        a_oOutput.Write(SI_UTF8_SIGNATURE);\n    }\n\n    // get all of the sections sorted in load order\n    TNamesDepend oSections;\n    GetAllSections(oSections);\n#if defined(_MSC_VER) && _MSC_VER <= 1200\n    oSections.sort();\n#elif defined(__BORLANDC__)\n    oSections.sort(Entry::LoadOrder());\n#else\n    oSections.sort(typename Entry::LoadOrder());\n#endif\n\n    // if there is an empty section name, then it must be written out first\n    // regardless of the load order\n    typename TNamesDepend::iterator is = oSections.begin();\n    for (; is != oSections.end(); ++is) {\n        if (!*is->pItem) {\n            // move the empty section name to the front of the section list\n            if (is != oSections.begin()) {\n                oSections.splice(oSections.begin(), oSections, is, std::next(is));\n            }\n            break;\n        }\n    }\n\n    // write the file comment if we have one\n    bool bNeedNewLine = false;\n    if (m_pFileComment) {\n        if (!OutputMultiLineText(a_oOutput, convert, m_pFileComment)) {\n            return SI_FAIL;\n        }\n        bNeedNewLine = true;\n    }\n\n    // iterate through our sections and output the data\n    typename TNamesDepend::const_iterator iSection = oSections.begin();\n    for ( ; iSection != oSections.end(); ++iSection ) {\n        // write out the comment if there is one\n        if (iSection->pComment) {\n            if (bNeedNewLine) {\n                a_oOutput.Write(SI_NEWLINE_A);\n                a_oOutput.Write(SI_NEWLINE_A);\n            }\n            if (!OutputMultiLineText(a_oOutput, convert, iSection->pComment)) {\n                return SI_FAIL;\n            }\n            bNeedNewLine = false;\n        }\n\n        if (bNeedNewLine) {\n            a_oOutput.Write(SI_NEWLINE_A);\n            a_oOutput.Write(SI_NEWLINE_A);\n            bNeedNewLine = false;\n        }\n\n        // write the section (unless there is no section name)\n        if (*iSection->pItem) {\n            if (!convert.ConvertToStore(iSection->pItem)) {\n                return SI_FAIL;\n            }\n            a_oOutput.Write(\"[\");\n            a_oOutput.Write(convert.Data());\n            a_oOutput.Write(\"]\");\n            a_oOutput.Write(SI_NEWLINE_A);\n        }\n\n        // get all of the keys sorted in load order\n        TNamesDepend oKeys;\n        GetAllKeys(iSection->pItem, oKeys);\n#if defined(_MSC_VER) && _MSC_VER <= 1200\n        oKeys.sort();\n#elif defined(__BORLANDC__)\n        oKeys.sort(Entry::LoadOrder());\n#else\n        oKeys.sort(typename Entry::LoadOrder());\n#endif\n\n        // write all keys and values\n        typename TNamesDepend::const_iterator iKey = oKeys.begin();\n        for ( ; iKey != oKeys.end(); ++iKey) {\n            // get all values for this key\n            TNamesDepend oValues;\n            GetAllValues(iSection->pItem, iKey->pItem, oValues);\n\n            typename TNamesDepend::const_iterator iValue = oValues.begin();\n            for ( ; iValue != oValues.end(); ++iValue) {\n                // write out the comment if there is one\n                if (iValue->pComment) {\n                    a_oOutput.Write(SI_NEWLINE_A);\n                    if (!OutputMultiLineText(a_oOutput, convert, iValue->pComment)) {\n                        return SI_FAIL;\n                    }\n                }\n\n                // write the key\n                if (!convert.ConvertToStore(iKey->pItem)) {\n                    return SI_FAIL;\n                }\n                a_oOutput.Write(convert.Data());\n\n                // write the value\n                if (!convert.ConvertToStore(iValue->pItem)) {\n                    return SI_FAIL;\n                }\n                a_oOutput.Write(m_bSpaces ? \" = \" : \"=\");\n                if (m_bAllowMultiLine && IsMultiLineData(iValue->pItem)) {\n                    // multi-line data needs to be processed specially to ensure\n                    // that we use the correct newline format for the current system\n                    a_oOutput.Write(\"<<<END_OF_TEXT\" SI_NEWLINE_A);\n                    if (!OutputMultiLineText(a_oOutput, convert, iValue->pItem)) {\n                        return SI_FAIL;\n                    }\n                    a_oOutput.Write(\"END_OF_TEXT\");\n                }\n                else {\n                    a_oOutput.Write(convert.Data());\n                }\n                a_oOutput.Write(SI_NEWLINE_A);\n            }\n        }\n\n        bNeedNewLine = true;\n    }\n\n    return SI_OK;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::OutputMultiLineText(\n    OutputWriter &  a_oOutput,\n    Converter &     a_oConverter,\n    const SI_CHAR * a_pText\n    ) const\n{\n    const SI_CHAR * pEndOfLine;\n    SI_CHAR cEndOfLineChar = *a_pText;\n    while (cEndOfLineChar) {\n        // find the end of this line\n        pEndOfLine = a_pText;\n        for (; *pEndOfLine && *pEndOfLine != '\\n'; ++pEndOfLine) /*loop*/ ;\n        cEndOfLineChar = *pEndOfLine;\n\n        // temporarily null terminate, convert and output the line\n        *const_cast<SI_CHAR*>(pEndOfLine) = 0;\n        if (!a_oConverter.ConvertToStore(a_pText)) {\n            return false;\n        }\n        *const_cast<SI_CHAR*>(pEndOfLine) = cEndOfLineChar;\n        a_pText += (pEndOfLine - a_pText) + 1;\n        a_oOutput.Write(a_oConverter.Data());\n        a_oOutput.Write(SI_NEWLINE_A);\n    }\n    return true;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::Delete(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    bool            a_bRemoveEmpty\n    )\n{\n    return DeleteValue(a_pSection, a_pKey, NULL, a_bRemoveEmpty);\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nbool\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::DeleteValue(\n    const SI_CHAR * a_pSection,\n    const SI_CHAR * a_pKey,\n    const SI_CHAR * a_pValue,\n    bool            a_bRemoveEmpty\n    )\n{\n    if (!a_pSection) {\n        return false;\n    }\n\n    typename TSection::iterator iSection = m_data.find(a_pSection);\n    if (iSection == m_data.end()) {\n        return false;\n    }\n\n    // remove a single key if we have a keyname\n    if (a_pKey) {\n        typename TKeyVal::iterator iKeyVal = iSection->second.find(a_pKey);\n        if (iKeyVal == iSection->second.end()) {\n            return false;\n        }\n\n        const static SI_STRLESS isLess = SI_STRLESS();\n\n        // remove any copied strings and then the key\n        typename TKeyVal::iterator iDelete;\n        bool bDeleted = false;\n        do {\n            iDelete = iKeyVal++;\n\n            if(a_pValue == NULL ||\n            (isLess(a_pValue, iDelete->second) == false &&\n            isLess(iDelete->second, a_pValue) == false)) {\n                DeleteString(iDelete->first.pItem);\n                DeleteString(iDelete->second);\n                iSection->second.erase(iDelete);\n                bDeleted = true;\n            }\n        }\n        while (iKeyVal != iSection->second.end()\n            && !IsLess(a_pKey, iKeyVal->first.pItem));\n\n        if(!bDeleted) {\n            return false;\n        }\n\n        // done now if the section is not empty or we are not pruning away\n        // the empty sections. Otherwise let it fall through into the section\n        // deletion code\n        if (!a_bRemoveEmpty || !iSection->second.empty()) {\n            return true;\n        }\n    }\n    else {\n        // delete all copied strings from this section. The actual\n        // entries will be removed when the section is removed.\n        typename TKeyVal::iterator iKeyVal = iSection->second.begin();\n        for ( ; iKeyVal != iSection->second.end(); ++iKeyVal) {\n            DeleteString(iKeyVal->first.pItem);\n            DeleteString(iKeyVal->second);\n        }\n    }\n\n    // delete the section itself\n    DeleteString(iSection->first.pItem);\n    m_data.erase(iSection);\n\n    return true;\n}\n\ntemplate<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>\nvoid\nCSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::DeleteString(\n    const SI_CHAR * a_pString\n    )\n{\n    // strings may exist either inside the data block, or they will be\n    // individually allocated and stored in m_strings. We only physically\n    // delete those stored in m_strings.\n    if (a_pString < m_pData || a_pString >= m_pData + m_uDataLen) {\n        typename TNamesDepend::iterator i = m_strings.begin();\n        for (;i != m_strings.end(); ++i) {\n            if (a_pString == i->pItem) {\n                delete[] const_cast<SI_CHAR*>(i->pItem);\n                m_strings.erase(i);\n                break;\n            }\n        }\n    }\n}\n\n// ---------------------------------------------------------------------------\n//                              CONVERSION FUNCTIONS\n// ---------------------------------------------------------------------------\n\n// Defines the conversion classes for different libraries. Before including\n// SimpleIni.h, set the converter that you wish you use by defining one of the\n// following symbols.\n//\n//  SI_NO_CONVERSION        Do not make the \"W\" wide character version of the \n//                          library available. Only CSimpleIniA etc is defined.\n//  SI_CONVERT_GENERIC      Use the Unicode reference conversion library in\n//                          the accompanying files ConvertUTF.h/c\n//  SI_CONVERT_ICU          Use the IBM ICU conversion library. Requires\n//                          ICU headers on include path and icuuc.lib\n//  SI_CONVERT_WIN32        Use the Win32 API functions for conversion.\n\n#if !defined(SI_NO_CONVERSION) && !defined(SI_CONVERT_GENERIC) && !defined(SI_CONVERT_WIN32) && !defined(SI_CONVERT_ICU)\n# ifdef _WIN32\n#  define SI_CONVERT_WIN32\n# else\n#  define SI_CONVERT_GENERIC\n# endif\n#endif\n\n/**\n * Generic case-sensitive less than comparison. This class returns numerically\n * ordered ASCII case-sensitive text for all possible sizes and types of\n * SI_CHAR.\n */\ntemplate<class SI_CHAR>\nstruct SI_GenericCase {\n    bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const {\n        long cmp;\n        for ( ;*pLeft && *pRight; ++pLeft, ++pRight) {\n            cmp = (long) *pLeft - (long) *pRight;\n            if (cmp != 0) {\n                return cmp < 0;\n            }\n        }\n        return *pRight != 0;\n    }\n};\n\n/**\n * Generic ASCII case-insensitive less than comparison. This class returns\n * numerically ordered ASCII case-insensitive text for all possible sizes\n * and types of SI_CHAR. It is not safe for MBCS text comparison where\n * ASCII A-Z characters are used in the encoding of multi-byte characters.\n */\ntemplate<class SI_CHAR>\nstruct SI_GenericNoCase {\n    inline SI_CHAR locase(SI_CHAR ch) const {\n        return (ch < 'A' || ch > 'Z') ? ch : (ch - 'A' + 'a');\n    }\n    bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const {\n        long cmp;\n        for ( ;*pLeft && *pRight; ++pLeft, ++pRight) {\n            cmp = (long) locase(*pLeft) - (long) locase(*pRight);\n            if (cmp != 0) {\n                return cmp < 0;\n            }\n        }\n        return *pRight != 0;\n    }\n};\n\n/**\n * Null conversion class for MBCS/UTF-8 to char (or equivalent).\n */\ntemplate<class SI_CHAR>\nclass SI_ConvertA {\n    bool m_bStoreIsUtf8;\nprotected:\n    SI_ConvertA() { }\npublic:\n    SI_ConvertA(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { }\n\n    /* copy and assignment */\n    SI_ConvertA(const SI_ConvertA & rhs) { operator=(rhs); }\n    SI_ConvertA & operator=(const SI_ConvertA & rhs) {\n        m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8;\n        return *this;\n    }\n\n    /** Calculate the number of SI_CHAR required for converting the input\n     * from the storage format. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to SI_CHAR.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @return              Number of SI_CHAR required by the string when\n     *                      converted. If there are embedded NULL bytes in the\n     *                      input data, only the string up and not including\n     *                      the NULL byte will be converted.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen)\n    {\n        (void)a_pInputData;\n        SI_ASSERT(a_uInputDataLen != (size_t) -1);\n\n        // ASCII/MBCS/UTF-8 needs no conversion\n        return a_uInputDataLen;\n    }\n\n    /** Convert the input string from the storage format to SI_CHAR.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to SI_CHAR.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @param a_pOutputData Pointer to the output buffer to received the\n     *                      converted data.\n     * @param a_uOutputDataSize Size of the output buffer in SI_CHAR.\n     * @return              true if all of the input data was successfully\n     *                      converted.\n     */\n    bool ConvertFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen,\n        SI_CHAR *       a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        // ASCII/MBCS/UTF-8 needs no conversion\n        if (a_uInputDataLen > a_uOutputDataSize) {\n            return false;\n        }\n        memcpy(a_pOutputData, a_pInputData, a_uInputDataLen);\n        return true;\n    }\n\n    /** Calculate the number of char required by the storage format of this\n     * data. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated string to calculate the number of\n     *                      bytes required to be converted to storage format.\n     * @return              Number of bytes required by the string when\n     *                      converted to storage format. This size always\n     *                      includes space for the terminating NULL character.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeToStore(\n        const SI_CHAR * a_pInputData)\n    {\n        // ASCII/MBCS/UTF-8 needs no conversion\n        return strlen((const char *)a_pInputData) + 1;\n    }\n\n    /** Convert the input string to the storage format of this data.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated source string to convert. All of\n     *                      the data will be converted including the\n     *                      terminating NULL character.\n     * @param a_pOutputData Pointer to the buffer to receive the converted\n     *                      string.\n     * @param a_uOutputDataSize Size of the output buffer in char.\n     * @return              true if all of the input data, including the\n     *                      terminating NULL character was successfully\n     *                      converted.\n     */\n    bool ConvertToStore(\n        const SI_CHAR * a_pInputData,\n        char *          a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        // calc input string length (SI_CHAR type and size independent)\n        size_t uInputLen = strlen((const char *)a_pInputData) + 1;\n        if (uInputLen > a_uOutputDataSize) {\n            return false;\n        }\n\n        // ascii/UTF-8 needs no conversion\n        memcpy(a_pOutputData, a_pInputData, uInputLen);\n        return true;\n    }\n};\n\n\n// ---------------------------------------------------------------------------\n//                              SI_CONVERT_GENERIC\n// ---------------------------------------------------------------------------\n#ifdef SI_CONVERT_GENERIC\n\n#define SI_Case     SI_GenericCase\n#define SI_NoCase   SI_GenericNoCase\n\n#include <wchar.h>\n#include \"ConvertUTF.h\"\n\n/**\n * Converts UTF-8 to a wchar_t (or equivalent) using the Unicode reference\n * library functions. This can be used on all platforms.\n */\ntemplate<class SI_CHAR>\nclass SI_ConvertW {\n    bool m_bStoreIsUtf8;\nprotected:\n    SI_ConvertW() { }\npublic:\n    SI_ConvertW(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { }\n\n    /* copy and assignment */\n    SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); }\n    SI_ConvertW & operator=(const SI_ConvertW & rhs) {\n        m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8;\n        return *this;\n    }\n\n    /** Calculate the number of SI_CHAR required for converting the input\n     * from the storage format. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to SI_CHAR.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @return              Number of SI_CHAR required by the string when\n     *                      converted. If there are embedded NULL bytes in the\n     *                      input data, only the string up and not including\n     *                      the NULL byte will be converted.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen)\n    {\n        SI_ASSERT(a_uInputDataLen != (size_t) -1);\n\n        if (m_bStoreIsUtf8) {\n            // worst case scenario for UTF-8 to wchar_t is 1 char -> 1 wchar_t\n            // so we just return the same number of characters required as for\n            // the source text.\n            return a_uInputDataLen;\n        }\n\n#if defined(SI_NO_MBSTOWCS_NULL) || (!defined(_MSC_VER) && !defined(_linux))\n        // fall back processing for platforms that don't support a NULL dest to mbstowcs\n        // worst case scenario is 1:1, this will be a sufficient buffer size\n        (void)a_pInputData;\n        return a_uInputDataLen;\n#else\n        // get the actual required buffer size\n        return mbstowcs(NULL, a_pInputData, a_uInputDataLen);\n#endif\n    }\n\n    /** Convert the input string from the storage format to SI_CHAR.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to SI_CHAR.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                       must be the actual length of the data, including\n     *                       NULL byte if NULL terminated string is required.\n     * @param a_pOutputData Pointer to the output buffer to received the\n     *                       converted data.\n     * @param a_uOutputDataSize Size of the output buffer in SI_CHAR.\n     * @return              true if all of the input data was successfully\n     *                       converted.\n     */\n    bool ConvertFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen,\n        SI_CHAR *       a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        if (m_bStoreIsUtf8) {\n            // This uses the Unicode reference implementation to do the\n            // conversion from UTF-8 to wchar_t. The required files are\n            // ConvertUTF.h and ConvertUTF.c which should be included in\n            // the distribution but are publically available from unicode.org\n            // at http://www.unicode.org/Public/PROGRAMS/CVTUTF/\n            ConversionResult retval;\n            const UTF8 * pUtf8 = (const UTF8 *) a_pInputData;\n            if (sizeof(wchar_t) == sizeof(UTF32)) {\n                UTF32 * pUtf32 = (UTF32 *) a_pOutputData;\n                retval = ConvertUTF8toUTF32(\n                    &pUtf8, pUtf8 + a_uInputDataLen,\n                    &pUtf32, pUtf32 + a_uOutputDataSize,\n                    lenientConversion);\n            }\n            else if (sizeof(wchar_t) == sizeof(UTF16)) {\n                UTF16 * pUtf16 = (UTF16 *) a_pOutputData;\n                retval = ConvertUTF8toUTF16(\n                    &pUtf8, pUtf8 + a_uInputDataLen,\n                    &pUtf16, pUtf16 + a_uOutputDataSize,\n                    lenientConversion);\n            }\n            return retval == conversionOK;\n        }\n\n        // convert to wchar_t\n        size_t retval = mbstowcs(a_pOutputData,\n            a_pInputData, a_uOutputDataSize);\n        return retval != (size_t)(-1);\n    }\n\n    /** Calculate the number of char required by the storage format of this\n     * data. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated string to calculate the number of\n     *                       bytes required to be converted to storage format.\n     * @return              Number of bytes required by the string when\n     *                       converted to storage format. This size always\n     *                       includes space for the terminating NULL character.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeToStore(\n        const SI_CHAR * a_pInputData)\n    {\n        if (m_bStoreIsUtf8) {\n            // worst case scenario for wchar_t to UTF-8 is 1 wchar_t -> 6 char\n            size_t uLen = 0;\n            while (a_pInputData[uLen]) {\n                ++uLen;\n            }\n            return (6 * uLen) + 1;\n        }\n        else {\n            size_t uLen = wcstombs(NULL, a_pInputData, 0);\n            if (uLen == (size_t)(-1)) {\n                return uLen;\n            }\n            return uLen + 1; // include NULL terminator\n        }\n    }\n\n    /** Convert the input string to the storage format of this data.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated source string to convert. All of\n     *                       the data will be converted including the\n     *                       terminating NULL character.\n     * @param a_pOutputData Pointer to the buffer to receive the converted\n     *                       string.\n     * @param a_uOutputDataSize Size of the output buffer in char.\n     * @return              true if all of the input data, including the\n     *                       terminating NULL character was successfully\n     *                       converted.\n     */\n    bool ConvertToStore(\n        const SI_CHAR * a_pInputData,\n        char *          a_pOutputData,\n        size_t          a_uOutputDataSize\n        )\n    {\n        if (m_bStoreIsUtf8) {\n            // calc input string length (SI_CHAR type and size independent)\n            size_t uInputLen = 0;\n            while (a_pInputData[uInputLen]) {\n                ++uInputLen;\n            }\n            ++uInputLen; // include the NULL char\n\n            // This uses the Unicode reference implementation to do the\n            // conversion from wchar_t to UTF-8. The required files are\n            // ConvertUTF.h and ConvertUTF.c which should be included in\n            // the distribution but are publically available from unicode.org\n            // at http://www.unicode.org/Public/PROGRAMS/CVTUTF/\n            ConversionResult retval;\n            UTF8 * pUtf8 = (UTF8 *) a_pOutputData;\n            if (sizeof(wchar_t) == sizeof(UTF32)) {\n                const UTF32 * pUtf32 = (const UTF32 *) a_pInputData;\n                retval = ConvertUTF32toUTF8(\n                    &pUtf32, pUtf32 + uInputLen,\n                    &pUtf8, pUtf8 + a_uOutputDataSize,\n                    lenientConversion);\n            }\n            else if (sizeof(wchar_t) == sizeof(UTF16)) {\n                const UTF16 * pUtf16 = (const UTF16 *) a_pInputData;\n                retval = ConvertUTF16toUTF8(\n                    &pUtf16, pUtf16 + uInputLen,\n                    &pUtf8, pUtf8 + a_uOutputDataSize,\n                    lenientConversion);\n            }\n            return retval == conversionOK;\n        }\n        else {\n            size_t retval = wcstombs(a_pOutputData,\n                a_pInputData, a_uOutputDataSize);\n            return retval != (size_t) -1;\n        }\n    }\n};\n\n#endif // SI_CONVERT_GENERIC\n\n\n// ---------------------------------------------------------------------------\n//                              SI_CONVERT_ICU\n// ---------------------------------------------------------------------------\n#ifdef SI_CONVERT_ICU\n\n#define SI_Case     SI_GenericCase\n#define SI_NoCase   SI_GenericNoCase\n\n#include <unicode/ucnv.h>\n\n/**\n * Converts MBCS/UTF-8 to UChar using ICU. This can be used on all platforms.\n */\ntemplate<class SI_CHAR>\nclass SI_ConvertW {\n    const char * m_pEncoding;\n    UConverter * m_pConverter;\nprotected:\n    SI_ConvertW() : m_pEncoding(NULL), m_pConverter(NULL) { }\npublic:\n    SI_ConvertW(bool a_bStoreIsUtf8) : m_pConverter(NULL) {\n        m_pEncoding = a_bStoreIsUtf8 ? \"UTF-8\" : NULL;\n    }\n\n    /* copy and assignment */\n    SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); }\n    SI_ConvertW & operator=(const SI_ConvertW & rhs) {\n        m_pEncoding = rhs.m_pEncoding;\n        m_pConverter = NULL;\n        return *this;\n    }\n    ~SI_ConvertW() { if (m_pConverter) ucnv_close(m_pConverter); }\n\n    /** Calculate the number of UChar required for converting the input\n     * from the storage format. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to UChar.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @return              Number of UChar required by the string when\n     *                      converted. If there are embedded NULL bytes in the\n     *                      input data, only the string up and not including\n     *                      the NULL byte will be converted.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen)\n    {\n        SI_ASSERT(a_uInputDataLen != (size_t) -1);\n\n        UErrorCode nError;\n\n        if (!m_pConverter) {\n            nError = U_ZERO_ERROR;\n            m_pConverter = ucnv_open(m_pEncoding, &nError);\n            if (U_FAILURE(nError)) {\n                return (size_t) -1;\n            }\n        }\n\n        nError = U_ZERO_ERROR;\n        int32_t nLen = ucnv_toUChars(m_pConverter, NULL, 0,\n            a_pInputData, (int32_t) a_uInputDataLen, &nError);\n        if (U_FAILURE(nError) && nError != U_BUFFER_OVERFLOW_ERROR) {\n            return (size_t) -1;\n        }\n\n        return (size_t) nLen;\n    }\n\n    /** Convert the input string from the storage format to UChar.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to UChar.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @param a_pOutputData Pointer to the output buffer to received the\n     *                      converted data.\n     * @param a_uOutputDataSize Size of the output buffer in UChar.\n     * @return              true if all of the input data was successfully\n     *                      converted.\n     */\n    bool ConvertFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen,\n        UChar *         a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        UErrorCode nError;\n\n        if (!m_pConverter) {\n            nError = U_ZERO_ERROR;\n            m_pConverter = ucnv_open(m_pEncoding, &nError);\n            if (U_FAILURE(nError)) {\n                return false;\n            }\n        }\n\n        nError = U_ZERO_ERROR;\n        ucnv_toUChars(m_pConverter,\n            a_pOutputData, (int32_t) a_uOutputDataSize,\n            a_pInputData, (int32_t) a_uInputDataLen, &nError);\n        if (U_FAILURE(nError)) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /** Calculate the number of char required by the storage format of this\n     * data. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated string to calculate the number of\n     *                      bytes required to be converted to storage format.\n     * @return              Number of bytes required by the string when\n     *                      converted to storage format. This size always\n     *                      includes space for the terminating NULL character.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeToStore(\n        const UChar * a_pInputData)\n    {\n        UErrorCode nError;\n\n        if (!m_pConverter) {\n            nError = U_ZERO_ERROR;\n            m_pConverter = ucnv_open(m_pEncoding, &nError);\n            if (U_FAILURE(nError)) {\n                return (size_t) -1;\n            }\n        }\n\n        nError = U_ZERO_ERROR;\n        int32_t nLen = ucnv_fromUChars(m_pConverter, NULL, 0,\n            a_pInputData, -1, &nError);\n        if (U_FAILURE(nError) && nError != U_BUFFER_OVERFLOW_ERROR) {\n            return (size_t) -1;\n        }\n\n        return (size_t) nLen + 1;\n    }\n\n    /** Convert the input string to the storage format of this data.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated source string to convert. All of\n     *                      the data will be converted including the\n     *                      terminating NULL character.\n     * @param a_pOutputData Pointer to the buffer to receive the converted\n     *                      string.\n     * @param a_pOutputDataSize Size of the output buffer in char.\n     * @return              true if all of the input data, including the\n     *                      terminating NULL character was successfully\n     *                      converted.\n     */\n    bool ConvertToStore(\n        const UChar *   a_pInputData,\n        char *          a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        UErrorCode nError;\n\n        if (!m_pConverter) {\n            nError = U_ZERO_ERROR;\n            m_pConverter = ucnv_open(m_pEncoding, &nError);\n            if (U_FAILURE(nError)) {\n                return false;\n            }\n        }\n\n        nError = U_ZERO_ERROR;\n        ucnv_fromUChars(m_pConverter,\n            a_pOutputData, (int32_t) a_uOutputDataSize,\n            a_pInputData, -1, &nError);\n        if (U_FAILURE(nError)) {\n            return false;\n        }\n\n        return true;\n    }\n};\n\n#endif // SI_CONVERT_ICU\n\n\n// ---------------------------------------------------------------------------\n//                              SI_CONVERT_WIN32\n// ---------------------------------------------------------------------------\n#ifdef SI_CONVERT_WIN32\n\n#define SI_Case     SI_GenericCase\n\n// Windows CE doesn't have errno or MBCS libraries\n#ifdef _WIN32_WCE\n# ifndef SI_NO_MBCS\n#  define SI_NO_MBCS\n# endif\n#endif\n\n#include <windows.h>\n#ifdef SI_NO_MBCS\n# define SI_NoCase   SI_GenericNoCase\n#else // !SI_NO_MBCS\n/**\n * Case-insensitive comparison class using Win32 MBCS functions. This class\n * returns a case-insensitive semi-collation order for MBCS text. It may not\n * be safe for UTF-8 text returned in char format as we don't know what\n * characters will be folded by the function! Therefore, if you are using\n * SI_CHAR == char and SetUnicode(true), then you need to use the generic\n * SI_NoCase class instead.\n */\n#include <mbstring.h>\ntemplate<class SI_CHAR>\nstruct SI_NoCase {\n    bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const {\n        if (sizeof(SI_CHAR) == sizeof(char)) {\n            return _mbsicmp((const unsigned char *)pLeft,\n                (const unsigned char *)pRight) < 0;\n        }\n        if (sizeof(SI_CHAR) == sizeof(wchar_t)) {\n            return _wcsicmp((const wchar_t *)pLeft,\n                (const wchar_t *)pRight) < 0;\n        }\n        return SI_GenericNoCase<SI_CHAR>()(pLeft, pRight);\n    }\n};\n#endif // SI_NO_MBCS\n\n/**\n * Converts MBCS and UTF-8 to a wchar_t (or equivalent) on Windows. This uses\n * only the Win32 functions and doesn't require the external Unicode UTF-8\n * conversion library. It will not work on Windows 95 without using Microsoft\n * Layer for Unicode in your application.\n */\ntemplate<class SI_CHAR>\nclass SI_ConvertW {\n    UINT m_uCodePage;\nprotected:\n    SI_ConvertW() { }\npublic:\n    SI_ConvertW(bool a_bStoreIsUtf8) {\n        m_uCodePage = a_bStoreIsUtf8 ? CP_UTF8 : CP_ACP;\n    }\n\n    /* copy and assignment */\n    SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); }\n    SI_ConvertW & operator=(const SI_ConvertW & rhs) {\n        m_uCodePage = rhs.m_uCodePage;\n        return *this;\n    }\n\n    /** Calculate the number of SI_CHAR required for converting the input\n     * from the storage format. The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to SI_CHAR.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @return              Number of SI_CHAR required by the string when\n     *                      converted. If there are embedded NULL bytes in the\n     *                      input data, only the string up and not including\n     *                      the NULL byte will be converted.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen)\n    {\n        SI_ASSERT(a_uInputDataLen != (size_t) -1);\n\n        int retval = MultiByteToWideChar(\n            m_uCodePage, 0,\n            a_pInputData, (int) a_uInputDataLen,\n            0, 0);\n        return (size_t)(retval > 0 ? retval : -1);\n    }\n\n    /** Convert the input string from the storage format to SI_CHAR.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  Data in storage format to be converted to SI_CHAR.\n     * @param a_uInputDataLen Length of storage format data in bytes. This\n     *                      must be the actual length of the data, including\n     *                      NULL byte if NULL terminated string is required.\n     * @param a_pOutputData Pointer to the output buffer to received the\n     *                      converted data.\n     * @param a_uOutputDataSize Size of the output buffer in SI_CHAR.\n     * @return              true if all of the input data was successfully\n     *                      converted.\n     */\n    bool ConvertFromStore(\n        const char *    a_pInputData,\n        size_t          a_uInputDataLen,\n        SI_CHAR *       a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        int nSize = MultiByteToWideChar(\n            m_uCodePage, 0,\n            a_pInputData, (int) a_uInputDataLen,\n            (wchar_t *) a_pOutputData, (int) a_uOutputDataSize);\n        return (nSize > 0);\n    }\n\n    /** Calculate the number of char required by the storage format of this\n     * data. The storage format is always UTF-8.\n     *\n     * @param a_pInputData  NULL terminated string to calculate the number of\n     *                      bytes required to be converted to storage format.\n     * @return              Number of bytes required by the string when\n     *                      converted to storage format. This size always\n     *                      includes space for the terminating NULL character.\n     * @return              -1 cast to size_t on a conversion error.\n     */\n    size_t SizeToStore(\n        const SI_CHAR * a_pInputData)\n    {\n        int retval = WideCharToMultiByte(\n            m_uCodePage, 0,\n            (const wchar_t *) a_pInputData, -1,\n            0, 0, 0, 0);\n        return (size_t) (retval > 0 ? retval : -1);\n    }\n\n    /** Convert the input string to the storage format of this data.\n     * The storage format is always UTF-8 or MBCS.\n     *\n     * @param a_pInputData  NULL terminated source string to convert. All of\n     *                      the data will be converted including the\n     *                      terminating NULL character.\n     * @param a_pOutputData Pointer to the buffer to receive the converted\n     *                      string.\n     * @param a_pOutputDataSize Size of the output buffer in char.\n     * @return              true if all of the input data, including the\n     *                      terminating NULL character was successfully\n     *                      converted.\n     */\n    bool ConvertToStore(\n        const SI_CHAR * a_pInputData,\n        char *          a_pOutputData,\n        size_t          a_uOutputDataSize)\n    {\n        int retval = WideCharToMultiByte(\n            m_uCodePage, 0,\n            (const wchar_t *) a_pInputData, -1,\n            a_pOutputData, (int) a_uOutputDataSize, 0, 0);\n        return retval > 0;\n    }\n};\n\n#endif // SI_CONVERT_WIN32\n\n\n// ---------------------------------------------------------------------------\n//                                  TYPE DEFINITIONS\n// ---------------------------------------------------------------------------\n\ntypedef CSimpleIniTempl<char,\n    SI_NoCase<char>,SI_ConvertA<char> >                 CSimpleIniA;\ntypedef CSimpleIniTempl<char,\n    SI_Case<char>,SI_ConvertA<char> >                   CSimpleIniCaseA;\n\n#if defined(SI_NO_CONVERSION)\n// if there is no wide char conversion then we don't need to define the \n// widechar \"W\" versions of CSimpleIni\n# define CSimpleIni      CSimpleIniA\n# define CSimpleIniCase  CSimpleIniCaseA\n# define SI_NEWLINE      SI_NEWLINE_A\n#else\n# if defined(SI_CONVERT_ICU)\ntypedef CSimpleIniTempl<UChar,\n    SI_NoCase<UChar>,SI_ConvertW<UChar> >               CSimpleIniW;\ntypedef CSimpleIniTempl<UChar,\n    SI_Case<UChar>,SI_ConvertW<UChar> >                 CSimpleIniCaseW;\n# else\ntypedef CSimpleIniTempl<wchar_t,\n    SI_NoCase<wchar_t>,SI_ConvertW<wchar_t> >           CSimpleIniW;\ntypedef CSimpleIniTempl<wchar_t,\n    SI_Case<wchar_t>,SI_ConvertW<wchar_t> >             CSimpleIniCaseW;\n# endif\n\n# ifdef _UNICODE\n#  define CSimpleIni      CSimpleIniW\n#  define CSimpleIniCase  CSimpleIniCaseW\n#  define SI_NEWLINE      SI_NEWLINE_W\n# else // !_UNICODE \n#  define CSimpleIni      CSimpleIniA\n#  define CSimpleIniCase  CSimpleIniCaseA\n#  define SI_NEWLINE      SI_NEWLINE_A\n# endif // _UNICODE\n#endif\n\n#ifdef _MSC_VER\n# pragma warning (pop)\n#endif\n\n#endif // INCLUDED_SimpleIni_h\n\n"
  },
  {
    "path": "source-code/dependencies/simpleini/other/package.cmd",
    "content": "set VERSION=4.15\n\nset SEVENZIP=\"C:\\Program Files\\7-Zip\\7z.exe\"\n\nFOR /F \"tokens=*\" %%G IN ('DIR /AD /B /S Debug*') DO (\n    DEL /S /Q \"%%G\"\n    RD \"%%G\"\n)\nFOR /F \"tokens=*\" %%G IN ('DIR /AD /B /S Release*') DO (\n    DEL /S /Q \"%%G\"\n    RD \"%%G\"\n)\nDEL /Q \"SimpleIni.ncb\"\nATTRIB -H \"SimpleIni.suo\"\nDEL /Q \"SimpleIni.suo\"\nDEL /Q \"SimpleIni.opt\"\nDEL /Q testsi-out*.ini\nDEL /Q test1-blah.ini\nDEL /Q test1-output.ini\nSTART \"Generate documentation\" /WAIT \"C:\\Program Files (x86)\\doxygen\\bin\\doxygen.exe\" SimpleIni.doxy\ncd ..\ndel simpleini-%VERSION%.zip\n%SEVENZIP% a -tzip -r- -x!simpleini\\.svn simpleini-%VERSION%.zip simpleini\\*\ndel simpleini-doc.zip\n%SEVENZIP% a -tzip -r simpleini-doc.zip simpleini-doc\\*\ncd simpleini\n"
  },
  {
    "path": "source-code/dependencies/simpleini/other/simpleini.doxy",
    "content": "# Doxyfile 1.5.4\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project\n#\n# All text after a hash (#) is considered a comment and will be ignored\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \")\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file that \n# follow. The default is UTF-8 which is also the encoding used for all text before \n# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into \n# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of \n# possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n# by quotes) that should identify the project.\n\nPROJECT_NAME           = SimpleIni\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. \n# This could be handy for archiving the generated documentation or \n# if some version control system is used.\n\nPROJECT_NUMBER         = \n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n# base path where the generated documentation will be put. \n# If a relative path is entered, it will be relative to the location \n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = D:/src/simpleini-doc\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n# 4096 sub-directories (in 2 levels) under the output directory of each output \n# format and will distribute the generated files over these directories. \n# Enabling this option can be useful when feeding doxygen a huge amount of \n# source files, where putting all generated files in the same directory would \n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all \n# documentation generated by doxygen is written. Doxygen will use this \n# information to generate all constant output in the proper language. \n# The default language is English, other supported languages are: \n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, \n# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, \n# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, \n# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, \n# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n# include brief member descriptions after the members that are listed in \n# the file and class documentation (similar to JavaDoc). \n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n# the brief description of a member or function before the detailed description. \n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator \n# that is used to form the text in various listings. Each string \n# in this list, if found as the leading text of the brief description, will be \n# stripped from the text and the result after processing the whole list, is \n# used as the annotated text. Otherwise, the brief description is used as-is. \n# If left blank, the following values are used (\"$name\" is automatically \n# replaced with the name of the entity): \"The $name class\" \"The $name widget\" \n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\" \n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \"The $name class  \" \\\n                         \"The $name widget  \" \\\n                         \"The $name file  \" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n# Doxygen will generate a detailed section even if there is only a brief \n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all \n# inherited members of a class in the documentation of that class as if those \n# members were ordinary class members. Constructors, destructors and assignment \n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n# path before files name in the file list and in the header files. If set \n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n# can be used to strip a user-defined part of the path. Stripping is \n# only done if one of the specified strings matches the left-hand part of \n# the path. The tag can be used to show relative paths in the file list. \n# If left blank the directory from which doxygen is run is used as the \n# path to strip.\n\nSTRIP_FROM_PATH        = \"D:/src/simpleini/  \"\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of \n# the path mentioned in the documentation of a class, which tells \n# the reader which header file to include in order to use a class. \n# If left blank only the name of the header file containing the class \n# definition is used. Otherwise one should specify the include paths that \n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    = \n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n# (but less readable) file names. This can be useful is your file systems \n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n# will interpret the first line (until the first dot) of a JavaDoc-style \n# comment as the brief description. If set to NO, the JavaDoc \n# comments will behave just like regular Qt-style comments \n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will \n# interpret the first line (until the first dot) of a Qt-style \n# comment as the brief description. If set to NO, the comments \n# will behave just like regular Qt-style comments (thus requiring \n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n# treat a multi-line C++ special comment block (i.e. a block of //! or /// \n# comments) as a brief description. This used to be the default behaviour. \n# The new default is to treat a multi-line C++ comment block as a detailed \n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the DETAILS_AT_TOP tag is set to YES then Doxygen \n# will output the detailed description near the top, like JavaDoc.\n# If set to NO, the detailed description appears after the member \n# documentation.\n\nDETAILS_AT_TOP         = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n# member inherits the documentation from any documented member that it \n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce \n# a new page for each member. If set to NO, the documentation of a member will \n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. \n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 4\n\n# This tag can be used to specify a number of aliases that acts \n# as commands in the documentation. An alias has the form \"name=value\". \n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n# put the command \\sideeffect (or @sideeffect) in the documentation, which \n# will result in a user-defined paragraph with heading \"Side Effects:\". \n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                = \n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C \n# sources only. Doxygen will then generate output that is more tailored for C. \n# For instance, some of the names that are used will be different. The list \n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java \n# sources only. Doxygen will then generate output that is more tailored for Java. \n# For instance, namespaces will be presented as packages, qualified scopes \n# will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to \n# include (a tag file for) the STL sources as input, then you should \n# set this tag to YES in order to let doxygen match functions declarations and \n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. \n# func(std::string) {}). This also make the inheritance and collaboration \n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. \n# Doxygen will parse them like normal C++ but will assume all classes use public \n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n# tag is set to YES, then doxygen will reuse the documentation of the first \n# member in the group (if any) for the other members of the group. By default \n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n# the same type (for instance a group of public functions) to be put as a \n# subgroup of that type (e.g. under the Public Functions section). Set it to \n# NO to prevent subgrouping. Alternatively, this can be done per class using \n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct (or union) is \n# documented as struct with the name of the typedef. So \n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct \n# with name TypeT. When disabled the typedef will appear as a member of a file, \n# namespace, or class. And the struct will be named TypeS. This can typically \n# be useful for C code where the coding convention is that all structs are \n# typedef'ed and only the typedef is referenced never the struct's name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n# documentation are documented, even if no documentation was available. \n# Private class members and static file members will be hidden unless \n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file \n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n# defined locally in source files will be included in the documentation. \n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local \n# methods, which are defined in the implementation section but not in \n# the interface are included in the documentation. \n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be extracted \n# and appear in the documentation as a namespace called 'anonymous_namespace{file}', \n# where file will be replaced with the base name of the file that contains the anonymous \n# namespace. By default anonymous namespace are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n# undocumented members of documented classes, files or namespaces. \n# If set to NO (the default) these members will be included in the \n# various overviews, but no documentation section is generated. \n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n# undocumented classes that are normally visible in the class hierarchy. \n# If set to NO (the default) these classes will be included in the various \n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n# friend (class|struct|union) declarations. \n# If set to NO (the default) these declarations will be included in the \n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n# documentation blocks found inside the body of a function. \n# If set to NO (the default) these blocks will be appended to the \n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation \n# that is typed after a \\internal command is included. If the tag is set \n# to NO (the default) then the documentation will be excluded. \n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n# file names in lower-case letters. If set to YES upper-case letters are also \n# allowed. This is useful if you have classes or files whose names only differ \n# in case and if your file system supports case sensitive file names. Windows \n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n# will show members with their full class and namespace scopes in the \n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n# will put a list of the files that are included by a file in the documentation \n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n# will sort the (detailed) documentation of file and class members \n# alphabetically by member name. If set to NO the members will appear in \n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n# brief documentation of file, namespace and class members alphabetically \n# by member name. If set to NO (the default) the members will appear in \n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n# sorted by fully-qualified names, including namespaces. If set to \n# NO (the default), the class list will be sorted only by class name, \n# not including the namespace part. \n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the \n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or \n# disable (NO) the todo list. This list is created by putting \\todo \n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or \n# disable (NO) the test list. This list is created by putting \\test \n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or \n# disable (NO) the bug list. This list is created by putting \\bug \n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n# disable (NO) the deprecated list. This list is created by putting \n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional \n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       = \n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n# the initial value of a variable or define consists of for it to appear in \n# the documentation. If the initializer consists of more lines than specified \n# here it will be hidden. Use a value of 0 to hide initializers completely. \n# The appearance of the initializer of individual variables and defines in the \n# documentation can be controlled using \\showinitializer or \\hideinitializer \n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n# at the bottom of the documentation of classes and structs. If set to YES the \n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# If the sources in your project are distributed over multiple directories \n# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy \n# in the documentation. The default is NO.\n\nSHOW_DIRECTORIES       = NO\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that \n# doxygen should invoke to get the current version for each file (typically from the \n# version control system). Doxygen will invoke the program by executing (via \n# popen()) the command <command> <input-file>, where <command> is the value of \n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file \n# provided by doxygen. Whatever the program writes to standard output \n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    = \n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated \n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are \n# generated by doxygen. Possible values are YES and NO. If left blank \n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n# potential errors in the documentation, such as not documenting some \n# parameters in a documented function, or documenting parameters that \n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be abled to get warnings for \n# functions that are documented, but have no documentation for their parameters \n# or return value. If set to NO (the default) doxygen will only warn about \n# wrong or incomplete parameter documentation, but not about the absence of \n# documentation.\n\nWARN_NO_PARAMDOC       = YES\n\n# The WARN_FORMAT tag determines the format of the warning messages that \n# doxygen can produce. The string should contain the $file, $line, and $text \n# tags, which will be replaced by the file and line number from which the \n# warning originated and the warning text. Optionally the format may contain \n# $version, which will be replaced by the version of the file (if it could \n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file($line) : $text  \"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning \n# and error messages should be written. If left blank the output is written \n# to stderr.\n\nWARN_LOGFILE           = \n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain \n# documented source files. You may enter file names like \"myfile.cpp\" or \n# directories like \"/usr/src/myproject\". Separate the files or directories \n# with spaces.\n\nINPUT                  = D:/src/simpleini/SimpleIni.h\n\n# This tag can be used to specify the character encoding of the source files that \n# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default \n# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. \n# See http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the \n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n# and *.h) to filter out the source-files in the directories. If left \n# blank the following patterns are tested: \n# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx \n# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90\n\nFILE_PATTERNS          = *.h\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories \n# should be searched for input files as well. Possible values are YES and NO. \n# If left blank NO is used.\n\nRECURSIVE              = NO\n\n# The EXCLUDE tag can be used to specify files and/or directories that should \n# excluded from the INPUT source files. This way you can easily exclude a \n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n\nEXCLUDE                = \n\n# The EXCLUDE_SYMLINKS tag can be used select whether or not files or \n# directories that are symbolic links (a Unix filesystem feature) are excluded \n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the \n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n# certain files from those directories. Note that the wildcards are matched \n# against the file with absolute path, so to exclude all test directories \n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = \n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names \n# (namespaces, classes, functions, etc.) that should be excluded from the output. \n# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, \n# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        = \n\n# The EXAMPLE_PATH tag can be used to specify one or more files or \n# directories that contain example code fragments that are included (see \n# the \\include command).\n\nEXAMPLE_PATH           = \n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the \n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n# and *.h) to filter out the source-files in the directories. If left \n# blank all files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n# searched for input files to be used with the \\include or \\dontinclude \n# commands irrespective of the value of the RECURSIVE tag. \n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or \n# directories that contain image that are included in the documentation (see \n# the \\image command).\n\nIMAGE_PATH             = \n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should \n# invoke to filter for each input file. Doxygen will invoke the filter program \n# by executing (via popen()) the command <filter> <input-file>, where <filter> \n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n# input file. Doxygen will then use the output that the filter program writes \n# to standard output.  If FILTER_PATTERNS is specified, this tag will be \n# ignored.\n\nINPUT_FILTER           = \n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern \n# basis.  Doxygen will compare the file name with each pattern and apply the \n# filter if there is a match.  The filters are a list of the form: \n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further \n# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER \n# is applied to all files.\n\nFILTER_PATTERNS        = \n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n# INPUT_FILTER) will be used to filter the input files when producing source \n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will \n# be generated. Documented entities will be cross-referenced with these sources. \n# Note: To get rid of all source code in the generated output, make sure also \n# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH \n# then you must also enable this option. If you don't then doxygen will produce \n# a warning and turn it on anyway\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body \n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n# doxygen to hide any special comment blocks from generated source code \n# fragments. Normal C and C++ comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES (the default) \n# then for each documented function all documented \n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES (the default) \n# then for each documented function all documented entities \n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.  Otherwise they will link to the documentstion.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code \n# will point to the HTML generated by the htags(1) tool instead of doxygen \n# built-in source browser. The htags tool is part of GNU's global source \n# tagging system (see http://www.gnu.org/software/global/global.html). You \n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n# will generate a verbatim copy of the header file for each class for \n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n# of all compounds will be generated. Enable this if the project \n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = NO\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all \n# classes will be put under the same header in the alphabetical index. \n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          = \n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for \n# each generated HTML page. If it is left blank doxygen will generate a \n# standard header.\n\nHTML_HEADER            = \n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for \n# each generated HTML page. If it is left blank doxygen will generate a \n# standard footer.\n\nHTML_FOOTER            = \n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n# style sheet that is used by each HTML page. It can be used to \n# fine-tune the look of the HTML output. If the tag is left blank doxygen \n# will generate a default style sheet. Note that doxygen will try to copy \n# the style sheet file to the HTML output directory, so don't put your own \n# stylesheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        = \n\n# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n# files or namespaces will be aligned in HTML using tables. If set to \n# NO a bullet list will be used.\n\nHTML_ALIGN_MEMBERS     = YES\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files \n# will be generated that can be used as input for tools like the \n# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML \n# documentation will contain sections that can be hidden and shown after the \n# page has loaded. For this to work a browser that supports \n# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox \n# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n# be used to specify the file name of the resulting .chm file. You \n# can add a path in front of the file if the result should not be \n# written to the html output directory.\n\nCHM_FILE               = \n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n# be used to specify the location (absolute path including file name) of \n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           = \n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n# controls if a separate .chi index file is generated (YES) or that \n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n# controls whether a binary table of contents is generated (YES) or a \n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members \n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n# top of each HTML page. The value NO (the default) enables the index and \n# the value YES disables it.\n\nDISABLE_INDEX          = NO\n\n# This tag can be used to set the number of enum values (range [1..20]) \n# that doxygen will group on one line in the generated HTML documentation.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n# generated containing a tree-like index structure (just like the one that \n# is generated for HTML Help). For this to work a browser that supports \n# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n# probably better off using the HTML help feature.\n\nGENERATE_TREEVIEW      = NO\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n# used to set the initial width (in pixels) of the frame in which the tree \n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n# invoked. If left blank `latex' will be used as the default command name.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n# generate index for LaTeX. If left blank `makeindex' will be used as the \n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n# LaTeX documents. This may be useful for small projects and may help to \n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used \n# by the printer. Possible values are: a4, a4wide, letter, legal and \n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         = \n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n# the generated latex document. The header should contain everything until \n# the first chapter. If it is left blank doxygen will generate a \n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           = \n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n# is prepared for conversion to pdf (using ps2pdf). The pdf file will \n# contain links (just like the HTML output) instead of page references \n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n# plain latex in the generated Makefile. Set this option to YES to get a \n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = NO\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n# command to the generated LaTeX files. This will instruct LaTeX to keep \n# running if errors occur, instead of asking the user for help. \n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not \n# include the index chapters (such as File Index, Compound Index, etc.) \n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n# The RTF output is optimized for Word 97 and may not look very pretty with \n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n# RTF documents. This may be useful for small projects and may help to \n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n# will contain hyperlink fields. The RTF file will \n# contain links (just like the HTML output) instead of page references. \n# This makes the output suitable for online browsing using WORD or other \n# programs which support those fields. \n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's \n# config file, i.e. a series of assignments. You only have to provide \n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    = \n\n# Set optional variables used in the generation of an rtf document. \n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    = \n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to \n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n# then it will generate one additional man file for each entity \n# documented in the real man page(s). These additional files \n# only source the real man page, but without them the man command \n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will \n# generate an XML file that captures the structure of \n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema, \n# which can be used by a validating XML parser to check the \n# syntax of the XML files.\n\nXML_SCHEMA             = \n\n# The XML_DTD tag can be used to specify an XML DTD, \n# which can be used by a validating XML parser to check the \n# syntax of the XML files.\n\nXML_DTD                = \n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n# dump the program listings (including syntax highlighting \n# and cross-referencing information) to the XML output. Note that \n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n# generate an AutoGen Definitions (see autogen.sf.net) file \n# that captures the structure of the code including all \n# documentation. Note that this feature is still experimental \n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will \n# generate a Perl module file that captures the structure of \n# the code including all documentation. Note that this \n# feature is still experimental and incomplete at the \n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n# the necessary Makefile rules, Perl scripts and LaTeX code to be able \n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n# nicely formatted so it can be parsed by a human reader.  This is useful \n# if you want to understand what is going on.  On the other hand, if this \n# tag is set to NO the size of the Perl module output will be much smaller \n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file \n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n# This is useful so different doxyrules.make files included by the same \n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor   \n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n# evaluate all C-preprocessor directives found in the sources and include \n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n# names in the source code. If set to NO (the default) only conditional \n# compilation will be performed. Macro expansion can be done in a controlled \n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n# then the macro expansion is limited to the macros specified with the \n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n# in the INCLUDE_PATH (see below) will be search if a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that \n# contain include files that are not input files but should be processed by \n# the preprocessor.\n\nINCLUDE_PATH           = \n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n# patterns (like *.h and *.hpp) to filter out the header-files in the \n# directories. If left blank, the patterns specified with FILE_PATTERNS will \n# be used.\n\nINCLUDE_FILE_PATTERNS  = \n\n# The PREDEFINED tag can be used to specify one or more macro names that \n# are defined before the preprocessor is started (similar to the -D option of \n# gcc). The argument of the tag is a list of macros of the form: name \n# or name=definition (no spaces). If the definition and the = are \n# omitted =1 is assumed. To prevent a macro definition from being \n# undefined via #undef or recursively expanded use the := operator \n# instead of the = operator.\n\nPREDEFINED             = SI_HAS_WIDE_FILE \\\n                         SI_SUPPORT_IOSTREAMS\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n# this tag can be used to specify a list of macro names that should be expanded. \n# The macro definition that is found in the sources will be used. \n# Use the PREDEFINED tag if you want to use a different macro definition.\n\nEXPAND_AS_DEFINED      = \n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n# doxygen's preprocessor will remove all function-like macros that are alone \n# on a line, have an all uppercase name, and do not end with a semicolon. Such \n# function macros are typically used for boiler-plate code, and will confuse \n# the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references   \n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. \n# Optionally an initial location of the external documentation \n# can be added for each tagfile. The format of a tag file without \n# this location is as follows: \n#   TAGFILES = file1 file2 ... \n# Adding location for the tag files is done as follows: \n#   TAGFILES = file1=loc1 \"file2 = loc2\" ... \n# where \"loc1\" and \"loc2\" can be relative or absolute paths or \n# URLs. If a location is present for each tag, the installdox tool \n# does not have to be run to correct the links.\n# Note that each tag file must have a unique name\n# (where the name does NOT include the path)\n# If a tag file is not located in the directory in which doxygen \n# is run, you must also specify the path to the tagfile here.\n\nTAGFILES               = \n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create \n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       = \n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed \n# in the class index. If set to NO only the inherited external classes \n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n# in the modules index. If set to NO, only the current project's groups will \n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script \n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool   \n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base \n# or super classes. Setting the tag to NO turns the diagrams off. Note that \n# this option is superseded by the HAVE_DOT option below. This is only a \n# fallback. It is recommended to install and use dot, since it yields more \n# powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc \n# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to \n# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to \n# specify the directory where the mscgen tool resides. If left empty the tool is assumed to \n# be found in the default search path.\n\nMSCGEN_PATH            = \n\n# If set to YES, the inheritance and collaboration graphs will hide \n# inheritance and usage relations if the target is undocumented \n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n# available from the path. This tool is part of Graphviz, a graph visualization \n# toolkit from AT&T and Lucent Bell Labs. The other options in this section \n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = NO\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for each documented class showing the direct and \n# indirect inheritance relations. Setting this tag to YES will force the \n# the CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for each documented class showing the direct and \n# indirect implementation dependencies (inheritance, containment, and \n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n# collaboration diagrams in a style similar to the OMG's Unified Modeling \n# Language.\n\nUML_LOOK               = NO\n\n# If set to YES, the inheritance and collaboration graphs will show the \n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n# tags are set to YES then doxygen will generate a graph for each documented \n# file showing the direct and indirect include dependencies of the file with \n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n# documented header file showing the documented files that directly or \n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will \n# generate a call dependency graph for every global function or class method. \n# Note that enabling this option will significantly increase the time of a run. \n# So in most cases it will be better to enable call graphs for selected \n# functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will \n# generate a caller dependency graph for every global function or class method. \n# Note that enabling this option will significantly increase the time of a run. \n# So in most cases it will be better to enable caller graphs for selected \n# functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n# will graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES \n# then doxygen will show the dependencies a directory has on other directories \n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n# generated by dot. Possible values are png, jpg, or gif\n# If left blank png will be used.\n\nDOT_IMAGE_FORMAT       = png\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be \n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               = \n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that \n# contain dot files that are included in the documentation (see the \n# \\dotfile command).\n\nDOTFILE_DIRS           = \n\n# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of \n# nodes that will be shown in the graph. If the number of nodes in a graph \n# becomes larger than this value, doxygen will truncate the graph, which is \n# visualized by representing a node as a red box. Note that doxygen if the number \n# of direct children of the root node in a graph is already larger than \n# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note \n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n# graphs generated by dot. A depth value of 3 means that only nodes reachable \n# from the root by following a path via at most 3 edges will be shown. Nodes \n# that lay further from the root node will be omitted. Note that setting this \n# option to 1 or 2 may greatly reduce the computation time needed for large \n# code bases. Also note that the size of a graph can be further restricted by \n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 1000\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent \n# background. This is disabled by default, which results in a white background. \n# Warning: Depending on the platform used, enabling this option may lead to \n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to \n# read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output \n# files in one run (i.e. multiple -o and -T options on the command line). This \n# makes dot run faster, but since only newer versions of dot (>1.8.10) \n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n# generate a legend page explaining the meaning of the various boxes and \n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n# remove the intermediate dot files that are used to generate \n# the various graphs.\n\nDOT_CLEANUP            = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to the search engine   \n#---------------------------------------------------------------------------\n\n# The SEARCHENGINE tag specifies whether or not a search engine should be \n# used. If set to NO the values of all tags below this one will be ignored.\n\nSEARCHENGINE           = NO\n"
  },
  {
    "path": "source-code/dependencies/simpleini/vcproj/SimpleIni.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30204.135\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Library Files\", \"Library Files\", \"{C1F8A145-78E7-42C6-95D5-23C746C2BC56}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t..\\ConvertUTF.c = ..\\ConvertUTF.c\n\t\t..\\ConvertUTF.h = ..\\ConvertUTF.h\n\t\t..\\SimpleIni.h = ..\\SimpleIni.h\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Information Files\", \"Information Files\", \"{E40DD170-6D17-49D2-9BB2-8546658F0A37}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t..\\LICENCE.txt = ..\\LICENCE.txt\n\t\t..\\README.md = ..\\README.md\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Other Files\", \"Other Files\", \"{560B512C-6D1C-4E65-83C1-049110E5DEF6}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t..\\other\\.travis.yml = ..\\other\\.travis.yml\n\t\t..\\other\\Makefile = ..\\other\\Makefile\n\t\t..\\other\\package.cmd = ..\\other\\package.cmd\n\t\t..\\other\\simpleini.doxy = ..\\other\\simpleini.doxy\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"tests\", \"..\\tests\\tests.vcxproj\", \"{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Debug|x64.Build.0 = Debug|x64\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Debug|x86.Build.0 = Debug|Win32\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Release|x64.ActiveCfg = Release|x64\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Release|x64.Build.0 = Release|x64\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Release|x86.ActiveCfg = Release|Win32\n\t\t{8F30A5DC-B942-4C9A-BA75-91C906FF85FA}.Release|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {ABD2CECE-EA8B-455B-8AE7-00E499634EC2}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "source-code/dependencies/simpleini/vcproj/SimpleIni.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{9a59fc4f-ad32-4bd3-b6b5-9bb0ddc6138d}</ProjectGuid>\n    <RootNamespace>SimpleIni</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\tests\\snippets.cpp\" />\n    <ClCompile Include=\"..\\tests\\testsi.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/dependencies/simpleini/vcproj/SimpleIni.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Tests\">\n      <UniqueIdentifier>{353054bc-f2a3-46d2-a9cb-df767fe52289}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\tests\\snippets.cpp\">\n      <Filter>Tests</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\tests\\testsi.cpp\">\n      <Filter>Tests</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/dependencies/xdelta3/LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction,\nand distribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by\nthe copyright owner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all\nother entities that control, are controlled by, or are under common\ncontrol with that entity. For the purposes of this definition,\n\"control\" means (i) the power, direct or indirect, to cause the\ndirection or management of such entity, whether by contract or\notherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity\nexercising permissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications,\nincluding but not limited to software source code, documentation\nsource, and configuration files.\n\n\"Object\" form shall mean any form resulting from mechanical\ntransformation or translation of a Source form, including but\nnot limited to compiled object code, generated documentation,\nand conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or\nObject form, made available under the License, as indicated by a\ncopyright notice that is included in or attached to the work\n(an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object\nform, that is based on (or derived from) the Work and for which the\neditorial revisions, annotations, elaborations, or other modifications\nrepresent, as a whole, an original work of authorship. For the purposes\nof this License, Derivative Works shall not include works that remain\nseparable from, or merely link (or bind by name) to the interfaces of,\nthe Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including\nthe original version of the Work and any modifications or additions\nto that Work or Derivative Works thereof, that is intentionally\nsubmitted to Licensor for inclusion in the Work by the copyright owner\nor by an individual or Legal Entity authorized to submit on behalf of\nthe copyright owner. For the purposes of this definition, \"submitted\"\nmeans any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems,\nand issue tracking systems that are managed by, or on behalf of, the\nLicensor for the purpose of discussing and improving the Work, but\nexcluding communication that is conspicuously marked or otherwise\ndesignated in writing by the copyright owner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity\non behalf of whom a Contribution has been received by Licensor and\nsubsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\nthis License, each Contributor hereby grants to You a perpetual,\nworldwide, non-exclusive, no-charge, royalty-free, irrevocable\ncopyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the\nWork and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\nthis License, each Contributor hereby grants to You a perpetual,\nworldwide, non-exclusive, no-charge, royalty-free, irrevocable\n(except as stated in this section) patent license to make, have made,\nuse, offer to sell, sell, import, and otherwise transfer the Work,\nwhere such license applies only to those patent claims licensable\nby such Contributor that are necessarily infringed by their\nContribution(s) alone or by combination of their Contribution(s)\nwith the Work to which such Contribution(s) was submitted. If You\ninstitute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work\nor a Contribution incorporated within the Work constitutes direct\nor contributory patent infringement, then any patent licenses\ngranted to You under this License for that Work shall terminate\nas of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\nWork or Derivative Works thereof in any medium, with or without\nmodifications, and in Source or Object form, provided that You\nmeet the following conditions:\n\n(a) You must give any other recipients of the Work or\nDerivative Works a copy of this License; and\n\n(b) You must cause any modified files to carry prominent notices\nstating that You changed the files; and\n\n(c) You must retain, in the Source form of any Derivative Works\nthat You distribute, all copyright, patent, trademark, and\nattribution notices from the Source form of the Work,\nexcluding those notices that do not pertain to any part of\nthe Derivative Works; and\n\n(d) If the Work includes a \"NOTICE\" text file as part of its\ndistribution, then any Derivative Works that You distribute must\ninclude a readable copy of the attribution notices contained\nwithin such NOTICE file, excluding those notices that do not\npertain to any part of the Derivative Works, in at least one\nof the following places: within a NOTICE text file distributed\nas part of the Derivative Works; within the Source form or\ndocumentation, if provided along with the Derivative Works; or,\nwithin a display generated by the Derivative Works, if and\nwherever such third-party notices normally appear. The contents\nof the NOTICE file are for informational purposes only and\ndo not modify the License. You may add Your own attribution\nnotices within Derivative Works that You distribute, alongside\nor as an addendum to the NOTICE text from the Work, provided\nthat such additional attribution notices cannot be construed\nas modifying the License.\n\nYou may add Your own copyright statement to Your modifications and\nmay provide additional or different license terms and conditions\nfor use, reproduction, or distribution of Your modifications, or\nfor any such Derivative Works as a whole, provided Your use,\nreproduction, and distribution of the Work otherwise complies with\nthe conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\nany Contribution intentionally submitted for inclusion in the Work\nby You to the Licensor shall be under the terms and conditions of\nthis License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify\nthe terms of any separate license agreement you may have executed\nwith Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\nnames, trademarks, service marks, or product names of the Licensor,\nexcept as required for reasonable and customary use in describing the\norigin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\nagreed to in writing, Licensor provides the Work (and each\nContributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied, including, without limitation, any warranties or conditions\nof TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\nPARTICULAR PURPOSE. You are solely responsible for determining the\nappropriateness of using or redistributing the Work and assume any\nrisks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\nwhether in tort (including negligence), contract, or otherwise,\nunless required by applicable law (such as deliberate and grossly\nnegligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special,\nincidental, or consequential damages of any character arising as a\nresult of this License or out of the use or inability to use the\nWork (including but not limited to damages for loss of goodwill,\nwork stoppage, computer failure or malfunction, or any and all\nother commercial damages or losses), even if such Contributor\nhas been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\nthe Work or Derivative Works thereof, You may choose to offer,\nand charge a fee for, acceptance of support, warranty, indemnity,\nor other liability obligations and/or rights consistent with this\nLicense. However, in accepting such obligations, You may act only\non Your own behalf and on Your sole responsibility, not on behalf\nof any other Contributor, and only if You agree to indemnify,\ndefend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason\nof your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/Makefile.am",
    "content": "ACLOCAL_AMFLAGS = -I m4\nAUTOMAKE_OPTIONS = subdir-objects\n\nbin_PROGRAMS = xdelta3\nnoinst_PROGRAMS = xdelta3regtest xdelta3decode xdelta3checksum\n\nexport AFL_HARDEN\n\ncommon_SOURCES = \\\n\t  xdelta3-blkcache.h \\\n\t  xdelta3-decode.h \\\n\t  xdelta3-djw.h \\\n\t  xdelta3-fgk.h \\\n\t  xdelta3-hash.h \\\n\t  xdelta3-internal.h \\\n\t  xdelta3-list.h \\\n\t  xdelta3-lzma.h \\\n\t  xdelta3-main.h \\\n\t  xdelta3-merge.h \\\n\t  xdelta3-second.h \\\n\t  xdelta3-test.h \\\n          xdelta3-cfgs.h \\\n\t  xdelta3.h\n\nxdelta3_SOURCES = $(common_SOURCES) xdelta3.c\n\nxdelta3decode_SOURCES = $(common_SOURCES) xdelta3.c\n\nxdelta3regtest_SOURCES = $(common_SOURCES) \\\n\ttesting/cmp.h \\\n\ttesting/delta.h \\\n\ttesting/file.h \\\n\ttesting/modify.h \\\n\ttesting/random.h \\\n\ttesting/regtest.cc \\\n\ttesting/regtest_c.c \\\n\ttesting/segment.h \\\n\ttesting/sizes.h \\\n\ttesting/test.h\n\nxdelta3checksum_SOURCES = $(common_SOURCES) \\\n\ttesting/checksum_test.cc \\\n\ttesting/checksum_test_c.c\n\n# These sources constitute a regression test written in Go, that is\n# not automatically built or run.  Install Go-1.5.x or later, add\n# `pwd`/go in $GOPATH, and (cd go/src && go run regtest.go).\n# TODO(jmacd): replace hard-coded path names in regtest.go w/ flags.\nGOLANG_SRCS = \\\n\tgo/src/xdelta/test.go \\\n\tgo/src/xdelta/rstream.go \\\n\tgo/src/xdelta/tgroup.go \\\n\tgo/src/xdelta/run.go \\\n\tgo/src/regtest.go\n\n# Note: for extra sanity checks, enable -Wconversion. Note there\n# are a lot of false positives.\nWFLAGS = -Wall -Wshadow -fno-builtin -Wextra -Wsign-compare \\\n\t -Wformat=2 -Wno-format-nonliteral \\\n\t -Wno-unused-parameter -Wno-unused-function\n\n # -Weverything \\\n # -Wc++11-compat-reserved-user-defined-literal \\\n # -Wno-padded \\\n # -Wno-format-nonliteral \\\n # -Wno-cast-align \\\n # -Wno-unused-parameter \\\n # -Wno-sign-conversion \\\n # -Wno-conversion \\\n # -Wno-switch-enum \\\n # -Wno-covered-switch-default \\\n # -Wno-disabled-macro-expansion \\\n # -Wno-variadic-macros \\\n # -Wno-c++98-compat-pedantic\n\nC_WFLAGS = $(WFLAGS) -std=c99\nCXX_WFLAGS = $(WFLAGS) -std=c++11\n\ncommon_CFLAGS = \\\n\t      -DREGRESSION_TEST=1 \\\n\t      -DSECONDARY_DJW=1 \\\n\t      -DSECONDARY_FGK=1 \\\n\t      -DXD3_MAIN=1\n\nif DEBUG_SYMBOLS\n  common_CFLAGS += -g\nendif\n\n#common_CFLAGS += -fsanitize=address -fno-omit-frame-pointer\n#common_CFLAGS += -O2\n\n# For additional debugging, add -DXD3_DEBUG=1, 2, 3, ...\nxdelta3_CFLAGS = $(C_WFLAGS) $(common_CFLAGS) -DXD3_DEBUG=0\nxdelta3_LDADD = -lm\n\nxdelta3decode_CFLAGS = \\\n\t$(C_WFLAGS) \\\n\t-DREGRESSION_TEST=0 \\\n\t-DSECONDARY_DJW=0 \\\n\t-DSECONDARY_FGK=0 \\\n\t-DSECONDARY_LZMA=0 \\\n\t-DXD3_MAIN=1 \\\n\t-DXD3_ENCODER=0 \\\n\t-DXD3_STDIO=1 \\\n\t-DEXTERNAL_COMPRESSION=0 \\\n\t-DVCDIFF_TOOLS=0\n\nxdelta3regtest_CXXFLAGS = \\\n\t$(CXX_WFLAGS) $(common_CFLAGS) -DNOT_MAIN=1 -DXD3_DEBUG=1\nxdelta3regtest_CFLAGS = \\\n\t$(C_WFLAGS) $(common_CFLAGS) -DNOT_MAIN=1 -DXD3_DEBUG=1\nxdelta3regtest_LDADD = -lm\n\nxdelta3checksum_CXXFLAGS = \\\n\t$(CXX_WFLAGS) $(common_CFLAGS) -DNOT_MAIN=1 -DXD3_MAIN=1 -std=c++11\nxdelta3checksum_CFLAGS = \\\n\t$(C_WFLAGS) $(common_CFLAGS) -DNOT_MAIN=1 -DXD3_MAIN=1\n\n\nman1_MANS = xdelta3.1\n\nEXTRA_DIST = \\\n\tREADME.md \\\n\trun_release.sh \\\n\tdraft-korn-vcdiff.txt \\\n\t$(GOLANG_SRCS) \\\n\texamples/Makefile \\\n\texamples/README.md \\\n\texamples/compare_test.c \\\n\texamples/encode_decode_test.c \\\n\texamples/small_page_test.c \\\n\texamples/speed_test.c \\\n\texamples/test.h \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test.xcodeproj/project.pbxproj \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSAppDelegate.h \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSAppDelegate.m \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSViewController.h \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSViewController.m \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/en.lproj/InfoPlist.strings \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/en.lproj/MainStoryboard_iPad.storyboard \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/en.lproj/MainStoryboard_iPhone.storyboard \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/file_v1.bin \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/file_v1_to_v2.bin \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/file_v2.bin \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/main.m \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/xdelta3-ios-test-Info.plist \\\n\texamples/iOS/xdelta3-ios-test/xdelta3-ios-test/xdelta3-ios-test-Prefix.pch \\\n\tcpp-btree/CMakeLists.txt \\\n\tcpp-btree/COPYING \\\n\tcpp-btree/README \\\n\tcpp-btree/btree.h \\\n\tcpp-btree/btree_bench.cc \\\n\tcpp-btree/btree_container.h \\\n\tcpp-btree/btree_map.h \\\n\tcpp-btree/btree_set.h \\\n\tcpp-btree/btree_test.cc \\\n\tcpp-btree/btree_test.h \\\n\tcpp-btree/btree_test_flags.cc \\\n\tcpp-btree/safe_btree.h \\\n\tcpp-btree/safe_btree_map.h \\\n\tcpp-btree/safe_btree_set.h \\\n\tcpp-btree/safe_btree_test.cc \\\n\ttesting/xdelta3-regtest.py \\\n\ttesting/xdelta3-test.py \\\n\txdelta3.1 \\\n\txdelta3.i \\\n\txdelta3.vcxproj \\\n\txdelta3.wxi \\\n\txdelta3.wxs\n\n# Broken, removed from distribution:\n#\txdelta3_pywrap.c\n#\txdelta3.py\n\n#PYFILES = xdelta3_pywrap.c xdelta3.py\n#XDELTA3PY = xdelta3.py\n#XDELTA3PYLIB = xdelta3.la\n\n#BUILT_SOURCES = $(PYFILES)\n\n#xdelta3_pywrap.c xdelta3.py : xdelta3.i\n#\t$(SWIG) -python -o xdelta3_pywrap.c xdelta3.i\n\n# OS X for some reason requires:\n# pythondir = $(PYTHON_SITE_PKG)\n# pyexecdir = $(PYTHON_SITE_PKG)\n\n#python_PYTHON = $(XDELTA3PY)\n#pyexec_LTLIBRARIES = $(XDELTA3PYLIB)\n#_xdelta3_la_SOURCES = $(srcdir)/xdelta3_pywrap.c $(xdelta3_SOURCES)\n#_xdelta3_la_CFLAGS = $(common_CFLAGS) -DNOT_MAIN=1 $(PYTHON_CPPFLAGS)\n#_xdelta3_la_LDFLAGS = -module\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/README.md",
    "content": "Xdelta 3.x readme.txt\nCopyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,\n2009, 2010, 2011, 2012, 2013, 2014, 2015\n<josh.macdonald@gmail.com>\n\n\nThanks for downloading Xdelta!\n\nThis directory contains the Xdelta3 command-line interface (CLI) and source\ndistribution for VCDIFF differential compression, a.k.a. delta\ncompression. The latest information and downloads are available here:\n\n  http://xdelta.org/\n  http://github.com/jmacd/xdelta/\n\nXdelta can be configured to use XZ Utils for secondary compression:\n\n  http://tukaani.org/xz/\n\nThe command-line syntax is detailed here:\n\n  https://github.com/jmacd/xdelta/blob/wiki/CommandLineSyntax.md\n\nRun 'xdelta3 -h' for brief help.  Run 'xdelta3 test' for built-in tests.\n\nSample commands (like gzip, -e means encode, -d means decode)\n\n  xdelta3 -9 -S lzma -e -f -s OLD_FILE NEW_FILE DELTA_FILE\n  xdelta3 -d -s OLD_FILE DELTA_FILE DECODED_FILE\n\nFile bug reports and browse open support issues here:\n\n  https://github.com/jmacd/xdelta/issues\n\nThe source distribution contains the C/C++/Python APIs, Unix, Microsoft VC++\nand Cygwin builds.  Xdelta3 is covered under the terms of the APL, see\nLICENSE.\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/badcopy.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n#define BUFSZ (1 << 22)\n\n#ifdef WIN32\n// whatever\nstatic \ndouble drand48() {\n  double r = rand() / (double)RAND_MAX;\n  return r;\n}\nlong lrand48() {\n\tlong l = 0;\n\tint i;\n\tfor (i = 0; i < 32; i++) {\n\t\tl = l ^ (l << 2) ^ (l << 1) ^ rand();\n\t}\n\treturn l;\n}\n#endif\n\n#ifdef _WIN32\n#define XD3_WIN32 1\n#else\n#define XD3_POSIX 1\n#endif\n#define XD3_MAIN 1\n#define main notmain\n#define EXTERNAL_COMPRESSION 0\n#define XD3_USE_LARGEFILE64 1\n#include \"xdelta3.c\"\n#undef main\n\n\ndouble error_prob   = 0.0001;\nusize_t mean_change  = 100;\nxoff_t total_change = 0;\nxoff_t total_size   = 0;\nusize_t max_change   = 0;\nusize_t num_change   = 0;\n\n\nstatic usize_t\nedist (usize_t mean, usize_t max)\n{\n  double mean_d = mean;\n  double erand  = log (1.0 / drand48 ());\n  usize_t x = (usize_t) (mean_d * erand + 0.5);\n\n  return (x < max) ? (x > 0 ? x : 1) : max;\n}\n\nvoid modify (char *buf, usize_t size)\n{\n  usize_t bufpos = 0, j;\n  usize_t last_end = 0;\n\n  for (;; /* bufpos and j are incremented in the inner loop */)\n    {\n      /* The size of the next modification. */\n      usize_t next_size = edist (mean_change, 1 << 31);\n      /* The expected interval of such a change. */\n      double expect_interval = ((double) next_size * (1.0 - error_prob)) / error_prob;\n      /* The number of bytes until the next modification. */\n      usize_t next_mod  = edist ((usize_t)expect_interval, 1 << 31);\n\n      if (next_size + next_mod + bufpos > size) { break; }\n\n      if (max_change < next_size) { max_change = next_size; }\n\n      bufpos += next_mod;\n\n      fprintf (stderr, \"COPY: %I64u-%I64u (%u)\\n\", \n\t\t  total_size + (xoff_t)last_end, \n\t\t  total_size + (xoff_t)bufpos, \n\t\t  bufpos - last_end);\n      fprintf (stderr, \"ADD:  %I64u-%I64u (%u) is change %u\\n\", \n\t\t  total_size + (xoff_t)bufpos, \n\t\t  total_size + (xoff_t)(bufpos + next_size),\n\t\t  next_size, num_change);\n\n      total_change += next_size;\n      num_change   += 1;\n\n      for (j = 0; j < next_size; j += 1, bufpos += 1)\n\t{\n\t  buf[bufpos] = (char)(lrand48 () >> 3);\n\t}\n\n      last_end = bufpos;\n    }\n\n  fprintf (stderr, \"COPY: %I64u-%I64u (%u)\\n\", \n\t  total_size + last_end, \n\t  total_size + size, size - last_end);\n\n  total_size += size;\n}\n\nint main(int argc, char **argv)\n{\n  main_file inp, out;\n  char *buf = malloc(BUFSZ);\n  int c, ret;\n  main_file_init(&inp);\n  main_file_init(&out);\n  option_force = 1;\n  if (argc > 5)\n    {\n      fprintf (stderr, \"usage: badcopy [byte_error_prob [mean_error_size]]\\n\");\n      return 1;\n    }\n\n  if (argc > 4) { mean_change = atoi (argv[4]); }\n  if (argc > 3) { error_prob  = atof (argv[3]); }\n  fprintf (stderr, \"mean change = %u; error_prob = %0.10f\\n\", mean_change, error_prob);\n\n  if ((ret = main_file_open (&inp, argv[1], XO_READ)) != 0) {\n\t  return 1;\n  }\n  if ((ret = main_file_open (&out, argv[2], XO_WRITE)) != 0) {\n\t  return 1;\n  }\n\n  if (error_prob < 0.0 || error_prob > 1.0)\n    {\n      fprintf (stderr, \"warning: error probability out of range\\n\");\n      return 1;\n    }\n\n  do\n    {\n\t\tif ((ret = main_file_read (&inp, buf, BUFSZ, &c, \"read failed\")) != 0) {\n\t\t\treturn 1;\n\t\t}\n\n        if (c == 0) { break; }\n\n        modify (buf, c);\n\n\t\tif ((ret = main_file_write (&out, buf, c, \"write failed\")) != 0) {\n\t\t\treturn 1;\n\t\t}\n    }\n  while (c == BUFSZ);\n\n  if ((ret = main_file_close (&out)))\n    {\n      return 1;\n    }\n\n  fprintf (stderr, \"add_prob %f; %u adds; total_change %u of %u bytes; add percentage %f; max add size %u\\n\",\n\t   error_prob, num_change, total_change, total_size, (double) total_change / (double) total_size, max_change);\n\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/configure.ac",
    "content": "AC_INIT([Xdelta3], [3.1.1], [josh.macdonald@gmail.com], \n\t[xdelta3], [http://xdelta.org/])\nAC_PREREQ([2.68])\nAC_CONFIG_MACRO_DIR([m4])\nLT_INIT\nAM_INIT_AUTOMAKE([1.15 no-define foreign tar-ustar subdir-objects])\nAC_CONFIG_MACRO_DIRS([m4])\n\nAX_CHECK_ALIGNED_ACCESS_REQUIRED\nAC_PROG_CC\nAC_PROG_CXX\n\nAC_CHECK_SIZEOF(size_t)\nAC_CHECK_SIZEOF(unsigned int)\nAC_CHECK_SIZEOF(unsigned long)\nAC_CHECK_SIZEOF(unsigned long long)\n\nAC_ARG_WITH(\n    [liblzma],\n    [AC_HELP_STRING(\n        [--with-liblzma],\n        [build with liblzma support @<:@default=autodetect@:>@])],\n    [USE_LIBLZMA=$withval],\n    [USE_LIBLZMA=auto])\n\nif test \"x$USE_LIBLZMA\" != xno ; then\n    AC_CHECK_HEADERS([lzma.h],,[\n        if test \"x$with_liblzma\" = xyes ; then\n            AC_MSG_FAILURE([liblzma includes were not found])\n        fi])\n    AC_CHECK_LIB([lzma], [lzma_easy_buffer_encode],,[\n        if test \"x$with_liblzma\" = xyes ; then\n            AC_MSG_FAILURE([liblzma library were not found])\n        fi])\nfi\n\n#AM_PATH_PYTHON(,, [:])\n#AM_CONDITIONAL([HAVE_PYTHON], [test \"$PYTHON\" != :])\n#AX_PYTHON_DEVEL()\n#AX_PKG_SWIG(2.0.0,,)\n#AX_SWIG_PYTHON\n\ndnl --enable-debug-symbols : build with debug symbols?\nAC_ARG_ENABLE(debug-symbols,\n   AS_HELP_STRING(--enable-debug-symbols,[Build with debug symbols (default is NO)]),,enableval=no)\nAM_CONDITIONAL([DEBUG_SYMBOLS], [test ${enableval} = \"yes\"])\n\n\nAC_CONFIG_HEADERS([config.h])\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/CMakeLists.txt",
    "content": "# Copyright 2013 Google Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\ncmake_minimum_required(VERSION 2.6)\n\nproject(cppbtree CXX)\n\noption(build_tests \"Build B-tree tests\" OFF)\nadd_definitions(-std=c++11)\nset(CMAKE_CXX_FLAGS \"-g -O2\")\n\n# CMake doesn't have a way to pure template library, \n# add_library(cppbtree btree.h btree_map.h btree_set.h \n#             safe_btree.h safe_btree_map.h safe_btree_set.h)\n# set_target_properties(cppbtree PROPERTIES LINKER_LANGUAGE CXX)\n\nif(build_tests)\n  enable_testing()\n  include_directories($ENV{GTEST_ROOT}/include)\n  link_directories($ENV{GTEST_ROOT})\n  include_directories($ENV{GFLAGS_ROOT}/include)\n  link_directories($ENV{GFLAGS_ROOT}/lib)\n  add_executable(btree_test btree_test.cc btree_test_flags.cc)\n  add_executable(safe_btree_test safe_btree_test.cc btree_test_flags.cc)\n  add_executable(btree_bench btree_bench.cc btree_test_flags.cc)\n  target_link_libraries(btree_test gtest_main gtest gflags)\n  target_link_libraries(safe_btree_test gtest_main gtest gflags)\n  target_link_libraries(btree_bench gflags gtest)\nendif()\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/COPYING",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/README",
    "content": "This library is a C++ template library and, as such, there is no\nlibrary to build and install.  Copy the .h files and use them!\n\nSee http://code.google.com/p/cpp-btree/wiki/UsageInstructions for\ndetails.\n\n----\n\nTo build and run the provided tests, however, you will need to install\nCMake, the Google C++ Test framework, and the Google flags package.\n\nDownload and install CMake from http://www.cmake.org\n\nDownload and build the GoogleTest framework from\nhttp://code.google.com/p/googletest\n\nDownload and install gflags from https://code.google.com/p/gflags\n\nSet GTEST_ROOT to the directory where GTEST was built.\nSet GFLAGS_ROOT to the directory prefix where GFLAGS is installed.\n\nexport GTEST_ROOT=/path/for/gtest-x.y\nexport GFLAGS_ROOT=/opt\n\ncmake . -Dbuild_tests=ON\n\nFor example, to build on a Unix system with the clang++ compiler,\n\nexport GTEST_ROOT=$(HOME)/src/googletest\nexport GFLAGS_ROOT=/opt\ncmake . -G \"Unix Makefiles\" -Dbuild_tests=ON -DCMAKE_CXX_COMPILER=clang++\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// A btree implementation of the STL set and map interfaces. A btree is both\n// smaller and faster than STL set/map. The red-black tree implementation of\n// STL set/map has an overhead of 3 pointers (left, right and parent) plus the\n// node color information for each stored value. So a set<int32> consumes 20\n// bytes for each value stored. This btree implementation stores multiple\n// values on fixed size nodes (usually 256 bytes) and doesn't store child\n// pointers for leaf nodes. The result is that a btree_set<int32> may use much\n// less memory per stored value. For the random insertion benchmark in\n// btree_test.cc, a btree_set<int32> with node-size of 256 uses 4.9 bytes per\n// stored value.\n//\n// The packing of multiple values on to each node of a btree has another effect\n// besides better space utilization: better cache locality due to fewer cache\n// lines being accessed. Better cache locality translates into faster\n// operations.\n//\n// CAVEATS\n//\n// Insertions and deletions on a btree can cause splitting, merging or\n// rebalancing of btree nodes. And even without these operations, insertions\n// and deletions on a btree will move values around within a node. In both\n// cases, the result is that insertions and deletions can invalidate iterators\n// pointing to values other than the one being inserted/deleted. This is\n// notably different from STL set/map which takes care to not invalidate\n// iterators on insert/erase except, of course, for iterators pointing to the\n// value being erased.  A partial workaround when erasing is available:\n// erase() returns an iterator pointing to the item just after the one that was\n// erased (or end() if none exists).  See also safe_btree.\n\n// PERFORMANCE\n//\n//   btree_bench --benchmarks=. 2>&1 | ./benchmarks.awk\n//\n// Run on pmattis-warp.nyc (4 X 2200 MHz CPUs); 2010/03/04-15:23:06\n// Benchmark                 STL(ns) B-Tree(ns) @    <size>\n// --------------------------------------------------------\n// BM_set_int32_insert        1516      608  +59.89%  <256>    [40.0,  5.2]\n// BM_set_int32_lookup        1160      414  +64.31%  <256>    [40.0,  5.2]\n// BM_set_int32_fulllookup     960      410  +57.29%  <256>    [40.0,  4.4]\n// BM_set_int32_delete        1741      528  +69.67%  <256>    [40.0,  5.2]\n// BM_set_int32_queueaddrem   3078     1046  +66.02%  <256>    [40.0,  5.5]\n// BM_set_int32_mixedaddrem   3600     1384  +61.56%  <256>    [40.0,  5.3]\n// BM_set_int32_fifo           227      113  +50.22%  <256>    [40.0,  4.4]\n// BM_set_int32_fwditer        158       26  +83.54%  <256>    [40.0,  5.2]\n// BM_map_int32_insert        1551      636  +58.99%  <256>    [48.0, 10.5]\n// BM_map_int32_lookup        1200      508  +57.67%  <256>    [48.0, 10.5]\n// BM_map_int32_fulllookup     989      487  +50.76%  <256>    [48.0,  8.8]\n// BM_map_int32_delete        1794      628  +64.99%  <256>    [48.0, 10.5]\n// BM_map_int32_queueaddrem   3189     1266  +60.30%  <256>    [48.0, 11.6]\n// BM_map_int32_mixedaddrem   3822     1623  +57.54%  <256>    [48.0, 10.9]\n// BM_map_int32_fifo           151      134  +11.26%  <256>    [48.0,  8.8]\n// BM_map_int32_fwditer        161       32  +80.12%  <256>    [48.0, 10.5]\n// BM_set_int64_insert        1546      636  +58.86%  <256>    [40.0, 10.5]\n// BM_set_int64_lookup        1200      512  +57.33%  <256>    [40.0, 10.5]\n// BM_set_int64_fulllookup     971      487  +49.85%  <256>    [40.0,  8.8]\n// BM_set_int64_delete        1745      616  +64.70%  <256>    [40.0, 10.5]\n// BM_set_int64_queueaddrem   3163     1195  +62.22%  <256>    [40.0, 11.6]\n// BM_set_int64_mixedaddrem   3760     1564  +58.40%  <256>    [40.0, 10.9]\n// BM_set_int64_fifo           146      103  +29.45%  <256>    [40.0,  8.8]\n// BM_set_int64_fwditer        162       31  +80.86%  <256>    [40.0, 10.5]\n// BM_map_int64_insert        1551      720  +53.58%  <256>    [48.0, 20.7]\n// BM_map_int64_lookup        1214      612  +49.59%  <256>    [48.0, 20.7]\n// BM_map_int64_fulllookup     994      592  +40.44%  <256>    [48.0, 17.2]\n// BM_map_int64_delete        1778      764  +57.03%  <256>    [48.0, 20.7]\n// BM_map_int64_queueaddrem   3189     1547  +51.49%  <256>    [48.0, 20.9]\n// BM_map_int64_mixedaddrem   3779     1887  +50.07%  <256>    [48.0, 21.6]\n// BM_map_int64_fifo           147      145   +1.36%  <256>    [48.0, 17.2]\n// BM_map_int64_fwditer        162       41  +74.69%  <256>    [48.0, 20.7]\n// BM_set_string_insert       1989     1966   +1.16%  <256>    [64.0, 44.5]\n// BM_set_string_lookup       1709     1600   +6.38%  <256>    [64.0, 44.5]\n// BM_set_string_fulllookup   1573     1529   +2.80%  <256>    [64.0, 35.4]\n// BM_set_string_delete       2520     1920  +23.81%  <256>    [64.0, 44.5]\n// BM_set_string_queueaddrem  4706     4309   +8.44%  <256>    [64.0, 48.3]\n// BM_set_string_mixedaddrem  5080     4654   +8.39%  <256>    [64.0, 46.7]\n// BM_set_string_fifo          318      512  -61.01%  <256>    [64.0, 35.4]\n// BM_set_string_fwditer       182       93  +48.90%  <256>    [64.0, 44.5]\n// BM_map_string_insert       2600     2227  +14.35%  <256>    [72.0, 55.8]\n// BM_map_string_lookup       2068     1730  +16.34%  <256>    [72.0, 55.8]\n// BM_map_string_fulllookup   1859     1618  +12.96%  <256>    [72.0, 44.0]\n// BM_map_string_delete       3168     2080  +34.34%  <256>    [72.0, 55.8]\n// BM_map_string_queueaddrem  5840     4701  +19.50%  <256>    [72.0, 59.4]\n// BM_map_string_mixedaddrem  6400     5200  +18.75%  <256>    [72.0, 57.8]\n// BM_map_string_fifo          398      596  -49.75%  <256>    [72.0, 44.0]\n// BM_map_string_fwditer       243      113  +53.50%  <256>    [72.0, 55.8]\n\n#ifndef UTIL_BTREE_BTREE_H__\n#define UTIL_BTREE_BTREE_H__\n\n#include <assert.h>\n#include <stddef.h>\n#include <string.h>\n#include <sys/types.h>\n#include <algorithm>\n#include <functional>\n#include <iostream>\n#include <iterator>\n#include <limits>\n#include <type_traits>\n#include <new>\n#include <ostream>\n#include <string>\n#include <utility>\n\n#ifndef NDEBUG\n#define NDEBUG 1\n#endif\n\nnamespace btree {\n\n// Inside a btree method, if we just call swap(), it will choose the\n// btree::swap method, which we don't want. And we can't say ::swap\n// because then MSVC won't pickup any std::swap() implementations. We\n// can't just use std::swap() directly because then we don't get the\n// specialization for types outside the std namespace. So the solution\n// is to have a special swap helper function whose name doesn't\n// collide with other swap functions defined by the btree classes.\ntemplate <typename T>\ninline void btree_swap_helper(T &a, T &b) {\n  using std::swap;\n  swap(a, b);\n}\n\n// A template helper used to select A or B based on a condition.\ntemplate<bool cond, typename A, typename B>\nstruct if_{\n  typedef A type;\n};\n\ntemplate<typename A, typename B>\nstruct if_<false, A, B> {\n  typedef B type;\n};\n\n// Types small_ and big_ are promise that sizeof(small_) < sizeof(big_)\ntypedef char small_;\n\nstruct big_ {\n  char dummy[2];\n};\n\n// A compile-time assertion.\ntemplate <bool>\nstruct CompileAssert {\n};\n\n#define COMPILE_ASSERT(expr, msg) \\\n  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]\n\n// A helper type used to indicate that a key-compare-to functor has been\n// provided. A user can specify a key-compare-to functor by doing:\n//\n//  struct MyStringComparer\n//      : public util::btree::btree_key_compare_to_tag {\n//    int operator()(const string &a, const string &b) const {\n//      return a.compare(b);\n//    }\n//  };\n//\n// Note that the return type is an int and not a bool. There is a\n// COMPILE_ASSERT which enforces this return type.\nstruct btree_key_compare_to_tag {\n};\n\n// A helper class that indicates if the Compare parameter is derived from\n// btree_key_compare_to_tag.\ntemplate <typename Compare>\nstruct btree_is_key_compare_to\n    : public std::is_convertible<Compare, btree_key_compare_to_tag> {\n};\n\n// A helper class to convert a boolean comparison into a three-way\n// \"compare-to\" comparison that returns a negative value to indicate\n// less-than, zero to indicate equality and a positive value to\n// indicate greater-than. This helper class is specialized for\n// less<string> and greater<string>. The btree_key_compare_to_adapter\n// class is provided so that btree users automatically get the more\n// efficient compare-to code when using common google string types\n// with common comparison functors.\ntemplate <typename Compare>\nstruct btree_key_compare_to_adapter : Compare {\n  btree_key_compare_to_adapter() { }\n  btree_key_compare_to_adapter(const Compare &c) : Compare(c) { }\n  btree_key_compare_to_adapter(const btree_key_compare_to_adapter<Compare> &c)\n      : Compare(c) {\n  }\n};\n\ntemplate <>\nstruct btree_key_compare_to_adapter<std::less<std::string> >\n    : public btree_key_compare_to_tag {\n  btree_key_compare_to_adapter() {}\n  btree_key_compare_to_adapter(const std::less<std::string>&) {}\n  btree_key_compare_to_adapter(\n      const btree_key_compare_to_adapter<std::less<std::string> >&) {}\n  int operator()(const std::string &a, const std::string &b) const {\n    return a.compare(b);\n  }\n};\n\ntemplate <>\nstruct btree_key_compare_to_adapter<std::greater<std::string> >\n    : public btree_key_compare_to_tag {\n  btree_key_compare_to_adapter() {}\n  btree_key_compare_to_adapter(const std::greater<std::string>&) {}\n  btree_key_compare_to_adapter(\n      const btree_key_compare_to_adapter<std::greater<std::string> >&) {}\n  int operator()(const std::string &a, const std::string &b) const {\n    return b.compare(a);\n  }\n};\n\n// A helper class that allows a compare-to functor to behave like a plain\n// compare functor. This specialization is used when we do not have a\n// compare-to functor.\ntemplate <typename Key, typename Compare, bool HaveCompareTo>\nstruct btree_key_comparer {\n  btree_key_comparer() {}\n  btree_key_comparer(Compare c) : comp(c) {}\n  static bool bool_compare(const Compare &comp, const Key &x, const Key &y) {\n    return comp(x, y);\n  }\n  bool operator()(const Key &x, const Key &y) const {\n    return bool_compare(comp, x, y);\n  }\n  Compare comp;\n};\n\n// A specialization of btree_key_comparer when a compare-to functor is\n// present. We need a plain (boolean) comparison in some parts of the btree\n// code, such as insert-with-hint.\ntemplate <typename Key, typename Compare>\nstruct btree_key_comparer<Key, Compare, true> {\n  btree_key_comparer() {}\n  btree_key_comparer(Compare c) : comp(c) {}\n  static bool bool_compare(const Compare &comp, const Key &x, const Key &y) {\n    return comp(x, y) < 0;\n  }\n  bool operator()(const Key &x, const Key &y) const {\n    return bool_compare(comp, x, y);\n  }\n  Compare comp;\n};\n\n// A helper function to compare to keys using the specified compare\n// functor. This dispatches to the appropriate btree_key_comparer comparison,\n// depending on whether we have a compare-to functor or not (which depends on\n// whether Compare is derived from btree_key_compare_to_tag).\ntemplate <typename Key, typename Compare>\nstatic bool btree_compare_keys(\n    const Compare &comp, const Key &x, const Key &y) {\n  typedef btree_key_comparer<Key, Compare,\n      btree_is_key_compare_to<Compare>::value> key_comparer;\n  return key_comparer::bool_compare(comp, x, y);\n}\n\ntemplate <typename Key, typename Compare,\n          typename Alloc, int TargetNodeSize, int ValueSize>\nstruct btree_common_params {\n  // If Compare is derived from btree_key_compare_to_tag then use it as the\n  // key_compare type. Otherwise, use btree_key_compare_to_adapter<> which will\n  // fall-back to Compare if we don't have an appropriate specialization.\n  typedef typename if_<\n    btree_is_key_compare_to<Compare>::value,\n    Compare, btree_key_compare_to_adapter<Compare> >::type key_compare;\n  // A type which indicates if we have a key-compare-to functor or a plain old\n  // key-compare functor.\n  typedef btree_is_key_compare_to<key_compare> is_key_compare_to;\n\n  typedef Alloc allocator_type;\n  typedef Key key_type;\n  typedef ssize_t size_type;\n  typedef ptrdiff_t difference_type;\n\n  enum {\n    kTargetNodeSize = TargetNodeSize,\n\n    // Available space for values.  This is largest for leaf nodes,\n    // which has overhead no fewer than two pointers.\n    kNodeValueSpace = TargetNodeSize - 2 * sizeof(void*),\n  };\n\n  // This is an integral type large enough to hold as many\n  // ValueSize-values as will fit a node of TargetNodeSize bytes.\n  typedef typename if_<\n    (kNodeValueSpace / ValueSize) >= 256,\n    uint16_t,\n    uint8_t>::type node_count_type;\n};\n\n// A parameters structure for holding the type parameters for a btree_map.\ntemplate <typename Key, typename Data, typename Compare,\n          typename Alloc, int TargetNodeSize>\nstruct btree_map_params\n    : public btree_common_params<Key, Compare, Alloc, TargetNodeSize,\n                                 sizeof(Key) + sizeof(Data)> {\n  typedef Data data_type;\n  typedef Data mapped_type;\n  typedef std::pair<const Key, data_type> value_type;\n  typedef std::pair<Key, data_type> mutable_value_type;\n  typedef value_type* pointer;\n  typedef const value_type* const_pointer;\n  typedef value_type& reference;\n  typedef const value_type& const_reference;\n\n  enum {\n    kValueSize = sizeof(Key) + sizeof(data_type),\n  };\n\n  static const Key& key(const value_type &x) { return x.first; }\n  static const Key& key(const mutable_value_type &x) { return x.first; }\n  static void swap(mutable_value_type *a, mutable_value_type *b) {\n    btree_swap_helper(a->first, b->first);\n    btree_swap_helper(a->second, b->second);\n  }\n};\n\n// A parameters structure for holding the type parameters for a btree_set.\ntemplate <typename Key, typename Compare, typename Alloc, int TargetNodeSize>\nstruct btree_set_params\n    : public btree_common_params<Key, Compare, Alloc, TargetNodeSize,\n                                 sizeof(Key)> {\n  typedef std::false_type data_type;\n  typedef std::false_type mapped_type;\n  typedef Key value_type;\n  typedef value_type mutable_value_type;\n  typedef value_type* pointer;\n  typedef const value_type* const_pointer;\n  typedef value_type& reference;\n  typedef const value_type& const_reference;\n\n  enum {\n    kValueSize = sizeof(Key),\n  };\n\n  static const Key& key(const value_type &x) { return x; }\n  static void swap(mutable_value_type *a, mutable_value_type *b) {\n    btree_swap_helper<mutable_value_type>(*a, *b);\n  }\n};\n\n// An adapter class that converts a lower-bound compare into an upper-bound\n// compare.\ntemplate <typename Key, typename Compare>\nstruct btree_upper_bound_adapter : public Compare {\n  btree_upper_bound_adapter(Compare c) : Compare(c) {}\n  bool operator()(const Key &a, const Key &b) const {\n    return !static_cast<const Compare&>(*this)(b, a);\n  }\n};\n\ntemplate <typename Key, typename CompareTo>\nstruct btree_upper_bound_compare_to_adapter : public CompareTo {\n  btree_upper_bound_compare_to_adapter(CompareTo c) : CompareTo(c) {}\n  int operator()(const Key &a, const Key &b) const {\n    return static_cast<const CompareTo&>(*this)(b, a);\n  }\n};\n\n// Dispatch helper class for using linear search with plain compare.\ntemplate <typename K, typename N, typename Compare>\nstruct btree_linear_search_plain_compare {\n  static int lower_bound(const K &k, const N &n, Compare comp)  {\n    return n.linear_search_plain_compare(k, 0, n.count(), comp);\n  }\n  static int upper_bound(const K &k, const N &n, Compare comp)  {\n    typedef btree_upper_bound_adapter<K, Compare> upper_compare;\n    return n.linear_search_plain_compare(k, 0, n.count(), upper_compare(comp));\n  }\n};\n\n// Dispatch helper class for using linear search with compare-to\ntemplate <typename K, typename N, typename CompareTo>\nstruct btree_linear_search_compare_to {\n  static int lower_bound(const K &k, const N &n, CompareTo comp)  {\n    return n.linear_search_compare_to(k, 0, n.count(), comp);\n  }\n  static int upper_bound(const K &k, const N &n, CompareTo comp)  {\n    typedef btree_upper_bound_adapter<K,\n        btree_key_comparer<K, CompareTo, true> > upper_compare;\n    return n.linear_search_plain_compare(k, 0, n.count(), upper_compare(comp));\n  }\n};\n\n// Dispatch helper class for using binary search with plain compare.\ntemplate <typename K, typename N, typename Compare>\nstruct btree_binary_search_plain_compare {\n  static int lower_bound(const K &k, const N &n, Compare comp)  {\n    return n.binary_search_plain_compare(k, 0, n.count(), comp);\n  }\n  static int upper_bound(const K &k, const N &n, Compare comp)  {\n    typedef btree_upper_bound_adapter<K, Compare> upper_compare;\n    return n.binary_search_plain_compare(k, 0, n.count(), upper_compare(comp));\n  }\n};\n\n// Dispatch helper class for using binary search with compare-to.\ntemplate <typename K, typename N, typename CompareTo>\nstruct btree_binary_search_compare_to {\n  static int lower_bound(const K &k, const N &n, CompareTo comp)  {\n    return n.binary_search_compare_to(k, 0, n.count(), CompareTo());\n  }\n  static int upper_bound(const K &k, const N &n, CompareTo comp)  {\n    typedef btree_upper_bound_adapter<K,\n        btree_key_comparer<K, CompareTo, true> > upper_compare;\n    return n.linear_search_plain_compare(k, 0, n.count(), upper_compare(comp));\n  }\n};\n\n// A node in the btree holding. The same node type is used for both internal\n// and leaf nodes in the btree, though the nodes are allocated in such a way\n// that the children array is only valid in internal nodes.\ntemplate <typename Params>\nclass btree_node {\n public:\n  typedef Params params_type;\n  typedef btree_node<Params> self_type;\n  typedef typename Params::key_type key_type;\n  typedef typename Params::data_type data_type;\n  typedef typename Params::value_type value_type;\n  typedef typename Params::mutable_value_type mutable_value_type;\n  typedef typename Params::pointer pointer;\n  typedef typename Params::const_pointer const_pointer;\n  typedef typename Params::reference reference;\n  typedef typename Params::const_reference const_reference;\n  typedef typename Params::key_compare key_compare;\n  typedef typename Params::size_type size_type;\n  typedef typename Params::difference_type difference_type;\n  // Typedefs for the various types of node searches.\n  typedef btree_linear_search_plain_compare<\n    key_type, self_type, key_compare> linear_search_plain_compare_type;\n  typedef btree_linear_search_compare_to<\n    key_type, self_type, key_compare> linear_search_compare_to_type;\n  typedef btree_binary_search_plain_compare<\n    key_type, self_type, key_compare> binary_search_plain_compare_type;\n  typedef btree_binary_search_compare_to<\n    key_type, self_type, key_compare> binary_search_compare_to_type;\n  // If we have a valid key-compare-to type, use linear_search_compare_to,\n  // otherwise use linear_search_plain_compare.\n  typedef typename if_<\n    Params::is_key_compare_to::value,\n    linear_search_compare_to_type,\n    linear_search_plain_compare_type>::type linear_search_type;\n  // If we have a valid key-compare-to type, use binary_search_compare_to,\n  // otherwise use binary_search_plain_compare.\n  typedef typename if_<\n    Params::is_key_compare_to::value,\n    binary_search_compare_to_type,\n    binary_search_plain_compare_type>::type binary_search_type;\n  // If the key is an integral or floating point type, use linear search which\n  // is faster than binary search for such types. Might be wise to also\n  // configure linear search based on node-size.\n  typedef typename if_<\n    std::is_integral<key_type>::value ||\n    std::is_floating_point<key_type>::value,\n    linear_search_type, binary_search_type>::type search_type;\n\n  struct base_fields {\n    typedef typename Params::node_count_type field_type;\n\n    // A boolean indicating whether the node is a leaf or not.\n    bool leaf;\n    // The position of the node in the node's parent.\n    field_type position;\n    // The maximum number of values the node can hold.\n    field_type max_count;\n    // The count of the number of values in the node.\n    field_type count;\n    // A pointer to the node's parent.\n    btree_node *parent;\n  };\n\n  enum {\n    kValueSize = params_type::kValueSize,\n    kTargetNodeSize = params_type::kTargetNodeSize,\n\n    // Compute how many values we can fit onto a leaf node.\n    kNodeTargetValues = (kTargetNodeSize - sizeof(base_fields)) / kValueSize,\n    // We need a minimum of 3 values per internal node in order to perform\n    // splitting (1 value for the two nodes involved in the split and 1 value\n    // propagated to the parent as the delimiter for the split).\n    kNodeValues = kNodeTargetValues >= 3 ? kNodeTargetValues : 3,\n\n    kExactMatch = 1 << 30,\n    kMatchMask = kExactMatch - 1,\n  };\n\n  struct leaf_fields : public base_fields {\n    // The array of values. Only the first count of these values have been\n    // constructed and are valid.\n    mutable_value_type values[kNodeValues];\n  };\n\n  struct internal_fields : public leaf_fields {\n    // The array of child pointers. The keys in children_[i] are all less than\n    // key(i). The keys in children_[i + 1] are all greater than key(i). There\n    // are always count + 1 children.\n    btree_node *children[kNodeValues + 1];\n  };\n\n  struct root_fields : public internal_fields {\n    btree_node *rightmost;\n    size_type size;\n  };\n\n public:\n  // Getter/setter for whether this is a leaf node or not. This value doesn't\n  // change after the node is created.\n  bool leaf() const { return fields_.leaf; }\n\n  // Getter for the position of this node in its parent.\n  int position() const { return fields_.position; }\n  void set_position(int v) { fields_.position = v; }\n\n  // Getter/setter for the number of values stored in this node.\n  int count() const { return fields_.count; }\n  void set_count(int v) { fields_.count = v; }\n  int max_count() const { return fields_.max_count; }\n\n  // Getter for the parent of this node.\n  btree_node* parent() const { return fields_.parent; }\n  // Getter for whether the node is the root of the tree. The parent of the\n  // root of the tree is the leftmost node in the tree which is guaranteed to\n  // be a leaf.\n  bool is_root() const { return parent()->leaf(); }\n  void make_root() {\n    assert(parent()->is_root());\n    fields_.parent = fields_.parent->parent();\n  }\n\n  // Getter for the rightmost root node field. Only valid on the root node.\n  btree_node* rightmost() const { return fields_.rightmost; }\n  btree_node** mutable_rightmost() { return &fields_.rightmost; }\n\n  // Getter for the size root node field. Only valid on the root node.\n  size_type size() const { return fields_.size; }\n  size_type* mutable_size() { return &fields_.size; }\n\n  // Getters for the key/value at position i in the node.\n  const key_type& key(int i) const {\n    return params_type::key(fields_.values[i]);\n  }\n  reference value(int i) {\n    return reinterpret_cast<reference>(fields_.values[i]);\n  }\n  const_reference value(int i) const {\n    return reinterpret_cast<const_reference>(fields_.values[i]);\n  }\n  mutable_value_type* mutable_value(int i) {\n    return &fields_.values[i];\n  }\n\n  // Swap value i in this node with value j in node x.\n  void value_swap(int i, btree_node *x, int j) {\n    params_type::swap(mutable_value(i), x->mutable_value(j));\n  }\n\n  // Getters/setter for the child at position i in the node.\n  btree_node* child(int i) const { return fields_.children[i]; }\n  btree_node** mutable_child(int i) { return &fields_.children[i]; }\n  void set_child(int i, btree_node *c) {\n    *mutable_child(i) = c;\n    c->fields_.parent = this;\n    c->fields_.position = i;\n  }\n\n  // Returns the position of the first value whose key is not less than k.\n  template <typename Compare>\n  int lower_bound(const key_type &k, const Compare &comp) const {\n    return search_type::lower_bound(k, *this, comp);\n  }\n  // Returns the position of the first value whose key is greater than k.\n  template <typename Compare>\n  int upper_bound(const key_type &k, const Compare &comp) const {\n    return search_type::upper_bound(k, *this, comp);\n  }\n\n  // Returns the position of the first value whose key is not less than k using\n  // linear search performed using plain compare.\n  template <typename Compare>\n  int linear_search_plain_compare(\n      const key_type &k, int s, int e, const Compare &comp) const {\n    while (s < e) {\n      if (!btree_compare_keys(comp, key(s), k)) {\n        break;\n      }\n      ++s;\n    }\n    return s;\n  }\n\n  // Returns the position of the first value whose key is not less than k using\n  // linear search performed using compare-to.\n  template <typename Compare>\n  int linear_search_compare_to(\n      const key_type &k, int s, int e, const Compare &comp) const {\n    while (s < e) {\n      int c = comp(key(s), k);\n      if (c == 0) {\n        return s | kExactMatch;\n      } else if (c > 0) {\n        break;\n      }\n      ++s;\n    }\n    return s;\n  }\n\n  // Returns the position of the first value whose key is not less than k using\n  // binary search performed using plain compare.\n  template <typename Compare>\n  int binary_search_plain_compare(\n      const key_type &k, int s, int e, const Compare &comp) const {\n    while (s != e) {\n      int mid = (s + e) / 2;\n      if (btree_compare_keys(comp, key(mid), k)) {\n        s = mid + 1;\n      } else {\n        e = mid;\n      }\n    }\n    return s;\n  }\n\n  // Returns the position of the first value whose key is not less than k using\n  // binary search performed using compare-to.\n  template <typename CompareTo>\n  int binary_search_compare_to(\n      const key_type &k, int s, int e, const CompareTo &comp) const {\n    while (s != e) {\n      int mid = (s + e) / 2;\n      int c = comp(key(mid), k);\n      if (c < 0) {\n        s = mid + 1;\n      } else if (c > 0) {\n        e = mid;\n      } else {\n        // Need to return the first value whose key is not less than k, which\n        // requires continuing the binary search. Note that we are guaranteed\n        // that the result is an exact match because if \"key(mid-1) < k\" the\n        // call to binary_search_compare_to() will return \"mid\".\n        s = binary_search_compare_to(k, s, mid, comp);\n        return s | kExactMatch;\n      }\n    }\n    return s;\n  }\n\n  // Inserts the value x at position i, shifting all existing values and\n  // children at positions >= i to the right by 1.\n  void insert_value(int i, const value_type &x);\n\n  // Removes the value at position i, shifting all existing values and children\n  // at positions > i to the left by 1.\n  void remove_value(int i);\n\n  // Rebalances a node with its right sibling.\n  void rebalance_right_to_left(btree_node *sibling, int to_move);\n  void rebalance_left_to_right(btree_node *sibling, int to_move);\n\n  // Splits a node, moving a portion of the node's values to its right sibling.\n  void split(btree_node *sibling, int insert_position);\n\n  // Merges a node with its right sibling, moving all of the values and the\n  // delimiting key in the parent node onto itself.\n  void merge(btree_node *sibling);\n\n  // Swap the contents of \"this\" and \"src\".\n  void swap(btree_node *src);\n\n  // Node allocation/deletion routines.\n  static btree_node* init_leaf(\n      leaf_fields *f, btree_node *parent, int max_count) {\n    btree_node *n = reinterpret_cast<btree_node*>(f);\n    f->leaf = 1;\n    f->position = 0;\n    f->max_count = max_count;\n    f->count = 0;\n    f->parent = parent;\n    if (!NDEBUG) {\n      memset(&f->values, 0, max_count * sizeof(value_type));\n    }\n    return n;\n  }\n  static btree_node* init_internal(internal_fields *f, btree_node *parent) {\n    btree_node *n = init_leaf(f, parent, kNodeValues);\n    f->leaf = 0;\n    if (!NDEBUG) {\n      memset(f->children, 0, sizeof(f->children));\n    }\n    return n;\n  }\n  static btree_node* init_root(root_fields *f, btree_node *parent) {\n    btree_node *n = init_internal(f, parent);\n    f->rightmost = parent;\n    f->size = parent->count();\n    return n;\n  }\n  void destroy() {\n    for (int i = 0; i < count(); ++i) {\n      value_destroy(i);\n    }\n  }\n\n private:\n  void value_init(int i) {\n    new (&fields_.values[i]) mutable_value_type;\n  }\n  void value_init(int i, const value_type &x) {\n    new (&fields_.values[i]) mutable_value_type(x);\n  }\n  void value_destroy(int i) {\n    fields_.values[i].~mutable_value_type();\n  }\n\n private:\n  root_fields fields_;\n\n private:\n  btree_node(const btree_node&);\n  void operator=(const btree_node&);\n};\n\ntemplate <typename Node, typename Reference, typename Pointer>\nstruct btree_iterator {\n  typedef typename Node::key_type key_type;\n  typedef typename Node::size_type size_type;\n  typedef typename Node::difference_type difference_type;\n  typedef typename Node::params_type params_type;\n\n  typedef Node node_type;\n  typedef typename std::remove_const<Node>::type normal_node;\n  typedef const Node const_node;\n  typedef typename params_type::value_type value_type;\n  typedef typename params_type::pointer normal_pointer;\n  typedef typename params_type::reference normal_reference;\n  typedef typename params_type::const_pointer const_pointer;\n  typedef typename params_type::const_reference const_reference;\n\n  typedef Pointer pointer;\n  typedef Reference reference;\n  typedef std::bidirectional_iterator_tag iterator_category;\n\n  typedef btree_iterator<\n    normal_node, normal_reference, normal_pointer> iterator;\n  typedef btree_iterator<\n    const_node, const_reference, const_pointer> const_iterator;\n  typedef btree_iterator<Node, Reference, Pointer> self_type;\n\n  btree_iterator()\n      : node(NULL),\n        position(-1) {\n  }\n  btree_iterator(Node *n, int p)\n      : node(n),\n        position(p) {\n  }\n  btree_iterator(const iterator &x)\n      : node(x.node),\n        position(x.position) {\n  }\n\n  // Increment/decrement the iterator.\n  void increment() {\n    if (node->leaf() && ++position < node->count()) {\n      return;\n    }\n    increment_slow();\n  }\n  void increment_by(int count);\n  void increment_slow();\n\n  void decrement() {\n    if (node->leaf() && --position >= 0) {\n      return;\n    }\n    decrement_slow();\n  }\n  void decrement_slow();\n\n  bool operator==(const const_iterator &x) const {\n    return node == x.node && position == x.position;\n  }\n  bool operator!=(const const_iterator &x) const {\n    return node != x.node || position != x.position;\n  }\n\n  // Accessors for the key/value the iterator is pointing at.\n  const key_type& key() const {\n    return node->key(position);\n  }\n  reference operator*() const {\n    return node->value(position);\n  }\n  pointer operator->() const {\n    return &node->value(position);\n  }\n\n  self_type& operator++() {\n    increment();\n    return *this;\n  }\n  self_type& operator--() {\n    decrement();\n    return *this;\n  }\n  self_type operator++(int) {\n    self_type tmp = *this;\n    ++*this;\n    return tmp;\n  }\n  self_type operator--(int) {\n    self_type tmp = *this;\n    --*this;\n    return tmp;\n  }\n\n  // The node in the tree the iterator is pointing at.\n  Node *node;\n  // The position within the node of the tree the iterator is pointing at.\n  int position;\n};\n\n// Dispatch helper class for using btree::internal_locate with plain compare.\nstruct btree_internal_locate_plain_compare {\n  template <typename K, typename T, typename Iter>\n  static std::pair<Iter, int> dispatch(const K &k, const T &t, Iter iter) {\n    return t.internal_locate_plain_compare(k, iter);\n  }\n};\n\n// Dispatch helper class for using btree::internal_locate with compare-to.\nstruct btree_internal_locate_compare_to {\n  template <typename K, typename T, typename Iter>\n  static std::pair<Iter, int> dispatch(const K &k, const T &t, Iter iter) {\n    return t.internal_locate_compare_to(k, iter);\n  }\n};\n\ntemplate <typename Params>\nclass btree : public Params::key_compare {\n  typedef btree<Params> self_type;\n  typedef btree_node<Params> node_type;\n  typedef typename node_type::base_fields base_fields;\n  typedef typename node_type::leaf_fields leaf_fields;\n  typedef typename node_type::internal_fields internal_fields;\n  typedef typename node_type::root_fields root_fields;\n  typedef typename Params::is_key_compare_to is_key_compare_to;\n\n  friend struct btree_internal_locate_plain_compare;\n  friend struct btree_internal_locate_compare_to;\n  typedef typename if_<\n    is_key_compare_to::value,\n    btree_internal_locate_compare_to,\n    btree_internal_locate_plain_compare>::type internal_locate_type;\n\n  enum {\n    kNodeValues = node_type::kNodeValues,\n    kMinNodeValues = kNodeValues / 2,\n    kValueSize = node_type::kValueSize,\n    kExactMatch = node_type::kExactMatch,\n    kMatchMask = node_type::kMatchMask,\n  };\n\n  // A helper class to get the empty base class optimization for 0-size\n  // allocators. Base is internal_allocator_type.\n  // (e.g. empty_base_handle<internal_allocator_type, node_type*>). If Base is\n  // 0-size, the compiler doesn't have to reserve any space for it and\n  // sizeof(empty_base_handle) will simply be sizeof(Data). Google [empty base\n  // class optimization] for more details.\n  template <typename Base, typename Data>\n  struct empty_base_handle : public Base {\n    empty_base_handle(const Base &b, const Data &d)\n        : Base(b),\n          data(d) {\n    }\n    Data data;\n  };\n\n  struct node_stats {\n    node_stats(ssize_t l, ssize_t i)\n        : leaf_nodes(l),\n          internal_nodes(i) {\n    }\n\n    node_stats& operator+=(const node_stats &x) {\n      leaf_nodes += x.leaf_nodes;\n      internal_nodes += x.internal_nodes;\n      return *this;\n    }\n\n    ssize_t leaf_nodes;\n    ssize_t internal_nodes;\n  };\n\n public:\n  typedef Params params_type;\n  typedef typename Params::key_type key_type;\n  typedef typename Params::data_type data_type;\n  typedef typename Params::mapped_type mapped_type;\n  typedef typename Params::value_type value_type;\n  typedef typename Params::key_compare key_compare;\n  typedef typename Params::pointer pointer;\n  typedef typename Params::const_pointer const_pointer;\n  typedef typename Params::reference reference;\n  typedef typename Params::const_reference const_reference;\n  typedef typename Params::size_type size_type;\n  typedef typename Params::difference_type difference_type;\n  typedef btree_iterator<node_type, reference, pointer> iterator;\n  typedef typename iterator::const_iterator const_iterator;\n  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n  typedef std::reverse_iterator<iterator> reverse_iterator;\n\n  typedef typename Params::allocator_type allocator_type;\n  typedef typename allocator_type::template rebind<char>::other\n    internal_allocator_type;\n\n public:\n  // Default constructor.\n  btree(const key_compare &comp, const allocator_type &alloc);\n\n  // Copy constructor.\n  btree(const self_type &x);\n\n  // Destructor.\n  ~btree() {\n    clear();\n  }\n\n  // Iterator routines.\n  iterator begin() {\n    return iterator(leftmost(), 0);\n  }\n  const_iterator begin() const {\n    return const_iterator(leftmost(), 0);\n  }\n  iterator end() {\n    return iterator(rightmost(), rightmost() ? rightmost()->count() : 0);\n  }\n  const_iterator end() const {\n    return const_iterator(rightmost(), rightmost() ? rightmost()->count() : 0);\n  }\n  reverse_iterator rbegin() {\n    return reverse_iterator(end());\n  }\n  const_reverse_iterator rbegin() const {\n    return const_reverse_iterator(end());\n  }\n  reverse_iterator rend() {\n    return reverse_iterator(begin());\n  }\n  const_reverse_iterator rend() const {\n    return const_reverse_iterator(begin());\n  }\n\n  // Finds the first element whose key is not less than key.\n  iterator lower_bound(const key_type &key) {\n    return internal_end(\n        internal_lower_bound(key, iterator(root(), 0)));\n  }\n  const_iterator lower_bound(const key_type &key) const {\n    return internal_end(\n        internal_lower_bound(key, const_iterator(root(), 0)));\n  }\n\n  // Finds the first element whose key is greater than key.\n  iterator upper_bound(const key_type &key) {\n    return internal_end(\n        internal_upper_bound(key, iterator(root(), 0)));\n  }\n  const_iterator upper_bound(const key_type &key) const {\n    return internal_end(\n        internal_upper_bound(key, const_iterator(root(), 0)));\n  }\n\n  // Finds the range of values which compare equal to key. The first member of\n  // the returned pair is equal to lower_bound(key). The second member pair of\n  // the pair is equal to upper_bound(key).\n  std::pair<iterator,iterator> equal_range(const key_type &key) {\n    return std::make_pair(lower_bound(key), upper_bound(key));\n  }\n  std::pair<const_iterator,const_iterator> equal_range(const key_type &key) const {\n    return std::make_pair(lower_bound(key), upper_bound(key));\n  }\n\n  // Inserts a value into the btree only if it does not already exist. The\n  // boolean return value indicates whether insertion succeeded or failed. The\n  // ValuePointer type is used to avoid instatiating the value unless the key\n  // is being inserted. Value is not dereferenced if the key already exists in\n  // the btree. See btree_map::operator[].\n  template <typename ValuePointer>\n  std::pair<iterator,bool> insert_unique(const key_type &key, ValuePointer value);\n\n  // Inserts a value into the btree only if it does not already exist. The\n  // boolean return value indicates whether insertion succeeded or failed.\n  std::pair<iterator,bool> insert_unique(const value_type &v) {\n    return insert_unique(params_type::key(v), &v);\n  }\n\n  // Insert with hint. Check to see if the value should be placed immediately\n  // before position in the tree. If it does, then the insertion will take\n  // amortized constant time. If not, the insertion will take amortized\n  // logarithmic time as if a call to insert_unique(v) were made.\n  iterator insert_unique(iterator position, const value_type &v);\n\n  // Insert a range of values into the btree.\n  template <typename InputIterator>\n  void insert_unique(InputIterator b, InputIterator e);\n\n  // Inserts a value into the btree. The ValuePointer type is used to avoid\n  // instatiating the value unless the key is being inserted. Value is not\n  // dereferenced if the key already exists in the btree. See\n  // btree_map::operator[].\n  template <typename ValuePointer>\n  iterator insert_multi(const key_type &key, ValuePointer value);\n\n  // Inserts a value into the btree.\n  iterator insert_multi(const value_type &v) {\n    return insert_multi(params_type::key(v), &v);\n  }\n\n  // Insert with hint. Check to see if the value should be placed immediately\n  // before position in the tree. If it does, then the insertion will take\n  // amortized constant time. If not, the insertion will take amortized\n  // logarithmic time as if a call to insert_multi(v) were made.\n  iterator insert_multi(iterator position, const value_type &v);\n\n  // Insert a range of values into the btree.\n  template <typename InputIterator>\n  void insert_multi(InputIterator b, InputIterator e);\n\n  void assign(const self_type &x);\n\n  // Erase the specified iterator from the btree. The iterator must be valid\n  // (i.e. not equal to end()).  Return an iterator pointing to the node after\n  // the one that was erased (or end() if none exists).\n  iterator erase(iterator iter);\n\n  // Erases range. Returns the number of keys erased.\n  int erase(iterator begin, iterator end);\n\n  // Erases the specified key from the btree. Returns 1 if an element was\n  // erased and 0 otherwise.\n  int erase_unique(const key_type &key);\n\n  // Erases all of the entries matching the specified key from the\n  // btree. Returns the number of elements erased.\n  int erase_multi(const key_type &key);\n\n  // Finds the iterator corresponding to a key or returns end() if the key is\n  // not present.\n  iterator find_unique(const key_type &key) {\n    return internal_end(\n        internal_find_unique(key, iterator(root(), 0)));\n  }\n  const_iterator find_unique(const key_type &key) const {\n    return internal_end(\n        internal_find_unique(key, const_iterator(root(), 0)));\n  }\n  iterator find_multi(const key_type &key) {\n    return internal_end(\n        internal_find_multi(key, iterator(root(), 0)));\n  }\n  const_iterator find_multi(const key_type &key) const {\n    return internal_end(\n        internal_find_multi(key, const_iterator(root(), 0)));\n  }\n\n  // Returns a count of the number of times the key appears in the btree.\n  size_type count_unique(const key_type &key) const {\n    const_iterator b = internal_find_unique(\n        key, const_iterator(root(), 0));\n    if (!b.node) {\n      // The key doesn't exist in the tree.\n      return 0;\n    }\n    return 1;\n  }\n  // Returns a count of the number of times the key appears in the btree.\n  size_type count_multi(const key_type &key) const {\n    return distance(lower_bound(key), upper_bound(key));\n  }\n\n  // Clear the btree, deleting all of the values it contains.\n  void clear();\n\n  // Swap the contents of *this and x.\n  void swap(self_type &x);\n\n  // Assign the contents of x to *this.\n  self_type& operator=(const self_type &x) {\n    if (&x == this) {\n      // Don't copy onto ourselves.\n      return *this;\n    }\n    assign(x);\n    return *this;\n  }\n\n  key_compare* mutable_key_comp() {\n    return this;\n  }\n  const key_compare& key_comp() const {\n    return *this;\n  }\n  bool compare_keys(const key_type &x, const key_type &y) const {\n    return btree_compare_keys(key_comp(), x, y);\n  }\n\n  // Dump the btree to the specified ostream. Requires that operator<< is\n  // defined for Key and Value.\n  void dump(std::ostream &os) const {\n    if (root() != NULL) {\n      internal_dump(os, root(), 0);\n    }\n  }\n\n  // Verifies the structure of the btree.\n  void verify() const;\n\n  // Size routines. Note that empty() is slightly faster than doing size()==0.\n  size_type size() const {\n    if (empty()) return 0;\n    if (root()->leaf()) return root()->count();\n    return root()->size();\n  }\n  size_type max_size() const { return std::numeric_limits<size_type>::max(); }\n  bool empty() const { return root() == NULL; }\n\n  // The height of the btree. An empty tree will have height 0.\n  size_type height() const {\n    size_type h = 0;\n    if (root()) {\n      // Count the length of the chain from the leftmost node up to the\n      // root. We actually count from the root back around to the level below\n      // the root, but the calculation is the same because of the circularity\n      // of that traversal.\n      const node_type *n = root();\n      do {\n        ++h;\n        n = n->parent();\n      } while (n != root());\n    }\n    return h;\n  }\n\n  // The number of internal, leaf and total nodes used by the btree.\n  size_type leaf_nodes() const {\n    return internal_stats(root()).leaf_nodes;\n  }\n  size_type internal_nodes() const {\n    return internal_stats(root()).internal_nodes;\n  }\n  size_type nodes() const {\n    node_stats stats = internal_stats(root());\n    return stats.leaf_nodes + stats.internal_nodes;\n  }\n\n  // The total number of bytes used by the btree.\n  size_type bytes_used() const {\n    node_stats stats = internal_stats(root());\n    if (stats.leaf_nodes == 1 && stats.internal_nodes == 0) {\n      return sizeof(*this) +\n          sizeof(base_fields) + root()->max_count() * sizeof(value_type);\n    } else {\n      return sizeof(*this) +\n          sizeof(root_fields) - sizeof(internal_fields) +\n          stats.leaf_nodes * sizeof(leaf_fields) +\n          stats.internal_nodes * sizeof(internal_fields);\n    }\n  }\n\n  // The average number of bytes used per value stored in the btree.\n  static double average_bytes_per_value() {\n    // Returns the number of bytes per value on a leaf node that is 75%\n    // full. Experimentally, this matches up nicely with the computed number of\n    // bytes per value in trees that had their values inserted in random order.\n    return sizeof(leaf_fields) / (kNodeValues * 0.75);\n  }\n\n  // The fullness of the btree. Computed as the number of elements in the btree\n  // divided by the maximum number of elements a tree with the current number\n  // of nodes could hold. A value of 1 indicates perfect space\n  // utilization. Smaller values indicate space wastage.\n  double fullness() const {\n    return double(size()) / (nodes() * kNodeValues);\n  }\n  // The overhead of the btree structure in bytes per node. Computed as the\n  // total number of bytes used by the btree minus the number of bytes used for\n  // storing elements divided by the number of elements.\n  double overhead() const {\n    if (empty()) {\n      return 0.0;\n    }\n    return (bytes_used() - size() * kValueSize) / double(size());\n  }\n\n private:\n  // Internal accessor routines.\n  node_type* root() { return root_.data; }\n  const node_type* root() const { return root_.data; }\n  node_type** mutable_root() { return &root_.data; }\n\n  // The rightmost node is stored in the root node.\n  node_type* rightmost() {\n    return (!root() || root()->leaf()) ? root() : root()->rightmost();\n  }\n  const node_type* rightmost() const {\n    return (!root() || root()->leaf()) ? root() : root()->rightmost();\n  }\n  node_type** mutable_rightmost() { return root()->mutable_rightmost(); }\n\n  // The leftmost node is stored as the parent of the root node.\n  node_type* leftmost() { return root() ? root()->parent() : NULL; }\n  const node_type* leftmost() const { return root() ? root()->parent() : NULL; }\n\n  // The size of the tree is stored in the root node.\n  size_type* mutable_size() { return root()->mutable_size(); }\n\n  // Allocator routines.\n  internal_allocator_type* mutable_internal_allocator() {\n    return static_cast<internal_allocator_type*>(&root_);\n  }\n  const internal_allocator_type& internal_allocator() const {\n    return *static_cast<const internal_allocator_type*>(&root_);\n  }\n\n  // Node creation/deletion routines.\n  node_type* new_internal_node(node_type *parent) {\n    internal_fields *p = reinterpret_cast<internal_fields*>(\n        mutable_internal_allocator()->allocate(sizeof(internal_fields)));\n    return node_type::init_internal(p, parent);\n  }\n  node_type* new_internal_root_node() {\n    root_fields *p = reinterpret_cast<root_fields*>(\n        mutable_internal_allocator()->allocate(sizeof(root_fields)));\n    return node_type::init_root(p, root()->parent());\n  }\n  node_type* new_leaf_node(node_type *parent) {\n    leaf_fields *p = reinterpret_cast<leaf_fields*>(\n        mutable_internal_allocator()->allocate(sizeof(leaf_fields)));\n    return node_type::init_leaf(p, parent, kNodeValues);\n  }\n  node_type* new_leaf_root_node(int max_count) {\n    leaf_fields *p = reinterpret_cast<leaf_fields*>(\n        mutable_internal_allocator()->allocate(\n            sizeof(base_fields) + max_count * sizeof(value_type)));\n    return node_type::init_leaf(p, reinterpret_cast<node_type*>(p), max_count);\n  }\n  void delete_internal_node(node_type *node) {\n    node->destroy();\n    assert(node != root());\n    mutable_internal_allocator()->deallocate(\n        reinterpret_cast<char*>(node), sizeof(internal_fields));\n  }\n  void delete_internal_root_node() {\n    root()->destroy();\n    mutable_internal_allocator()->deallocate(\n        reinterpret_cast<char*>(root()), sizeof(root_fields));\n  }\n  void delete_leaf_node(node_type *node) {\n    node->destroy();\n    mutable_internal_allocator()->deallocate(\n        reinterpret_cast<char*>(node),\n        sizeof(base_fields) + node->max_count() * sizeof(value_type));\n  }\n\n  // Rebalances or splits the node iter points to.\n  void rebalance_or_split(iterator *iter);\n\n  // Merges the values of left, right and the delimiting key on their parent\n  // onto left, removing the delimiting key and deleting right.\n  void merge_nodes(node_type *left, node_type *right);\n\n  // Tries to merge node with its left or right sibling, and failing that,\n  // rebalance with its left or right sibling. Returns true if a merge\n  // occurred, at which point it is no longer valid to access node. Returns\n  // false if no merging took place.\n  bool try_merge_or_rebalance(iterator *iter);\n\n  // Tries to shrink the height of the tree by 1.\n  void try_shrink();\n\n  iterator internal_end(iterator iter) {\n    return iter.node ? iter : end();\n  }\n  const_iterator internal_end(const_iterator iter) const {\n    return iter.node ? iter : end();\n  }\n\n  // Inserts a value into the btree immediately before iter. Requires that\n  // key(v) <= iter.key() and (--iter).key() <= key(v).\n  iterator internal_insert(iterator iter, const value_type &v);\n\n  // Returns an iterator pointing to the first value >= the value \"iter\" is\n  // pointing at. Note that \"iter\" might be pointing to an invalid location as\n  // iter.position == iter.node->count(). This routine simply moves iter up in\n  // the tree to a valid location.\n  template <typename IterType>\n  static IterType internal_last(IterType iter);\n\n  // Returns an iterator pointing to the leaf position at which key would\n  // reside in the tree. We provide 2 versions of internal_locate. The first\n  // version (internal_locate_plain_compare) always returns 0 for the second\n  // field of the pair. The second version (internal_locate_compare_to) is for\n  // the key-compare-to specialization and returns either kExactMatch (if the\n  // key was found in the tree) or -kExactMatch (if it wasn't) in the second\n  // field of the pair. The compare_to specialization allows the caller to\n  // avoid a subsequent comparison to determine if an exact match was made,\n  // speeding up string keys.\n  template <typename IterType>\n  std::pair<IterType, int> internal_locate(\n      const key_type &key, IterType iter) const;\n  template <typename IterType>\n  std::pair<IterType, int> internal_locate_plain_compare(\n      const key_type &key, IterType iter) const;\n  template <typename IterType>\n  std::pair<IterType, int> internal_locate_compare_to(\n      const key_type &key, IterType iter) const;\n\n  // Internal routine which implements lower_bound().\n  template <typename IterType>\n  IterType internal_lower_bound(\n      const key_type &key, IterType iter) const;\n\n  // Internal routine which implements upper_bound().\n  template <typename IterType>\n  IterType internal_upper_bound(\n      const key_type &key, IterType iter) const;\n\n  // Internal routine which implements find_unique().\n  template <typename IterType>\n  IterType internal_find_unique(\n      const key_type &key, IterType iter) const;\n\n  // Internal routine which implements find_multi().\n  template <typename IterType>\n  IterType internal_find_multi(\n      const key_type &key, IterType iter) const;\n\n  // Deletes a node and all of its children.\n  void internal_clear(node_type *node);\n\n  // Dumps a node and all of its children to the specified ostream.\n  void internal_dump(std::ostream &os, const node_type *node, int level) const;\n\n  // Verifies the tree structure of node.\n  int internal_verify(const node_type *node,\n                      const key_type *lo, const key_type *hi) const;\n\n  node_stats internal_stats(const node_type *node) const {\n    if (!node) {\n      return node_stats(0, 0);\n    }\n    if (node->leaf()) {\n      return node_stats(1, 0);\n    }\n    node_stats res(0, 1);\n    for (int i = 0; i <= node->count(); ++i) {\n      res += internal_stats(node->child(i));\n    }\n    return res;\n  }\n\n private:\n  empty_base_handle<internal_allocator_type, node_type*> root_;\n\n private:\n  // A never instantiated helper function that returns big_ if we have a\n  // key-compare-to functor or if R is bool and small_ otherwise.\n  template <typename R>\n  static typename if_<\n   if_<is_key_compare_to::value,\n             std::is_same<R, int>,\n             std::is_same<R, bool> >::type::value,\n   big_, small_>::type key_compare_checker(R);\n\n  // A never instantiated helper function that returns the key comparison\n  // functor.\n  static key_compare key_compare_helper();\n\n  // Verify that key_compare returns a bool. This is similar to the way\n  // is_convertible in base/type_traits.h works. Note that key_compare_checker\n  // is never actually invoked. The compiler will select which\n  // key_compare_checker() to instantiate and then figure out the size of the\n  // return type of key_compare_checker() at compile time which we then check\n  // against the sizeof of big_.\n  COMPILE_ASSERT(\n      sizeof(key_compare_checker(key_compare_helper()(key_type(), key_type()))) ==\n      sizeof(big_),\n      key_comparison_function_must_return_bool);\n\n  // Note: We insist on kTargetValues, which is computed from\n  // Params::kTargetNodeSize, must fit the base_fields::field_type.\n  COMPILE_ASSERT(kNodeValues <\n                 (1 << (8 * sizeof(typename base_fields::field_type))),\n                 target_node_size_too_large);\n\n  // Test the assumption made in setting kNodeValueSpace.\n  COMPILE_ASSERT(sizeof(base_fields) >= 2 * sizeof(void*),\n                 node_space_assumption_incorrect);\n};\n\n////\n// btree_node methods\ntemplate <typename P>\ninline void btree_node<P>::insert_value(int i, const value_type &x) {\n  assert(i <= count());\n  value_init(count(), x);\n  for (int j = count(); j > i; --j) {\n    value_swap(j, this, j - 1);\n  }\n  set_count(count() + 1);\n\n  if (!leaf()) {\n    ++i;\n    for (int j = count(); j > i; --j) {\n      *mutable_child(j) = child(j - 1);\n      child(j)->set_position(j);\n    }\n    *mutable_child(i) = NULL;\n  }\n}\n\ntemplate <typename P>\ninline void btree_node<P>::remove_value(int i) {\n  if (!leaf()) {\n    assert(child(i + 1)->count() == 0);\n    for (int j = i + 1; j < count(); ++j) {\n      *mutable_child(j) = child(j + 1);\n      child(j)->set_position(j);\n    }\n    *mutable_child(count()) = NULL;\n  }\n\n  set_count(count() - 1);\n  for (; i < count(); ++i) {\n    value_swap(i, this, i + 1);\n  }\n  value_destroy(i);\n}\n\ntemplate <typename P>\nvoid btree_node<P>::rebalance_right_to_left(btree_node *src, int to_move) {\n  assert(parent() == src->parent());\n  assert(position() + 1 == src->position());\n  assert(src->count() >= count());\n  assert(to_move >= 1);\n  assert(to_move <= src->count());\n\n  // Make room in the left node for the new values.\n  for (int i = 0; i < to_move; ++i) {\n    value_init(i + count());\n  }\n\n  // Move the delimiting value to the left node and the new delimiting value\n  // from the right node.\n  value_swap(count(), parent(), position());\n  parent()->value_swap(position(), src, to_move - 1);\n\n  // Move the values from the right to the left node.\n  for (int i = 1; i < to_move; ++i) {\n    value_swap(count() + i, src, i - 1);\n  }\n  // Shift the values in the right node to their correct position.\n  for (int i = to_move; i < src->count(); ++i) {\n    src->value_swap(i - to_move, src, i);\n  }\n  for (int i = 1; i <= to_move; ++i) {\n    src->value_destroy(src->count() - i);\n  }\n\n  if (!leaf()) {\n    // Move the child pointers from the right to the left node.\n    for (int i = 0; i < to_move; ++i) {\n      set_child(1 + count() + i, src->child(i));\n    }\n    for (int i = 0; i <= src->count() - to_move; ++i) {\n      assert(i + to_move <= src->max_count());\n      src->set_child(i, src->child(i + to_move));\n      *src->mutable_child(i + to_move) = NULL;\n    }\n  }\n\n  // Fixup the counts on the src and dest nodes.\n  set_count(count() + to_move);\n  src->set_count(src->count() - to_move);\n}\n\ntemplate <typename P>\nvoid btree_node<P>::rebalance_left_to_right(btree_node *dest, int to_move) {\n  assert(parent() == dest->parent());\n  assert(position() + 1 == dest->position());\n  assert(count() >= dest->count());\n  assert(to_move >= 1);\n  assert(to_move <= count());\n\n  // Make room in the right node for the new values.\n  for (int i = 0; i < to_move; ++i) {\n    dest->value_init(i + dest->count());\n  }\n  for (int i = dest->count() - 1; i >= 0; --i) {\n    dest->value_swap(i, dest, i + to_move);\n  }\n\n  // Move the delimiting value to the right node and the new delimiting value\n  // from the left node.\n  dest->value_swap(to_move - 1, parent(), position());\n  parent()->value_swap(position(), this, count() - to_move);\n  value_destroy(count() - to_move);\n\n  // Move the values from the left to the right node.\n  for (int i = 1; i < to_move; ++i) {\n    value_swap(count() - to_move + i, dest, i - 1);\n    value_destroy(count() - to_move + i);\n  }\n\n  if (!leaf()) {\n    // Move the child pointers from the left to the right node.\n    for (int i = dest->count(); i >= 0; --i) {\n      dest->set_child(i + to_move, dest->child(i));\n      *dest->mutable_child(i) = NULL;\n    }\n    for (int i = 1; i <= to_move; ++i) {\n      dest->set_child(i - 1, child(count() - to_move + i));\n      *mutable_child(count() - to_move + i) = NULL;\n    }\n  }\n\n  // Fixup the counts on the src and dest nodes.\n  set_count(count() - to_move);\n  dest->set_count(dest->count() + to_move);\n}\n\ntemplate <typename P>\nvoid btree_node<P>::split(btree_node *dest, int insert_position) {\n  assert(dest->count() == 0);\n\n  // We bias the split based on the position being inserted. If we're\n  // inserting at the beginning of the left node then bias the split to put\n  // more values on the right node. If we're inserting at the end of the\n  // right node then bias the split to put more values on the left node.\n  if (insert_position == 0) {\n    dest->set_count(count() - 1);\n  } else if (insert_position == max_count()) {\n    dest->set_count(0);\n  } else {\n    dest->set_count(count() / 2);\n  }\n  set_count(count() - dest->count());\n  assert(count() >= 1);\n\n  // Move values from the left sibling to the right sibling.\n  for (int i = 0; i < dest->count(); ++i) {\n    dest->value_init(i);\n    value_swap(count() + i, dest, i);\n    value_destroy(count() + i);\n  }\n\n  // The split key is the largest value in the left sibling.\n  set_count(count() - 1);\n  parent()->insert_value(position(), value_type());\n  value_swap(count(), parent(), position());\n  value_destroy(count());\n  parent()->set_child(position() + 1, dest);\n\n  if (!leaf()) {\n    for (int i = 0; i <= dest->count(); ++i) {\n      assert(child(count() + i + 1) != NULL);\n      dest->set_child(i, child(count() + i + 1));\n      *mutable_child(count() + i + 1) = NULL;\n    }\n  }\n}\n\ntemplate <typename P>\nvoid btree_node<P>::merge(btree_node *src) {\n  assert(parent() == src->parent());\n  assert(position() + 1 == src->position());\n\n  // Move the delimiting value to the left node.\n  value_init(count());\n  value_swap(count(), parent(), position());\n\n  // Move the values from the right to the left node.\n  for (int i = 0; i < src->count(); ++i) {\n    value_init(1 + count() + i);\n    value_swap(1 + count() + i, src, i);\n    src->value_destroy(i);\n  }\n\n  if (!leaf()) {\n    // Move the child pointers from the right to the left node.\n    for (int i = 0; i <= src->count(); ++i) {\n      set_child(1 + count() + i, src->child(i));\n      *src->mutable_child(i) = NULL;\n    }\n  }\n\n  // Fixup the counts on the src and dest nodes.\n  set_count(1 + count() + src->count());\n  src->set_count(0);\n\n  // Remove the value on the parent node.\n  parent()->remove_value(position());\n}\n\ntemplate <typename P>\nvoid btree_node<P>::swap(btree_node *x) {\n  assert(leaf() == x->leaf());\n\n  // Swap the values.\n  for (int i = count(); i < x->count(); ++i) {\n    value_init(i);\n  }\n  for (int i = x->count(); i < count(); ++i) {\n    x->value_init(i);\n  }\n  int n = std::max(count(), x->count());\n  for (int i = 0; i < n; ++i) {\n    value_swap(i, x, i);\n  }\n  for (int i = count(); i < x->count(); ++i) {\n    x->value_destroy(i);\n  }\n  for (int i = x->count(); i < count(); ++i) {\n    value_destroy(i);\n  }\n\n  if (!leaf()) {\n    // Swap the child pointers.\n    for (int i = 0; i <= n; ++i) {\n      btree_swap_helper(*mutable_child(i), *x->mutable_child(i));\n    }\n    for (int i = 0; i <= count(); ++i) {\n      x->child(i)->fields_.parent = x;\n    }\n    for (int i = 0; i <= x->count(); ++i) {\n      child(i)->fields_.parent = this;\n    }\n  }\n\n  // Swap the counts.\n  btree_swap_helper(fields_.count, x->fields_.count);\n}\n\n////\n// btree_iterator methods\ntemplate <typename N, typename R, typename P>\nvoid btree_iterator<N, R, P>::increment_slow() {\n  if (node->leaf()) {\n    assert(position >= node->count());\n    self_type save(*this);\n    while (position == node->count() && !node->is_root()) {\n      assert(node->parent()->child(node->position()) == node);\n      position = node->position();\n      node = node->parent();\n    }\n    if (position == node->count()) {\n      *this = save;\n    }\n  } else {\n    assert(position < node->count());\n    node = node->child(position + 1);\n    while (!node->leaf()) {\n      node = node->child(0);\n    }\n    position = 0;\n  }\n}\n\ntemplate <typename N, typename R, typename P>\nvoid btree_iterator<N, R, P>::increment_by(int count) {\n  while (count > 0) {\n    if (node->leaf()) {\n      int rest = node->count() - position;\n      position += std::min(rest, count);\n      count = count - rest;\n      if (position < node->count()) {\n        return;\n      }\n    } else {\n      --count;\n    }\n    increment_slow();\n  }\n}\n\ntemplate <typename N, typename R, typename P>\nvoid btree_iterator<N, R, P>::decrement_slow() {\n  if (node->leaf()) {\n    assert(position <= -1);\n    self_type save(*this);\n    while (position < 0 && !node->is_root()) {\n      assert(node->parent()->child(node->position()) == node);\n      position = node->position() - 1;\n      node = node->parent();\n    }\n    if (position < 0) {\n      *this = save;\n    }\n  } else {\n    assert(position >= 0);\n    node = node->child(position);\n    while (!node->leaf()) {\n      node = node->child(node->count());\n    }\n    position = node->count() - 1;\n  }\n}\n\n////\n// btree methods\ntemplate <typename P>\nbtree<P>::btree(const key_compare &comp, const allocator_type &alloc)\n    : key_compare(comp),\n      root_(alloc, NULL) {\n}\n\ntemplate <typename P>\nbtree<P>::btree(const self_type &x)\n    : key_compare(x.key_comp()),\n      root_(x.internal_allocator(), NULL) {\n  assign(x);\n}\n\ntemplate <typename P> template <typename ValuePointer>\nstd::pair<typename btree<P>::iterator, bool>\nbtree<P>::insert_unique(const key_type &key, ValuePointer value) {\n  if (empty()) {\n    *mutable_root() = new_leaf_root_node(1);\n  }\n\n  std::pair<iterator, int> res = internal_locate(key, iterator(root(), 0));\n  iterator &iter = res.first;\n  if (res.second == kExactMatch) {\n    // The key already exists in the tree, do nothing.\n    return std::make_pair(internal_last(iter), false);\n  } else if (!res.second) {\n    iterator last = internal_last(iter);\n    if (last.node && !compare_keys(key, last.key())) {\n      // The key already exists in the tree, do nothing.\n      return std::make_pair(last, false);\n    }\n  }\n\n  return std::make_pair(internal_insert(iter, *value), true);\n}\n\ntemplate <typename P>\ninline typename btree<P>::iterator\nbtree<P>::insert_unique(iterator position, const value_type &v) {\n  if (!empty()) {\n    const key_type &key = params_type::key(v);\n    if (position == end() || compare_keys(key, position.key())) {\n      iterator prev = position;\n      if (position == begin() || compare_keys((--prev).key(), key)) {\n        // prev.key() < key < position.key()\n        return internal_insert(position, v);\n      }\n    } else if (compare_keys(position.key(), key)) {\n      iterator next = position;\n      ++next;\n      if (next == end() || compare_keys(key, next.key())) {\n        // position.key() < key < next.key()\n        return internal_insert(next, v);\n      }\n    } else {\n      // position.key() == key\n      return position;\n    }\n  }\n  return insert_unique(v).first;\n}\n\ntemplate <typename P> template <typename InputIterator>\nvoid btree<P>::insert_unique(InputIterator b, InputIterator e) {\n  for (; b != e; ++b) {\n    insert_unique(end(), *b);\n  }\n}\n\ntemplate <typename P> template <typename ValuePointer>\ntypename btree<P>::iterator\nbtree<P>::insert_multi(const key_type &key, ValuePointer value) {\n  if (empty()) {\n    *mutable_root() = new_leaf_root_node(1);\n  }\n\n  iterator iter = internal_upper_bound(key, iterator(root(), 0));\n  if (!iter.node) {\n    iter = end();\n  }\n  return internal_insert(iter, *value);\n}\n\ntemplate <typename P>\ntypename btree<P>::iterator\nbtree<P>::insert_multi(iterator position, const value_type &v) {\n  if (!empty()) {\n    const key_type &key = params_type::key(v);\n    if (position == end() || !compare_keys(position.key(), key)) {\n      iterator prev = position;\n      if (position == begin() || !compare_keys(key, (--prev).key())) {\n        // prev.key() <= key <= position.key()\n        return internal_insert(position, v);\n      }\n    } else {\n      iterator next = position;\n      ++next;\n      if (next == end() || !compare_keys(next.key(), key)) {\n        // position.key() < key <= next.key()\n        return internal_insert(next, v);\n      }\n    }\n  }\n  return insert_multi(v);\n}\n\ntemplate <typename P> template <typename InputIterator>\nvoid btree<P>::insert_multi(InputIterator b, InputIterator e) {\n  for (; b != e; ++b) {\n    insert_multi(end(), *b);\n  }\n}\n\ntemplate <typename P>\nvoid btree<P>::assign(const self_type &x) {\n  clear();\n\n  *mutable_key_comp() = x.key_comp();\n  *mutable_internal_allocator() = x.internal_allocator();\n\n  // Assignment can avoid key comparisons because we know the order of the\n  // values is the same order we'll store them in.\n  for (const_iterator iter = x.begin(); iter != x.end(); ++iter) {\n    if (empty()) {\n      insert_multi(*iter);\n    } else {\n      // If the btree is not empty, we can just insert the new value at the end\n      // of the tree!\n      internal_insert(end(), *iter);\n    }\n  }\n}\n\ntemplate <typename P>\ntypename btree<P>::iterator btree<P>::erase(iterator iter) {\n  bool internal_delete = false;\n  if (!iter.node->leaf()) {\n    // Deletion of a value on an internal node. Swap the key with the largest\n    // value of our left child. This is easy, we just decrement iter.\n    iterator tmp_iter(iter--);\n    assert(iter.node->leaf());\n    assert(!compare_keys(tmp_iter.key(), iter.key()));\n    iter.node->value_swap(iter.position, tmp_iter.node, tmp_iter.position);\n    internal_delete = true;\n    --*mutable_size();\n  } else if (!root()->leaf()) {\n    --*mutable_size();\n  }\n\n  // Delete the key from the leaf.\n  iter.node->remove_value(iter.position);\n\n  // We want to return the next value after the one we just erased. If we\n  // erased from an internal node (internal_delete == true), then the next\n  // value is ++(++iter). If we erased from a leaf node (internal_delete ==\n  // false) then the next value is ++iter. Note that ++iter may point to an\n  // internal node and the value in the internal node may move to a leaf node\n  // (iter.node) when rebalancing is performed at the leaf level.\n\n  // Merge/rebalance as we walk back up the tree.\n  iterator res(iter);\n  for (;;) {\n    if (iter.node == root()) {\n      try_shrink();\n      if (empty()) {\n        return end();\n      }\n      break;\n    }\n    if (iter.node->count() >= kMinNodeValues) {\n      break;\n    }\n    bool merged = try_merge_or_rebalance(&iter);\n    if (iter.node->leaf()) {\n      res = iter;\n    }\n    if (!merged) {\n      break;\n    }\n    iter.node = iter.node->parent();\n  }\n\n  // Adjust our return value. If we're pointing at the end of a node, advance\n  // the iterator.\n  if (res.position == res.node->count()) {\n    res.position = res.node->count() - 1;\n    ++res;\n  }\n  // If we erased from an internal node, advance the iterator.\n  if (internal_delete) {\n    ++res;\n  }\n  return res;\n}\n\ntemplate <typename P>\nint btree<P>::erase(iterator b, iterator e) {\n  int count = distance(b, e);\n  for (int i = 0; i < count; i++) {\n    b = erase(b);\n  }\n  return count;\n}\n\ntemplate <typename P>\nint btree<P>::erase_unique(const key_type &key) {\n  iterator iter = internal_find_unique(key, iterator(root(), 0));\n  if (!iter.node) {\n    // The key doesn't exist in the tree, return nothing done.\n    return 0;\n  }\n  erase(iter);\n  return 1;\n}\n\ntemplate <typename P>\nint btree<P>::erase_multi(const key_type &key) {\n  iterator b = internal_lower_bound(key, iterator(root(), 0));\n  if (!b.node) {\n    // The key doesn't exist in the tree, return nothing done.\n    return 0;\n  }\n  // Delete all of the keys between begin and upper_bound(key).\n  iterator e = internal_end(\n      internal_upper_bound(key, iterator(root(), 0)));\n  return erase(b, e);\n}\n\ntemplate <typename P>\nvoid btree<P>::clear() {\n  if (root() != NULL) {\n    internal_clear(root());\n  }\n  *mutable_root() = NULL;\n}\n\ntemplate <typename P>\nvoid btree<P>::swap(self_type &x) {\n  std::swap(static_cast<key_compare&>(*this), static_cast<key_compare&>(x));\n  std::swap(root_, x.root_);\n}\n\ntemplate <typename P>\nvoid btree<P>::verify() const {\n  if (root() != NULL) {\n    assert(size() == internal_verify(root(), NULL, NULL));\n    assert(leftmost() == (++const_iterator(root(), -1)).node);\n    assert(rightmost() == (--const_iterator(root(), root()->count())).node);\n    assert(leftmost()->leaf());\n    assert(rightmost()->leaf());\n  } else {\n    assert(size() == 0);\n    assert(leftmost() == NULL);\n    assert(rightmost() == NULL);\n  }\n}\n\ntemplate <typename P>\nvoid btree<P>::rebalance_or_split(iterator *iter) {\n  node_type *&node = iter->node;\n  int &insert_position = iter->position;\n  assert(node->count() == node->max_count());\n\n  // First try to make room on the node by rebalancing.\n  node_type *parent = node->parent();\n  if (node != root()) {\n    if (node->position() > 0) {\n      // Try rebalancing with our left sibling.\n      node_type *left = parent->child(node->position() - 1);\n      if (left->count() < left->max_count()) {\n        // We bias rebalancing based on the position being inserted. If we're\n        // inserting at the end of the right node then we bias rebalancing to\n        // fill up the left node.\n        int to_move = (left->max_count() - left->count()) /\n            (1 + (insert_position < left->max_count()));\n        to_move = std::max(1, to_move);\n\n        if (((insert_position - to_move) >= 0) ||\n            ((left->count() + to_move) < left->max_count())) {\n          left->rebalance_right_to_left(node, to_move);\n\n          assert(node->max_count() - node->count() == to_move);\n          insert_position = insert_position - to_move;\n          if (insert_position < 0) {\n            insert_position = insert_position + left->count() + 1;\n            node = left;\n          }\n\n          assert(node->count() < node->max_count());\n          return;\n        }\n      }\n    }\n\n    if (node->position() < parent->count()) {\n      // Try rebalancing with our right sibling.\n      node_type *right = parent->child(node->position() + 1);\n      if (right->count() < right->max_count()) {\n        // We bias rebalancing based on the position being inserted. If we're\n        // inserting at the beginning of the left node then we bias rebalancing\n        // to fill up the right node.\n        int to_move = (right->max_count() - right->count()) /\n            (1 + (insert_position > 0));\n        to_move = std::max(1, to_move);\n\n        if ((insert_position <= (node->count() - to_move)) ||\n            ((right->count() + to_move) < right->max_count())) {\n          node->rebalance_left_to_right(right, to_move);\n\n          if (insert_position > node->count()) {\n            insert_position = insert_position - node->count() - 1;\n            node = right;\n          }\n\n          assert(node->count() < node->max_count());\n          return;\n        }\n      }\n    }\n\n    // Rebalancing failed, make sure there is room on the parent node for a new\n    // value.\n    if (parent->count() == parent->max_count()) {\n      iterator parent_iter(node->parent(), node->position());\n      rebalance_or_split(&parent_iter);\n    }\n  } else {\n    // Rebalancing not possible because this is the root node.\n    if (root()->leaf()) {\n      // The root node is currently a leaf node: create a new root node and set\n      // the current root node as the child of the new root.\n      parent = new_internal_root_node();\n      parent->set_child(0, root());\n      *mutable_root() = parent;\n      assert(*mutable_rightmost() == parent->child(0));\n    } else {\n      // The root node is an internal node. We do not want to create a new root\n      // node because the root node is special and holds the size of the tree\n      // and a pointer to the rightmost node. So we create a new internal node\n      // and move all of the items on the current root into the new node.\n      parent = new_internal_node(parent);\n      parent->set_child(0, parent);\n      parent->swap(root());\n      node = parent;\n    }\n  }\n\n  // Split the node.\n  node_type *split_node;\n  if (node->leaf()) {\n    split_node = new_leaf_node(parent);\n    node->split(split_node, insert_position);\n    if (rightmost() == node) {\n      *mutable_rightmost() = split_node;\n    }\n  } else {\n    split_node = new_internal_node(parent);\n    node->split(split_node, insert_position);\n  }\n\n  if (insert_position > node->count()) {\n    insert_position = insert_position - node->count() - 1;\n    node = split_node;\n  }\n}\n\ntemplate <typename P>\nvoid btree<P>::merge_nodes(node_type *left, node_type *right) {\n  left->merge(right);\n  if (right->leaf()) {\n    if (rightmost() == right) {\n      *mutable_rightmost() = left;\n    }\n    delete_leaf_node(right);\n  } else {\n    delete_internal_node(right);\n  }\n}\n\ntemplate <typename P>\nbool btree<P>::try_merge_or_rebalance(iterator *iter) {\n  node_type *parent = iter->node->parent();\n  if (iter->node->position() > 0) {\n    // Try merging with our left sibling.\n    node_type *left = parent->child(iter->node->position() - 1);\n    if ((1 + left->count() + iter->node->count()) <= left->max_count()) {\n      iter->position += 1 + left->count();\n      merge_nodes(left, iter->node);\n      iter->node = left;\n      return true;\n    }\n  }\n  if (iter->node->position() < parent->count()) {\n    // Try merging with our right sibling.\n    node_type *right = parent->child(iter->node->position() + 1);\n    if ((1 + iter->node->count() + right->count()) <= right->max_count()) {\n      merge_nodes(iter->node, right);\n      return true;\n    }\n    // Try rebalancing with our right sibling. We don't perform rebalancing if\n    // we deleted the first element from iter->node and the node is not\n    // empty. This is a small optimization for the common pattern of deleting\n    // from the front of the tree.\n    if ((right->count() > kMinNodeValues) &&\n        ((iter->node->count() == 0) ||\n         (iter->position > 0))) {\n      int to_move = (right->count() - iter->node->count()) / 2;\n      to_move = std::min(to_move, right->count() - 1);\n      iter->node->rebalance_right_to_left(right, to_move);\n      return false;\n    }\n  }\n  if (iter->node->position() > 0) {\n    // Try rebalancing with our left sibling. We don't perform rebalancing if\n    // we deleted the last element from iter->node and the node is not\n    // empty. This is a small optimization for the common pattern of deleting\n    // from the back of the tree.\n    node_type *left = parent->child(iter->node->position() - 1);\n    if ((left->count() > kMinNodeValues) &&\n        ((iter->node->count() == 0) ||\n         (iter->position < iter->node->count()))) {\n      int to_move = (left->count() - iter->node->count()) / 2;\n      to_move = std::min(to_move, left->count() - 1);\n      left->rebalance_left_to_right(iter->node, to_move);\n      iter->position += to_move;\n      return false;\n    }\n  }\n  return false;\n}\n\ntemplate <typename P>\nvoid btree<P>::try_shrink() {\n  if (root()->count() > 0) {\n    return;\n  }\n  // Deleted the last item on the root node, shrink the height of the tree.\n  if (root()->leaf()) {\n    assert(size() == 0);\n    delete_leaf_node(root());\n    *mutable_root() = NULL;\n  } else {\n    node_type *child = root()->child(0);\n    if (child->leaf()) {\n      // The child is a leaf node so simply make it the root node in the tree.\n      child->make_root();\n      delete_internal_root_node();\n      *mutable_root() = child;\n    } else {\n      // The child is an internal node. We want to keep the existing root node\n      // so we move all of the values from the child node into the existing\n      // (empty) root node.\n      child->swap(root());\n      delete_internal_node(child);\n    }\n  }\n}\n\ntemplate <typename P> template <typename IterType>\ninline IterType btree<P>::internal_last(IterType iter) {\n  while (iter.node && iter.position == iter.node->count()) {\n    iter.position = iter.node->position();\n    iter.node = iter.node->parent();\n    if (iter.node->leaf()) {\n      iter.node = NULL;\n    }\n  }\n  return iter;\n}\n\ntemplate <typename P>\ninline typename btree<P>::iterator\nbtree<P>::internal_insert(iterator iter, const value_type &v) {\n  if (!iter.node->leaf()) {\n    // We can't insert on an internal node. Instead, we'll insert after the\n    // previous value which is guaranteed to be on a leaf node.\n    --iter;\n    ++iter.position;\n  }\n  if (iter.node->count() == iter.node->max_count()) {\n    // Make room in the leaf for the new item.\n    if (iter.node->max_count() < kNodeValues) {\n      // Insertion into the root where the root is smaller that the full node\n      // size. Simply grow the size of the root node.\n      assert(iter.node == root());\n      iter.node = new_leaf_root_node(\n          std::min<int>(kNodeValues, 2 * iter.node->max_count()));\n      iter.node->swap(root());\n      delete_leaf_node(root());\n      *mutable_root() = iter.node;\n    } else {\n      rebalance_or_split(&iter);\n      ++*mutable_size();\n    }\n  } else if (!root()->leaf()) {\n    ++*mutable_size();\n  }\n  iter.node->insert_value(iter.position, v);\n  return iter;\n}\n\ntemplate <typename P> template <typename IterType>\ninline std::pair<IterType, int> btree<P>::internal_locate(\n    const key_type &key, IterType iter) const {\n  return internal_locate_type::dispatch(key, *this, iter);\n}\n\ntemplate <typename P> template <typename IterType>\ninline std::pair<IterType, int> btree<P>::internal_locate_plain_compare(\n    const key_type &key, IterType iter) const {\n  for (;;) {\n    iter.position = iter.node->lower_bound(key, key_comp());\n    if (iter.node->leaf()) {\n      break;\n    }\n    iter.node = iter.node->child(iter.position);\n  }\n  return std::make_pair(iter, 0);\n}\n\ntemplate <typename P> template <typename IterType>\ninline std::pair<IterType, int> btree<P>::internal_locate_compare_to(\n    const key_type &key, IterType iter) const {\n  for (;;) {\n    int res = iter.node->lower_bound(key, key_comp());\n    iter.position = res & kMatchMask;\n    if (res & kExactMatch) {\n      return std::make_pair(iter, static_cast<int>(kExactMatch));\n    }\n    if (iter.node->leaf()) {\n      break;\n    }\n    iter.node = iter.node->child(iter.position);\n  }\n  return std::make_pair(iter, -kExactMatch);\n}\n\ntemplate <typename P> template <typename IterType>\nIterType btree<P>::internal_lower_bound(\n    const key_type &key, IterType iter) const {\n  if (iter.node) {\n    for (;;) {\n      iter.position =\n          iter.node->lower_bound(key, key_comp()) & kMatchMask;\n      if (iter.node->leaf()) {\n        break;\n      }\n      iter.node = iter.node->child(iter.position);\n    }\n    iter = internal_last(iter);\n  }\n  return iter;\n}\n\ntemplate <typename P> template <typename IterType>\nIterType btree<P>::internal_upper_bound(\n    const key_type &key, IterType iter) const {\n  if (iter.node) {\n    for (;;) {\n      iter.position = iter.node->upper_bound(key, key_comp());\n      if (iter.node->leaf()) {\n        break;\n      }\n      iter.node = iter.node->child(iter.position);\n    }\n    iter = internal_last(iter);\n  }\n  return iter;\n}\n\ntemplate <typename P> template <typename IterType>\nIterType btree<P>::internal_find_unique(\n    const key_type &key, IterType iter) const {\n  if (iter.node) {\n    std::pair<IterType, int> res = internal_locate(key, iter);\n    if (res.second == kExactMatch) {\n      return res.first;\n    }\n    if (!res.second) {\n      iter = internal_last(res.first);\n      if (iter.node && !compare_keys(key, iter.key())) {\n        return iter;\n      }\n    }\n  }\n  return IterType(NULL, 0);\n}\n\ntemplate <typename P> template <typename IterType>\nIterType btree<P>::internal_find_multi(\n    const key_type &key, IterType iter) const {\n  if (iter.node) {\n    iter = internal_lower_bound(key, iter);\n    if (iter.node) {\n      iter = internal_last(iter);\n      if (iter.node && !compare_keys(key, iter.key())) {\n        return iter;\n      }\n    }\n  }\n  return IterType(NULL, 0);\n}\n\ntemplate <typename P>\nvoid btree<P>::internal_clear(node_type *node) {\n  if (!node->leaf()) {\n    for (int i = 0; i <= node->count(); ++i) {\n      internal_clear(node->child(i));\n    }\n    if (node == root()) {\n      delete_internal_root_node();\n    } else {\n      delete_internal_node(node);\n    }\n  } else {\n    delete_leaf_node(node);\n  }\n}\n\ntemplate <typename P>\nvoid btree<P>::internal_dump(\n    std::ostream &os, const node_type *node, int level) const {\n  for (int i = 0; i < node->count(); ++i) {\n    if (!node->leaf()) {\n      internal_dump(os, node->child(i), level + 1);\n    }\n    for (int j = 0; j < level; ++j) {\n      os << \"  \";\n    }\n    os << node->key(i) << \" [\" << level << \"]\\n\";\n  }\n  if (!node->leaf()) {\n    internal_dump(os, node->child(node->count()), level + 1);\n  }\n}\n\ntemplate <typename P>\nint btree<P>::internal_verify(\n    const node_type *node, const key_type *lo, const key_type *hi) const {\n  assert(node->count() > 0);\n  assert(node->count() <= node->max_count());\n  if (lo) {\n    assert(!compare_keys(node->key(0), *lo));\n  }\n  if (hi) {\n    assert(!compare_keys(*hi, node->key(node->count() - 1)));\n  }\n  for (int i = 1; i < node->count(); ++i) {\n    assert(!compare_keys(node->key(i), node->key(i - 1)));\n  }\n  int count = node->count();\n  if (!node->leaf()) {\n    for (int i = 0; i <= node->count(); ++i) {\n      assert(node->child(i) != NULL);\n      assert(node->child(i)->parent() == node);\n      assert(node->child(i)->position() == i);\n      count += internal_verify(\n          node->child(i),\n          (i == 0) ? lo : &node->key(i - 1),\n          (i == node->count()) ? hi : &node->key(i));\n    }\n  }\n  return count;\n}\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_BTREE_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_bench.cc",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include <stdint.h>\n#include <stdlib.h>\n#include <algorithm>\n#include <functional>\n#include <map>\n#include <set>\n#include <string>\n#include <sys/time.h>\n#include <type_traits>\n#include <vector>\n\n#include \"gflags/gflags.h\"\n#include \"btree_map.h\"\n#include \"btree_set.h\"\n#include \"btree_test.h\"\n\nDEFINE_int32(test_random_seed, 123456789, \"Seed for srand()\");\nDEFINE_int32(benchmark_max_iters, 10000000, \"Maximum test iterations\");\nDEFINE_int32(benchmark_min_iters, 100, \"Minimum test iterations\");\nDEFINE_int32(benchmark_target_seconds, 1,\n\t     \"Attempt to benchmark for this many seconds\");\n\nusing std::allocator;\nusing std::less;\nusing std::map;\nusing std::max;\nusing std::min;\nusing std::multimap;\nusing std::multiset;\nusing std::set;\nusing std::string;\nusing std::vector;\n\nnamespace btree {\nnamespace {\n\nstruct RandGen {\n  typedef ptrdiff_t result_type;\n  RandGen(result_type seed) {\n    srand(seed);\n  }\n  result_type operator()(result_type l) {\n    return rand() % l;\n  }\n};\n\nstruct BenchmarkRun {\n  BenchmarkRun(const char *name, void (*func)(int));\n  void Run();\n  void Stop();\n  void Start();\n  void Reset();\n\n  BenchmarkRun *next_benchmark;\n  const char *benchmark_name;\n  void (*benchmark_func)(int);\n  int64_t accum_micros;\n  int64_t last_started;\n};\n\nBenchmarkRun *first_benchmark;\nBenchmarkRun *current_benchmark;\n\nint64_t get_micros () {\n  timeval tv;\n  gettimeofday(&tv, NULL);\n  return tv.tv_sec * 1000000 + tv.tv_usec;\n}\n\nBenchmarkRun::BenchmarkRun(const char *name, void (*func)(int))\n  : next_benchmark(first_benchmark),\n    benchmark_name(name),\n    benchmark_func(func),\n    accum_micros(0),\n    last_started(0) {\n  first_benchmark = this;\n}\n\n#define BTREE_BENCHMARK(name) \\\n  BTREE_BENCHMARK2(#name, name, __COUNTER__)\n#define BTREE_BENCHMARK2(name, func, counter)\t\\\n  BTREE_BENCHMARK3(name, func, counter)\n#define BTREE_BENCHMARK3(name, func, counter)\t\\\n  BenchmarkRun bench ## counter (name, func)\n\nvoid StopBenchmarkTiming() {\n  current_benchmark->Stop();\n}\n\nvoid StartBenchmarkTiming() {\n  current_benchmark->Start();\n}\n\nvoid RunBenchmarks() {\n  for (BenchmarkRun *bench = first_benchmark; bench; \n       bench = bench->next_benchmark) {\n    bench->Run();\n  }\n}\n\nvoid BenchmarkRun::Start() {\n  assert(!last_started);\n  last_started = get_micros();\n}\n\nvoid BenchmarkRun::Stop() {\n  if (last_started == 0) {\n    return;\n  }\n  accum_micros += get_micros() - last_started;\n  last_started = 0;\n}\n\nvoid BenchmarkRun::Reset() {\n  last_started = 0;\n  accum_micros = 0;\n}\n\nvoid BenchmarkRun::Run() {\n  assert(current_benchmark == NULL);\n  current_benchmark = this;\n  int iters = FLAGS_benchmark_min_iters;\n  for (;;) {\n    Reset();\n    Start();\n    benchmark_func(iters);\n    Stop();\n    if (accum_micros > FLAGS_benchmark_target_seconds * 1000000 ||\n\titers >= FLAGS_benchmark_max_iters) {\n      break;\n    } else if (accum_micros == 0) {\n      iters *= 100;\n    } else {\n      int64_t target_micros = FLAGS_benchmark_target_seconds * 1000000;\n      iters = target_micros * iters / accum_micros;\n    }\n    iters = min(iters, FLAGS_benchmark_max_iters);\n  }\n  std::cout << benchmark_name << \"\\t\"\n\t    << accum_micros * 1000 / iters << \"\\t\"\n\t    << iters;\n  current_benchmark = NULL;\n}\n\n// Used to avoid compiler optimizations for these benchmarks.\ntemplate <typename T>\nvoid sink(const T& t0) {\n  volatile T t = t0;\n}\n\n// Benchmark insertion of values into a container.\ntemplate <typename T>\nvoid BM_Insert(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n\n  T container;\n  vector<V> values = GenerateValues<V>(FLAGS_benchmark_values);\n  for (int i = 0; i < values.size(); i++) {\n    container.insert(values[i]);\n  }\n\n  for (int i = 0; i < n; ) {\n    // Remove and re-insert 10% of the keys\n    int m = min(n - i, FLAGS_benchmark_values / 10);\n\n    for (int j = i; j < i + m; j++) {\n      int x = j % FLAGS_benchmark_values;\n      container.erase(key_of_value(values[x]));\n    }\n\n    StartBenchmarkTiming();\n\n    for (int j = i; j < i + m; j++) {\n      int x = j % FLAGS_benchmark_values;\n      container.insert(values[x]);\n    }\n\n    StopBenchmarkTiming();\n\n    i += m;\n  }\n}\n\n// Benchmark lookup of values in a container.\ntemplate <typename T>\nvoid BM_Lookup(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n\n  T container;\n  vector<V> values = GenerateValues<V>(FLAGS_benchmark_values);\n\n  for (int i = 0; i < values.size(); i++) {\n    container.insert(values[i]);\n  }\n\n  V r = V();\n\n  StartBenchmarkTiming();\n\n  for (int i = 0; i < n; i++) {\n    int m = i % values.size();\n    r = *container.find(key_of_value(values[m]));\n  }\n\n  StopBenchmarkTiming();\n\n  sink(r); // Keep compiler from optimizing away r.\n}\n\n// Benchmark lookup of values in a full container, meaning that values\n// are inserted in-order to take advantage of biased insertion, which\n// yields a full tree.\ntemplate <typename T>\nvoid BM_FullLookup(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n\n  T container;\n  vector<V> values = GenerateValues<V>(FLAGS_benchmark_values);\n  vector<V> sorted(values);\n  sort(sorted.begin(), sorted.end());\n\n  for (int i = 0; i < sorted.size(); i++) {\n    container.insert(sorted[i]);\n  }\n\n  V r = V();\n\n  StartBenchmarkTiming();\n\n  for (int i = 0; i < n; i++) {\n    int m = i % values.size();\n    r = *container.find(key_of_value(values[m]));\n  }\n\n  StopBenchmarkTiming();\n\n  sink(r); // Keep compiler from optimizing away r.\n}\n\n// Benchmark deletion of values from a container.\ntemplate <typename T>\nvoid BM_Delete(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n\n  T container;\n  vector<V> values = GenerateValues<V>(FLAGS_benchmark_values);\n  for (int i = 0; i < values.size(); i++) {\n    container.insert(values[i]);\n  }\n\n  for (int i = 0; i < n; ) {\n    // Remove and re-insert 10% of the keys\n    int m = min(n - i, FLAGS_benchmark_values / 10);\n\n    StartBenchmarkTiming();\n\n    for (int j = i; j < i + m; j++) {\n      int x = j % FLAGS_benchmark_values;\n      container.erase(key_of_value(values[x]));\n    }\n\n    StopBenchmarkTiming();\n\n    for (int j = i; j < i + m; j++) {\n      int x = j % FLAGS_benchmark_values;\n      container.insert(values[x]);\n    }\n\n    i += m;\n  }\n}\n\n// Benchmark steady-state insert (into first half of range) and remove\n// (from second second half of range), treating the container\n// approximately like a queue with log-time access for all elements.\n// This benchmark does not test the case where insertion and removal\n// happen in the same region of the tree.  This benchmark counts two\n// value constructors.\ntemplate <typename T>\nvoid BM_QueueAddRem(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n  assert(FLAGS_benchmark_values % 2 == 0);\n\n  T container;\n\n  const int half = FLAGS_benchmark_values / 2;\n  vector<int> remove_keys(half);\n  vector<int> add_keys(half);\n\n  for (int i = 0; i < half; i++) {\n    remove_keys[i] = i;\n    add_keys[i] = i;\n  }\n\n  RandGen rand(FLAGS_test_random_seed);\n\n  random_shuffle(remove_keys.begin(), remove_keys.end(), rand);\n  random_shuffle(add_keys.begin(), add_keys.end(), rand);\n\n  Generator<V> g(FLAGS_benchmark_values + FLAGS_benchmark_max_iters);\n\n  for (int i = 0; i < half; i++) {\n    container.insert(g(add_keys[i]));\n    container.insert(g(half + remove_keys[i]));\n  }\n\n  // There are three parts each of size \"half\":\n  // 1 is being deleted from  [offset - half, offset)\n  // 2 is standing            [offset, offset + half)\n  // 3 is being inserted into [offset + half, offset + 2 * half)\n  int offset = 0;\n\n  StartBenchmarkTiming();\n\n  for (int i = 0; i < n; i++) {\n    int idx = i % half;\n\n    if (idx == 0) {\n      StopBenchmarkTiming();\n      random_shuffle(remove_keys.begin(), remove_keys.end(), rand);\n      random_shuffle(add_keys.begin(), add_keys.end(), rand);\n      offset += half;\n      StartBenchmarkTiming();\n    }\n\n    int e = container.erase(key_of_value(g(offset - half + remove_keys[idx])));\n    assert(e == 1);\n    container.insert(g(offset + half + add_keys[idx]));\n  }\n\n  StopBenchmarkTiming();\n}\n\n// Mixed insertion and deletion in the same range using pre-constructed values.\ntemplate <typename T>\nvoid BM_MixedAddRem(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n  assert(FLAGS_benchmark_values % 2 == 0);\n\n  T container;\n  RandGen rand(FLAGS_test_random_seed);\n\n  vector<V> values = GenerateValues<V>(FLAGS_benchmark_values * 2);\n\n  // Create two random shuffles\n  vector<int> remove_keys(FLAGS_benchmark_values);\n  vector<int> add_keys(FLAGS_benchmark_values);\n\n  // Insert the first half of the values (already in random order)\n  for (int i = 0; i < FLAGS_benchmark_values; i++) {\n    container.insert(values[i]);\n\n    // remove_keys and add_keys will be swapped before each round,\n    // therefore fill add_keys here w/ the keys being inserted, so\n    // they'll be the first to be removed.\n    remove_keys[i] = i + FLAGS_benchmark_values;\n    add_keys[i] = i;\n  }\n\n  StartBenchmarkTiming();\n\n  for (int i = 0; i < n; i++) {\n    int idx = i % FLAGS_benchmark_values;\n\n    if (idx == 0) {\n      StopBenchmarkTiming();\n      remove_keys.swap(add_keys);\n      random_shuffle(remove_keys.begin(), remove_keys.end(), rand);\n      random_shuffle(add_keys.begin(), add_keys.end(), rand);\n      StartBenchmarkTiming();\n    }\n\n    int e = container.erase(key_of_value(values[remove_keys[idx]]));\n    assert(e == 1);\n    container.insert(values[add_keys[idx]]);\n  }\n\n  StopBenchmarkTiming();\n}\n\n// Insertion at end, removal from the beginning.  This benchmark\n// counts two value constructors.\ntemplate <typename T>\nvoid BM_Fifo(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n\n  T container;\n  Generator<V> g(FLAGS_benchmark_values + FLAGS_benchmark_max_iters);\n\n  for (int i = 0; i < FLAGS_benchmark_values; i++) {\n    container.insert(g(i));\n  }\n\n  StartBenchmarkTiming();\n\n  for (int i = 0; i < n; i++) {\n    container.erase(container.begin());\n    container.insert(container.end(), g(i + FLAGS_benchmark_values));\n  }\n\n  StopBenchmarkTiming();\n}\n\n// Iteration (forward) through the tree\ntemplate <typename T>\nvoid BM_FwdIter(int n) {\n  typedef typename std::remove_const<typename T::value_type>::type V;\n\n  // Disable timing while we perform some initialization.\n  StopBenchmarkTiming();\n\n  T container;\n  vector<V> values = GenerateValues<V>(FLAGS_benchmark_values);\n\n  for (int i = 0; i < FLAGS_benchmark_values; i++) {\n    container.insert(values[i]);\n  }\n\n  typename T::iterator iter;\n\n  V r = V();\n\n  StartBenchmarkTiming();\n\n  for (int i = 0; i < n; i++) {\n    int idx = i % FLAGS_benchmark_values;\n\n    if (idx == 0) {\n      iter = container.begin();\n    }\n    r = *iter;\n    ++iter;\n  }\n\n  StopBenchmarkTiming();\n\n  sink(r); // Keep compiler from optimizing away r.\n}\n\ntypedef set<int32_t> stl_set_int32;\ntypedef set<int64_t> stl_set_int64;\ntypedef set<string> stl_set_string;\n\ntypedef map<int32_t, intptr_t> stl_map_int32;\ntypedef map<int64_t, intptr_t> stl_map_int64;\ntypedef map<string, intptr_t> stl_map_string;\n\ntypedef multiset<int32_t> stl_multiset_int32;\ntypedef multiset<int64_t> stl_multiset_int64;\ntypedef multiset<string> stl_multiset_string;\n\ntypedef multimap<int32_t, intptr_t> stl_multimap_int32;\ntypedef multimap<int64_t, intptr_t> stl_multimap_int64;\ntypedef multimap<string, intptr_t> stl_multimap_string;\n\n#define MY_BENCHMARK_TYPES2(value, name, size)                                \\\n  typedef btree ## _set<value, less<value>, allocator<value>, size>           \\\n    btree ## _ ## size ## _set_ ## name;                                      \\\n  typedef btree ## _map<value, int, less<value>, allocator<value>, size>      \\\n    btree ## _ ## size ## _map_ ## name;                                      \\\n  typedef btree ## _multiset<value, less<value>, allocator<value>, size>      \\\n    btree ## _ ## size ## _multiset_ ## name;                                 \\\n  typedef btree ## _multimap<value, int, less<value>, allocator<value>, size> \\\n    btree ## _ ## size ## _multimap_ ## name\n\n#define MY_BENCHMARK_TYPES(value, name)  \\\n  MY_BENCHMARK_TYPES2(value, name, 128); \\\n  MY_BENCHMARK_TYPES2(value, name, 160); \\\n  MY_BENCHMARK_TYPES2(value, name, 192); \\\n  MY_BENCHMARK_TYPES2(value, name, 224); \\\n  MY_BENCHMARK_TYPES2(value, name, 256); \\\n  MY_BENCHMARK_TYPES2(value, name, 288); \\\n  MY_BENCHMARK_TYPES2(value, name, 320); \\\n  MY_BENCHMARK_TYPES2(value, name, 352); \\\n  MY_BENCHMARK_TYPES2(value, name, 384); \\\n  MY_BENCHMARK_TYPES2(value, name, 416); \\\n  MY_BENCHMARK_TYPES2(value, name, 448); \\\n  MY_BENCHMARK_TYPES2(value, name, 480); \\\n  MY_BENCHMARK_TYPES2(value, name, 512); \\\n  MY_BENCHMARK_TYPES2(value, name, 1024); \\\n  MY_BENCHMARK_TYPES2(value, name, 1536); \\\n  MY_BENCHMARK_TYPES2(value, name, 2048)\n\nMY_BENCHMARK_TYPES(int32_t, int32);\nMY_BENCHMARK_TYPES(int64_t, int64);\nMY_BENCHMARK_TYPES(string, string);\n\n#define MY_BENCHMARK4(type, name, func)                            \\\n  void BM_ ## type ## _ ## name(int n) { BM_ ## func <type>(n); }  \\\n  BTREE_BENCHMARK(BM_ ## type ## _ ## name)\n\n// Define NODESIZE_TESTING when running btree_perf.py.\n\n#ifdef NODESIZE_TESTING\n#define MY_BENCHMARK3(tree, type, name, func) \\\n  MY_BENCHMARK4(tree ## _128_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _160_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _192_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _224_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _256_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _288_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _320_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _352_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _384_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _416_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _448_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _480_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _512_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _1024_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _1536_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _2048_ ## type, name, func)\n#else\n#define MY_BENCHMARK3(tree, type, name, func) \\\n  MY_BENCHMARK4(tree ## _256_ ## type, name, func); \\\n  MY_BENCHMARK4(tree ## _2048_ ## type, name, func)\n#endif\n\n#define MY_BENCHMARK2(type, name, func)    \\\n  MY_BENCHMARK4(stl_ ## type, name, func); \\\n  MY_BENCHMARK3(btree, type, name, func)\n\n#define MY_BENCHMARK(type)                        \\\n  MY_BENCHMARK2(type, insert, Insert);            \\\n  MY_BENCHMARK2(type, lookup, Lookup);            \\\n  MY_BENCHMARK2(type, fulllookup, FullLookup);    \\\n  MY_BENCHMARK2(type, delete, Delete);            \\\n  MY_BENCHMARK2(type, queueaddrem, QueueAddRem);  \\\n  MY_BENCHMARK2(type, mixedaddrem, MixedAddRem);  \\\n  MY_BENCHMARK2(type, fifo, Fifo);                \\\n  MY_BENCHMARK2(type, fwditer, FwdIter)\n\nMY_BENCHMARK(set_int32);\nMY_BENCHMARK(map_int32);\nMY_BENCHMARK(set_int64);\nMY_BENCHMARK(map_int64);\nMY_BENCHMARK(set_string);\nMY_BENCHMARK(map_string);\n\nMY_BENCHMARK(multiset_int32);\nMY_BENCHMARK(multimap_int32);\nMY_BENCHMARK(multiset_int64);\nMY_BENCHMARK(multimap_int64);\nMY_BENCHMARK(multiset_string);\nMY_BENCHMARK(multimap_string);\n\n} // namespace\n} // namespace btree\n\nint main(int argc, char **argv) {\n  btree::RunBenchmarks();\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_container.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef UTIL_BTREE_BTREE_CONTAINER_H__\n#define UTIL_BTREE_BTREE_CONTAINER_H__\n\n#include <iosfwd>\n#include <utility>\n\n#include \"btree.h\"\n\nnamespace btree {\n\n// A common base class for btree_set, btree_map, btree_multiset and\n// btree_multimap.\ntemplate <typename Tree>\nclass btree_container {\n  typedef btree_container<Tree> self_type;\n\n public:\n  typedef typename Tree::params_type params_type;\n  typedef typename Tree::key_type key_type;\n  typedef typename Tree::value_type value_type;\n  typedef typename Tree::key_compare key_compare;\n  typedef typename Tree::allocator_type allocator_type;\n  typedef typename Tree::pointer pointer;\n  typedef typename Tree::const_pointer const_pointer;\n  typedef typename Tree::reference reference;\n  typedef typename Tree::const_reference const_reference;\n  typedef typename Tree::size_type size_type;\n  typedef typename Tree::difference_type difference_type;\n  typedef typename Tree::iterator iterator;\n  typedef typename Tree::const_iterator const_iterator;\n  typedef typename Tree::reverse_iterator reverse_iterator;\n  typedef typename Tree::const_reverse_iterator const_reverse_iterator;\n\n public:\n  // Default constructor.\n  btree_container(const key_compare &comp, const allocator_type &alloc)\n      : tree_(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_container(const self_type &x)\n      : tree_(x.tree_) {\n  }\n\n  // Iterator routines.\n  iterator begin() { return tree_.begin(); }\n  const_iterator begin() const { return tree_.begin(); }\n  iterator end() { return tree_.end(); }\n  const_iterator end() const { return tree_.end(); }\n  reverse_iterator rbegin() { return tree_.rbegin(); }\n  const_reverse_iterator rbegin() const { return tree_.rbegin(); }\n  reverse_iterator rend() { return tree_.rend(); }\n  const_reverse_iterator rend() const { return tree_.rend(); }\n\n  // Lookup routines.\n  iterator lower_bound(const key_type &key) {\n    return tree_.lower_bound(key);\n  }\n  const_iterator lower_bound(const key_type &key) const {\n    return tree_.lower_bound(key);\n  }\n  iterator upper_bound(const key_type &key) {\n    return tree_.upper_bound(key);\n  }\n  const_iterator upper_bound(const key_type &key) const {\n    return tree_.upper_bound(key);\n  }\n  std::pair<iterator,iterator> equal_range(const key_type &key) {\n    return tree_.equal_range(key);\n  }\n  std::pair<const_iterator,const_iterator> equal_range(const key_type &key) const {\n    return tree_.equal_range(key);\n  }\n\n  // Utility routines.\n  void clear() {\n    tree_.clear();\n  }\n  void swap(self_type &x) {\n    tree_.swap(x.tree_);\n  }\n  void dump(std::ostream &os) const {\n    tree_.dump(os);\n  }\n  void verify() const {\n    tree_.verify();\n  }\n\n  // Size routines.\n  size_type size() const { return tree_.size(); }\n  size_type max_size() const { return tree_.max_size(); }\n  bool empty() const { return tree_.empty(); }\n  size_type height() const { return tree_.height(); }\n  size_type internal_nodes() const { return tree_.internal_nodes(); }\n  size_type leaf_nodes() const { return tree_.leaf_nodes(); }\n  size_type nodes() const { return tree_.nodes(); }\n  size_type bytes_used() const { return tree_.bytes_used(); }\n  static double average_bytes_per_value() {\n    return Tree::average_bytes_per_value();\n  }\n  double fullness() const { return tree_.fullness(); }\n  double overhead() const { return tree_.overhead(); }\n\n  bool operator==(const self_type& x) const {\n    if (size() != x.size()) {\n      return false;\n    }\n    for (const_iterator i = begin(), xi = x.begin(); i != end(); ++i, ++xi) {\n      if (*i != *xi) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  bool operator!=(const self_type& other) const {\n    return !operator==(other);\n  }\n\n\n protected:\n  Tree tree_;\n};\n\ntemplate <typename T>\ninline std::ostream& operator<<(std::ostream &os, const btree_container<T> &b) {\n  b.dump(os);\n  return os;\n}\n\n// A common base class for btree_set and safe_btree_set.\ntemplate <typename Tree>\nclass btree_unique_container : public btree_container<Tree> {\n  typedef btree_unique_container<Tree> self_type;\n  typedef btree_container<Tree> super_type;\n\n public:\n  typedef typename Tree::key_type key_type;\n  typedef typename Tree::value_type value_type;\n  typedef typename Tree::size_type size_type;\n  typedef typename Tree::key_compare key_compare;\n  typedef typename Tree::allocator_type allocator_type;\n  typedef typename Tree::iterator iterator;\n  typedef typename Tree::const_iterator const_iterator;\n\n public:\n  // Default constructor.\n  btree_unique_container(const key_compare &comp = key_compare(),\n                         const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_unique_container(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_unique_container(InputIterator b, InputIterator e,\n                         const key_compare &comp = key_compare(),\n                         const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n    insert(b, e);\n  }\n\n  // Lookup routines.\n  iterator find(const key_type &key) {\n    return this->tree_.find_unique(key);\n  }\n  const_iterator find(const key_type &key) const {\n    return this->tree_.find_unique(key);\n  }\n  size_type count(const key_type &key) const {\n    return this->tree_.count_unique(key);\n  }\n\n  // Insertion routines.\n  std::pair<iterator,bool> insert(const value_type &x) {\n    return this->tree_.insert_unique(x);\n  }\n  iterator insert(iterator position, const value_type &x) {\n    return this->tree_.insert_unique(position, x);\n  }\n  template <typename InputIterator>\n  void insert(InputIterator b, InputIterator e) {\n    this->tree_.insert_unique(b, e);\n  }\n\n  // Deletion routines.\n  int erase(const key_type &key) {\n    return this->tree_.erase_unique(key);\n  }\n  // Erase the specified iterator from the btree. The iterator must be valid\n  // (i.e. not equal to end()).  Return an iterator pointing to the node after\n  // the one that was erased (or end() if none exists).\n  iterator erase(const iterator &iter) {\n    return this->tree_.erase(iter);\n  }\n  void erase(const iterator &first, const iterator &last) {\n    this->tree_.erase(first, last);\n  }\n};\n\n// A common base class for btree_map and safe_btree_map.\ntemplate <typename Tree>\nclass btree_map_container : public btree_unique_container<Tree> {\n  typedef btree_map_container<Tree> self_type;\n  typedef btree_unique_container<Tree> super_type;\n\n public:\n  typedef typename Tree::key_type key_type;\n  typedef typename Tree::data_type data_type;\n  typedef typename Tree::value_type value_type;\n  typedef typename Tree::mapped_type mapped_type;\n  typedef typename Tree::key_compare key_compare;\n  typedef typename Tree::allocator_type allocator_type;\n\n private:\n  // A pointer-like object which only generates its value when\n  // dereferenced. Used by operator[] to avoid constructing an empty data_type\n  // if the key already exists in the map.\n  struct generate_value {\n    generate_value(const key_type &k)\n        : key(k) {\n    }\n    value_type operator*() const {\n      return std::make_pair(key, data_type());\n    }\n    const key_type &key;\n  };\n\n public:\n  // Default constructor.\n  btree_map_container(const key_compare &comp = key_compare(),\n                      const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_map_container(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_map_container(InputIterator b, InputIterator e,\n                      const key_compare &comp = key_compare(),\n                      const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n\n  // Insertion routines.\n  data_type& operator[](const key_type &key) {\n    return this->tree_.insert_unique(key, generate_value(key)).first->second;\n  }\n};\n\n// A common base class for btree_multiset and btree_multimap.\ntemplate <typename Tree>\nclass btree_multi_container : public btree_container<Tree> {\n  typedef btree_multi_container<Tree> self_type;\n  typedef btree_container<Tree> super_type;\n\n public:\n  typedef typename Tree::key_type key_type;\n  typedef typename Tree::value_type value_type;\n  typedef typename Tree::size_type size_type;\n  typedef typename Tree::key_compare key_compare;\n  typedef typename Tree::allocator_type allocator_type;\n  typedef typename Tree::iterator iterator;\n  typedef typename Tree::const_iterator const_iterator;\n\n public:\n  // Default constructor.\n  btree_multi_container(const key_compare &comp = key_compare(),\n                        const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_multi_container(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_multi_container(InputIterator b, InputIterator e,\n                        const key_compare &comp = key_compare(),\n                        const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n    insert(b, e);\n  }\n\n  // Lookup routines.\n  iterator find(const key_type &key) {\n    return this->tree_.find_multi(key);\n  }\n  const_iterator find(const key_type &key) const {\n    return this->tree_.find_multi(key);\n  }\n  size_type count(const key_type &key) const {\n    return this->tree_.count_multi(key);\n  }\n\n  // Insertion routines.\n  iterator insert(const value_type &x) {\n    return this->tree_.insert_multi(x);\n  }\n  iterator insert(iterator position, const value_type &x) {\n    return this->tree_.insert_multi(position, x);\n  }\n  template <typename InputIterator>\n  void insert(InputIterator b, InputIterator e) {\n    this->tree_.insert_multi(b, e);\n  }\n\n  // Deletion routines.\n  int erase(const key_type &key) {\n    return this->tree_.erase_multi(key);\n  }\n  // Erase the specified iterator from the btree. The iterator must be valid\n  // (i.e. not equal to end()).  Return an iterator pointing to the node after\n  // the one that was erased (or end() if none exists).\n  iterator erase(const iterator &iter) {\n    return this->tree_.erase(iter);\n  }\n  void erase(const iterator &first, const iterator &last) {\n    this->tree_.erase(first, last);\n  }\n};\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_BTREE_CONTAINER_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_map.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// A btree_map<> implements the STL unique sorted associative container\n// interface and the pair associative container interface (a.k.a map<>) using a\n// btree. A btree_multimap<> implements the STL multiple sorted associative\n// container interface and the pair associtive container interface (a.k.a\n// multimap<>) using a btree. See btree.h for details of the btree\n// implementation and caveats.\n\n#ifndef UTIL_BTREE_BTREE_MAP_H__\n#define UTIL_BTREE_BTREE_MAP_H__\n\n#include <algorithm>\n#include <functional>\n#include <memory>\n#include <string>\n#include <utility>\n\n#include \"btree.h\"\n#include \"btree_container.h\"\n\nnamespace btree {\n\n// The btree_map class is needed mainly for its constructors.\ntemplate <typename Key, typename Value,\n          typename Compare = std::less<Key>,\n          typename Alloc = std::allocator<std::pair<const Key, Value> >,\n          int TargetNodeSize = 256>\nclass btree_map : public btree_map_container<\n  btree<btree_map_params<Key, Value, Compare, Alloc, TargetNodeSize> > > {\n\n  typedef btree_map<Key, Value, Compare, Alloc, TargetNodeSize> self_type;\n  typedef btree_map_params<\n    Key, Value, Compare, Alloc, TargetNodeSize> params_type;\n  typedef btree<params_type> btree_type;\n  typedef btree_map_container<btree_type> super_type;\n\n public:\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n\n public:\n  // Default constructor.\n  btree_map(const key_compare &comp = key_compare(),\n            const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_map(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_map(InputIterator b, InputIterator e,\n            const key_compare &comp = key_compare(),\n            const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n};\n\ntemplate <typename K, typename V, typename C, typename A, int N>\ninline void swap(btree_map<K, V, C, A, N> &x,\n                 btree_map<K, V, C, A, N> &y) {\n  x.swap(y);\n}\n\n// The btree_multimap class is needed mainly for its constructors.\ntemplate <typename Key, typename Value,\n          typename Compare = std::less<Key>,\n          typename Alloc = std::allocator<std::pair<const Key, Value> >,\n          int TargetNodeSize = 256>\nclass btree_multimap : public btree_multi_container<\n  btree<btree_map_params<Key, Value, Compare, Alloc, TargetNodeSize> > > {\n\n  typedef btree_multimap<Key, Value, Compare, Alloc, TargetNodeSize> self_type;\n  typedef btree_map_params<\n    Key, Value, Compare, Alloc, TargetNodeSize> params_type;\n  typedef btree<params_type> btree_type;\n  typedef btree_multi_container<btree_type> super_type;\n\n public:\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n  typedef typename btree_type::data_type data_type;\n  typedef typename btree_type::mapped_type mapped_type;\n\n public:\n  // Default constructor.\n  btree_multimap(const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_multimap(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_multimap(InputIterator b, InputIterator e,\n                 const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n};\n\ntemplate <typename K, typename V, typename C, typename A, int N>\ninline void swap(btree_multimap<K, V, C, A, N> &x,\n                 btree_multimap<K, V, C, A, N> &y) {\n  x.swap(y);\n}\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_BTREE_MAP_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_set.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// A btree_set<> implements the STL unique sorted associative container\n// interface (a.k.a set<>) using a btree. A btree_multiset<> implements the STL\n// multiple sorted associative container interface (a.k.a multiset<>) using a\n// btree. See btree.h for details of the btree implementation and caveats.\n\n#ifndef UTIL_BTREE_BTREE_SET_H__\n#define UTIL_BTREE_BTREE_SET_H__\n\n#include <functional>\n#include <memory>\n#include <string>\n\n#include \"btree.h\"\n#include \"btree_container.h\"\n\nnamespace btree {\n\n// The btree_set class is needed mainly for its constructors.\ntemplate <typename Key,\n          typename Compare = std::less<Key>,\n          typename Alloc = std::allocator<Key>,\n          int TargetNodeSize = 256>\nclass btree_set : public btree_unique_container<\n  btree<btree_set_params<Key, Compare, Alloc, TargetNodeSize> > > {\n\n  typedef btree_set<Key, Compare, Alloc, TargetNodeSize> self_type;\n  typedef btree_set_params<Key, Compare, Alloc, TargetNodeSize> params_type;\n  typedef btree<params_type> btree_type;\n  typedef btree_unique_container<btree_type> super_type;\n\n public:\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n\n public:\n  // Default constructor.\n  btree_set(const key_compare &comp = key_compare(),\n            const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_set(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_set(InputIterator b, InputIterator e,\n            const key_compare &comp = key_compare(),\n            const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n};\n\ntemplate <typename K, typename C, typename A, int N>\ninline void swap(btree_set<K, C, A, N> &x, btree_set<K, C, A, N> &y) {\n  x.swap(y);\n}\n\n// The btree_multiset class is needed mainly for its constructors.\ntemplate <typename Key,\n          typename Compare = std::less<Key>,\n          typename Alloc = std::allocator<Key>,\n          int TargetNodeSize = 256>\nclass btree_multiset : public btree_multi_container<\n  btree<btree_set_params<Key, Compare, Alloc, TargetNodeSize> > > {\n\n  typedef btree_multiset<Key, Compare, Alloc, TargetNodeSize> self_type;\n  typedef btree_set_params<Key, Compare, Alloc, TargetNodeSize> params_type;\n  typedef btree<params_type> btree_type;\n  typedef btree_multi_container<btree_type> super_type;\n\n public:\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n\n public:\n  // Default constructor.\n  btree_multiset(const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  btree_multiset(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  btree_multiset(InputIterator b, InputIterator e,\n                 const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n};\n\ntemplate <typename K, typename C, typename A, int N>\ninline void swap(btree_multiset<K, C, A, N> &x,\n                 btree_multiset<K, C, A, N> &y) {\n  x.swap(y);\n}\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_BTREE_SET_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_test.cc",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include \"gtest/gtest.h\"\n#include \"btree_map.h\"\n#include \"btree_set.h\"\n#include \"btree_test.h\"\n\nnamespace btree {\nnamespace {\n\ntemplate <typename K, int N>\nvoid SetTest() {\n  typedef TestAllocator<K> TestAlloc;\n  ASSERT_EQ(sizeof(btree_set<K>), sizeof(void*));\n  BtreeTest<btree_set<K, std::less<K>, std::allocator<K>, N>, std::set<K> >();\n  BtreeAllocatorTest<btree_set<K, std::less<K>, TestAlloc, N> >();\n}\n\ntemplate <typename K, int N>\nvoid MapTest() {\n  typedef TestAllocator<K> TestAlloc;\n  ASSERT_EQ(sizeof(btree_map<K, K>), sizeof(void*));\n  BtreeTest<btree_map<K, K, std::less<K>, std::allocator<K>, N>, std::map<K, K> >();\n  BtreeAllocatorTest<btree_map<K, K, std::less<K>, TestAlloc, N> >();\n  BtreeMapTest<btree_map<K, K, std::less<K>, std::allocator<K>, N> >();\n}\n\nTEST(Btree, set_int32_32)   { SetTest<int32_t, 32>(); }\nTEST(Btree, set_int32_64)   { SetTest<int32_t, 64>(); }\nTEST(Btree, set_int32_128)  { SetTest<int32_t, 128>(); }\nTEST(Btree, set_int32_256)  { SetTest<int32_t, 256>(); }\nTEST(Btree, set_int64_256)  { SetTest<int64_t, 256>(); }\nTEST(Btree, set_string_256) { SetTest<std::string, 256>(); }\nTEST(Btree, set_pair_256)   { SetTest<std::pair<int, int>, 256>(); }\nTEST(Btree, map_int32_256)  { MapTest<int32_t, 256>(); }\nTEST(Btree, map_int64_256)  { MapTest<int64_t, 256>(); }\nTEST(Btree, map_string_256) { MapTest<std::string, 256>(); }\nTEST(Btree, map_pair_256)   { MapTest<std::pair<int, int>, 256>(); }\n\n// Large-node tests\nTEST(Btree, map_int32_1024)   { MapTest<int32_t, 1024>(); }\nTEST(Btree, map_int32_1032)   { MapTest<int32_t, 1032>(); }\nTEST(Btree, map_int32_1040)   { MapTest<int32_t, 1040>(); }\nTEST(Btree, map_int32_1048)   { MapTest<int32_t, 1048>(); }\nTEST(Btree, map_int32_1056)   { MapTest<int32_t, 1056>(); }\n\nTEST(Btree, map_int32_2048)   { MapTest<int32_t, 2048>(); }\nTEST(Btree, map_int32_4096)   { MapTest<int32_t, 4096>(); }\nTEST(Btree, set_int32_1024)   { SetTest<int32_t, 1024>(); }\nTEST(Btree, set_int32_2048)   { SetTest<int32_t, 2048>(); }\nTEST(Btree, set_int32_4096)   { SetTest<int32_t, 4096>(); }\nTEST(Btree, map_string_1024)   { MapTest<std::string, 1024>(); }\nTEST(Btree, map_string_2048)   { MapTest<std::string, 2048>(); }\nTEST(Btree, map_string_4096)   { MapTest<std::string, 4096>(); }\nTEST(Btree, set_string_1024)   { SetTest<std::string, 1024>(); }\nTEST(Btree, set_string_2048)   { SetTest<std::string, 2048>(); }\nTEST(Btree, set_string_4096)   { SetTest<std::string, 4096>(); }\n\ntemplate <typename K, int N>\nvoid MultiSetTest() {\n  typedef TestAllocator<K> TestAlloc;\n  ASSERT_EQ(sizeof(btree_multiset<K>), sizeof(void*));\n  BtreeMultiTest<btree_multiset<K, std::less<K>, std::allocator<K>, N>,\n      std::multiset<K> >();\n  BtreeAllocatorTest<btree_multiset<K, std::less<K>, TestAlloc, N> >();\n}\n\ntemplate <typename K, int N>\nvoid MultiMapTest() {\n  typedef TestAllocator<K> TestAlloc;\n  ASSERT_EQ(sizeof(btree_multimap<K, K>), sizeof(void*));\n  BtreeMultiTest<btree_multimap<K, K, std::less<K>, std::allocator<K>, N>,\n      std::multimap<K, K> >();\n  BtreeMultiMapTest<btree_multimap<K, K, std::less<K>, std::allocator<K>, N> >();\n  BtreeAllocatorTest<btree_multimap<K, K, std::less<K>, TestAlloc, N> >();\n}\n\nTEST(Btree, multiset_int32_256)  { MultiSetTest<int32_t, 256>(); }\nTEST(Btree, multiset_int64_256)  { MultiSetTest<int64_t, 256>(); }\nTEST(Btree, multiset_string_256) { MultiSetTest<std::string, 256>(); }\nTEST(Btree, multiset_pair_256)   { MultiSetTest<std::pair<int, int>, 256>(); }\nTEST(Btree, multimap_int32_256)  { MultiMapTest<int32_t, 256>(); }\nTEST(Btree, multimap_int64_256)  { MultiMapTest<int64_t, 256>(); }\nTEST(Btree, multimap_string_256) { MultiMapTest<std::string, 256>(); }\nTEST(Btree, multimap_pair_256)   { MultiMapTest<std::pair<int, int>, 256>(); }\n\n// Large-node tests\nTEST(Btree, multimap_int32_1024)   { MultiMapTest<int32_t, 1024>(); }\nTEST(Btree, multimap_int32_2048)   { MultiMapTest<int32_t, 2048>(); }\nTEST(Btree, multimap_int32_4096)   { MultiMapTest<int32_t, 4096>(); }\nTEST(Btree, multiset_int32_1024)   { MultiSetTest<int32_t, 1024>(); }\nTEST(Btree, multiset_int32_2048)   { MultiSetTest<int32_t, 2048>(); }\nTEST(Btree, multiset_int32_4096)   { MultiSetTest<int32_t, 4096>(); }\nTEST(Btree, multimap_string_1024)   { MultiMapTest<std::string, 1024>(); }\nTEST(Btree, multimap_string_2048)   { MultiMapTest<std::string, 2048>(); }\nTEST(Btree, multimap_string_4096)   { MultiMapTest<std::string, 4096>(); }\nTEST(Btree, multiset_string_1024)   { MultiSetTest<std::string, 1024>(); }\nTEST(Btree, multiset_string_2048)   { MultiSetTest<std::string, 2048>(); }\nTEST(Btree, multiset_string_4096)   { MultiSetTest<std::string, 4096>(); }\n\n// Verify that swapping btrees swaps the key comparision functors.\nstruct SubstringLess {\n  SubstringLess() : n(2) {}\n  SubstringLess(size_t length)\n      : n(length) {\n  }\n  bool operator()(const std::string &a, const std::string &b) const {\n    std::string as(a.data(), std::min(n, a.size()));\n    std::string bs(b.data(), std::min(n, b.size()));\n    return as < bs;\n  }\n  size_t n;\n};\n\nTEST(Btree, SwapKeyCompare) {\n  typedef btree_set<std::string, SubstringLess> SubstringSet;\n  SubstringSet s1(SubstringLess(1), SubstringSet::allocator_type());\n  SubstringSet s2(SubstringLess(2), SubstringSet::allocator_type());\n\n  ASSERT_TRUE(s1.insert(\"a\").second);\n  ASSERT_FALSE(s1.insert(\"aa\").second);\n\n  ASSERT_TRUE(s2.insert(\"a\").second);\n  ASSERT_TRUE(s2.insert(\"aa\").second);\n  ASSERT_FALSE(s2.insert(\"aaa\").second);\n\n  swap(s1, s2);\n\n  ASSERT_TRUE(s1.insert(\"b\").second);\n  ASSERT_TRUE(s1.insert(\"bb\").second);\n  ASSERT_FALSE(s1.insert(\"bbb\").second);\n\n  ASSERT_TRUE(s2.insert(\"b\").second);\n  ASSERT_FALSE(s2.insert(\"bb\").second);\n}\n\nTEST(Btree, UpperBoundRegression) {\n  // Regress a bug where upper_bound would default-construct a new key_compare\n  // instead of copying the existing one.\n  typedef btree_set<std::string, SubstringLess> SubstringSet;\n  SubstringSet my_set(SubstringLess(3));\n  my_set.insert(\"aab\");\n  my_set.insert(\"abb\");\n  // We call upper_bound(\"aaa\").  If this correctly uses the length 3\n  // comparator, aaa < aab < abb, so we should get aab as the result.\n  // If it instead uses the default-constructed length 2 comparator,\n  // aa == aa < ab, so we'll get abb as our result.\n  SubstringSet::iterator it = my_set.upper_bound(\"aaa\");\n  ASSERT_TRUE(it != my_set.end());\n  EXPECT_EQ(\"aab\", *it);\n}\n\n\nTEST(Btree, IteratorIncrementBy) {\n  // Test that increment_by returns the same position as increment.\n  const int kSetSize = 2341;\n  btree_set<int32_t> my_set;\n  for (int i = 0; i < kSetSize; ++i) {\n    my_set.insert(i);\n  }\n\n  {\n    // Simple increment vs. increment by.\n    btree_set<int32_t>::iterator a = my_set.begin();\n    btree_set<int32_t>::iterator b = my_set.begin();\n    a.increment();\n    b.increment_by(1);\n    EXPECT_EQ(*a, *b);\n  }\n\n  btree_set<int32_t>::iterator a = my_set.begin();\n  for (int i = 1; i < kSetSize; ++i) {\n    ++a;\n    // increment_by\n    btree_set<int32_t>::iterator b = my_set.begin();\n    b.increment_by(i);\n    EXPECT_EQ(*a, *b) << \": i=\" << i;\n  }\n}\n\nTEST(Btree, Comparison) {\n  const int kSetSize = 1201;\n  btree_set<int64_t> my_set;\n  for (int i = 0; i < kSetSize; ++i) {\n    my_set.insert(i);\n  }\n  btree_set<int64_t> my_set_copy(my_set);\n  EXPECT_TRUE(my_set_copy == my_set);\n  EXPECT_TRUE(my_set == my_set_copy);\n  EXPECT_FALSE(my_set_copy != my_set);\n  EXPECT_FALSE(my_set != my_set_copy);\n\n  my_set.insert(kSetSize);\n  EXPECT_FALSE(my_set_copy == my_set);\n  EXPECT_FALSE(my_set == my_set_copy);\n  EXPECT_TRUE(my_set_copy != my_set);\n  EXPECT_TRUE(my_set != my_set_copy);\n\n  my_set.erase(kSetSize - 1);\n  EXPECT_FALSE(my_set_copy == my_set);\n  EXPECT_FALSE(my_set == my_set_copy);\n  EXPECT_TRUE(my_set_copy != my_set);\n  EXPECT_TRUE(my_set != my_set_copy);\n\n  btree_map<std::string, int64_t> my_map;\n  for (int i = 0; i < kSetSize; ++i) {\n    my_map[std::string(i, 'a')] = i;\n  }\n  btree_map<std::string, int64_t> my_map_copy(my_map);\n  EXPECT_TRUE(my_map_copy == my_map);\n  EXPECT_TRUE(my_map == my_map_copy);\n  EXPECT_FALSE(my_map_copy != my_map);\n  EXPECT_FALSE(my_map != my_map_copy);\n\n  ++my_map_copy[std::string(7, 'a')];\n  EXPECT_FALSE(my_map_copy == my_map);\n  EXPECT_FALSE(my_map == my_map_copy);\n  EXPECT_TRUE(my_map_copy != my_map);\n  EXPECT_TRUE(my_map != my_map_copy);\n\n  my_map_copy = my_map;\n  my_map[\"hello\"] = kSetSize;\n  EXPECT_FALSE(my_map_copy == my_map);\n  EXPECT_FALSE(my_map == my_map_copy);\n  EXPECT_TRUE(my_map_copy != my_map);\n  EXPECT_TRUE(my_map != my_map_copy);\n\n  my_map.erase(std::string(kSetSize - 1, 'a'));\n  EXPECT_FALSE(my_map_copy == my_map);\n  EXPECT_FALSE(my_map == my_map_copy);\n  EXPECT_TRUE(my_map_copy != my_map);\n  EXPECT_TRUE(my_map != my_map_copy);\n}\n\nTEST(Btree, RangeCtorSanity) {\n  typedef btree_set<int, std::less<int>, std::allocator<int>, 256> test_set;\n  typedef btree_map<int, int, std::less<int>, std::allocator<int>, 256> \n      test_map;\n  typedef btree_multiset<int, std::less<int>, std::allocator<int>, 256> \n      test_mset;\n  typedef btree_multimap<int, int, std::less<int>, std::allocator<int>, 256> \n      test_mmap;\n  std::vector<int> ivec;\n  ivec.push_back(1);\n  std::map<int, int> imap;\n  imap.insert(std::make_pair(1, 2));\n  test_mset tmset(ivec.begin(), ivec.end());\n  test_mmap tmmap(imap.begin(), imap.end());\n  test_set tset(ivec.begin(), ivec.end());\n  test_map tmap(imap.begin(), imap.end());\n  EXPECT_EQ(1, tmset.size());\n  EXPECT_EQ(1, tmmap.size());\n  EXPECT_EQ(1, tset.size());\n  EXPECT_EQ(1, tmap.size());\n}\n\n} // namespace\n} // namespace btree\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_test.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef UTIL_BTREE_BTREE_TEST_H__\n#define UTIL_BTREE_BTREE_TEST_H__\n\n#include <stdio.h>\n#include <algorithm>\n#include <functional>\n#include <type_traits>\n#include <iosfwd>\n#include <map>\n#include <set>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"gtest/gtest.h\"\n#include \"gflags/gflags.h\"\n#include \"btree_container.h\"\n\nDECLARE_int32(test_values);\nDECLARE_int32(benchmark_values);\n\nnamespace std {\n\n// Provide operator<< support for std::pair<T, U>.\ntemplate <typename T, typename U>\nostream& operator<<(ostream &os, const std::pair<T, U> &p) {\n  os << \"(\" << p.first << \",\" << p.second << \")\";\n  return os;\n}\n\n// Provide pair equality testing that works as long as x.first is comparable to\n// y.first and x.second is comparable to y.second. Needed in the test for\n// comparing std::pair<T, U> to std::pair<const T, U>.\ntemplate <typename T, typename U, typename V, typename W>\nbool operator==(const std::pair<T, U> &x, const std::pair<V, W> &y) {\n  return x.first == y.first && x.second == y.second;\n}\n\n// Partial specialization of remove_const that propagates the removal through\n// std::pair.\ntemplate <typename T, typename U>\nstruct remove_const<pair<T, U> > {\n  typedef pair<typename remove_const<T>::type,\n               typename remove_const<U>::type> type;\n};\n\n} // namespace std\n\nnamespace btree {\n\n// Select the first member of a pair.\ntemplate <class _Pair>\nstruct select1st : public std::unary_function<_Pair, typename _Pair::first_type> {\n  const typename _Pair::first_type& operator()(const _Pair& __x) const {\n    return __x.first;\n  }\n};\n\n// Utility class to provide an accessor for a key given a value. The default\n// behavior is to treat the value as a pair and return the first element.\ntemplate <typename K, typename V>\nstruct KeyOfValue {\n  typedef select1st<V> type;\n};\n\ntemplate <typename T>\nstruct identity {\n  inline const T& operator()(const T& t) const { return t; }\n};\n\n// Partial specialization of KeyOfValue class for when the key and value are\n// the same type such as in set<> and btree_set<>.\ntemplate <typename K>\nstruct KeyOfValue<K, K> {\n  typedef identity<K> type;\n};\n\n// Counts the number of occurances of \"c\" in a buffer.\ninline ptrdiff_t strcount(const char* buf_begin, const char* buf_end, char c) {\n  if (buf_begin == NULL)\n    return 0;\n  if (buf_end <= buf_begin)\n    return 0;\n  ptrdiff_t num = 0;\n  for (const char* bp = buf_begin; bp != buf_end; bp++) {\n    if (*bp == c)\n      num++;\n  }\n  return num;\n}\n\n// for when the string is not null-terminated.\ninline ptrdiff_t strcount(const char* buf, size_t len, char c) {\n  return strcount(buf, buf + len, c);\n}\n\ninline ptrdiff_t strcount(const std::string& buf, char c) {\n  return strcount(buf.c_str(), buf.size(), c);\n}\n\n// The base class for a sorted associative container checker. TreeType is the\n// container type to check and CheckerType is the container type to check\n// against. TreeType is expected to be btree_{set,map,multiset,multimap} and\n// CheckerType is expected to be {set,map,multiset,multimap}.\ntemplate <typename TreeType, typename CheckerType>\nclass base_checker {\n  typedef base_checker<TreeType, CheckerType> self_type;\n\n public:\n  typedef typename TreeType::key_type key_type;\n  typedef typename TreeType::value_type value_type;\n  typedef typename TreeType::key_compare key_compare;\n  typedef typename TreeType::pointer pointer;\n  typedef typename TreeType::const_pointer const_pointer;\n  typedef typename TreeType::reference reference;\n  typedef typename TreeType::const_reference const_reference;\n  typedef typename TreeType::size_type size_type;\n  typedef typename TreeType::difference_type difference_type;\n  typedef typename TreeType::iterator iterator;\n  typedef typename TreeType::const_iterator const_iterator;\n  typedef typename TreeType::reverse_iterator reverse_iterator;\n  typedef typename TreeType::const_reverse_iterator const_reverse_iterator;\n\n public:\n  // Default constructor.\n  base_checker()\n      : const_tree_(tree_) {\n  }\n  // Copy constructor.\n  base_checker(const self_type &x)\n      : tree_(x.tree_),\n        const_tree_(tree_),\n        checker_(x.checker_) {\n  }\n  // Range constructor.\n  template <typename InputIterator>\n  base_checker(InputIterator b, InputIterator e)\n      : tree_(b, e),\n        const_tree_(tree_),\n        checker_(b, e) {\n  }\n\n  // Iterator routines.\n  iterator begin() { return tree_.begin(); }\n  const_iterator begin() const { return tree_.begin(); }\n  iterator end() { return tree_.end(); }\n  const_iterator end() const { return tree_.end(); }\n  reverse_iterator rbegin() { return tree_.rbegin(); }\n  const_reverse_iterator rbegin() const { return tree_.rbegin(); }\n  reverse_iterator rend() { return tree_.rend(); }\n  const_reverse_iterator rend() const { return tree_.rend(); }\n\n  // Helper routines.\n  template <typename IterType, typename CheckerIterType>\n  IterType iter_check(\n      IterType tree_iter, CheckerIterType checker_iter) const {\n    if (tree_iter == tree_.end()) {\n      EXPECT_EQ(checker_iter, checker_.end());\n    } else {\n      EXPECT_EQ(*tree_iter, *checker_iter);\n    }\n    return tree_iter;\n  }\n  template <typename IterType, typename CheckerIterType>\n  IterType riter_check(\n      IterType tree_iter, CheckerIterType checker_iter) const {\n    if (tree_iter == tree_.rend()) {\n      EXPECT_EQ(checker_iter, checker_.rend());\n    } else {\n      EXPECT_EQ(*tree_iter, *checker_iter);\n    }\n    return tree_iter;\n  }\n  void value_check(const value_type &x) {\n    typename KeyOfValue<typename TreeType::key_type,\n        typename TreeType::value_type>::type key_of_value;\n    const key_type &key = key_of_value(x);\n    EXPECT_EQ(*find(key), x);\n    lower_bound(key);\n    upper_bound(key);\n    equal_range(key);\n    count(key);\n  }\n  void erase_check(const key_type &key) {\n    EXPECT_TRUE(tree_.find(key) == const_tree_.end());\n    EXPECT_TRUE(const_tree_.find(key) == tree_.end());\n    EXPECT_TRUE(tree_.equal_range(key).first ==\n                const_tree_.equal_range(key).second);\n  }\n\n  // Lookup routines.\n  iterator lower_bound(const key_type &key) {\n    return iter_check(tree_.lower_bound(key), checker_.lower_bound(key));\n  }\n  const_iterator lower_bound(const key_type &key) const {\n    return iter_check(tree_.lower_bound(key), checker_.lower_bound(key));\n  }\n  iterator upper_bound(const key_type &key) {\n    return iter_check(tree_.upper_bound(key), checker_.upper_bound(key));\n  }\n  const_iterator upper_bound(const key_type &key) const {\n    return iter_check(tree_.upper_bound(key), checker_.upper_bound(key));\n  }\n  std::pair<iterator,iterator> equal_range(const key_type &key) {\n    std::pair<typename CheckerType::iterator,\n        typename CheckerType::iterator> checker_res =\n        checker_.equal_range(key);\n    std::pair<iterator, iterator> tree_res = tree_.equal_range(key);\n    iter_check(tree_res.first, checker_res.first);\n    iter_check(tree_res.second, checker_res.second);\n    return tree_res;\n  }\n  std::pair<const_iterator,const_iterator> equal_range(const key_type &key) const {\n    std::pair<typename CheckerType::const_iterator,\n        typename CheckerType::const_iterator> checker_res =\n        checker_.equal_range(key);\n    std::pair<const_iterator, const_iterator> tree_res = tree_.equal_range(key);\n    iter_check(tree_res.first, checker_res.first);\n    iter_check(tree_res.second, checker_res.second);\n    return tree_res;\n  }\n  iterator find(const key_type &key) {\n    return iter_check(tree_.find(key), checker_.find(key));\n  }\n  const_iterator find(const key_type &key) const {\n    return iter_check(tree_.find(key), checker_.find(key));\n  }\n  size_type count(const key_type &key) const {\n    size_type res = checker_.count(key);\n    EXPECT_EQ(res, tree_.count(key));\n    return res;\n  }\n\n  // Assignment operator.\n  self_type& operator=(const self_type &x) {\n    tree_ = x.tree_;\n    checker_ = x.checker_;\n    return *this;\n  }\n\n  // Deletion routines.\n  int erase(const key_type &key) {\n    int size = tree_.size();\n    int res = checker_.erase(key);\n    EXPECT_EQ(res, tree_.count(key));\n    EXPECT_EQ(res, tree_.erase(key));\n    EXPECT_EQ(tree_.count(key), 0);\n    EXPECT_EQ(tree_.size(), size - res);\n    erase_check(key);\n    return res;\n  }\n  iterator erase(iterator iter) {\n    key_type key = iter.key();\n    int size = tree_.size();\n    int count = tree_.count(key);\n    typename CheckerType::iterator checker_iter = checker_.find(key);\n    for (iterator tmp(tree_.find(key)); tmp != iter; ++tmp) {\n      ++checker_iter;\n    }\n    typename CheckerType::iterator checker_next = checker_iter;\n    ++checker_next;\n    checker_.erase(checker_iter);\n    iter = tree_.erase(iter);\n    EXPECT_EQ(tree_.size(), checker_.size());\n    EXPECT_EQ(tree_.size(), size - 1);\n    EXPECT_EQ(tree_.count(key), count - 1);\n    if (count == 1) {\n      erase_check(key);\n    }\n    return iter_check(iter, checker_next);\n  }\n\n  void erase(iterator begin, iterator end) {\n    int size = tree_.size();\n    int count = distance(begin, end);\n    typename CheckerType::iterator checker_begin = checker_.find(begin.key());\n    for (iterator tmp(tree_.find(begin.key())); tmp != begin; ++tmp) {\n      ++checker_begin;\n    }\n    typename CheckerType::iterator checker_end =\n        end == tree_.end() ? checker_.end() : checker_.find(end.key());\n    if (end != tree_.end()) {\n      for (iterator tmp(tree_.find(end.key())); tmp != end; ++tmp) {\n        ++checker_end;\n      }\n    }\n    checker_.erase(checker_begin, checker_end);\n    tree_.erase(begin, end);\n    EXPECT_EQ(tree_.size(), checker_.size());\n    EXPECT_EQ(tree_.size(), size - count);\n  }\n\n  // Utility routines.\n  void clear() {\n    tree_.clear();\n    checker_.clear();\n  }\n  void swap(self_type &x) {\n    tree_.swap(x.tree_);\n    checker_.swap(x.checker_);\n  }\n\n  void verify() const {\n    tree_.verify();\n    EXPECT_EQ(tree_.size(), checker_.size());\n\n    // Move through the forward iterators using increment.\n    typename CheckerType::const_iterator\n        checker_iter(checker_.begin());\n    const_iterator tree_iter(tree_.begin());\n    for (; tree_iter != tree_.end();\n         ++tree_iter, ++checker_iter) {\n      EXPECT_EQ(*tree_iter, *checker_iter);\n    }\n\n    // Move through the forward iterators using decrement.\n    for (int n = tree_.size() - 1; n >= 0; --n) {\n      iter_check(tree_iter, checker_iter);\n      --tree_iter;\n      --checker_iter;\n    }\n    EXPECT_TRUE(tree_iter == tree_.begin());\n    EXPECT_TRUE(checker_iter == checker_.begin());\n\n    // Move through the reverse iterators using increment.\n    typename CheckerType::const_reverse_iterator\n        checker_riter(checker_.rbegin());\n    const_reverse_iterator tree_riter(tree_.rbegin());\n    for (; tree_riter != tree_.rend();\n         ++tree_riter, ++checker_riter) {\n      EXPECT_EQ(*tree_riter, *checker_riter);\n    }\n\n    // Move through the reverse iterators using decrement.\n    for (int n = tree_.size() - 1; n >= 0; --n) {\n      riter_check(tree_riter, checker_riter);\n      --tree_riter;\n      --checker_riter;\n    }\n    EXPECT_EQ(tree_riter, tree_.rbegin());\n    EXPECT_EQ(checker_riter, checker_.rbegin());\n  }\n\n  // Access to the underlying btree.\n  const TreeType& tree() const { return tree_; }\n\n  // Size routines.\n  size_type size() const {\n    EXPECT_EQ(tree_.size(), checker_.size());\n    return tree_.size();\n  }\n  size_type max_size() const { return tree_.max_size(); }\n  bool empty() const {\n    EXPECT_EQ(tree_.empty(), checker_.empty());\n    return tree_.empty();\n  }\n  size_type height() const { return tree_.height(); }\n  size_type internal_nodes() const { return tree_.internal_nodes(); }\n  size_type leaf_nodes() const { return tree_.leaf_nodes(); }\n  size_type nodes() const { return tree_.nodes(); }\n  size_type bytes_used() const { return tree_.bytes_used(); }\n  double fullness() const { return tree_.fullness(); }\n  double overhead() const { return tree_.overhead(); }\n\n protected:\n  TreeType tree_;\n  const TreeType &const_tree_;\n  CheckerType checker_;\n};\n\n// A checker for unique sorted associative containers. TreeType is expected to\n// be btree_{set,map} and CheckerType is expected to be {set,map}.\ntemplate <typename TreeType, typename CheckerType>\nclass unique_checker : public base_checker<TreeType, CheckerType> {\n  typedef base_checker<TreeType, CheckerType> super_type;\n  typedef unique_checker<TreeType, CheckerType> self_type;\n\n public:\n  typedef typename super_type::iterator iterator;\n  typedef typename super_type::value_type value_type;\n\n public:\n  // Default constructor.\n  unique_checker()\n      : super_type() {\n  }\n  // Copy constructor.\n  unique_checker(const self_type &x)\n      : super_type(x) {\n  }\n  // Range constructor.\n  template <class InputIterator>\n  unique_checker(InputIterator b, InputIterator e)\n      : super_type(b, e) {\n  }\n\n  // Insertion routines.\n  std::pair<iterator,bool> insert(const value_type &x) {\n    int size = this->tree_.size();\n    std::pair<typename CheckerType::iterator,bool> checker_res =\n        this->checker_.insert(x);\n    std::pair<iterator,bool> tree_res = this->tree_.insert(x);\n    EXPECT_EQ(*tree_res.first, *checker_res.first);\n    EXPECT_EQ(tree_res.second, checker_res.second);\n    EXPECT_EQ(this->tree_.size(), this->checker_.size());\n    EXPECT_EQ(this->tree_.size(), size + tree_res.second);\n    return tree_res;\n  }\n  iterator insert(iterator position, const value_type &x) {\n    int size = this->tree_.size();\n    std::pair<typename CheckerType::iterator,bool> checker_res =\n        this->checker_.insert(x);\n    iterator tree_res = this->tree_.insert(position, x);\n    EXPECT_EQ(*tree_res, *checker_res.first);\n    EXPECT_EQ(this->tree_.size(), this->checker_.size());\n    EXPECT_EQ(this->tree_.size(), size + checker_res.second);\n    return tree_res;\n  }\n  template <typename InputIterator>\n  void insert(InputIterator b, InputIterator e) {\n    for (; b != e; ++b) {\n      insert(*b);\n    }\n  }\n};\n\n// A checker for multiple sorted associative containers. TreeType is expected\n// to be btree_{multiset,multimap} and CheckerType is expected to be\n// {multiset,multimap}.\ntemplate <typename TreeType, typename CheckerType>\nclass multi_checker : public base_checker<TreeType, CheckerType> {\n  typedef base_checker<TreeType, CheckerType> super_type;\n  typedef multi_checker<TreeType, CheckerType> self_type;\n\n public:\n  typedef typename super_type::iterator iterator;\n  typedef typename super_type::value_type value_type;\n\n public:\n  // Default constructor.\n  multi_checker()\n      : super_type() {\n  }\n  // Copy constructor.\n  multi_checker(const self_type &x)\n      : super_type(x) {\n  }\n  // Range constructor.\n  template <class InputIterator>\n  multi_checker(InputIterator b, InputIterator e)\n      : super_type(b, e) {\n  }\n\n  // Insertion routines.\n  iterator insert(const value_type &x) {\n    int size = this->tree_.size();\n    typename CheckerType::iterator checker_res = this->checker_.insert(x);\n    iterator tree_res = this->tree_.insert(x);\n    EXPECT_EQ(*tree_res, *checker_res);\n    EXPECT_EQ(this->tree_.size(), this->checker_.size());\n    EXPECT_EQ(this->tree_.size(), size + 1);\n    return tree_res;\n  }\n  iterator insert(iterator position, const value_type &x) {\n    int size = this->tree_.size();\n    typename CheckerType::iterator checker_res = this->checker_.insert(x);\n    iterator tree_res = this->tree_.insert(position, x);\n    EXPECT_EQ(*tree_res, *checker_res);\n    EXPECT_EQ(this->tree_.size(), this->checker_.size());\n    EXPECT_EQ(this->tree_.size(), size + 1);\n    return tree_res;\n  }\n  template <typename InputIterator>\n  void insert(InputIterator b, InputIterator e) {\n    for (; b != e; ++b) {\n      insert(*b);\n    }\n  }\n};\n\nchar* GenerateDigits(char buf[16], int val, int maxval) {\n  EXPECT_LE(val, maxval);\n  int p = 15;\n  buf[p--] = 0;\n  while (maxval > 0) {\n    buf[p--] = '0' + (val % 10);\n    val /= 10;\n    maxval /= 10;\n  }\n  return buf + p + 1;\n}\n\ntemplate <typename K>\nstruct Generator {\n  int maxval;\n  Generator(int m)\n      : maxval(m) {\n  }\n  K operator()(int i) const {\n    EXPECT_LE(i, maxval);\n    return i;\n  }\n};\n\ntemplate <>\nstruct Generator<std::string> {\n  int maxval;\n  Generator(int m)\n      : maxval(m) {\n  }\n  std::string operator()(int i) const {\n    char buf[16];\n    return GenerateDigits(buf, i, maxval);\n  }\n};\n\ntemplate <typename T, typename U>\nstruct Generator<std::pair<T, U> > {\n  Generator<typename std::remove_const<T>::type> tgen;\n  Generator<typename std::remove_const<U>::type> ugen;\n\n  Generator(int m)\n      : tgen(m),\n        ugen(m) {\n  }\n  std::pair<T, U> operator()(int i) const {\n    return std::make_pair(tgen(i), ugen(i));\n  }\n};\n\n// Generate values for our tests and benchmarks. Value range is [0, maxval].\nconst std::vector<int>& GenerateNumbers(int n, int maxval) {\n  static std::vector<int> values;\n  static std::set<int> unique_values;\n\n  if (values.size() < n) {\n\n    for (int i = values.size(); i < n; i++) {\n      int value;\n      do {\n        value = rand() % (maxval + 1);\n      } while (unique_values.find(value) != unique_values.end());\n\n      values.push_back(value);\n      unique_values.insert(value);\n    }\n  }\n\n  return values;\n}\n\n// Generates values in the range\n// [0, 4 * min(FLAGS_benchmark_values, FLAGS_test_values)]\ntemplate <typename V>\nstd::vector<V> GenerateValues(int n) {\n  int two_times_max = 2 * std::max(FLAGS_benchmark_values, FLAGS_test_values);\n  int four_times_max = 2 * two_times_max;\n  EXPECT_LE(n, two_times_max);\n  const std::vector<int> &nums = GenerateNumbers(n, four_times_max);\n  Generator<V> gen(four_times_max);\n  std::vector<V> vec;\n\n  for (int i = 0; i < n; i++) {\n    vec.push_back(gen(nums[i]));\n  }\n\n  return vec;\n}\n\ntemplate <typename T, typename V>\nvoid DoTest(const char *name, T *b, const std::vector<V> &values) {\n  typename KeyOfValue<typename T::key_type, V>::type key_of_value;\n\n  T &mutable_b = *b;\n  const T &const_b = *b;\n\n  // Test insert.\n  for (int i = 0; i < values.size(); ++i) {\n    mutable_b.insert(values[i]);\n    mutable_b.value_check(values[i]);\n  }\n  assert(mutable_b.size() == values.size());\n\n  const_b.verify();\n  printf(\"    %s fullness=%0.2f  overhead=%0.2f  bytes-per-value=%0.2f\\n\",\n         name, const_b.fullness(), const_b.overhead(),\n         double(const_b.bytes_used()) / const_b.size());\n\n  // Test copy constructor.\n  T b_copy(const_b);\n  EXPECT_EQ(b_copy.size(), const_b.size());\n  EXPECT_LE(b_copy.height(), const_b.height());\n  EXPECT_LE(b_copy.internal_nodes(), const_b.internal_nodes());\n  EXPECT_LE(b_copy.leaf_nodes(), const_b.leaf_nodes());\n  for (int i = 0; i < values.size(); ++i) {\n    EXPECT_EQ(*b_copy.find(key_of_value(values[i])), values[i]);\n  }\n\n  // Test range constructor.\n  T b_range(const_b.begin(), const_b.end());\n  EXPECT_EQ(b_range.size(), const_b.size());\n  EXPECT_LE(b_range.height(), const_b.height());\n  EXPECT_LE(b_range.internal_nodes(), const_b.internal_nodes());\n  EXPECT_LE(b_range.leaf_nodes(), const_b.leaf_nodes());\n  for (int i = 0; i < values.size(); ++i) {\n    EXPECT_EQ(*b_range.find(key_of_value(values[i])), values[i]);\n  }\n\n  // Test range insertion for values that already exist.\n  b_range.insert(b_copy.begin(), b_copy.end());\n  b_range.verify();\n\n  // Test range insertion for new values.\n  b_range.clear();\n  b_range.insert(b_copy.begin(), b_copy.end());\n  EXPECT_EQ(b_range.size(), b_copy.size());\n  EXPECT_EQ(b_range.height(), b_copy.height());\n  EXPECT_EQ(b_range.internal_nodes(), b_copy.internal_nodes());\n  EXPECT_EQ(b_range.leaf_nodes(), b_copy.leaf_nodes());\n  for (int i = 0; i < values.size(); ++i) {\n    EXPECT_EQ(*b_range.find(key_of_value(values[i])), values[i]);\n  }\n\n  // Test assignment to self. Nothing should change.\n  b_range.operator=(b_range);\n  EXPECT_EQ(b_range.size(), b_copy.size());\n  EXPECT_EQ(b_range.height(), b_copy.height());\n  EXPECT_EQ(b_range.internal_nodes(), b_copy.internal_nodes());\n  EXPECT_EQ(b_range.leaf_nodes(), b_copy.leaf_nodes());\n\n  // Test assignment of new values.\n  b_range.clear();\n  b_range = b_copy;\n  EXPECT_EQ(b_range.size(), b_copy.size());\n  EXPECT_EQ(b_range.height(), b_copy.height());\n  EXPECT_EQ(b_range.internal_nodes(), b_copy.internal_nodes());\n  EXPECT_EQ(b_range.leaf_nodes(), b_copy.leaf_nodes());\n\n  // Test swap.\n  b_range.clear();\n  b_range.swap(b_copy);\n  EXPECT_EQ(b_copy.size(), 0);\n  EXPECT_EQ(b_range.size(), const_b.size());\n  for (int i = 0; i < values.size(); ++i) {\n    EXPECT_EQ(*b_range.find(key_of_value(values[i])), values[i]);\n  }\n  b_range.swap(b_copy);\n\n  // Test erase via values.\n  for (int i = 0; i < values.size(); ++i) {\n    mutable_b.erase(key_of_value(values[i]));\n    // Erasing a non-existent key should have no effect.\n    EXPECT_EQ(mutable_b.erase(key_of_value(values[i])), 0);\n  }\n\n  const_b.verify();\n  EXPECT_EQ(const_b.internal_nodes(), 0);\n  EXPECT_EQ(const_b.leaf_nodes(), 0);\n  EXPECT_EQ(const_b.size(), 0);\n\n  // Test erase via iterators.\n  mutable_b = b_copy;\n  for (int i = 0; i < values.size(); ++i) {\n    mutable_b.erase(mutable_b.find(key_of_value(values[i])));\n  }\n\n  const_b.verify();\n  EXPECT_EQ(const_b.internal_nodes(), 0);\n  EXPECT_EQ(const_b.leaf_nodes(), 0);\n  EXPECT_EQ(const_b.size(), 0);\n\n  // Test insert with hint.\n  for (int i = 0; i < values.size(); i++) {\n    mutable_b.insert(mutable_b.upper_bound(key_of_value(values[i])), values[i]);\n  }\n\n  const_b.verify();\n\n  // Test dumping of the btree to an ostream. There should be 1 line for each\n  // value.\n  std::stringstream strm;\n  strm << mutable_b.tree();\n  EXPECT_EQ(mutable_b.size(), strcount(strm.str(), '\\n'));\n\n  // Test range erase.\n  mutable_b.erase(mutable_b.begin(), mutable_b.end());\n  EXPECT_EQ(mutable_b.size(), 0);\n  const_b.verify();\n\n  // First half.\n  mutable_b = b_copy;\n  typename T::iterator mutable_iter_end = mutable_b.begin();\n  for (int i = 0; i < values.size() / 2; ++i) ++mutable_iter_end;\n  mutable_b.erase(mutable_b.begin(), mutable_iter_end);\n  EXPECT_EQ(mutable_b.size(), values.size() - values.size() / 2);\n  const_b.verify();\n\n  // Second half.\n  mutable_b = b_copy;\n  typename T::iterator mutable_iter_begin = mutable_b.begin();\n  for (int i = 0; i < values.size() / 2; ++i) ++mutable_iter_begin;\n  mutable_b.erase(mutable_iter_begin, mutable_b.end());\n  EXPECT_EQ(mutable_b.size(), values.size() / 2);\n  const_b.verify();\n\n  // Second quarter.\n  mutable_b = b_copy;\n  mutable_iter_begin = mutable_b.begin();\n  for (int i = 0; i < values.size() / 4; ++i) ++mutable_iter_begin;\n  mutable_iter_end = mutable_iter_begin;\n  for (int i = 0; i < values.size() / 4; ++i) ++mutable_iter_end;\n  mutable_b.erase(mutable_iter_begin, mutable_iter_end);\n  EXPECT_EQ(mutable_b.size(), values.size() - values.size() / 4);\n  const_b.verify();\n\n  mutable_b.clear();\n}\n\ntemplate <typename T>\nvoid ConstTest() {\n  typedef typename T::value_type value_type;\n  typename KeyOfValue<typename T::key_type, value_type>::type key_of_value;\n\n  T mutable_b;\n  const T &const_b = mutable_b;\n\n  // Insert a single value into the container and test looking it up.\n  value_type value = Generator<value_type>(2)(2);\n  mutable_b.insert(value);\n  EXPECT_TRUE(mutable_b.find(key_of_value(value)) != const_b.end());\n  EXPECT_TRUE(const_b.find(key_of_value(value)) != mutable_b.end());\n  EXPECT_EQ(*const_b.lower_bound(key_of_value(value)), value);\n  EXPECT_TRUE(const_b.upper_bound(key_of_value(value)) == const_b.end());\n  EXPECT_EQ(*const_b.equal_range(key_of_value(value)).first, value);\n\n  // We can only create a non-const iterator from a non-const container.\n  typename T::iterator mutable_iter(mutable_b.begin());\n  EXPECT_TRUE(mutable_iter == const_b.begin());\n  EXPECT_TRUE(mutable_iter != const_b.end());\n  EXPECT_TRUE(const_b.begin() == mutable_iter);\n  EXPECT_TRUE(const_b.end() != mutable_iter);\n  typename T::reverse_iterator mutable_riter(mutable_b.rbegin());\n  EXPECT_TRUE(mutable_riter == const_b.rbegin());\n  EXPECT_TRUE(mutable_riter != const_b.rend());\n  EXPECT_TRUE(const_b.rbegin() == mutable_riter);\n  EXPECT_TRUE(const_b.rend() != mutable_riter);\n\n  // We can create a const iterator from a non-const iterator.\n  typename T::const_iterator const_iter(mutable_iter);\n  EXPECT_TRUE(const_iter == mutable_b.begin());\n  EXPECT_TRUE(const_iter != mutable_b.end());\n  EXPECT_TRUE(mutable_b.begin() == const_iter);\n  EXPECT_TRUE(mutable_b.end() != const_iter);\n  typename T::const_reverse_iterator const_riter(mutable_riter);\n  EXPECT_EQ(const_riter, mutable_b.rbegin());\n  EXPECT_TRUE(const_riter != mutable_b.rend());\n  EXPECT_EQ(mutable_b.rbegin(), const_riter);\n  EXPECT_TRUE(mutable_b.rend() != const_riter);\n\n  // Make sure various methods can be invoked on a const container.\n  const_b.verify();\n  EXPECT_FALSE(const_b.empty());\n  EXPECT_EQ(const_b.size(), 1);\n  EXPECT_GT(const_b.max_size(), 0);\n  EXPECT_EQ(const_b.height(), 1);\n  EXPECT_EQ(const_b.count(key_of_value(value)), 1);\n  EXPECT_EQ(const_b.internal_nodes(), 0);\n  EXPECT_EQ(const_b.leaf_nodes(), 1);\n  EXPECT_EQ(const_b.nodes(), 1);\n  EXPECT_GT(const_b.bytes_used(), 0);\n  EXPECT_GT(const_b.fullness(), 0);\n  EXPECT_GT(const_b.overhead(), 0);\n}\n\ntemplate <typename T, typename C>\nvoid BtreeTest() {\n  ConstTest<T>();\n\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  std::vector<V> random_values = GenerateValues<V>(FLAGS_test_values);\n\n  unique_checker<T, C> container;\n\n  // Test key insertion/deletion in sorted order.\n  std::vector<V> sorted_values(random_values);\n  sort(sorted_values.begin(), sorted_values.end());\n  DoTest(\"sorted:    \", &container, sorted_values);\n\n  // Test key insertion/deletion in reverse sorted order.\n  reverse(sorted_values.begin(), sorted_values.end());\n  DoTest(\"rsorted:   \", &container, sorted_values);\n\n  // Test key insertion/deletion in random order.\n  DoTest(\"random:    \", &container, random_values);\n}\n\ntemplate <typename T, typename C>\nvoid BtreeMultiTest() {\n  ConstTest<T>();\n\n  typedef typename std::remove_const<typename T::value_type>::type V;\n  const std::vector<V>& random_values = GenerateValues<V>(FLAGS_test_values);\n\n  multi_checker<T, C> container;\n\n  // Test keys in sorted order.\n  std::vector<V> sorted_values(random_values);\n  sort(sorted_values.begin(), sorted_values.end());\n  DoTest(\"sorted:    \", &container, sorted_values);\n\n  // Test keys in reverse sorted order.\n  reverse(sorted_values.begin(), sorted_values.end());\n  DoTest(\"rsorted:   \", &container, sorted_values);\n\n  // Test keys in random order.\n  DoTest(\"random:    \", &container, random_values);\n\n  // Test keys in random order w/ duplicates.\n  std::vector<V> duplicate_values(random_values);\n  duplicate_values.insert(\n      duplicate_values.end(), random_values.begin(), random_values.end());\n  DoTest(\"duplicates:\", &container, duplicate_values);\n\n  // Test all identical keys.\n  std::vector<V> identical_values(100);\n  fill(identical_values.begin(), identical_values.end(), Generator<V>(2)(2));\n  DoTest(\"identical: \", &container, identical_values);\n}\n\ntemplate <typename T, typename Alloc = std::allocator<T> >\nclass TestAllocator : public Alloc {\n public:\n  typedef typename Alloc::pointer pointer;\n  typedef typename Alloc::size_type size_type;\n\n  TestAllocator() : bytes_used_(NULL) { }\n  TestAllocator(int64_t *bytes_used) : bytes_used_(bytes_used) { }\n\n  // Constructor used for rebinding\n  template <class U>\n  TestAllocator(const TestAllocator<U>& x)\n      : Alloc(x),\n        bytes_used_(x.bytes_used()) {\n  }\n\n  pointer allocate(size_type n, std::allocator<void>::const_pointer hint = 0) {\n    EXPECT_TRUE(bytes_used_ != NULL);\n    *bytes_used_ += n * sizeof(T);\n    return Alloc::allocate(n, hint);\n  }\n\n  void deallocate(pointer p, size_type n) {\n    Alloc::deallocate(p, n);\n    EXPECT_TRUE(bytes_used_ != NULL);\n    *bytes_used_ -= n * sizeof(T);\n  }\n\n  // Rebind allows an allocator<T> to be used for a different type\n  template <class U> struct rebind {\n    typedef TestAllocator<U, typename Alloc::template rebind<U>::other> other;\n  };\n\n  int64_t* bytes_used() const { return bytes_used_; }\n\n private:\n  int64_t *bytes_used_;\n};\n\ntemplate <typename T>\nvoid BtreeAllocatorTest() {\n  typedef typename T::value_type value_type;\n\n  int64_t alloc1 = 0;\n  int64_t alloc2 = 0;\n  T b1(typename T::key_compare(), &alloc1);\n  T b2(typename T::key_compare(), &alloc2);\n\n  // This should swap the allocators!\n  swap(b1, b2);\n\n  for (int i = 0; i < 1000; i++) {\n    b1.insert(Generator<value_type>(1000)(i));\n  }\n\n  // We should have allocated out of alloc2!\n  EXPECT_LE(b1.bytes_used(), alloc2 + sizeof(b1));\n  EXPECT_GT(alloc2, alloc1);\n}\n\ntemplate <typename T>\nvoid BtreeMapTest() {\n  typedef typename T::value_type value_type;\n  typedef typename T::mapped_type mapped_type;\n\n  mapped_type m = Generator<mapped_type>(0)(0);\n  (void) m;\n\n  T b;\n\n  // Verify we can insert using operator[].\n  for (int i = 0; i < 1000; i++) {\n    value_type v = Generator<value_type>(1000)(i);\n    b[v.first] = v.second;\n  }\n  EXPECT_EQ(b.size(), 1000);\n\n  // Test whether we can use the \"->\" operator on iterators and\n  // reverse_iterators. This stresses the btree_map_params::pair_pointer\n  // mechanism.\n  EXPECT_EQ(b.begin()->first, Generator<value_type>(1000)(0).first);\n  EXPECT_EQ(b.begin()->second, Generator<value_type>(1000)(0).second);\n  EXPECT_EQ(b.rbegin()->first, Generator<value_type>(1000)(999).first);\n  EXPECT_EQ(b.rbegin()->second, Generator<value_type>(1000)(999).second);\n}\n\ntemplate <typename T>\nvoid BtreeMultiMapTest() {\n  typedef typename T::mapped_type mapped_type;\n  mapped_type m = Generator<mapped_type>(0)(0);\n  (void) m;\n}\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_BTREE_TEST_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/btree_test_flags.cc",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#include \"gflags/gflags.h\"\n\nDEFINE_int32(test_values, 10000,\n             \"The number of values to use for tests.\");\nDEFINE_int32(benchmark_values, 1000000,\n             \"The number of values to use for benchmarks.\");\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/safe_btree.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// A safe_btree<> wraps around a btree<> and removes the caveat that insertion\n// and deletion invalidate iterators. A safe_btree<> maintains a generation\n// number that is incremented on every mutation. A safe_btree<>::iterator keeps\n// a pointer to the safe_btree<> it came from, the generation of the tree when\n// it was last validated and the key the underlying btree<>::iterator points\n// to. If an iterator is accessed and its generation differs from the tree\n// generation it is revalidated.\n//\n// References and pointers returned by safe_btree iterators are not safe.\n//\n// See the incorrect usage examples mentioned in safe_btree_set.h and\n// safe_btree_map.h.\n\n#ifndef UTIL_BTREE_SAFE_BTREE_H__\n#define UTIL_BTREE_SAFE_BTREE_H__\n\n#include <stddef.h>\n#include <iosfwd>\n#include <utility>\n\n#include \"btree.h\"\n\nnamespace btree {\n\ntemplate <typename Tree, typename Iterator>\nclass safe_btree_iterator {\n public:\n  typedef typename Iterator::key_type key_type;\n  typedef typename Iterator::value_type value_type;\n  typedef typename Iterator::size_type size_type;\n  typedef typename Iterator::difference_type difference_type;\n  typedef typename Iterator::pointer pointer;\n  typedef typename Iterator::reference reference;\n  typedef typename Iterator::const_pointer const_pointer;\n  typedef typename Iterator::const_reference const_reference;\n  typedef typename Iterator::iterator_category iterator_category;\n  typedef typename Tree::iterator iterator;\n  typedef typename Tree::const_iterator const_iterator;\n  typedef safe_btree_iterator<Tree, Iterator> self_type;\n\n  void update() const {\n    if (iter_ != tree_->internal_btree()->end()) {\n      // A positive generation indicates a valid key.\n      generation_ = tree_->generation();\n      key_ = iter_.key();\n    } else {\n      // Use a negative generation to indicate iter_ points to end().\n      generation_ = -tree_->generation();\n    }\n  }\n\n public:\n  safe_btree_iterator()\n      : generation_(0),\n        key_(),\n        iter_(),\n        tree_(NULL) {\n  }\n  safe_btree_iterator(const iterator &x)\n      : generation_(x.generation()),\n        key_(x.key()),\n        iter_(x.iter()),\n        tree_(x.tree()) {\n  }\n  safe_btree_iterator(Tree *tree, const Iterator &iter)\n      : generation_(),\n        key_(),\n        iter_(iter),\n        tree_(tree) {\n    update();\n  }\n\n  Tree* tree() const { return tree_; }\n  int64_t generation() const { return generation_; }\n\n  Iterator* mutable_iter() const {\n    if (generation_ != tree_->generation()) {\n      if (generation_ > 0) {\n        // This does the wrong thing for a multi{set,map}. If my iter was\n        // pointing to the 2nd of 2 values with the same key, then this will\n        // reset it to point to the first. This is why we don't provide a\n        // safe_btree_multi{set,map}.\n        iter_ = tree_->internal_btree()->lower_bound(key_);\n        update();\n      } else if (-generation_ != tree_->generation()) {\n        iter_ = tree_->internal_btree()->end();\n        generation_ = -tree_->generation();\n      }\n    }\n    return &iter_;\n  }\n  const Iterator& iter() const {\n    return *mutable_iter();\n  }\n\n  // Equality/inequality operators.\n  bool operator==(const const_iterator &x) const {\n    return iter() == x.iter();\n  }\n  bool operator!=(const const_iterator &x) const {\n    return iter() != x.iter();\n  }\n\n  // Accessors for the key/value the iterator is pointing at.\n  const key_type& key() const {\n    return key_;\n  }\n  // This reference value is potentially invalidated by any non-const\n  // method on the tree; it is NOT safe.\n  reference operator*() const {\n    assert(generation_ > 0);\n    return iter().operator*();\n  }\n  // This pointer value is potentially invalidated by any non-const\n  // method on the tree; it is NOT safe.\n  pointer operator->() const {\n    assert(generation_ > 0);\n    return iter().operator->();\n  }\n\n  // Increment/decrement operators.\n  self_type& operator++() {\n    ++(*mutable_iter());\n    update();\n    return *this;\n  }\n  self_type& operator--() {\n    --(*mutable_iter());\n    update();\n    return *this;\n  }\n  self_type operator++(int) {\n    self_type tmp = *this;\n    ++*this;\n    return tmp;\n  }\n  self_type operator--(int) {\n    self_type tmp = *this;\n    --*this;\n    return tmp;\n  }\n\n private:\n  // The generation of the tree when \"iter\" was updated.\n  mutable int64_t generation_;\n  // The key the iterator points to.\n  mutable key_type key_;\n  // The underlying iterator.\n  mutable Iterator iter_;\n  // The tree the iterator is associated with.\n  Tree *tree_;\n};\n\ntemplate <typename Params>\nclass safe_btree {\n  typedef safe_btree<Params> self_type;\n\n  typedef btree<Params> btree_type;\n  typedef typename btree_type::iterator tree_iterator;\n  typedef typename btree_type::const_iterator tree_const_iterator;\n\n public:\n  typedef typename btree_type::params_type params_type;\n  typedef typename btree_type::key_type key_type;\n  typedef typename btree_type::data_type data_type;\n  typedef typename btree_type::mapped_type mapped_type;\n  typedef typename btree_type::value_type value_type;\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n  typedef typename btree_type::pointer pointer;\n  typedef typename btree_type::const_pointer const_pointer;\n  typedef typename btree_type::reference reference;\n  typedef typename btree_type::const_reference const_reference;\n  typedef typename btree_type::size_type size_type;\n  typedef typename btree_type::difference_type difference_type;\n  typedef safe_btree_iterator<self_type, tree_iterator> iterator;\n  typedef safe_btree_iterator<\n    const self_type, tree_const_iterator> const_iterator;\n  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n  typedef std::reverse_iterator<iterator> reverse_iterator;\n\n public:\n  // Default constructor.\n  safe_btree(const key_compare &comp, const allocator_type &alloc)\n      : tree_(comp, alloc),\n        generation_(1) {\n  }\n\n  // Copy constructor.\n  safe_btree(const self_type &x)\n      : tree_(x.tree_),\n        generation_(1) {\n  }\n\n  iterator begin() {\n    return iterator(this, tree_.begin());\n  }\n  const_iterator begin() const {\n    return const_iterator(this, tree_.begin());\n  }\n  iterator end() {\n    return iterator(this, tree_.end());\n  }\n  const_iterator end() const {\n    return const_iterator(this, tree_.end());\n  }\n  reverse_iterator rbegin() {\n    return reverse_iterator(end());\n  }\n  const_reverse_iterator rbegin() const {\n    return const_reverse_iterator(end());\n  }\n  reverse_iterator rend() {\n    return reverse_iterator(begin());\n  }\n  const_reverse_iterator rend() const {\n    return const_reverse_iterator(begin());\n  }\n\n  // Lookup routines.\n  iterator lower_bound(const key_type &key) {\n    return iterator(this, tree_.lower_bound(key));\n  }\n  const_iterator lower_bound(const key_type &key) const {\n    return const_iterator(this, tree_.lower_bound(key));\n  }\n  iterator upper_bound(const key_type &key) {\n    return iterator(this, tree_.upper_bound(key));\n  }\n  const_iterator upper_bound(const key_type &key) const {\n    return const_iterator(this, tree_.upper_bound(key));\n  }\n  std::pair<iterator, iterator> equal_range(const key_type &key) {\n    std::pair<tree_iterator, tree_iterator> p = tree_.equal_range(key);\n    return std::make_pair(iterator(this, p.first),\n                     iterator(this, p.second));\n  }\n  std::pair<const_iterator, const_iterator> equal_range(const key_type &key) const {\n    std::pair<tree_const_iterator, tree_const_iterator> p = tree_.equal_range(key);\n    return std::make_pair(const_iterator(this, p.first),\n                     const_iterator(this, p.second));\n  }\n  iterator find_unique(const key_type &key) {\n    return iterator(this, tree_.find_unique(key));\n  }\n  const_iterator find_unique(const key_type &key) const {\n    return const_iterator(this, tree_.find_unique(key));\n  }\n  iterator find_multi(const key_type &key) {\n    return iterator(this, tree_.find_multi(key));\n  }\n  const_iterator find_multi(const key_type &key) const {\n    return const_iterator(this, tree_.find_multi(key));\n  }\n  size_type count_unique(const key_type &key) const {\n    return tree_.count_unique(key);\n  }\n  size_type count_multi(const key_type &key) const {\n    return tree_.count_multi(key);\n  }\n\n  // Insertion routines.\n  template <typename ValuePointer>\n  std::pair<iterator, bool> insert_unique(const key_type &key, ValuePointer value) {\n    std::pair<tree_iterator, bool> p = tree_.insert_unique(key, value);\n    generation_ += p.second;\n    return std::make_pair(iterator(this, p.first), p.second);\n  }\n  std::pair<iterator, bool> insert_unique(const value_type &v) {\n    std::pair<tree_iterator, bool> p = tree_.insert_unique(v);\n    generation_ += p.second;\n    return std::make_pair(iterator(this, p.first), p.second);\n  }\n  iterator insert_unique(iterator position, const value_type &v) {\n    tree_iterator tree_pos = position.iter();\n    ++generation_;\n    return iterator(this, tree_.insert_unique(tree_pos, v));\n  }\n  template <typename InputIterator>\n  void insert_unique(InputIterator b, InputIterator e) {\n    for (; b != e; ++b) {\n      insert_unique(*b);\n    }\n  }\n  iterator insert_multi(const value_type &v) {\n    ++generation_;\n    return iterator(this, tree_.insert_multi(v));\n  }\n  iterator insert_multi(iterator position, const value_type &v) {\n    tree_iterator tree_pos = position.iter();\n    ++generation_;\n    return iterator(this, tree_.insert_multi(tree_pos, v));\n  }\n  template <typename InputIterator>\n  void insert_multi(InputIterator b, InputIterator e) {\n    for (; b != e; ++b) {\n      insert_multi(*b);\n    }\n  }\n  self_type& operator=(const self_type &x) {\n    if (&x == this) {\n      // Don't copy onto ourselves.\n      return *this;\n    }\n    ++generation_;\n    tree_ = x.tree_;\n    return *this;\n  }\n\n  // Deletion routines.\n  void erase(const iterator &begin, const iterator &end) {\n    tree_.erase(begin.iter(), end.iter());\n    ++generation_;\n  }\n  // Erase the specified iterator from the btree. The iterator must be valid\n  // (i.e. not equal to end()).  Return an iterator pointing to the node after\n  // the one that was erased (or end() if none exists).\n  iterator erase(iterator iter) {\n    tree_iterator res = tree_.erase(iter.iter());\n    ++generation_;\n    return iterator(this, res);\n  }\n  int erase_unique(const key_type &key) {\n    int res = tree_.erase_unique(key);\n    generation_ += res;\n    return res;\n  }\n  int erase_multi(const key_type &key) {\n    int res = tree_.erase_multi(key);\n    generation_ += res;\n    return res;\n  }\n\n  // Access to the underlying btree.\n  btree_type* internal_btree() { return &tree_; }\n  const btree_type* internal_btree() const { return &tree_; }\n\n  // Utility routines.\n  void clear() {\n    ++generation_;\n    tree_.clear();\n  }\n  void swap(self_type &x) {\n    ++generation_;\n    ++x.generation_;\n    tree_.swap(x.tree_);\n  }\n  void dump(std::ostream &os) const {\n    tree_.dump(os);\n  }\n  void verify() const {\n    tree_.verify();\n  }\n  int64_t generation() const {\n    return generation_;\n  }\n  key_compare key_comp() const { return tree_.key_comp(); }\n\n  // Size routines.\n  size_type size() const { return tree_.size(); }\n  size_type max_size() const { return tree_.max_size(); }\n  bool empty() const { return tree_.empty(); }\n  size_type height() const { return tree_.height(); }\n  size_type internal_nodes() const { return tree_.internal_nodes(); }\n  size_type leaf_nodes() const { return tree_.leaf_nodes(); }\n  size_type nodes() const { return tree_.nodes(); }\n  size_type bytes_used() const { return tree_.bytes_used(); }\n  static double average_bytes_per_value() {\n    return btree_type::average_bytes_per_value();\n  }\n  double fullness() const { return tree_.fullness(); }\n  double overhead() const { return tree_.overhead(); }\n\n private:\n  btree_type tree_;\n  int64_t generation_;\n};\n\n}  // namespace btree\n\n#endif  // UTIL_BTREE_SAFE_BTREE_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/safe_btree_map.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// The safe_btree_map<> is like btree_map<> except that it removes the caveat\n// about insertion and deletion invalidating existing iterators at a small cost\n// in making iterators larger and slower.\n//\n// Revalidation occurs whenever an iterator is accessed.  References\n// and pointers returned by safe_btree_map<> iterators are not stable,\n// they are potentially invalidated by any non-const method on the map.\n//\n// BEGIN INCORRECT EXAMPLE\n//   for (auto i = safe_map->begin(); i != safe_map->end(); ++i) {\n//     const T *value = &i->second;  // DO NOT DO THIS\n//     [code that modifies safe_map and uses value];\n//   }\n// END INCORRECT EXAMPLE\n#ifndef UTIL_BTREE_SAFE_BTREE_MAP_H__\n#define UTIL_BTREE_SAFE_BTREE_MAP_H__\n\n#include <functional>\n#include <memory>\n#include <utility>\n\n#include \"btree_container.h\"\n#include \"btree_map.h\"\n#include \"safe_btree.h\"\n\nnamespace btree {\n\n// The safe_btree_map class is needed mainly for its constructors.\ntemplate <typename Key, typename Value,\n          typename Compare = std::less<Key>,\n          typename Alloc = std::allocator<std::pair<const Key, Value> >,\n          int TargetNodeSize = 256>\nclass safe_btree_map : public btree_map_container<\n  safe_btree<btree_map_params<Key, Value, Compare, Alloc, TargetNodeSize> > > {\n\n  typedef safe_btree_map<Key, Value, Compare, Alloc, TargetNodeSize> self_type;\n  typedef btree_map_params<\n    Key, Value, Compare, Alloc, TargetNodeSize> params_type;\n  typedef safe_btree<params_type> btree_type;\n  typedef btree_map_container<btree_type> super_type;\n\n public:\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n\n public:\n  // Default constructor.\n  safe_btree_map(const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  safe_btree_map(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  safe_btree_map(InputIterator b, InputIterator e,\n                 const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n};\n\ntemplate <typename K, typename V, typename C, typename A, int N>\ninline void swap(safe_btree_map<K, V, C, A, N> &x,\n                 safe_btree_map<K, V, C, A, N> &y) {\n  x.swap(y);\n}\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_SAFE_BTREE_MAP_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/safe_btree_set.h",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// The safe_btree_set<> is like btree_set<> except that it removes the caveat\n// about insertion and deletion invalidating existing iterators at a small cost\n// in making iterators larger and slower.\n//\n// Revalidation occurs whenever an iterator is accessed.  References\n// and pointers returned by safe_btree_map<> iterators are not stable,\n// they are potentially invalidated by any non-const method on the set.\n//\n// BEGIN INCORRECT EXAMPLE\n//   for (auto i = safe_set->begin(); i != safe_set->end(); ++i) {\n//     const T &value = *i;  // DO NOT DO THIS\n//     [code that modifies safe_set and uses value];\n//   }\n// END INCORRECT EXAMPLE\n\n#ifndef UTIL_BTREE_SAFE_BTREE_SET_H__\n#define UTIL_BTREE_SAFE_BTREE_SET_H__\n\n#include <functional>\n#include <memory>\n\n#include \"btree_container.h\"\n#include \"btree_set.h\"\n#include \"safe_btree.h\"\n\nnamespace btree {\n\n// The safe_btree_set class is needed mainly for its constructors.\ntemplate <typename Key,\n          typename Compare = std::less<Key>,\n          typename Alloc = std::allocator<Key>,\n          int TargetNodeSize = 256>\nclass safe_btree_set : public btree_unique_container<\n  safe_btree<btree_set_params<Key, Compare, Alloc, TargetNodeSize> > > {\n\n  typedef safe_btree_set<Key, Compare, Alloc, TargetNodeSize> self_type;\n  typedef btree_set_params<Key, Compare, Alloc, TargetNodeSize> params_type;\n  typedef safe_btree<params_type> btree_type;\n  typedef btree_unique_container<btree_type> super_type;\n\n public:\n  typedef typename btree_type::key_compare key_compare;\n  typedef typename btree_type::allocator_type allocator_type;\n\n public:\n  // Default constructor.\n  safe_btree_set(const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(comp, alloc) {\n  }\n\n  // Copy constructor.\n  safe_btree_set(const self_type &x)\n      : super_type(x) {\n  }\n\n  // Range constructor.\n  template <class InputIterator>\n  safe_btree_set(InputIterator b, InputIterator e,\n                 const key_compare &comp = key_compare(),\n                 const allocator_type &alloc = allocator_type())\n      : super_type(b, e, comp, alloc) {\n  }\n};\n\ntemplate <typename K, typename C, typename A, int N>\ninline void swap(safe_btree_set<K, C, A, N> &x,\n                 safe_btree_set<K, C, A, N> &y) {\n  x.swap(y);\n}\n\n} // namespace btree\n\n#endif  // UTIL_BTREE_SAFE_BTREE_SET_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/cpp-btree/safe_btree_test.cc",
    "content": "// Copyright 2013 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// TODO(pmattis): Add some tests that iterators are not invalidated by\n// insertion and deletion.\n\n#include <functional>\n#include <map>\n#include <set>\n#include <string>\n#include <utility>\n\n#include \"gtest/gtest.h\"\n#include \"btree_test.h\"\n#include \"safe_btree_map.h\"\n#include \"safe_btree_set.h\"\n\nclass UnsafeArena;\n\nnamespace btree {\nnamespace {\n\ntemplate <typename K, int N>\nvoid SetTest() {\n  typedef TestAllocator<K> TestAlloc;\n  BtreeTest<safe_btree_set<K, std::less<K>, std::allocator<K>, N>, std::set<K> >();\n  BtreeAllocatorTest<safe_btree_set<K, std::less<K>, TestAlloc, N> >();\n}\n\ntemplate <typename K, int N>\nvoid MapTest() {\n  typedef TestAllocator<K> TestAlloc;\n  BtreeTest<safe_btree_map<K, K, std::less<K>, std::allocator<K>, N>, std::map<K, K> >();\n  BtreeAllocatorTest<safe_btree_map<K, K, std::less<K>, TestAlloc, N> >();\n  BtreeMapTest<safe_btree_map<K, K, std::less<K>, std::allocator<K>, N> >();\n}\n\nTEST(SafeBtree, set_int32_32)   { SetTest<int32_t, 32>(); }\nTEST(SafeBtree, set_int32_64)   { SetTest<int32_t, 64>(); }\nTEST(SafeBtree, set_int32_128)  { SetTest<int32_t, 128>(); }\nTEST(SafeBtree, set_int32_256)  { SetTest<int32_t, 256>(); }\nTEST(SafeBtree, set_int64_256)  { SetTest<int64_t, 256>(); }\nTEST(SafeBtree, set_string_256) { SetTest<std::string, 256>(); }\nTEST(SafeBtree, set_pair_256)   { SetTest<std::pair<int, int>, 256>(); }\nTEST(SafeBtree, map_int32_256)  { MapTest<int32_t, 256>(); }\nTEST(SafeBtree, map_int64_256)  { MapTest<int64_t, 256>(); }\nTEST(SafeBtree, map_string_256) { MapTest<std::string, 256>(); }\nTEST(SafeBtree, map_pair_256)   { MapTest<std::pair<int, int>, 256>(); }\n\nTEST(SafeBtree, Comparison) {\n  const int kSetSize = 1201;\n  safe_btree_set<int64_t> my_set;\n  for (int i = 0; i < kSetSize; ++i) {\n    my_set.insert(i);\n  }\n  safe_btree_set<int64_t> my_set_copy(my_set);\n  EXPECT_TRUE(my_set_copy == my_set);\n  EXPECT_TRUE(my_set == my_set_copy);\n  EXPECT_FALSE(my_set_copy != my_set);\n  EXPECT_FALSE(my_set != my_set_copy);\n\n  my_set.insert(kSetSize);\n  EXPECT_FALSE(my_set_copy == my_set);\n  EXPECT_FALSE(my_set == my_set_copy);\n  EXPECT_TRUE(my_set_copy != my_set);\n  EXPECT_TRUE(my_set != my_set_copy);\n\n  my_set.erase(kSetSize - 1);\n  EXPECT_FALSE(my_set_copy == my_set);\n  EXPECT_FALSE(my_set == my_set_copy);\n  EXPECT_TRUE(my_set_copy != my_set);\n  EXPECT_TRUE(my_set != my_set_copy);\n\n  safe_btree_map<std::string, int64_t> my_map;\n  for (int i = 0; i < kSetSize; ++i) {\n    my_map[std::string(i, 'a')] = i;\n  }\n  safe_btree_map<std::string, int64_t> my_map_copy(my_map);\n  EXPECT_TRUE(my_map_copy == my_map);\n  EXPECT_TRUE(my_map == my_map_copy);\n  EXPECT_FALSE(my_map_copy != my_map);\n  EXPECT_FALSE(my_map != my_map_copy);\n\n  ++my_map_copy[std::string(7, 'a')];\n  EXPECT_FALSE(my_map_copy == my_map);\n  EXPECT_FALSE(my_map == my_map_copy);\n  EXPECT_TRUE(my_map_copy != my_map);\n  EXPECT_TRUE(my_map != my_map_copy);\n\n  my_map_copy = my_map;\n  my_map[\"hello\"] = kSetSize;\n  EXPECT_FALSE(my_map_copy == my_map);\n  EXPECT_FALSE(my_map == my_map_copy);\n  EXPECT_TRUE(my_map_copy != my_map);\n  EXPECT_TRUE(my_map != my_map_copy);\n\n  my_map.erase(std::string(kSetSize - 1, 'a'));\n  EXPECT_FALSE(my_map_copy == my_map);\n  EXPECT_FALSE(my_map == my_map_copy);\n  EXPECT_TRUE(my_map_copy != my_map);\n  EXPECT_TRUE(my_map != my_map_copy);\n}\n\n} // namespace\n} // namespace btree\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/draft-korn-vcdiff.txt",
    "content": "                                                     David G. Korn, AT&T Labs\n\t\t\t\t             Joshua P. MacDonald, UC Berkeley\n                                                 Jeffrey C. Mogul, Compaq WRL\nInternet-Draft                                       Kiem-Phong Vo, AT&T Labs\nExpires: 09 November 2002                                    09 November 2001\n\n\n        The VCDIFF Generic Differencing and Compression Data Format\n\n                         draft-korn-vcdiff-06.txt\n\n\n\nStatus of this Memo\n\n    This document is an Internet-Draft and is in full conformance\n    with all provisions of Section 10 of RFC2026.\n\n    Internet-Drafts are working documents of the Internet Engineering\n    Task Force (IETF), its areas, and its working groups.  Note that\n    other groups may also distribute working documents as\n    Internet-Drafts.\n\n    Internet-Drafts are draft documents valid for a maximum of six\n    months and may be updated, replaced, or obsoleted by other\n    documents at any time.  It is inappropriate to use Internet-\n    Drafts as reference material or to cite them other than as\n    \"work in progress.\"\n\n    The list of current Internet-Drafts can be accessed at\n    http://www.ietf.org/ietf/1id-abstracts.txt\n\n    The list of Internet-Draft Shadow Directories can be accessed at\n    http://www.ietf.org/shadow.html.\n\n\nAbstract\n\n    This memo describes a general, efficient and portable data format\n    suitable for encoding compressed and/or differencing data so that\n    they can be easily transported among computers.\n\n\nTable of Contents:\n\n    1.  EXECUTIVE SUMMARY ............................................  2\n    2.  CONVENTIONS ..................................................  3\n    3.  DELTA INSTRUCTIONS ...........................................  4\n    4.  DELTA FILE ORGANIZATION ......................................  5\n    5.  DELTA INSTRUCTION ENCODING ...................................  9\n    6.  DECODING A TARGET WINDOW ..................................... 14\n    7.  APPLICATION-DEFINED CODE TABLES .............................. 16\n    8.  PERFORMANCE .................................................. 16\n    9.  FURTHER ISSUES ............................................... 17\n   10.  SUMMARY ...................................................... 18\n   11.  ACKNOWLEDGEMENTS ............................................. 18\n   12.  SECURITY CONSIDERATIONS ...................................... 18\n   13.  SOURCE CODE AVAILABILITY ..................................... 18\n   14.  INTELLECTUAL PROPERTY RIGHTS ................................. 18\n   15.  IANA CONSIDERATIONS .......................................... 19\n   16.  REFERENCES ................................................... 19\n   17.  AUTHOR'S ADDRESS ............................................. 20\n\n\n1.  EXECUTIVE SUMMARY\n\n    Compression and differencing techniques can greatly improve storage\n    and transmission of files and file versions.  Since files are often\n    transported across machines with distinct architectures and performance\n    characteristics, such data should be encoded in a form that is portable\n    and can be decoded with little or no knowledge of the encoders.\n    This document describes Vcdiff, a compact portable encoding format\n    designed for these purposes.\n\n    Data differencing is the process of computing a compact and invertible\n    encoding of a \"target file\" given a \"source file\".  Data compression\n    is similar but without the use of source data.  The UNIX utilities diff,\n    compress, and gzip are well-known examples of data differencing and\n    compression tools.  For data differencing, the computed encoding is\n    called a \"delta file\", and, for data compression, it is called\n    a \"compressed file\".  Delta and compressed files are good for storage\n    and transmission as they are often smaller than the originals.\n\n    Data differencing and data compression are traditionally treated\n    as distinct types of data processing.  However, as shown in the Vdelta\n    technique by Korn and Vo [1], compression can be thought of as a special\n    case of differencing in which the source data is empty. The basic idea\n    is to unify the string parsing scheme used in the Lempel-Ziv'77 style\n    compressors [2], and the block-move technique of Tichy [3].  Loosely\n    speaking, this works as follows:\n\n        a. Concatenate source and target data.\n        b. Parse the data from left to right as in LZ'77 but\n\t   make sure that a parsed segment starts the target data.\n        c. Start to output when reaching target data.\n\n    Parsing is based on string matching algorithms such as suffix trees [4]\n    or hashing with different time and space performance characteristics.\n    Vdelta uses a fast string matching algorithm that requires less memory\n    than other techniques [5,6].  However, even with this algorithm, the\n    memory requirement can still be prohibitive for large files.  A common\n    way to deal with memory limitation is to partition an input file into\n    chunks called \"windows\" and process them separately. Here, except for\n    unpublished work by Vo, little has been done on designing effective\n    windowing schemes. Current techniques, including Vdelta, simply use\n    source and target windows with corresponding addresses across source\n    and target files.\n\n    String matching and windowing algorithms have large influence on the\n    compression rate of delta and compressed files. However, it is desirable\n    to have a portable encoding format that is independent of such algorithms.\n    This enables construction of client-server applications in which a server\n    may serve clients with unknown computing characteristics.  Unfortunately,\n    all current differencing and compressing tools, including Vdelta, fall\n    short in this respect. Their storage formats are closely intertwined\n    with the implemented string matching and/or windowing algorithms.\n\n    The encoding format Vcdiff proposed here addresses the above issues.\n    Vcdiff achieves the below characteristics:\n\n\tOutput compactness:\n            The basic encoding format compactly represents compressed or delta\n\t    files. Applications can further extend the basic encoding format\n\t    with \"secondary encoders\" to achieve more compression.\n\n\tData portability:\n\t    The basic encoding format is free from machine byte order and\n\t    word size issues. This allows data to be encoded on one machine\n\t    and decoded on a different machine with different architecture.\n\n    \tAlgorithm genericity:\n\t    The decoding algorithm is independent from string matching and\n\t    windowing algorithms. This allows competition among implementations\n\t    of the encoder while keeping the same decoder.\n\n    \tDecoding efficiency:\n\t    Except for secondary encoder issues, the decoding algorithm runs\n\t    in time proportional to the size of the target file and uses space\n\t    proportional to the maximal window size.  Vcdiff differs from more\n\t    conventional compressors in that it uses only byte-aligned\n\t    data, thus avoiding bit-level operations, which improves\n\t    decoding speed at the slight cost of compression efficiency.\n\n    The Vcdiff data format and the algorithms for decoding data shall be\n    described next.  Since Vcdiff treats compression as a special case of\n    differencing, we shall use the term \"delta file\" to indicate the\n    compressed output for both cases.\n\n\n2. CONVENTIONS\n\n    The basic data unit is a byte.  For portability, Vcdiff shall limit\n    a byte to its lower eight bits even on machines with larger bytes.\n    The bits in a byte are ordered from right to left so that the least\n    significant bit (LSB) has value 1, and the most significant bit (MSB),\n    has value 128.\n\n    For purposes of exposition in this document, we adopt the convention\n    that the LSB is numbered 0, and the MSB is numbered 7.  Bit numbers\n    never appear in the encoded format itself.\n\n    Vcdiff encodes unsigned integer values using a portable variable-sized\n    format (originally introduced in the Sfio library [7]). This encoding\n    treats an integer as a number in base 128. Then, each digit in this\n    representation is encoded in the lower seven bits of a byte. Except for\n    the least significant byte, other bytes have their most significant bit\n    turned on to indicate that there are still more digits in the encoding.\n    The two key properties of this integer encoding that are beneficial\n    to a data compression format are:\n\n\ta. The encoding is portable among systems using 8-bit bytes, and\n        b. Small values are encoded compactly.\n\n    For example, consider the value 123456789 which can be represented with\n    four 7-bit digits whose values are 58, 111, 26, 21 in order from most\n    to least significant. Below is the 8-bit byte encoding of these digits.\n    Note that the MSBs of 58, 111 and 26 are on.\n\n                 +-------------------------------------------+\n                 | 10111010 | 11101111 | 10011010 | 00010101 |\n                 +-------------------------------------------+\n                   MSB+58     MSB+111    MSB+26     0+21\n\n\n    Henceforth, the terms \"byte\" and \"integer\" will refer to a byte and an\n    unsigned integer as described.\n\n\n    From time to time, algorithms are exhibited to clarify the descriptions\n    of parts of the Vcdiff format. On such occasions, the C language will be\n    used to make precise the algorithms.  The C code shown in this\n    document is meant for clarification only, and is not part of the\n    actual specification of the Vcdiff format.\n\n    In this specification, the key words \"MUST\", \"MUST NOT\",\n    \"SHOULD\", \"SHOULD NOT\", and \"MAY\" document are to be interpreted as\n    described in RFC2119 [12].\n\n\n3.  DELTA INSTRUCTIONS\n\n    A large target file is partitioned into non-overlapping sections\n    called \"target windows\". These target windows are processed separately\n    and sequentially based on their order in the target file.\n\n    A target window T of length t may be compared against some source data\n    segment S of length s. By construction, this source data segment S\n    comes either from the source file, if one is used, or from a part of\n    the target file earlier than T.  In this way, during decoding, S is\n    completely known when T is being decoded.\n\n    The choices of T, t, S and s are made by some window selection algorithm\n    which can greatly affect the size of the encoding. However, as seen later,\n    these choices are encoded so that no knowledge of the window selection\n    algorithm is needed during decoding.\n\n    Assume that S[j] represents the jth byte in S, and T[k] represents\n    the kth byte in T.  Then, for the delta instructions, we treat the data\n    windows S and T as substrings of a superstring U formed by concatenating\n    them like this:\n\n        S[0]S[1]...S[s-1]T[0]T[1]...T[t-1]\n\n    The \"address\" of a byte in S or T is referred to by its location in U.\n    For example, the address of T[k] is s+k.\n\n    The instructions to encode and direct the reconstruction of a target\n    window are called delta instructions. There are three types:\n\n\tADD: This instruction has two arguments, a size x and a sequence of\n\t    x bytes to be copied.\n\tCOPY: This instruction has two arguments, a size x and an address p\n\t    in the string U. The arguments specify the substring of U that\n\t    must be copied. We shall assert that such a substring must be\n\t    entirely contained in either S or T.\n\tRUN: This instruction has two arguments, a size x and a byte b that\n\t    will be repeated x times.\n\n    Below are example source and target windows and the delta instructions\n    that encode the target window in terms of the source window.\n\n        a b c d e f g h i j k l m n o p\n        a b c d w x y z e f g h e f g h e f g h e f g h z z z z\n\n        COPY  4, 0\n        ADD   4, w x y z\n        COPY  4, 4\n        COPY 12, 24\n\tRUN   4, z\n\n\n    Thus, the first letter 'a' in the target window is at location 16\n    in the superstring. Note that the fourth instruction, \"COPY 12, 24\",\n    copies data from T itself since address 24 is position 8 in T.\n    This instruction also shows that it is fine to overlap the data to be\n    copied with the data being copied from as long as the latter starts\n    earlier. This enables efficient encoding of periodic sequences,\n    i.e., sequences with regularly repeated subsequences. The RUN instruction\n    is a compact way to encode a sequence repeating the same byte even though\n    such a sequence can be thought of as a periodic sequence with period 1.\n\n    To reconstruct the target window, one simply processes one delta\n    instruction at a time and copy the data either from the source window\n    or the being reconstructed target window based on the type of the\n    instruction and the associated address, if any.\n\n\n4.  DELTA FILE ORGANIZATION\n\n    A Vcdiff delta file starts with a Header section followed by a sequence\n    of Window sections. The Header section includes magic bytes to identify\n    the file type, and information concerning data processing beyond the\n    basic encoding format. The Window sections encode the target windows.\n\n    Below is the overall organization of a delta file. The indented items\n    refine the ones immediately above them. An item in square brackets may\n    or may not be present in the file depending on the information encoded\n    in the Indicator byte above it.\n\n        Header\n\t    Header1                                  - byte\n\t    Header2                                  - byte\n\t    Header3                                  - byte\n\t    Header4                                  - byte\n\t    Hdr_Indicator                            - byte\n\t    [Secondary compressor ID]                - byte\n\n[@@@ Why is compressor ID not an integer? ]\n[@@@ If we aren't defining any secondary compressors yet, then it seems\nthat defining the [Secondary compressor ID] and the corresponding\nVCD_DECOMPRESS Hdr_Indicator bit in this draft has no real value.  An\nimplementation of this specification won't be able to decode a VCDIFF\nencoded with this option if it doesn't know about any secondary\ncompressors.  It seems that you should specify the bits related to\nsecondary compressors once you have defined the first a secondary\ncompressor.  I can imagine a secondary-compressor might want to supply\nextra information, such as a dictionary of some kind, in which case\nthis speculative treatment wouldn't go far enough.]\n\n\t    [Length of code table data]              - integer\n\t    [Code table data]\n\t      \tSize of near cache                   - byte\n\t        Size of same cache                   - byte\n\t        Compressed code table data\n\tWindow1\n\t    Win_Indicator                            - byte\n\t    [Source segment size]                    - integer\n\t    [Source segment position]                - integer\n            The delta encoding of the target window\n\t        Length of the delta encoding         - integer\n\t        The delta encoding\n\t            Size of the target window        - integer\n\t            Delta_Indicator                  - byte\n\t            Length of data for ADDs and RUNs - integer\n\t            Length of instructions and sizes - integer\n\t            Length of addresses for COPYs    - integer\n\t            Data section for ADDs and RUNs   - array of bytes\n\t            Instructions and sizes section   - array of bytes\n\t            Addresses section for COPYs      - array of bytes\n\tWindow2\n\t...\n\n\n\n4.1 The Header Section\n\n    Each delta file starts with a header section organized as below.\n    Note the convention that square-brackets enclose optional items.\n\n\t    Header1                                  - byte = 0xE6\n\t    Header2                                  - byte = 0xD3\n\t    Header3                                  - byte = 0xD4\n\nHMMM\n\n0xD6\n0xC3\n0xC4\n\n\t    Header4                                  - byte\n\t    Hdr_Indicator                            - byte\n\t    [Secondary compressor ID]                - byte\n\t    [Length of code table data]              - integer\n\t    [Code table data]\n\n    The first three Header bytes are the ASCII characters 'V', 'C' and 'D'\n    with their most significant bits turned on (in hexadecimal, the values\n    are 0xE6, 0xD3, and 0xD4). The fourth Header byte is currently set to\n    zero. In the future, it might be used to indicate the version of Vcdiff.\n\n    The Hdr_Indicator byte shows if there are any initialization data\n    required to aid in the reconstruction of data in the Window sections.\n    This byte MAY have non-zero values for either, both, or neither of\n    the two bits VCD_DECOMPRESS and VCD_CODETABLE below:\n\n\t    7 6 5 4 3 2 1 0\n\t   +-+-+-+-+-+-+-+-+\n\t   | | | | | | | | |\n\t   +-+-+-+-+-+-+-+-+\n\t                ^ ^\n\t                | |\n\t                | +-- VCD_DECOMPRESS\n\t                +---- VCD_CODETABLE\n\n    If bit 0 (VCD_DECOMPRESS) is non-zero, this indicates that a secondary\n    compressor may have been used to further compress certain parts of the\n    delta encoding data as described in Sections 4.3 and 6. In that case,\n    the ID of the secondary compressor is given next. If this bit is zero,\n    the compressor ID byte is not included.\n\n[@@@ If we aren't defining any secondary compressors yet, then it seems\nthis bit has no real value yet..]\n\n    If bit 1 (VCD_CODETABLE) is non-zero, this indicates that an\n    application-defined code table is to be used for decoding the delta\n    instructions. This table itself is compressed.  The length of the data\n    comprising this compressed code table and the data follow next. Section 7\n    discusses application-defined code tables.  If this bit is zero, the code\n    table data length and the code table data are not included.\n\n    If both bits are set, then the compressor ID byte is included\n    before the code table data length and the code table data.\n\n\n4.2 The Format of a Window Section\n\n    Each Window section is organized as follows:\n\n\t    Win_Indicator                            - byte\n\t    [Source segment length]                  - integer\n\t    [Source segment position]                - integer\n            The delta encoding of the target window\n\n\n    Below are the detail of the various items:\n\n[@@@ Here, I want to replace the Win_Indicator with a source-count,\nfollowed by source-count length/position pairs?]\n\n        Win_Indicator:\n\t    This byte is a set of bits, as shown:\n\n\t    7 6 5 4 3 2 1 0\n\t   +-+-+-+-+-+-+-+-+\n\t   | | | | | | | | |\n\t   +-+-+-+-+-+-+-+-+\n\t                ^ ^\n\t                | |\n\t                | +-- VCD_SOURCE\n\t                +---- VCD_TARGET\n\n\n\t    If bit 0 (VCD_SOURCE) is non-zero, this indicates that a segment\n            of data from the \"source\" file was used as the corresponding\n            source window of data to encode the target window. The decoder\n\t    will use this same source data segment to decode the target window.\n\n\t    If bit 1 (VCD_TARGET) is non-zero, this indicates that a segment\n            of data from the \"target\" file was used as the corresponding\n\t    source window of data to encode the target window. As above, this\n\t    same source data segment is used to decode the target window.\n\n\t    The Win_Indicator byte MUST NOT have more than one of the bits\n\t    set (non-zero).  It MAY have none of these bits set.\n\n\t    If one of these bits is set, the byte is followed by two\n            integers to indicate respectively the length and position of\n            the source data segment in the relevant file.  If the\n            indicator byte is zero, the target window was compressed\n            by itself without comparing against another data segment,\n            and these two integers are not included.\n\n        The delta encoding of the target window:\n            This contains the delta encoding of the target window either\n            in terms of the source data segment (i.e., VCD_SOURCE\n            or VCD_TARGET was set) or by itself if no source window\n            is specified. This data format is discussed next.\n\n\n4.3 The Delta Encoding of a Target Window\n\n    The delta encoding of a target window is organized as follows:\n\n\tLength of the delta encoding            - integer\n\tThe delta encoding\n\t    Length of the target window         - integer\n\t    Delta_Indicator                     - byte\n\t    Length of data for ADDs and RUNs    - integer\n\t    Length of instructions section      - integer\n\t    Length of addresses for COPYs       - integer\n\t    Data section for ADDs and RUNs      - array of bytes\n\t    Instructions and sizes section      - array of bytes\n\t    Addresses section for COPYs         - array of bytes\n\n\n\tLength of the delta encoding:\n\t    This integer gives the total number of remaining bytes that\n\t    comprise data of the delta encoding for this target window.\n\n        The delta encoding:\n\t    This contains the data representing the delta encoding which\n\t    is described next.\n\n    \tLength of the target window:\n\t    This integer indicates the actual size of the target window\n            after decompression. A decoder can use this value to allocate\n            memory to store the uncompressed data.\n\n\tDelta_Indicator:\n\t    This byte is a set of bits, as shown:\n\n\t    7 6 5 4 3 2 1 0\n\t   +-+-+-+-+-+-+-+-+\n\t   | | | | | | | | |\n\t   +-+-+-+-+-+-+-+-+\n\t              ^ ^ ^\n\t              | | |\n\t              | | +-- VCD_DATACOMP\n\t              | +---- VCD_INSTCOMP\n\t              +------ VCD_ADDRCOMP\n\n\t\tVCD_DATACOMP:\tbit value 1.\n\t\tVCD_INSTCOMP:\tbit value 2.\n\t\tVCD_ADDRCOMP:\tbit value 4.\n\n            As discussed, the delta encoding consists of COPY, ADD and RUN\n            instructions. The ADD and RUN instructions have accompanying\n            unmatched data (that is, data that does not specifically match\n            any data in the source window or in some earlier part of the\n            target window) and the COPY instructions have addresses of where\n\t    the matches occur. OPTIONALLY, these types of data MAY be further\n\t    compressed using a secondary compressor. Thus, Vcdiff separates\n            the encoding of the delta instructions into three parts:\n\n\t        a. The unmatched data in the ADD and RUN instructions,\n\t        b. The delta instructions and accompanying sizes, and\n                c. The addresses of the COPY instructions.\n\n            If the bit VCD_DECOMPRESS (Section 4.1) was on, each of these\n            sections may have been compressed using the specified secondary\n            compressor. The bit positions 0 (VCD_DATACOMP), 1 (VCD_INSTCOMP),\n            and 2 (VCD_ADDRCOMP) respectively indicate, if non-zero, that\n            the corresponding parts are compressed. Then, these parts MUST\n\t    be decompressed before decoding the delta instructions.\n\n\tLength of data for ADDs and RUNs:\n\t    This is the length (in bytes) of the section of data storing\n            the unmatched data accompanying the ADD and RUN instructions.\n\n\tLength of instructions section:\n\t    This is the length (in bytes) of the delta instructions and\n            accompanying sizes.\n\n\tLength of addresses for COPYs:\n\t    This is the length (in bytes) of the section storing\n            the addresses of the COPY instructions.\n\n    \tData section for ADDs and RUNs:\n\t    This sequence of bytes encodes the unmatched data for the ADD\n            and RUN instructions.\n\n\tInstructions and sizes section:\n\t    This sequence of bytes encodes the instructions and their sizes.\n\n\tAddresses section for COPYs:\n\t    This sequence of bytes encodes the addresses of the COPY\n\t    instructions.\n\n\n5. DELTA INSTRUCTION ENCODING\n\n    The delta instructions described in Section 3 represent the results of\n    string matching. For many data differencing applications in which the\n    changes between source and target data are small, any straightforward\n    representation of these instructions would be adequate.  However, for\n    applications including data compression, it is important to encode\n    these instructions well to achieve good compression rates.  From our\n    experience, the following observations can be made:\n\n    a. The addresses in COPY instructions are locations of matches and\n       often occur close by or even exactly equal to one another. This is\n       because data in local regions are often replicated with minor changes.\n       In turn, this means that coding a newly matched address against some\n       set of recently matched addresses can be beneficial.\n\n    b. The matches are often short in length and separated by small amounts\n       of unmatched data. That is, the lengths of COPY and ADD instructions\n       are often small. This is particularly true of binary data such as\n       executable files or structured data such as HTML or XML. In such cases,\n       compression can be improved by combining the encoding of the sizes\n       and the instruction types as well as combining the encoding of adjacent\n       delta instructions with sufficiently small data sizes.\n\n    The below subsections discuss how the Vcdiff data format provides\n    mechanisms enabling encoders to use the above observations to improve\n    compression rates.\n\n\n5.1 Address Encoding Modes of COPY Instructions\n\n    As mentioned earlier, addresses of COPY instructions often occur close\n    to one another or are exactly equal. To take advantage of this phenomenon\n    and encode addresses of COPY instructions more efficiently, the Vcdiff\n    data format supports the use of two different types of address caches.\n    Both the encoder and decoder maintain these caches, so that decoder's\n    caches remain synchronized with the encoder's caches.\n\n    a. A \"near\" cache is an array with \"s_near\" slots, each containing an\n       address used for encoding addresses nearby to previously encoded\n       addresses (in the positive direction only).  The near cache also\n       maintains a \"next_slot\" index to the near cache.  New entries to the\n       near cache are always inserted in the next_slot index, which maintains\n       a circular buffer of the s_near most recent addresses.\n\n    b. A \"same\" cache is an array with \"s_same\" multiple of 256 slots, each\n       containing an address.  The same cache maintains a hash table of recent\n       addresses used for repeated encoding of the exact same address.\n\n\n    By default, the parameters s_near and s_same are respectively set to 4\n    and 3. An encoder MAY modify these values, but then it MUST encode the\n    new values in the encoding itself, as discussed in Section 7, so that\n    the decoder can properly set up its own caches.\n\n    At the start of processing a target window, an implementation\n    (encoder or decoder) initializes all of the slots in both caches\n    to zero.  The next_slot pointer of the near cache is set\n    to point to slot zero.\n\n    Each time a COPY instruction is processed by the encoder or\n    decoder, the implementation's caches are updated as follows, where\n    \"addr\" is the address in the COPY instruction.\n\n    a. The slot in the near cache referenced by the next_slot\n       index is set to addr.  The next_slot index is then incremented\n       modulo s_near.\n\n    b. The slot in the same cache whose index is addr%(s_same*256)\n       is set to addr. [We use the C notations of % for modulo and\n       * for multiplication.]\n\n\n5.2 Example code for maintaining caches\n\n    To make clear the above description, below are example cache data\n    structures and algorithms to initialize and update them:\n\n        typedef struct _cache_s\n        {\n\t    int*  near;      /* array of size s_near        */\n            int   s_near;\n            int   next_slot; /* the circular index for near */\n            int*  same;      /* array of size s_same*256    */\n            int   s_same;\n        } Cache_t;\n\n        cache_init(Cache_t* ka)\n        {\n\t    int   i;\n\n            ka->next_slot = 0;\n            for(i = 0; i < ka->s_near; ++i)\n                 ka->near[i] = 0;\n\n            for(i = 0; i < ka->s_same*256; ++i)\n                 ka->same[i] = 0;\n        }\n\n        cache_update(Cache_t* ka, int addr)\n        {\n\t    if(ka->s_near > 0)\n            {   ka->near[ka->next_slot] = addr;\n                ka->next_slot = (ka->next_slot + 1) % ka->s_near;\n            }\n\n            if(ka->s_same > 0)\n                ka->same[addr % (ka->s_same*256)] = addr;\n        }\n\n\n5.3 Encoding of COPY instruction addresses\n\n    The address of a COPY instruction is encoded using different modes\n    depending on the type of cached address used, if any.\n\n    Let \"addr\" be the address of a COPY instruction to be decoded and \"here\"\n    be the current location in the target data (i.e., the start of the data\n    about to be encoded or decoded).  Let near[j] be the jth element in\n    the near cache, and same[k] be the kth element in the same cache.\n    Below are the possible address modes:\n\n\tVCD_SELF: This mode has value 0. The address was encoded by itself\n            as an integer.\n\n\tVCD_HERE: This mode has value 1. The address was encoded as\n\t    the integer value \"here - addr\".\n\n\tNear modes: The \"near modes\" are in the range [2,s_near+1]. Let m\n\t    be the mode of the address encoding. The address was encoded\n\t    as the integer value \"addr - near[m-2]\".\n\n\tSame modes: The \"same modes\" are in the range\n\t    [s_near+2,s_near+s_same+1]. Let m be the mode of the encoding.\n\t    The address was encoded as a single byte b such that\n\t    \"addr == same[(m - (s_near+2))*256 + b]\".\n\n\n5.3 Example code for encoding and decoding of COPY instruction addresses\n\n    We show example algorithms below to demonstrate use of address modes more\n    clearly. The encoder has freedom to choose address modes, the sample\n    addr_encode() algorithm merely shows one way of picking the address\n    mode. The decoding algorithm addr_decode() will uniquely decode addresses\n    regardless of the encoder's algorithm choice.\n\n    Note that the address caches are updated immediately after an address is\n    encoded or decoded. In this way, the decoder is always synchronized with\n    the encoder.\n\n        int addr_encode(Cache_t* ka, int addr, int here, int* mode)\n        {\n\t    int  i, d, bestd, bestm;\n\n\t    /* Attempt to find the address mode that yields the\n\t     * smallest integer value for \"d\", the encoded address\n\t     * value, thereby minimizing the encoded size of the\n\t     * address. */\n\n            bestd = addr; bestm = VCD_SELF;      /* VCD_SELF == 0 */\n\n            if((d = here-addr) < bestd)\n                { bestd = d; bestm = VCD_HERE; } /* VCD_HERE == 1 */\n\n            for(i = 0; i < ka->s_near; ++i)\n                if((d = addr - ka->near[i]) >= 0 && d < bestd)\n                    { bestd = d; bestm = i+2; }\n\n            if(ka->s_same > 0 && ka->same[d = addr%(ka->s_same*256)] == addr)\n                { bestd = d%256; bestm = ka->s_near + 2 + d/256; }\n\n            cache_update(ka,addr);\n\n            *mode = bestm; /* this returns the address encoding mode */\n            return  bestd; /* this returns the encoded address       */\n        }\n\n    Note that the addr_encode() algorithm chooses the best address mode using a\n    local optimization, but that may not lead to the best encoding efficiency\n    because different modes lead to different instruction encodings, as    described below.\n\n    The functions addrint() and addrbyte() used in addr_decode() obtain from\n    the \"Addresses section for COPYs\" (Section 4.3) an integer or a byte,\n    respectively. These utilities will not be described here.  We simply\n    recall that an integer is represented as a compact variable-sized string\n    of bytes as described in Section 2 (i.e., base 128).\n\n        int addr_decode(Cache_t* ka, int here, int mode)\n        {   int  addr, m;\n\n            if(mode == VCD_SELF)\n                 addr = addrint();\n            else if(mode == VCD_HERE)\n                 addr = here - addrint();\n            else if((m = mode - 2) >= 0 && m < ka->s_near) /* near cache */\n                 addr = ka->near[m] + addrint();\n            else /* same cache */\n            {    m = mode - (2 + ka->s_near);\n                 addr = ka->same[m*256 + addrbyte()];\n            }\n\n            cache_update(ka, addr);\n\n            return addr;\n        }\n\n\n5.4 Instruction Codes\n\n    As noted, the data sizes associated with delta instructions are often\n    small. Thus, compression efficiency can be improved by combining the sizes\n    and instruction types in a single encoding, as well by combining certain\n    pairs of adjacent delta instructions. Effective choices of when to perform\n    such combinations depend on many factors including the data being processed\n    and the string matching algorithm in use. For example, if many COPY\n    instructions have the same data sizes, it may be worth to encode these\n    instructions more compactly than others.\n\n    The Vcdiff data format is designed so that a decoder does not need to be\n    aware of the choices made in encoding algorithms. This is achieved with the\n    notion of an \"instruction code table\" containing 256 entries. Each entry\n    defines either a single delta instruction or a pair of instructions that\n    have been combined.  Note that the code table itself only exists in main\n    memory, not in the delta file (unless using an application-defined code\n    table, described in Section 7). The encoded data simply includes the index\n    of each instruction and, since there are only 256 indices, each index\n    can be represented as a single byte.\n\n    Each instruction code entry contains six fields, each of which\n    is a single byte with unsigned value:\n\n            +-----------------------------------------------+\n\t    | inst1 | size1 | mode1 | inst2 | size2 | mode2 |\n\t    +-----------------------------------------------+\n\n@@@ could be more compact\n\n    Each triple (inst,size,mode) defines a delta instruction. The meanings\n    of these fields are as follows:\n\n    inst: An \"inst\" field can have one of the four values: NOOP (0), ADD (1),\n\tRUN (2) or COPY (3) to indicate the instruction types. NOOP means\n\tthat no instruction is specified. In this case, both the corresponding\n\tsize and mode fields will be zero.\n\n    size: A \"size\" field is zero or positive. A value zero means that the\n\tsize associated with the instruction is encoded separately as\n\tan integer in the \"Instructions and sizes section\" (Section 6).\n\tA positive value for \"size\" defines the actual data size.\n\tNote that since the size is restricted to a byte, the maximum\n\tvalue for any instruction with size implicitly defined in the code\n\ttable is 255.\n\n    mode: A \"mode\" field is significant only when the associated delta\n\tinstruction is a COPY. It defines the mode used to encode the\n\tassociated addresses. For other instructions, this is always zero.\n\n\n5.5 The Code Table\n\n    Following the discussions on address modes and instruction code tables,\n    we define a \"Code Table\" to have the data below:\n\n\ts_near: the size of the near cache,\n\ts_same: the size of the same cache,\n\ti_code: the 256-entry instruction code table.\n\n    Vcdiff itself defines a \"default code table\" in which s_near is 4\n    and s_same is 3. Thus, there are 9 address modes for a COPY instruction.\n    The first two are VCD_SELF (0) and VCD_HERE (1). Modes 2, 3, 4 and 5\n    are for addresses coded against the near cache. And, modes 6, 7  and 8\n    are for addresses coded against the same cache.\n\n    The default instruction code table is depicted below, in a compact\n    representation that we use only for descriptive purposes.  See section 7\n    for the specification of how an instruction code table is represented\n    in the Vcdiff encoding format.  In the depiction, a zero value for\n    size indicates that the size is separately coded. The mode of non-COPY\n    instructions is represented as 0 even though they are not used.\n\n\n         TYPE      SIZE     MODE    TYPE     SIZE     MODE     INDEX\n        ---------------------------------------------------------------\n     1.  RUN         0        0     NOOP       0        0        0\n     2.  ADD    0, [1,17]     0     NOOP       0        0      [1,18]\n     3.  COPY   0, [4,18]     0     NOOP       0        0     [19,34]\n     4.  COPY   0, [4,18]     1     NOOP       0        0     [35,50]\n     5.  COPY   0, [4,18]     2     NOOP       0        0     [51,66]\n     6.  COPY   0, [4,18]     3     NOOP       0        0     [67,82]\n     7.  COPY   0, [4,18]     4     NOOP       0        0     [83,98]\n     8.  COPY   0, [4,18]     5     NOOP       0        0     [99,114]\n     9.  COPY   0, [4,18]     6     NOOP       0        0    [115,130]\n    10.  COPY   0, [4,18]     7     NOOP       0        0    [131,146]\n    11.  COPY   0, [4,18]     8     NOOP       0        0    [147,162]\n    12.  ADD       [1,4]      0     COPY     [4,6]      0    [163,174]\n    13.  ADD       [1,4]      0     COPY     [4,6]      1    [175,186]\n    14.  ADD       [1,4]      0     COPY     [4,6]      2    [187,198]\n    15.  ADD       [1,4]      0     COPY     [4,6]      3    [199,210]\n    16.  ADD       [1,4]      0     COPY     [4,6]      4    [211,222]\n    17.  ADD       [1,4]      0     COPY     [4,6]      5    [223,234]\n    18.  ADD       [1,4]      0     COPY       4        6    [235,238]\n    19.  ADD       [1,4]      0     COPY       4        7    [239,242]\n    20.  ADD       [1,4]      0     COPY       4        8    [243,246]\n    21.  COPY        4      [0,8]   ADD        1        0    [247,255]\n        ---------------------------------------------------------------\n\n    In the above depiction, each numbered line represents one or more\n    entries in the actual instruction code table (recall that an entry in\n    the instruction code table may represent up to two combined delta\n    instructions.) The last column (\"INDEX\") shows which index value or\n    range of index values of the entries covered by that line. The notation\n    [i,j] means values from i through j, inclusive. The first 6 columns of\n    a line in the depiction describe the pairs of instructions used for\n    the corresponding index value(s).\n\n    If a line in the depiction includes a column entry using the [i,j]\n    notation, this means that the line is instantiated for each value\n    in the range from i to j, inclusive.  The notation \"0, [i,j]\" means\n    that the line is instantiated for the value 0 and for each value\n    in the range from i to j, inclusive.\n\n    If a line in the depiction includes more than one entry using the [i,j]\n    notation, implying a \"nested loop\" to convert the line to a range of\n    table entries, the first such [i,j] range specifies the outer loop,\n    and the second specifies the inner loop.\n\n    The below examples should make clear the above description:\n\n    Line 1 shows the single RUN instruction with index 0. As the size field\n    is 0, this RUN instruction always has its actual size encoded separately.\n\n    Line 2 shows the 18 single ADD instructions. The ADD instruction with\n    size field 0 (i.e., the actual size is coded separately) has index 1.\n    ADD instructions with sizes from 1 to 17 use code indices 2 to 18 and\n    their sizes are as given (so they will not be separately encoded.)\n\n    Following the single ADD instructions are the single COPY instructions\n    ordered by their address encoding modes. For example, line 11 shows the\n    COPY instructions with mode 8, i.e., the last of the same cache.\n    In this case, the COPY instruction with size field 0 has index 147.\n    Again, the actual size of this instruction will be coded separately.\n\n    Lines 12 to 21 show the pairs of instructions that are combined together.\n    For example, line 12 depicts the 12 entries in which an ADD instruction\n    is combined with an immediately following COPY instruction. The entries\n    with indices 163, 164, 165 represent the pairs in which the ADD\n    instructions all have size 1 while the COPY instructions has mode\n    0 (VCD_SELF) and sizes 4, 5 and 6 respectively.\n\n    The last line, line 21, shows the eight instruction pairs where the first\n    instruction is a COPY and the second is an ADD. In this case, all COPY\n    instructions have size 4 with mode ranging from 0 to 8 and all the ADD\n    instructions have size 1. Thus, the entry with largest index 255\n    combines a COPY instruction of size 4 and mode 8 with an ADD instruction\n    of size 1.\n\n    The choice of the minimum size 4 for COPY instructions in the default code\n    table was made from experiments that showed that excluding small matches\n    (less then 4 bytes long) improved the compression rates.\n\n\n6. DECODING A TARGET WINDOW\n\n    Section 4.3 discusses that the delta instructions and associated data\n    are encoded in three arrays of bytes:\n\n        Data section for ADDs and RUNs,\n        Instructions and sizes section, and\n        Addresses section for COPYs.\n\n\n    Further, these data sections may have been further compressed by some\n    secondary compressor. Assuming that any such compressed data has been\n    decompressed so that we now have three arrays:\n\n\tinst: bytes coding the instructions and sizes.\n        data: unmatched data associated with ADDs and RUNs.\n\taddr: bytes coding the addresses of COPYs.\n\n    These arrays are organized as follows:\n\n\tinst:\n\t    a sequence of (index, [size1], [size2]) tuples, where \"index\"\n            is an index into the instruction code table, and size1 and size2\n            are integers that MAY or MAY NOT be included in the tuple as\n            follows. The entry with the given \"index\" in the instruction\n            code table potentially defines two delta instructions. If the\n            first delta instruction is not a VCD_NOOP and its size is zero,\n            then size1 MUST be present. Otherwise, size1 MUST be omitted and\n            the size of the instruction (if it is not VCD_NOOP) is as defined\n            in the table. The presence or absence of size2 is defined\n            similarly with respect to the second delta instruction.\n\n\tdata:\n\t    a sequence of data values, encoded as bytes.\n\n\taddr:\n\t    a sequence of address values. Addresses are normally encoded as\n            integers as described in Section 2 (i.e., base 128).\n\t    Since the same cache emits addresses in the range [0,255],\n\t    however, same cache addresses are always encoded as a\n\t    single byte.\n\n    To summarize, each tuple in the \"inst\" array includes an index to some\n    entry in the instruction code table that determines:\n\n    a. Whether one or two instructions were encoded and their types.\n\n    b. If the instructions have their sizes encoded separately, these\n       sizes will follow, in order, in the tuple.\n\n    c. If the instructions have accompanying data, i.e., ADDs or RUNs,\n       their data will be in the array \"data\".\n\n    d. Similarly, if the instructions are COPYs, the coded addresses are\n       found in the array \"addr\".\n\n    The decoding procedure simply processes the arrays by reading one code\n    index at a time, looking up the corresponding instruction code entry,\n    then consuming the respective sizes, data and addresses following the\n    directions in this entry. In other words, the decoder maintains an implicit\n    next-element pointer for each array; \"consuming\" an instruction tuple,\n    data, or address value implies incrementing the associated pointer.\n\n    For example, if during the processing of the target window, the next\n    unconsumed tuple in the inst array has index value 19, then the first\n    instruction is a COPY, whose size is found as the immediately following\n    integer in the inst array.  Since the mode of this COPY instruction is\n    VCD_SELF, the corresponding address is found by consuming the next\n    integer in the addr array.  The data array is left intact. As the second\n    instruction for code index 19 is a NOOP, this tuple is finished.\n\n\n7. APPLICATION-DEFINED CODE TABLES\n\n    Although the default code table used in Vcdiff is good for general\n    purpose encoders, there are times when other code tables may perform\n    better. For example, to code a file with many identical segments of data,\n    it may be advantageous to have a COPY instruction with the specific size\n    of these data segments so that the instruction can be encoded in a single\n    byte. Such a special code table MUST then be encoded in the delta file\n    so that the decoder can reconstruct it before decoding the data.\n\n    Vcdiff allows an application-defined code table to be specified\n    in a delta file with the following data:\n\n\tSize of near cache            - byte\n\tSize of same cache            - byte\n\tCompressed code table data\n\n    The \"compressed code table data\" encodes the delta between the default\n    code table (source) and the new code table (target) in the same manner as\n    described in Section 4.3 for encoding a target window in terms of a\n    source window. This delta is computed using the following steps:\n\n    a.  Convert the new instruction code table into a string, \"code\", of\n\t1536 bytes using the below steps in order:\n\n        i. Add in order the 256 bytes representing the types of the first\n\t   instructions in the instruction pairs.\n       ii. Add in order the 256 bytes representing the types of the second\n\t   instructions in the instruction pairs.\n      iii. Add in order the 256 bytes representing the sizes of the first\n\t   instructions in the instruction pairs.\n       iv. Add in order the 256 bytes representing the sizes of the second\n\t   instructions in the instruction pairs.\n        v. Add in order the 256 bytes representing the modes of the first\n\t   instructions in the instruction pairs.\n       vi. Add in order the 256 bytes representing the modes of the second\n\t   instructions in the instruction pairs.\n\n    b.  Similarly, convert the default instruction code table into\n\ta string \"dflt\".\n\n    c.  Treat the string \"code\" as a target window and \"dflt\" as the\n\tcorresponding source data and apply an encoding algorithm to\n\tcompute the delta encoding of \"code\" in terms of \"dflt\".\n\tThis computation MUST use the default code table for encoding\n\tthe delta instructions.\n\n    The decoder can then reverse the above steps to decode the compressed\n    table data using the method of Section 6, employing the default code\n    table, to generate the new code table.  Note that the decoder does not\n    need to know anything about the details of the encoding algorithm used\n    in step (c). The decoder is still able to decode the new code table\n    because the Vcdiff format is independent from the choice of encoding\n    algorithm, and because the encoder in step (c) uses the known, default\n    code table.\n\n\n8. PERFORMANCE\n\n    The encoding format is compact. For compression only, using the LZ-77\n    string parsing strategy and without any secondary compressors, the typical\n    compression rate is better than Unix compress and close to gzip.  For\n    differencing, the data format is better than all known methods in\n    terms of its stated goal, which is primarily decoding speed and\n    encoding efficiency.\n\n    We compare the performance of compress, gzip and Vcdiff using the\n    archives of three versions of the Gnu C compiler, gcc-2.95.1.tar,\n    gcc-2.95.2.tar and gcc-2.95.3.tar. The experiments were done on an\n    SGI-MIPS3, 400MHZ. Gzip was used at its default compression level.\n    Vcdiff timings were done using the Vcodex/Vcdiff software (Section 13).\n    As string and window matching typically dominates the computation during\n    compression, the Vcdiff compression times were directly due to the\n    algorithms used in the Vcodex/Vcdiff software. However, the decompression\n    times should be generic and representative of any good implementation\n    of the Vcdiff data format. Timing was done by running each program\n    three times and taking the average of the total cpu+system times.\n\n    Below are the different Vcdiff runs:\n\n\tVcdiff: vcdiff is used as compressor only.\n\n\tVcdiff-d: vcdiff is used as a differencer only. That is, it only\n\t\tcompares target data against source data.  Since the files\n\t\tinvolved are large, they are broken into windows. In this\n\t\tcase, each target window starting at some file offset in\n\t\tthe target file is compared against a source window with\n\t\tthe same file offset (in the source file). The source\n\t\twindow is also slightly larger than the target window\n\t\tto increase matching opportunities. The -d option also gives\n\t\ta hint to the string matching algorithm of Vcdiff that\n\t\tthe two files are very similar with long stretches of matches.\n\t\tThe algorithm takes advantage of this to minimize its\n\t\tprocessing of source data and save time.\n\n\tVcdiff-dc: This is similar to Vcdiff-d but vcdiff can also compare\n\t\ttarget data against target data as applicable. Thus, vcdiff\n\t\tboth computes differences and compresses data. The windowing\n\t\talgorithm is the same as above. However, the above hint is\n\t\trecinded in this case.\n\n\tVcdiff-dcs: This is similar to Vcdiff-dc but the windowing algorithm\n\t\tuses a content-based heuristic to select source data segments\n\t\tthat are more likely to match with a given target window.\n\t\tThus, the source data segment selected for a target window\n\t\toften will not be aligned with the file offsets of this\n\t\ttarget window.\n\n\n                gcc-2.95.1    gcc-2.95.2    compression   decompression\n    raw size      55746560      55797760\n    compress         -          19939390       13.85s\t      7.09s\n    gzip             -          12973443       42.99s         5.35s\n    Vcdiff           -          15358786       20.04s         4.65s\n    Vcdiff-d         -            100971       10.93s         1.92s\n    Vcdiff-dc        -             97246       20.03s         1.84s\n    Vcdiff-dcs       -            256445       44.81s         1.84s\n\n\t\tTABLE 1. Compressing gcc-2.95.2.tar given gcc-2.95.1\n\n\n    TABLE 1 shows the raw sizes of gcc-2.95.1.tar and gcc-2.95.2.tar and the\n    sizes of the compressed results. As a pure compressor, the compression\n    rate for Vcdiff is worse than gzip and better than compress. The last\n    three rows shows that when two file versions are very similar, differencing\n    can have dramatically good compression rates. Vcdiff-d and Vcdiff-dc use\n    the same simple window selection method but Vcdiff-dc also does compression\n    so its output is slightly smaller. Vcdiff-dcs uses a heuristic based on\n    data content to search for source data that likely will match a given target\n    window. Although it does a good job, the heuristic did not always find the\n    best matches which are given by the simple algorithm of Vcdiff-d.  As a\n    result, the output size is slightly larger. Note also that there is a large\n    cost in computing matching windows this way. Finally, the compression times\n    of Vcdiff-d is nearly half of that of Vcdiff-dc. It is tempting to conclude\n    that the compression feature causes the additional time in Vcdiff-dc\n    relative to Vcdiff-d.  However, this is not the case. The hint given to\n    the Vcdiff string matching algorithm that the two files are likely to\n    have very long stretches of matches helps the algorithm to minimize\n    processing of the \"source data\", thus saving half the time. However, as we\n    shall see below when this hint is wrong, the result is even longer time.\n\n\n                gcc-2.95.2    gcc-2.95.3    compression   decompression\n    raw size      55797760      55787520\n    compress         -          19939453       13.54s\t      7.00s\n    gzip             -          12998097       42.63s         5.62s\n    Vcdiff           -          15371737       20.09s         4.74s\n    Vcdiff-d         -          26383849       71.41s         6.41s\n    Vcdiff-dc        -          14461203       42.48s         4.82s\n    Vcdiff-dcs       -           1248543       61.18s         1.99s\n\n\t\tTABLE 2. Compressing gcc-2.95.3.tar given gcc-2.95.2\n\n\n    TABLE 2 shows the raw sizes of gcc-2.95.2.tar and gcc-2.95.3.tar and\n    the sizes of the compressed results. In this case, the tar file of\n    gcc-2.95.3 is rearranged in a way that makes the straightforward method\n    of matching file offsets for source and target windows fail. As a\n    result, Vcdiff-d performs rather dismally both in time and output size.\n    The large time for Vcdiff-d is directly due to fact that the string\n    matching algorithm has to work much harder to find matches when the hint\n    that two files have long matching stretches fails to hold. On the other\n    hand, Vcdiff-dc does both differencing and compression resulting in good\n    output size. Finally, the window searching heuristic used in Vcdiff-dcs is\n    effective in finding the right matching source windows for target windows\n    resulting a small output size. This shows why the data format needs to\n    have a way to specify matching windows to gain performance. Finally,\n    we note that the decoding times are always good regardless of how\n    the string matching or window searching algorithms perform.\n\n\n9. FURTHER ISSUES\n\n    This document does not address a few issues:\n\n    Secondary compressors:\n        As discussed in Section 4.3, certain sections in the delta encoding\n\tof a window may be further compressed by a secondary compressor.\n\tIn our experience, the basic Vcdiff format is adequate for most\n\tpurposes so that secondary compressors are seldom needed. In\n        particular, for normal use of data differencing where the files to\n\tbe compared have long stretches of matches, much of the gain in\n\tcompression rate is already achieved by normal string matching.\n\tThus, the use of secondary compressors is seldom needed in this case.\n\tHowever, for applications beyond differencing of such nearly identical\n\tfiles, secondary compressors may be needed to achieve maximal\n\tcompressed results.\n\n        Therefore, we recommend to leave the Vcdiff data format defined\n\tas in this document so that the use of secondary compressors\n \tcan be implemented when they become needed in the future.\n        The formats of the compressed data via such compressors or any\n\tcompressors that may be defined in the future are left open to\n\ttheir implementations.  These could include Huffman encoding,\n\tarithmetic encoding, and splay tree encoding [8,9].\n\n    Large file system vs. small file system:\n\tAs discussed in Section 4, a target window in a large file may be\n\tcompared against some source window in another file or in the same\n\tfile (from some earlier part). In that case, the file offset of the\n\tsource window is specified as a variable-sized integer in the delta\n\tencoding. There is a possibility that the encoding was computed on\n\ta system supporting much larger files than in a system where\n\tthe data may be decoded (e.g., 64-bit file systems vs. 32-bit file\n\tsystems). In that case, some target data may not be recoverable.\n\tThis problem could afflict any compression format, and ought\n\tto be resolved with a generic negotiation mechanism in the\n\tappropriate protocol(s).\n\n\n10.  SUMMARY\n\n    We have described Vcdiff, a general and portable encoding format for\n    compression and differencing. The format is good in that it allows\n    implementing a decoder without knowledge of the encoders. Further,\n    ignoring the use of secondary compressors not defined within the format,\n    the decoding algorithms runs in linear time and requires working space\n    proportional to window sizes.\n\n\n\n11. ACKNOWLEDGEMENTS\n\n    Thanks are due to Balachander Krishnamurthy, Jeff Mogul and Arthur Van Hoff\n    who provided much encouragement to publicize Vcdiff. In particular, Jeff\n    helped clarifying the description of the data format presented here.\n\n\n\n12. SECURITY CONSIDERATIONS\n\n    Vcdiff only provides a format to encode compressed and differenced data.\n    It does not address any issues concerning how such data are, in fact,\n    stored in a given file system or the run-time memory of a computer system.\n    Therefore, we do not anticipate any security issues with respect to Vcdiff.\n\n\n\n13. SOURCE CODE AVAILABILITY\n\n    Vcdiff is implemented as a data transforming method in Phong Vo's\n    Vcodex library. AT&T Corp. has made the source code for Vcodex available\n    for anyone to use to transmit data via HTTP/1.1 Delta Encoding [10,11].\n    The source code and according license is accessible at the below URL:\n\n          http://www.research.att.com/sw/tools\n\n\n14. INTELLECTUAL PROPERTY RIGHTS\n\n   The IETF has been notified of intellectual property rights claimed in\n   regard to some or all of the specification contained in this\n   document.  For more information consult the online list of claimed\n   rights, at <http://www.ietf.org/ipr.html>.\n\n   The IETF takes no position regarding the validity or scope of any\n   intellectual property or other rights that might be claimed to\n   pertain to the implementation or use of the technology described in\n   this document or the extent to which any license under such rights\n   might or might not be available; neither does it represent that it\n   has made any effort to identify any such rights.  Information on the\n   IETF's procedures with respect to rights in standards-track and\n   standards-related documentation can be found in BCP-11.  Copies of\n   claims of rights made available for publication and any assurances of\n   licenses to be made available, or the result of an attempt made to\n   obtain a general license or permission for the use of such\n   proprietary rights by implementors or users of this specification can\n   be obtained from the IETF Secretariat.\n\n\n\n15. IANA CONSIDERATIONS\n\n   The Internet Assigned Numbers Authority (IANA) administers the number\n   space for Secondary Compressor ID values.  Values and their meaning\n   must be documented in an RFC or other peer-reviewed, permanent, and\n   readily available reference, in sufficient detail so that\n   interoperability between independent implementations is possible.\n   Subject to these constraints, name assignments are First Come, First\n   Served - see RFC2434 [13].  Legal ID values are in the range 1..255.\n\n   This document does not define any values in this number space.\n\n\n16. REFERENCES\n\n    [1] D.G. Korn and K.P. Vo, Vdelta: Differencing and Compression,\n        Practical Reusable Unix Software, Editor B. Krishnamurthy,\n        John Wiley & Sons, Inc., 1995.\n\n    [2] J. Ziv and A. Lempel, A Universal Algorithm for Sequential Data\n        Compression, IEEE Trans. on Information Theory, 23(3):337-343, 1977.\n\n    [3] W. Tichy, The String-to-String Correction Problem with Block Moves,\n        ACM Transactions on Computer Systems, 2(4):309-321, November 1984.\n\n    [4] E.M. McCreight, A Space-Economical Suffix Tree Construction\n        Algorithm, Journal of the ACM, 23:262-272, 1976.\n\n    [5] J.J. Hunt, K.P. Vo, W. Tichy, An Empirical Study of Delta Algorithms,\n        IEEE Software Configuration and Maintenance Workshop, 1996.\n\n    [6] J.J. Hunt, K.P. Vo, W. Tichy, Delta Algorithms: An Empirical Analysis,\n        ACM Trans. on Software Engineering and Methodology, 7:192-214, 1998.\n\n    [7] D.G. Korn, K.P. Vo, Sfio: A buffered I/O Library,\n        Proc. of the Summer '91 Usenix Conference, 1991.\n\n    [8] D. W. Jones, Application of Splay Trees to Data Compression,\n        CACM, 31(8):996:1007.\n\n    [9] M. Nelson, J. Gailly, The Data Compression Book, ISBN 1-55851-434-1,\n        M&T Books, New York, NY, 1995.\n\n   [10] J.C. Mogul, F. Douglis, A. Feldmann, and B. Krishnamurthy,\n        Potential benefits of delta encoding and data compression for HTTP,\n        SIGCOMM '97, Cannes, France, 1997.\n\n   [11] J.C. Mogul, B. Krishnamurthy, F. Douglis, A. Feldmann,\n        Y. Goland, and A. Van Hoff, Delta Encoding in HTTP,\n        IETF, draft-mogul-http-delta-10, 2001.\n\n   [12] S. Bradner, Key words for use in RFCs to Indicate Requirement Levels,\n        RFC 2119, March 1997.\n\n   [13] T. Narten, H. Alvestrand, Guidelines for Writing an IANA\n        Considerations Section in RFCs, RFC2434, October 1998.\n\n\n\n17. AUTHOR'S ADDRESS\n\n    Kiem-Phong Vo (main contact)\n    AT&T Labs, Room D223\n    180 Park Avenue\n    Florham Park, NJ 07932\n    Email: kpv@research.att.com\n    Phone: 1 973 360 8630\n\n    David G. Korn\n    AT&T Labs, Room D237\n    180 Park Avenue\n    Florham Park, NJ 07932\n    Email: dgk@research.att.com\n    Phone: 1 973 360 8602\n\n    Jeffrey C. Mogul\n    Western Research Laboratory\n    Compaq Computer Corporation\n    250 University Avenue\n    Palo Alto, California, 94305, U.S.A.\n    Email: JeffMogul@acm.org\n    Phone: 1 650 617 3304 (email preferred)\n\n    Joshua P. MacDonald\n    Computer Science Division\n    University of California, Berkeley\n    345 Soda Hall\n    Berkeley, CA 94720\n    Email: jmacd@cs.berkeley.edu\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/Makefile",
    "content": "CFLAGS = -g -Wall -I.. -DXD3_DEBUG=1 -DNDEBUG=0 -DSIZEOF_SIZE_T=8 -DSIZEOF_UNSIGNED_LONG_LONG=8\n#CFLAGS = -O3 -Wall -I.. -DXD3_DEBUG=0 -fno-builtin -DNDEBUG=1\n# -pg\n\nSOURCES = small_page_test.c encode_decode_test.c speed_test.c\n\nDEPS = ../*.h ../*.c *.h\n\nTARGETS = small_page_test encode_decode_test speed_test32 speed_test64 compare_test checksum_test\n\nall: $(TARGETS)\n\nsmall_page_test: small_page_test.c $(DEPS)\n\t$(CC) $(CFLAGS) small_page_test.c -o small_page_test -DXD3_USE_LARGEFILE64=0 -DSECONDARY_DJW=1\n\nencode_decode_test: encode_decode_test.c $(DEPS)\n\t$(CC) $(CFLAGS) encode_decode_test.c -o encode_decode_test\n\nspeed_test32: speed_test.c $(DEPS)\n\t$(CC) $(CFLAGS) -DXD3_USE_LARGEFILE64=0 speed_test.c -o speed_test32\n\nspeed_test64: speed_test.c $(DEPS)\n\t$(CC) $(CFLAGS) -DXD3_USE_LARGEFILE64=1 speed_test.c -o speed_test64\n\ncompare_test: compare_test.c\n\t$(CC) $(CFLAGS) compare_test.c -o compare_test\n\nchecksum_test: checksum_test.cc\n\t$(CXX) $(CFLAGS) checksum_test.cc -o checksum_test\n\nclean:\n\trm -r -f *.exe *.stackdump $(TARGETS) *.dSYM *~\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/README.md",
    "content": "Files in this directory demonstrate how to use the Xdelta3 API.  Copyrights\nare held by the respective authors.\n\nsmall_page_test.c -- how to use xdelta3 in an environment such as the kernel\nfor small pages with little memory\n\nencode_decode_test.c -- how to use xdelta3 to process (encode/decode) data in\nmultiple windows with the non-blocking API\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/compare_test.c",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#include <string.h>\n#include <assert.h>\n\n#include \"xdelta3.h\"\n\n#define NUM (1<<20)\n#define ITERS 100\n\n/* From wikipedia on RDTSC */\ninline uint64_t rdtsc() {\n  uint32_t lo, hi;\n  asm volatile (\"rdtsc\" : \"=a\" (lo), \"=d\" (hi));\n  return (uint64_t)hi << 32 | lo;\n}\n\ntypedef int (*test_func)(const char *s1, const char *s2, int n);\n\nvoid run_test(const char *buf1, const char *buf2,\n\t      const char *name, test_func func) {\n  uint64_t start, end;\n  uint64_t accum = 0;\n  int i, x;\n\n  for (i = 0; i < ITERS; i++) {\n    start = rdtsc();\n    x = func(buf1, buf2, NUM);\n    end = rdtsc();\n    accum += end - start;\n    assert(x == NUM - 1);\n  }\n\n  accum /= ITERS;\n\n  printf(\"%s : %qu cycles\\n\", name, accum);\n}\n\n/* Build w/ -fno-builtin for this to be fast, this assumes that there\n * is a difference at s1[n-1] */\nint memcmp_fake(const char *s1, const char *s2, int n) {\n  int x = memcmp(s1, s2, n);\n  return x < 0 ? n - 1 : n + 1;\n}\n\n#define UNALIGNED_OK 1\nstatic inline int\ntest2(const char *s1c, const char *s2c, int n)\n{\n  int i = 0;\n#if UNALIGNED_OK\n  int nint = n / sizeof(int);\n\n  if (nint >> 3)\n    {\n      int j = 0;\n      const int *s1 = (const int*)s1c;\n      const int *s2 = (const int*)s2c;\n      int nint_8 = nint - 8;\n\n      while (i <= nint_8 &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\t \n\t     s1[i++] == s2[j++]) { }\n\n      i = (i - 1) * sizeof(int);\n    }\n#endif\n\n  while (i < n && s1c[i] == s2c[i])\n    {\n      i++;\n    }\n  return i;\n}\n\nstatic inline int\ntest1(const char *s1c, const char *s2c, int n) {\n  int i = 0;\n  while (i < n && s1c[i] == s2c[i])\n    {\n      i++;\n    }\n  return i;\n}\n\nint main(/*int argc, char **argv*/) {\n  char *buf1 = malloc(NUM+1);\n  char *buf2 = malloc(NUM+1);\n  int i;\n\n  for (i = 0; i < NUM; i++) {\n    buf1[i] = buf2[i] = rand();\n  }\n\n  buf2[NUM-1]++;\n\n  printf (\"ALIGNED\\n\");\n\n  run_test(buf1, buf2, \"memcmp\", &memcmp_fake);\n  run_test(buf1, buf2, \"test1\", &test1);\n  run_test(buf1, buf2, \"test2\", &test2);\n\n  for (i = 0; i < NUM; i++) {\n    buf1[i] = buf2[i+1] = rand();\n  }\n\n  buf2[NUM]++;\n\n  printf (\"UNALIGNED\\n\");\n\n  run_test(buf1, buf2+1, \"memcmp\", &memcmp_fake);\n  run_test(buf1, buf2+1, \"test1\", &test1);\n  run_test(buf1, buf2+1, \"test2\", &test2);\n\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/encode_decode_test.c",
    "content": "// Permission to distribute this example by\n// Copyright (C) 2007 Ralf Junker\n// Ralf Junker <delphi@yunqa.de>\n// http://www.yunqa.de/delphi/\n\n//---------------------------------------------------------------------------\n\n#include <stdio.h>\n#include <sys/stat.h>\n#include \"xdelta3.h\"\n#include \"xdelta3.c\"\n\n//---------------------------------------------------------------------------\n\nint code (\n  int encode,\n  FILE*  InFile,\n  FILE*  SrcFile ,\n  FILE* OutFile,\n  int BufSize )\n{\n  int r, ret;\n  struct stat statbuf;\n  xd3_stream stream;\n  xd3_config config;\n  xd3_source source;\n  void* Input_Buf;\n  int Input_Buf_Read;\n\n  if (BufSize < XD3_ALLOCSIZE)\n    BufSize = XD3_ALLOCSIZE;\n\n  memset (&stream, 0, sizeof (stream));\n  memset (&source, 0, sizeof (source));\n\n  xd3_init_config(&config, XD3_ADLER32);\n  config.winsize = BufSize;\n  xd3_config_stream(&stream, &config);\n\n  if (SrcFile)\n  {\n    r = fstat(fileno(SrcFile), &statbuf);\n    if (r)\n      return r;\n\n    source.blksize = BufSize;\n    source.curblk = malloc(source.blksize);\n\n    /* Load 1st block of stream. */\n    r = fseek(SrcFile, 0, SEEK_SET);\n    if (r)\n      return r;\n    source.onblk = fread((void*)source.curblk, 1, source.blksize, SrcFile);\n    source.curblkno = 0;\n    /* Set the stream. */\n    xd3_set_source(&stream, &source);\n  }\n\n  Input_Buf = malloc(BufSize);\n\n  fseek(InFile, 0, SEEK_SET);\n  do\n  {\n    Input_Buf_Read = fread(Input_Buf, 1, BufSize, InFile);\n    if (Input_Buf_Read < BufSize)\n    {\n      xd3_set_flags(&stream, XD3_FLUSH | stream.flags);\n    }\n    xd3_avail_input(&stream, Input_Buf, Input_Buf_Read);\n\nprocess:\n    if (encode)\n      ret = xd3_encode_input(&stream);\n    else\n      ret = xd3_decode_input(&stream);\n\n    switch (ret)\n    {\n    case XD3_INPUT:\n      {\n        fprintf (stderr,\"XD3_INPUT\\n\");\n        continue;\n      }\n\n    case XD3_OUTPUT:\n      {\n        fprintf (stderr,\"XD3_OUTPUT\\n\");\n        r = fwrite(stream.next_out, 1, stream.avail_out, OutFile);\n        if (r != (int)stream.avail_out)\n          return r;\n\txd3_consume_output(&stream);\n        goto process;\n      }\n\n    case XD3_GETSRCBLK:\n      {\n        fprintf (stderr,\"XD3_GETSRCBLK %qd\\n\", source.getblkno);\n        if (SrcFile)\n        {\n          r = fseek(SrcFile, source.blksize * source.getblkno, SEEK_SET);\n          if (r)\n            return r;\n          source.onblk = fread((void*)source.curblk, 1,\n\t\t\t       source.blksize, SrcFile);\n          source.curblkno = source.getblkno;\n        }\n        goto process;\n      }\n\n    case XD3_GOTHEADER:\n      {\n        fprintf (stderr,\"XD3_GOTHEADER\\n\");\n        goto process;\n      }\n\n    case XD3_WINSTART:\n      {\n        fprintf (stderr,\"XD3_WINSTART\\n\");\n        goto process;\n      }\n\n    case XD3_WINFINISH:\n      {\n        fprintf (stderr,\"XD3_WINFINISH\\n\");\n        goto process;\n      }\n\n    default:\n      {\n        fprintf (stderr,\"!!! INVALID %s %d !!!\\n\",\n\t\tstream.msg, ret);\n        return ret;\n      }\n\n    }\n\n  }\n  while (Input_Buf_Read == BufSize);\n\n  free(Input_Buf);\n\n  free((void*)source.curblk);\n  xd3_close_stream(&stream);\n  xd3_free_stream(&stream);\n\n  return 0;\n\n};\n\n\nint main(int argc, char* argv[])\n{\n  FILE*  InFile;\n  FILE*  SrcFile;\n  FILE* OutFile;\n  int r;\n\n  if (argc != 3) {\n    fprintf (stderr, \"usage: %s source input\\n\", argv[0]);\n    return 1;\n  }\n\n  char *input = argv[2];\n  char *source = argv[1];\n  const char *output = \"encoded.testdata\";\n  const char *decoded = \"decoded.testdata\";\n\n  /* Encode */\n\n  InFile = fopen(input, \"rb\");\n  SrcFile = fopen(source, \"rb\");\n  OutFile = fopen(output, \"wb\");\n\n  r = code (1, InFile, SrcFile, OutFile, 0x1000);\n\n  fclose(OutFile);\n  fclose(SrcFile);\n  fclose(InFile);\n\n  if (r) {\n    fprintf (stderr, \"Encode error: %d\\n\", r);\n    return r;\n  }\n\n  /* Decode */\n\n  InFile = fopen(output, \"rb\");\n  SrcFile = fopen(source, \"rb\");\n  OutFile = fopen(decoded, \"wb\");\n\n  r = code (0, InFile, SrcFile, OutFile, 0x1000);\n\n  fclose(OutFile);\n  fclose(SrcFile);\n  fclose(InFile);\n\n  if (r) {\n    fprintf (stderr, \"Decode error: %d\\n\", r);\n    return r;\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSAppDelegate.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: objc *-*\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#import <UIKit/UIKit.h>\n\n@interface Xd3iOSAppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSAppDelegate.m",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: objc *-*\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#import \"Xd3iOSAppDelegate.h\"\n\n@implementation Xd3iOSAppDelegate\n\n@synthesize window = _window;\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n    // Override point for customization after application launch.\n    return YES;\n}\n\t\t\t\t\t\t\t\n- (void)applicationWillResignActive:(UIApplication *)application\n{\n    /*\n     Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n     Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n     */\n}\n\n- (void)applicationDidEnterBackground:(UIApplication *)application\n{\n    /*\n     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. \n     If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n     */\n}\n\n- (void)applicationWillEnterForeground:(UIApplication *)application\n{\n    /*\n     Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n     */\n}\n\n- (void)applicationDidBecomeActive:(UIApplication *)application\n{\n    /*\n     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n     */\n}\n\n- (void)applicationWillTerminate:(UIApplication *)application\n{\n    /*\n     Called when the application is about to terminate.\n     Save data if appropriate.\n     See also applicationDidEnterBackground:.\n     */\n}\n\n@end\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSViewController.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: objc *-*\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#import <UIKit/UIKit.h>\n\n@interface Xd3iOSViewController : UIViewController <UITextViewDelegate> {\n    NSString *inputSeed;\n}\n- (IBAction)startTest:(id)sender;\n@property (weak, nonatomic) IBOutlet UITextField *theSeed;\n@property (weak, nonatomic) IBOutlet UITextView *theView;\n@property (atomic, retain) NSMutableString *theOutput;\n@property (nonatomic) BOOL inTest;\n\n@end\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/Xd3iOSViewController.m",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: objc *-*\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#import \"Xd3iOSViewController.h\"\n#include \"xdelta3.h\"\n#include \"dispatch/queue.h\"\n#include \"Foundation/NSBundle.h\"\n\nextern void (*xprintf_message_func)(const char* msg);\nvoid print_to_view(const char* buf);\nint xd3_main_cmdline(int argc, char **argv);\nvoid do_localfile_test(void);\nint compare_files(const char* file1, const char* file2);\nXd3iOSViewController *static_ptr;\n\n@implementation Xd3iOSViewController\n@synthesize theSeed = _theSeed;\n@synthesize theView = _theView;\n@synthesize theOutput = _theOutput;\n@synthesize inTest = _inTest;\n\n- (void)didReceiveMemoryWarning\n{\n    [super didReceiveMemoryWarning];\n}\n\n#pragma mark - View lifecycle\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n}\n\n- (void)viewDidUnload\n{\n    [self setTheSeed:nil];\n    [self setTheView:nil];\n    [self setTheView:nil];\n    [super viewDidUnload];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n\t[super viewWillDisappear:animated];\n}\n\n- (void)viewDidDisappear:(BOOL)animated\n{\n\t[super viewDidDisappear:animated];\n}\n\n- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation\n{\n    switch (interfaceOrientation) {\n        case UIInterfaceOrientationPortrait:\n        case UIInterfaceOrientationPortraitUpsideDown:\n            return YES;\n        default:\n            break;\n    }\n    return NO;\n}\n- (BOOL)textFieldShouldReturn:(UITextField*)theTextField {\n    if (theTextField == self.theSeed) {\n        [theTextField resignFirstResponder];\n    }\n    return YES;\n}\n- (IBAction)startTest:(id)sender {\n    if (self.inTest) {\n        return;\n    }\n    self.inTest = YES;\n    NSString *seedString = self.theSeed.text;\n    if ([seedString length] == 0) {\n        seedString = @\"RFC3284\";\n    }\n    static_ptr = self;\n    xprintf_message_func = &print_to_view;\n    self.theOutput = [[NSMutableString alloc] initWithFormat:@\"Starting test (seed=%@)\\n\", seedString];\n    self.theView.text = self.theOutput;\n    dispatch_queue_t mq = dispatch_get_main_queue();\n    dispatch_queue_t dq = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);\n    dispatch_async(dq, ^{\n        do_localfile_test();\n        char *argv[] = { \"xdelta3\", \"test\", NULL };\n        xd3_main_cmdline(2, argv);\n        print_to_view(\"Finished unittest: success\");\n        dispatch_async(mq, ^{\n            self.inTest = NO;\n        });\n    });\n}\n\nvoid printns_to_view(NSString* ns);\nvoid printns_to_view(NSString* ns) {\n    dispatch_queue_t mq = dispatch_get_main_queue();\n    dispatch_async(mq, ^{\n        if ([static_ptr.theOutput length] < 25000) {\n            [static_ptr.theOutput appendString:ns];\n        } else {\n            static_ptr.theOutput = [[NSMutableString alloc] initWithString:ns];\n        }\n        static_ptr.theView.text = static_ptr.theOutput;\n        CGSize size = static_ptr.theView.contentSize;\n        [static_ptr.theView scrollRectToVisible:CGRectMake(0, size.height - 1, 1, 1) animated:NO];\n    });\n}\n\nvoid print_to_view(const char* buf) {\n    NSString *ns = [NSString stringWithCString:buf encoding:NSASCIIStringEncoding];\n    printns_to_view(ns);\n}\n\nvoid do_localfile_test(void) {\n    NSBundle *bundle;\n    bundle = [NSBundle mainBundle];\n    NSString *localfile1 = [bundle pathForResource:@\"file_v1\" ofType:@\"bin\"];\n    NSString *localfile2 = [bundle pathForResource:@\"file_v2\" ofType:@\"bin\"];\n    NSString *localfiled = [bundle pathForResource:@\"file_v1_to_v2\" ofType:@\"bin\"];\n    printns_to_view([localfile1 stringByAppendingString:@\"\\n\"]);\n    printns_to_view([localfile2 stringByAppendingString:@\"\\n\"]);\n    printns_to_view([localfiled stringByAppendingString:@\"\\n\"]);\n    NSString *tmpdir = NSTemporaryDirectory();\n    NSString *tmpfile = [tmpdir stringByAppendingPathComponent:@\"delta.tmp\"];\n    printns_to_view([tmpfile stringByAppendingString:@\"\\n\"]);\n    char *argv[] = { \n        \"xdelta3\", \"-dfvv\", \"-s\", \n        (char*)[localfile1 UTF8String],\n        (char*)[localfiled UTF8String],\n        (char*)[tmpfile UTF8String] };\n    xd3_main_cmdline(6, argv);\n\n    NSFileManager *filemgr;\n\n    filemgr = [NSFileManager defaultManager];\n    \n    if ([filemgr contentsEqualAtPath: localfile2 andPath: tmpfile] == YES) {\n        printns_to_view(@\"File contents match\\n\");\n    } else {\n        NSError *err1 = NULL;\n        NSDictionary *d1 = [filemgr attributesOfItemAtPath: tmpfile error: &err1];\n        if (err1 != NULL) {\n            printns_to_view([@\"File localfile2 could not stat %s\\n\" stringByAppendingString: tmpfile]);\n        } else {\n            printns_to_view([@\"File contents do not match!!!! tmpfile size=\" stringByAppendingString:\n                             [[NSMutableString alloc] initWithFormat:@\"%llu\\n\", [d1 fileSize]]]);\n        }\n        compare_files([localfile2 UTF8String], [tmpfile UTF8String]);\n    }\n    print_to_view(\"Finished localfile test.\\n\");\n}\n\n@end\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/en.lproj/MainStoryboard_iPad.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"1.0\" toolsVersion=\"1938\" systemVersion=\"11C74\" targetRuntime=\"iOS.CocoaTouch.iPad\" propertyAccessControl=\"none\" initialViewController=\"2\">\n    <dependencies>\n        <development defaultVersion=\"4200\" identifier=\"xcode\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"933\"/>\n    </dependencies>\n    <scenes>\n        <scene sceneID=\"4\">\n            <objects>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"3\" sceneMemberID=\"firstResponder\"/>\n                <viewController id=\"2\" customClass=\"Xd3iOSViewController\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"5\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"768\" height=\"1004\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" id=\"d7Y-KS-zOa\">\n                                <rect key=\"frame\" x=\"258\" y=\"28\" width=\"197\" height=\"37\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"15\"/>\n                                <state key=\"normal\" title=\"Start test\">\n                                    <color key=\"titleColor\" red=\"0.19607843459999999\" green=\"0.30980393290000002\" blue=\"0.52156865600000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    <color key=\"titleShadowColor\" white=\"0.5\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                </state>\n                                <state key=\"highlighted\">\n                                    <color key=\"titleColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"startTest:\" destination=\"2\" eventType=\"touchUpInside\" id=\"f4X-jg-ZsU\"/>\n                                </connections>\n                            </button>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" placeholder=\"Random seed\" minimumFontSize=\"17\" id=\"TZ8-OW-wjf\">\n                                <rect key=\"frame\" x=\"27\" y=\"28\" width=\"197\" height=\"31\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"2\" id=\"hjY-Ym-Fcw\"/>\n                                </connections>\n                            </textField>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" id=\"LHz-h6-ZBC\">\n                                <rect key=\"frame\" x=\"27\" y=\"88\" width=\"721\" height=\"887\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"2\" id=\"fwY-fT-bCV\"/>\n                                </connections>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.13337372065218178\" green=\"0.1801924475036723\" blue=\"0.21739130434782605\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    </view>\n                    <connections>\n                        <outlet property=\"theSeed\" destination=\"TZ8-OW-wjf\" id=\"QuA-uT-5IR\"/>\n                        <outlet property=\"theView\" destination=\"LHz-h6-ZBC\" id=\"s64-32-fBA\"/>\n                    </connections>\n                </viewController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-601\" y=\"-1021\"/>\n        </scene>\n    </scenes>\n    <classes>\n        <class className=\"Xd3iOSViewController\" superclassName=\"UIViewController\">\n            <source key=\"sourceIdentifier\" type=\"project\" relativePath=\"./Classes/Xd3iOSViewController.h\"/>\n            <relationships>\n                <relationship kind=\"action\" name=\"startTest:\"/>\n                <relationship kind=\"outlet\" name=\"theSeed\" candidateClass=\"UITextField\"/>\n                <relationship kind=\"outlet\" name=\"theView\" candidateClass=\"UITextView\"/>\n            </relationships>\n        </class>\n    </classes>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\" statusBarStyle=\"blackTranslucent\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\"/>\n    </simulatedMetricsContainer>\n</document>\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/en.lproj/MainStoryboard_iPhone.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"1.0\" toolsVersion=\"1906\" systemVersion=\"11A511\" targetRuntime=\"iOS.CocoaTouch\" nextObjectID=\"6\" propertyAccessControl=\"none\" initialViewController=\"2\">\n    <dependencies>\n        <development defaultVersion=\"4200\" identifier=\"xcode\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"902\"/>\n    </dependencies>\n    <scenes>\n        <scene sceneID=\"5\">\n            <objects>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"4\" sceneMemberID=\"firstResponder\"/>\n                <viewController id=\"2\" customClass=\"Xd3iOSViewController\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"320\" height=\"460\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n            </objects>\n        </scene>\n    </scenes>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\"/>\n    </simulatedMetricsContainer>\n</document>"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/main.m",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: objc *-*\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#import <UIKit/UIKit.h>\n\n#import \"Xd3iOSAppDelegate.h\"\n\nint main(int argc, char *argv[])\n{\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([Xd3iOSAppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test/xdelta3-ios-test-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFiles</key>\n\t<array/>\n\t<key>CFBundleIdentifier</key>\n\t<string>Joshua-MacDonald.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIMainStoryboardFile</key>\n\t<string>MainStoryboard_iPhone</string>\n\t<key>UIMainStoryboardFile~ipad</key>\n\t<string>MainStoryboard_iPad</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/iOS/xdelta3-ios-test/xdelta3-ios-test.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tB9001B65158D008900B9E855 /* xdelta3.c in Sources */ = {isa = PBXBuildFile; fileRef = B9001B63158D008900B9E855 /* xdelta3.c */; };\n\t\tB9313C3C158D11BA001C1F28 /* file_v1_to_v2.bin in Resources */ = {isa = PBXBuildFile; fileRef = B9313C39158D11BA001C1F28 /* file_v1_to_v2.bin */; };\n\t\tB9313C3D158D11BA001C1F28 /* file_v1.bin in Resources */ = {isa = PBXBuildFile; fileRef = B9313C3A158D11BA001C1F28 /* file_v1.bin */; };\n\t\tB9313C3E158D11BA001C1F28 /* file_v2.bin in Resources */ = {isa = PBXBuildFile; fileRef = B9313C3B158D11BA001C1F28 /* file_v2.bin */; };\n\t\tB9ADC6BF158CFD36007EF999 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9ADC6BE158CFD36007EF999 /* UIKit.framework */; };\n\t\tB9ADC6C1158CFD36007EF999 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9ADC6C0158CFD36007EF999 /* Foundation.framework */; };\n\t\tB9ADC6C3158CFD36007EF999 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9ADC6C2158CFD36007EF999 /* CoreGraphics.framework */; };\n\t\tB9ADC6C9158CFD36007EF999 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B9ADC6C7158CFD36007EF999 /* InfoPlist.strings */; };\n\t\tB9ADC6CB158CFD36007EF999 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B9ADC6CA158CFD36007EF999 /* main.m */; };\n\t\tB9ADC6CF158CFD36007EF999 /* Xd3iOSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B9ADC6CE158CFD36007EF999 /* Xd3iOSAppDelegate.m */; };\n\t\tB9ADC6D2158CFD36007EF999 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9ADC6D0158CFD36007EF999 /* MainStoryboard_iPhone.storyboard */; };\n\t\tB9ADC6D5158CFD36007EF999 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9ADC6D3158CFD36007EF999 /* MainStoryboard_iPad.storyboard */; };\n\t\tB9ADC6D8158CFD36007EF999 /* Xd3iOSViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B9ADC6D7158CFD36007EF999 /* Xd3iOSViewController.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tB9001B56158D008900B9E855 /* xdelta3-blkcache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-blkcache.h\"; path = \"../../../../xdelta3-blkcache.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B57158D008900B9E855 /* xdelta3-cfgs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-cfgs.h\"; path = \"../../../../xdelta3-cfgs.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B58158D008900B9E855 /* xdelta3-decode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-decode.h\"; path = \"../../../../xdelta3-decode.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B59158D008900B9E855 /* xdelta3-djw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-djw.h\"; path = \"../../../../xdelta3-djw.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B5A158D008900B9E855 /* xdelta3-fgk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-fgk.h\"; path = \"../../../../xdelta3-fgk.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B5B158D008900B9E855 /* xdelta3-hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-hash.h\"; path = \"../../../../xdelta3-hash.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B5C158D008900B9E855 /* xdelta3-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-internal.h\"; path = \"../../../../xdelta3-internal.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B5D158D008900B9E855 /* xdelta3-list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-list.h\"; path = \"../../../../xdelta3-list.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B5E158D008900B9E855 /* xdelta3-main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-main.h\"; path = \"../../../../xdelta3-main.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B5F158D008900B9E855 /* xdelta3-merge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-merge.h\"; path = \"../../../../xdelta3-merge.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B60158D008900B9E855 /* xdelta3-python.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-python.h\"; path = \"../../../../xdelta3-python.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B61158D008900B9E855 /* xdelta3-second.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-second.h\"; path = \"../../../../xdelta3-second.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B62158D008900B9E855 /* xdelta3-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"xdelta3-test.h\"; path = \"../../../../xdelta3-test.h\"; sourceTree = \"<group>\"; };\n\t\tB9001B63158D008900B9E855 /* xdelta3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xdelta3.c; path = ../../../../xdelta3.c; sourceTree = \"<group>\"; };\n\t\tB9001B64158D008900B9E855 /* xdelta3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xdelta3.h; path = ../../../../xdelta3.h; sourceTree = \"<group>\"; };\n\t\tB9313C39158D11BA001C1F28 /* file_v1_to_v2.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = file_v1_to_v2.bin; sourceTree = \"<group>\"; };\n\t\tB9313C3A158D11BA001C1F28 /* file_v1.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = file_v1.bin; sourceTree = \"<group>\"; };\n\t\tB9313C3B158D11BA001C1F28 /* file_v2.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = file_v2.bin; sourceTree = \"<group>\"; };\n\t\tB9ADC6BA158CFD36007EF999 /* xdelta3-ios-test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"xdelta3-ios-test.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB9ADC6BE158CFD36007EF999 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\tB9ADC6C0158CFD36007EF999 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tB9ADC6C2158CFD36007EF999 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\tB9ADC6C6158CFD36007EF999 /* xdelta3-ios-test-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"xdelta3-ios-test-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tB9ADC6C8158CFD36007EF999 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tB9ADC6CA158CFD36007EF999 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\tB9ADC6CC158CFD36007EF999 /* xdelta3-ios-test-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"xdelta3-ios-test-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tB9ADC6CD158CFD36007EF999 /* Xd3iOSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Xd3iOSAppDelegate.h; sourceTree = \"<group>\"; };\n\t\tB9ADC6CE158CFD36007EF999 /* Xd3iOSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Xd3iOSAppDelegate.m; sourceTree = \"<group>\"; };\n\t\tB9ADC6D1158CFD36007EF999 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = \"<group>\"; };\n\t\tB9ADC6D4158CFD36007EF999 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = \"<group>\"; };\n\t\tB9ADC6D6158CFD36007EF999 /* Xd3iOSViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Xd3iOSViewController.h; sourceTree = \"<group>\"; };\n\t\tB9ADC6D7158CFD36007EF999 /* Xd3iOSViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Xd3iOSViewController.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tB9ADC6B7158CFD36007EF999 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB9ADC6BF158CFD36007EF999 /* UIKit.framework in Frameworks */,\n\t\t\t\tB9ADC6C1158CFD36007EF999 /* Foundation.framework in Frameworks */,\n\t\t\t\tB9ADC6C3158CFD36007EF999 /* CoreGraphics.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tB9ADC6AF158CFD36007EF999 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ADC6C4158CFD36007EF999 /* xdelta3-ios-test */,\n\t\t\t\tB9ADC6BD158CFD36007EF999 /* Frameworks */,\n\t\t\t\tB9ADC6BB158CFD36007EF999 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9ADC6BB158CFD36007EF999 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ADC6BA158CFD36007EF999 /* xdelta3-ios-test.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9ADC6BD158CFD36007EF999 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ADC6BE158CFD36007EF999 /* UIKit.framework */,\n\t\t\t\tB9ADC6C0158CFD36007EF999 /* Foundation.framework */,\n\t\t\t\tB9ADC6C2158CFD36007EF999 /* CoreGraphics.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9ADC6C4158CFD36007EF999 /* xdelta3-ios-test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9001B56158D008900B9E855 /* xdelta3-blkcache.h */,\n\t\t\t\tB9001B57158D008900B9E855 /* xdelta3-cfgs.h */,\n\t\t\t\tB9001B58158D008900B9E855 /* xdelta3-decode.h */,\n\t\t\t\tB9001B59158D008900B9E855 /* xdelta3-djw.h */,\n\t\t\t\tB9001B5A158D008900B9E855 /* xdelta3-fgk.h */,\n\t\t\t\tB9001B5B158D008900B9E855 /* xdelta3-hash.h */,\n\t\t\t\tB9001B5C158D008900B9E855 /* xdelta3-internal.h */,\n\t\t\t\tB9001B5D158D008900B9E855 /* xdelta3-list.h */,\n\t\t\t\tB9001B5E158D008900B9E855 /* xdelta3-main.h */,\n\t\t\t\tB9001B5F158D008900B9E855 /* xdelta3-merge.h */,\n\t\t\t\tB9001B60158D008900B9E855 /* xdelta3-python.h */,\n\t\t\t\tB9001B61158D008900B9E855 /* xdelta3-second.h */,\n\t\t\t\tB9001B62158D008900B9E855 /* xdelta3-test.h */,\n\t\t\t\tB9001B63158D008900B9E855 /* xdelta3.c */,\n\t\t\t\tB9001B64158D008900B9E855 /* xdelta3.h */,\n\t\t\t\tB9ADC6CD158CFD36007EF999 /* Xd3iOSAppDelegate.h */,\n\t\t\t\tB9ADC6CE158CFD36007EF999 /* Xd3iOSAppDelegate.m */,\n\t\t\t\tB9ADC6D0158CFD36007EF999 /* MainStoryboard_iPhone.storyboard */,\n\t\t\t\tB9ADC6D3158CFD36007EF999 /* MainStoryboard_iPad.storyboard */,\n\t\t\t\tB9ADC6D6158CFD36007EF999 /* Xd3iOSViewController.h */,\n\t\t\t\tB9ADC6D7158CFD36007EF999 /* Xd3iOSViewController.m */,\n\t\t\t\tB9ADC6C5158CFD36007EF999 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"xdelta3-ios-test\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9ADC6C5158CFD36007EF999 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9313C39158D11BA001C1F28 /* file_v1_to_v2.bin */,\n\t\t\t\tB9313C3A158D11BA001C1F28 /* file_v1.bin */,\n\t\t\t\tB9313C3B158D11BA001C1F28 /* file_v2.bin */,\n\t\t\t\tB9ADC6C6158CFD36007EF999 /* xdelta3-ios-test-Info.plist */,\n\t\t\t\tB9ADC6C7158CFD36007EF999 /* InfoPlist.strings */,\n\t\t\t\tB9ADC6CA158CFD36007EF999 /* main.m */,\n\t\t\t\tB9ADC6CC158CFD36007EF999 /* xdelta3-ios-test-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tB9ADC6B9158CFD36007EF999 /* xdelta3-ios-test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B9ADC6DB158CFD36007EF999 /* Build configuration list for PBXNativeTarget \"xdelta3-ios-test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB9ADC6B6158CFD36007EF999 /* Sources */,\n\t\t\t\tB9ADC6B7158CFD36007EF999 /* Frameworks */,\n\t\t\t\tB9ADC6B8158CFD36007EF999 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"xdelta3-ios-test\";\n\t\t\tproductName = \"xdelta3-ios-test\";\n\t\t\tproductReference = B9ADC6BA158CFD36007EF999 /* xdelta3-ios-test.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tB9ADC6B1158CFD36007EF999 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0420;\n\t\t\t};\n\t\t\tbuildConfigurationList = B9ADC6B4158CFD36007EF999 /* Build configuration list for PBXProject \"xdelta3-ios-test\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = B9ADC6AF158CFD36007EF999;\n\t\t\tproductRefGroup = B9ADC6BB158CFD36007EF999 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tB9ADC6B9158CFD36007EF999 /* xdelta3-ios-test */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tB9ADC6B8158CFD36007EF999 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB9ADC6C9158CFD36007EF999 /* InfoPlist.strings in Resources */,\n\t\t\t\tB9ADC6D2158CFD36007EF999 /* MainStoryboard_iPhone.storyboard in Resources */,\n\t\t\t\tB9ADC6D5158CFD36007EF999 /* MainStoryboard_iPad.storyboard in Resources */,\n\t\t\t\tB9313C3C158D11BA001C1F28 /* file_v1_to_v2.bin in Resources */,\n\t\t\t\tB9313C3D158D11BA001C1F28 /* file_v1.bin in Resources */,\n\t\t\t\tB9313C3E158D11BA001C1F28 /* file_v2.bin in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tB9ADC6B6158CFD36007EF999 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB9ADC6CB158CFD36007EF999 /* main.m in Sources */,\n\t\t\t\tB9ADC6CF158CFD36007EF999 /* Xd3iOSAppDelegate.m in Sources */,\n\t\t\t\tB9ADC6D8158CFD36007EF999 /* Xd3iOSViewController.m in Sources */,\n\t\t\t\tB9001B65158D008900B9E855 /* xdelta3.c in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\tB9ADC6C7158CFD36007EF999 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ADC6C8158CFD36007EF999 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9ADC6D0158CFD36007EF999 /* MainStoryboard_iPhone.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ADC6D1158CFD36007EF999 /* en */,\n\t\t\t);\n\t\t\tname = MainStoryboard_iPhone.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9ADC6D3158CFD36007EF999 /* MainStoryboard_iPad.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ADC6D4158CFD36007EF999 /* en */,\n\t\t\t);\n\t\t\tname = MainStoryboard_iPad.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tB9ADC6D9158CFD36007EF999 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_BIT)\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_INPUT_FILETYPE = sourcecode.c.objc;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"XD3_USE_LARGEFILE64=0\",\n\t\t\t\t\t\"XD3_POSIX=1\",\n\t\t\t\t\t\"EXTERNAL_COMPRESSION=0\",\n\t\t\t\t\t\"NOT_MAIN=1\",\n\t\t\t\t\t\"XD3_MAIN=1\",\n\t\t\t\t\t\"SECONDARY_DJW=1\",\n\t\t\t\t\t\"XD3_DEBUG=1\",\n\t\t\t\t\t\"REGRESSION_TEST=1\",\n\t\t\t\t\t\"SHELL_TESTS=0\",\n\t\t\t\t\t\"SECONDARY_FGK=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 5.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DXD3_USE_LARGEFILE64=0\",\n\t\t\t\t\t\"-DXD3_POSIX=1\",\n\t\t\t\t\t\"-DEXTERNAL_COMPRESSION=0\",\n\t\t\t\t\t\"-DNOT_MAIN=1\",\n\t\t\t\t\t\"-DXD3_MAIN=1\",\n\t\t\t\t\t\"-DSECONDARY_DJW=1\",\n\t\t\t\t\t\"-DXD3_DEBUG=1\",\n\t\t\t\t\t\"-DREGRESSION_TEST=1\",\n\t\t\t\t\t\"-DSHELL_TESTS=0\",\n\t\t\t\t\t\"-DSECONDARY_FGK=1\",\n\t\t\t\t);\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB9ADC6DA158CFD36007EF999 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_BIT)\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_INPUT_FILETYPE = sourcecode.c.objc;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"XD3_USE_LARGEFILE64=0\",\n\t\t\t\t\t\"XD3_POSIX=1\",\n\t\t\t\t\t\"EXTERNAL_COMPRESSION=0\",\n\t\t\t\t\t\"NOT_MAIN=1\",\n\t\t\t\t\t\"XD3_MAIN=1\",\n\t\t\t\t\t\"SECONDARY_DJW=1\",\n\t\t\t\t\t\"XD3_DEBUG=1\",\n\t\t\t\t\t\"REGRESSION_TEST=1\",\n\t\t\t\t\t\"SHELL_TESTS=0\",\n\t\t\t\t\t\"SECONDARY_FGK=1\",\n\t\t\t\t);\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 5.0;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-DXD3_USE_LARGEFILE64=0\",\n\t\t\t\t\t\"-DXD3_POSIX=1\",\n\t\t\t\t\t\"-DEXTERNAL_COMPRESSION=0\",\n\t\t\t\t\t\"-DNOT_MAIN=1\",\n\t\t\t\t\t\"-DXD3_MAIN=1\",\n\t\t\t\t\t\"-DSECONDARY_DJW=1\",\n\t\t\t\t\t\"-DXD3_DEBUG=1\",\n\t\t\t\t\t\"-DREGRESSION_TEST=1\",\n\t\t\t\t\t\"-DSHELL_TESTS=0\",\n\t\t\t\t\t\"-DSECONDARY_FGK=1\",\n\t\t\t\t);\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tB9ADC6DC158CFD36007EF999 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"xdelta3-ios-test/xdelta3-ios-test-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"xdelta3-ios-test/xdelta3-ios-test-Info.plist\";\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB9ADC6DD158CFD36007EF999 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"xdelta3-ios-test/xdelta3-ios-test-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"xdelta3-ios-test/xdelta3-ios-test-Info.plist\";\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tB9ADC6B4158CFD36007EF999 /* Build configuration list for PBXProject \"xdelta3-ios-test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB9ADC6D9158CFD36007EF999 /* Debug */,\n\t\t\t\tB9ADC6DA158CFD36007EF999 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB9ADC6DB158CFD36007EF999 /* Build configuration list for PBXNativeTarget \"xdelta3-ios-test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB9ADC6DC158CFD36007EF999 /* Debug */,\n\t\t\t\tB9ADC6DD158CFD36007EF999 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = B9ADC6B1158CFD36007EF999 /* Project object */;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/small_page_test.c",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#include <stdio.h>\n\n#define PAGE_SIZE 4096\n\n#define SPACE_MAX 131072   // how much memory per process\n#define OUTPUT_MAX 1024    // max size for output\n#define XD3_ALLOCSIZE 256  // internal size for various buffers\n#define IOPT_SIZE 128      // instruction buffer\n\n// SPACE_MAX of 32K is sufficient for most inputs with XD3_COMPLEVEL_1\n// XD3_COMPLEVEL_9 requires about 4x more space than XD3_COMPLEVEL_1\n\n#include \"xdelta3.h\"\n#include \"xdelta3.c\"\n\ntypedef struct _context {\n  uint8_t *buffer;\n  int allocated;\n} context_t;\n\nstatic int max_allocated = 0;\n\nvoid*\nprocess_alloc (void* opaque, usize_t items, usize_t size)\n{\n  context_t *ctx = (context_t*) opaque;\n  usize_t t = items * size;\n  void *ret;\n\n  if (ctx->allocated + t > SPACE_MAX)\n    {\n      return NULL;\n    }\n\n  ret = ctx->buffer + ctx->allocated;\n  ctx->allocated += t;\n  return ret;\n}\n\nvoid\nprocess_free (void* opaque, void *ptr)\n{\n}\n\nint\nprocess_page (int            is_encode,\n\t      int          (*func) (xd3_stream *),\n\t      const uint8_t *input,\n\t      usize_t        input_size,\n\t      const uint8_t *source,\n\t      uint8_t       *output,\n\t      usize_t       *output_size,\n\t      usize_t        output_size_max,\n\t      int            flags) {\n\n  /* On my x86 this is 1072 of objects on the stack */\n  xd3_stream stream;\n  xd3_config config;\n  xd3_source src;\n  context_t *ctx = calloc(SPACE_MAX, 1);\n  int ret;\n\n  memset (&config, 0, sizeof(config));\n\n  if (ctx == NULL)\n    {\n      printf(\"calloc failed\\n\");\n      return -1;\n    }\n\n  ctx->buffer = (uint8_t*)ctx;\n  ctx->allocated = sizeof(*ctx);\n\n  config.flags = flags;\n  config.winsize = PAGE_SIZE;\n  config.sprevsz = PAGE_SIZE;\n  config.srcwin_maxsz = PAGE_SIZE;\n  config.iopt_size = IOPT_SIZE;\n  config.alloc = &process_alloc;\n  config.freef = &process_free;\n  config.opaque = (void*) ctx;\n\n  src.blksize = PAGE_SIZE;\n  src.onblk = PAGE_SIZE;\n  src.curblk = source;\n  src.curblkno = 0;\n\n  if ((ret = xd3_config_stream (&stream, &config)) != 0 ||\n      (ret = xd3_set_source_and_size (&stream, &src, PAGE_SIZE)) != 0 ||\n      (ret = xd3_process_stream (is_encode,\n\t\t\t\t &stream,\n\t\t\t\t func, 1,\n\t\t\t\t input, input_size,\n\t\t\t\t output, output_size,\n\t\t\t\t output_size_max)) != 0)\n    {\n      if (stream.msg != NULL)\n\t{\n\t  fprintf(stderr, \"stream message: %s\\n\", stream.msg);\n\t}\n    }\n\n  xd3_free_stream (&stream);\n  if (max_allocated < ctx->allocated)\n    {\n      max_allocated = ctx->allocated;\n      fprintf(stderr, \"max allocated %d\\n\", max_allocated);\n    }\n\n  free(ctx);\n  return ret;\n}\n\nint test(int stride, int encode_flags)\n{\n  uint8_t frompg[PAGE_SIZE];\n  uint8_t topg[PAGE_SIZE];\n  uint8_t output[OUTPUT_MAX];\n  uint8_t reout[PAGE_SIZE];\n  usize_t output_size;\n  usize_t re_size;\n  int i, j, ret;\n\n  for (i = 0; i < PAGE_SIZE; i++)\n    {\n      topg[i] = frompg[i] = (rand() >> 3 ^ rand() >> 6 ^ rand() >> 9);\n    }\n\n  // change 1 byte every stride\n  if (stride > 0)\n    {\n      for (j = stride; j <= PAGE_SIZE; j += stride)\n\t{\n\t  topg[j - 1] ^= 0xff;\n\t}\n    }\n\n  if ((ret = process_page (1, xd3_encode_input,\n\t\t\t   topg, PAGE_SIZE,\n\t\t\t   frompg, output,\n\t\t\t   &output_size, OUTPUT_MAX,\n\t\t\t   encode_flags)) != 0)\n    {\n      fprintf (stderr, \"encode failed: stride %u flags 0x%x\\n\",\n\t       stride, encode_flags);\n      return ret;\n    }\n\n  if ((ret = process_page (0, xd3_decode_input,\n\t\t\t   output, output_size,\n\t\t\t   frompg, reout,\n\t\t\t   &re_size, PAGE_SIZE,\n\t\t\t   0)) != 0)\n    {\n      fprintf (stderr, \"decode failed: stride %u output_size %u flags 0x%x\\n\",\n\t       stride, output_size, encode_flags);\n      return ret;\n    }\n\n  if (output_size > OUTPUT_MAX || re_size != PAGE_SIZE)\n    {\n      fprintf (stderr, \"internal error: %u != %u\\n\", output_size, re_size);\n      return -1;\n    }\n\n  for (i = 0; i < PAGE_SIZE; i++)\n    {\n      if (reout[i] != topg[i])\n\t{\n\t  fprintf (stderr, \"encode-decode error: position %d\\n\", i);\n\t  return -1;\n\t}\n    }\n\n  fprintf(stderr, \"stride %d flags 0x%x size %u \",\n\t  stride, encode_flags, output_size);\n  fprintf(stderr, \"%s\\n\", (ret == 0) ? \"OK\" : \"FAIL\");\n\n  return 0;\n}\n\nint main()\n{\n  int stride;\n  int level;\n\n  for (level = 1; level < 10; level = (level == 1 ? 3 : level + 3))\n    {\n      int lflag = level << XD3_COMPLEVEL_SHIFT;\n\n      for (stride = 2; stride <= PAGE_SIZE; stride += 2)\n\t{\n\t  test(stride, lflag);\n\t  test(stride, lflag | XD3_SEC_DJW);\n\t}\n    }\n\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/speed_test.c",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#include \"test.h\"\n\nusize_t bench_speed(const uint8_t *from_buf, const size_t from_len,\n\t\t const uint8_t *to_buf, const size_t to_len,\n\t\t uint8_t *delta_buf, const size_t delta_alloc,\n\t\t int flags) {\n  usize_t delta_size;\n  int ret = xd3_encode_memory(to_buf, to_len, from_buf, from_len,\n\t\t\t      delta_buf, &delta_size, delta_alloc, flags);\n  if (ret != 0) {\n    fprintf(stderr, \"encode failure: %d: %s\\n\", ret, xd3_strerror(ret));\n    abort();\n  }\n  return delta_size;\n}\n\nint main(int argc, char **argv) {\n  int repeat, level;\n  char *from, *to;\n  uint8_t *from_buf = NULL, *to_buf = NULL, *delta_buf = NULL;\n  size_t from_len = 0, to_len, delta_alloc, delta_size = 0;\n  long start, finish;\n  int i, ret;\n  int flags;\n\n  if (argc != 5) {\n    fprintf(stderr, \"usage: speed_test LEVEL COUNT FROM TO\\n\");\n    return 1;\n  }\n\n  level = atoi(argv[1]);\n  repeat = atoi(argv[2]);\n  from = argv[3];\n  to = argv[4];\n  flags = (level << XD3_COMPLEVEL_SHIFT) & XD3_COMPLEVEL_MASK;\n\n  if ((strcmp(from, \"null\") != 0 &&\n       (ret = read_whole_file(from, &from_buf, &from_len))) ||\n      (ret = read_whole_file(to, &to_buf, &to_len))) {\n    fprintf(stderr, \"read_whole_file error\\n\");\n    goto exit;\n  }\n\n  delta_alloc = to_len * 11 / 10;\n  delta_buf = main_malloc(delta_alloc);\n\n  start = get_millisecs_now();\n\n  for (i = 0; i < repeat; ++i) {\n    delta_size = bench_speed(from_buf, from_len,\n\t\t\t     to_buf, to_len, delta_buf, delta_alloc, flags);\n  }\n\n  finish = get_millisecs_now();\n\n  fprintf(stderr,\n\t  \"STAT: encode %3.2f ms from %s to %s repeat %d %zdbit delta %zd\\n\",\n\t  (double)(finish - start) / repeat, from, to, repeat, sizeof (xoff_t) * 8, delta_size);\n\n  ret = 0;\n\n  if (0) {\n  exit:\n    ret = 1;\n  }\n    \n  main_free(to_buf);\n  main_free(from_buf);\n  main_free(delta_buf);\n  return ret;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/examples/test.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#define NOT_MAIN 1\n\n#include \"xdelta3.h\"\n#include \"xdelta3.c\"\n\nstatic int read_whole_file(const char *name,\n\t\t\t   uint8_t **buf_ptr,\n\t\t\t   size_t *buf_len) {\n  main_file file;\n  int ret;\n  xoff_t len;\n  usize_t nread;\n  main_file_init(&file);\n  file.filename = name;\n  ret = main_file_open(&file, name, XO_READ);\n  if (ret != 0) {\n    fprintf(stderr, \"open failed\\n\");\n    goto exit;\n  }\n  ret = main_file_stat(&file, &len);\n  if (ret != 0) {\n    fprintf(stderr, \"stat failed\\n\");\n    goto exit;\n  }\n  \n  (*buf_len) = (size_t)len;\n  (*buf_ptr) = (uint8_t*) main_malloc(*buf_len);\n  ret = main_file_read(&file, *buf_ptr, *buf_len, &nread,\n\t\t       \"read failed\");\n  if (ret == 0 && *buf_len == nread) {\n    ret = 0;\n  } else {\n    fprintf(stderr, \"invalid read\\n\");\n    ret = XD3_INTERNAL;\n  }\n exit:\n  main_file_cleanup(&file);\n  return ret;\n}\n\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/generate_build_files.sh",
    "content": "#!/bin/sh\n\naclocal &&\n    autoreconf --install &&\n    libtoolize &&\n    autoconf &&\n    automake --add-missing &&\n    automake\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/go/src/regtest.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"os\"\n\t\"sort\"\n\t\"time\"\n\n\t\"xdelta\"\n)\n\nconst (\n\txdataset = \"/volume/home/jmacd/src/testdata\"\n\txcompare = \"/volume/home/jmacd/src/xdelta-devel/xdelta3/build/x86_64-pc-linux-gnu-m64/xoff64/xdelta3\"\n\txdelta3  = \"/volume/home/jmacd/src/xdelta-64bithash/xdelta3/build/x86_64-pc-linux-gnu-m64/usize64/xoff64/xdelta3\"\n\tseed = 1422253499919909358\n)\n\ntype Config struct {\n\tsrcbuf_size int64\n\twindow_size int64\n\tblocksize   int\n}\n\nfunc NewC() Config {\n\t// TODO make these (and above) flags\n\treturn Config{1<<26, 1<<22, 1<<16}\n}\n\nfunc (c Config) smokeTest(t *xdelta.TestGroup, p xdelta.Program) {\n\ttarget := \"Hello world!\"\n\tsource := \"Hello world, nice to meet you!\"\n\n\tenc, err := t.Exec(\"encode\", p, true, []string{\"-e\"})\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\tdec, err := t.Exec(\"decode\", p, true, []string{\"-d\"})\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\n\tencodeout := t.Drain(enc.Stdout, \"encode.stdout\")\n\tdecodeout := t.Drain(dec.Stdout, \"decode.stdout\")\n\n\tt.Empty(enc.Stderr, \"encode\")\n\tt.Empty(dec.Stderr, \"decode\")\n\n\tt.TestWrite(\"encode.stdin\", enc.Stdin, []byte(target))\n\tt.TestWrite(\"encode.srcin\", enc.Srcin, []byte(source))\n\n\tt.TestWrite(\"decode.stdin\", dec.Stdin, <-encodeout)\n\tt.TestWrite(\"decode.srcin\", dec.Srcin, []byte(source))\n\n\tif do := string(<-decodeout); do != target {\n\t\tt.Panic(fmt.Errorf(\"It's not working! %s\\n!=\\n%s\\n\", do, target))\n\t}\n\tt.Wait(enc, dec)\n}\n\ntype PairTest struct {\n\t// Input\n\tConfig\n\tprogram xdelta.Program\n\tsource, target string\n\n\t// Output\n\tTestOutput\n}\n\ntype TestOutput struct {\n\tencoded int64\n\tencDuration time.Duration\n\tdecDuration time.Duration\n\tencSysDuration time.Duration\n\tdecSysDuration time.Duration\n}\n\nfunc (to *TestOutput) Add(a TestOutput) {\n\tto.encoded += a.encoded\n\tto.encDuration += a.encDuration\n\tto.decDuration += a.decDuration\n\tto.encSysDuration += a.encSysDuration\n\tto.decSysDuration += a.decSysDuration\n}\n\nfunc (to *TestOutput) String() string {\n\treturn fmt.Sprintf(\"SIZE: %v\\tT: %v\\tTSYS: %v\\tDT: %v\\tDTSYS: %v\",\n\t\tto.encoded, to.encDuration, to.encSysDuration, to.decDuration, to.encSysDuration)\n}\n\n// P is the test program, Q is the reference version.\nfunc (cfg Config) datasetTest(t *xdelta.TestGroup, p, q xdelta.Program) {\n\tdir, err := os.Open(xdataset)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\tdents, err := dir.Readdir(-1)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\tpaths := make([]string, len(dents))\n\tvar total int64\n\tfor i, d := range dents {\n\t\tif !d.Mode().IsRegular() {\n\t\t\tcontinue\n\t\t}\n\t\tpaths[i] = fmt.Sprint(xdataset, \"/\", d.Name())\n\t\ttotal += d.Size()\n\t}\n\tmeansize := total / int64(len(dents))\n\tlargest  := uint(20)\n\tfor ; largest <= 31 && 1<<largest < meansize; largest++ {}\n\n\tsort.Strings(paths)\n\n\ttestSum := map[uint]*TestOutput{}\n\tcompSum := map[uint]*TestOutput{}\n\n\tfor _, in1 := range paths {\n\t\tfor _, in2 := range paths {\n\t\t\tif in1 == in2 { continue }\n\n\t\t\t// 1/4, 1/2, and 1 of the power-of-2 rounded-up mean size\n\t\t\tfor b := largest - 2; b <= largest; b++ {\n\t\t\t\tif _, has := testSum[b]; !has {\n\t\t\t\t\ttestSum[b] = &TestOutput{}\n\t\t\t\t\tcompSum[b] = &TestOutput{}\n\t\t\t\t}\n\t\t\t\tc1 := cfg\n\t\t\t\tc1.srcbuf_size = 1<<b\n\t\t\t\tptest := &PairTest{c1, p, in1, in2, TestOutput{-1, 0, 0, 0, 0}}\n\t\t\t\tptest.datasetPairTest(t, 1<<b);\n\t\t\t\tqtest := &PairTest{c1, q, in1, in2, TestOutput{-1, 0, 0, 0, 0}}\n\t\t\t\tqtest.datasetPairTest(t, 1<<b)\n\n\t\t\t\ttestSum[b].Add(ptest.TestOutput)\n\t\t\t\tcompSum[b].Add(qtest.TestOutput)\n\n \t\t\t\tfmt.Printf(\"%s, %s: %.2f%% %+d/%d\\n\\tE:%.2f%%/%s(%.2f%%/%s) D:%.2f%%/%s(%.2f%%/%s) [B=%d]\\n\",\n\t\t\t\t\tpath.Base(in1), path.Base(in2),\n\t\t\t\t\tfloat64(ptest.encoded - qtest.encoded) * 100.0 / float64(qtest.encoded),\n\t\t\t\t\tptest.encoded - qtest.encoded,\n\t\t\t\t\tqtest.encoded,\n\t\t\t\t\t(ptest.encDuration - qtest.encDuration).Seconds() * 100.0 / qtest.encDuration.Seconds(),\n\t\t\t\t\tqtest.encDuration,\n\t\t\t\t\t(ptest.decDuration - qtest.decDuration).Seconds() * 100.0 / qtest.decDuration.Seconds(),\n\t\t\t\t\tqtest.encDuration,\n\t\t\t\t\t(ptest.encSysDuration - qtest.encSysDuration).Seconds() * 100.0 / qtest.encSysDuration.Seconds(),\n\t\t\t\t\tqtest.encSysDuration,\n\t\t\t\t\t(ptest.decSysDuration - qtest.decSysDuration).Seconds() * 100.0 / qtest.decSysDuration.Seconds(),\n\t\t\t\t\tqtest.decSysDuration,\n\t\t\t\t\t1<<b)\n\t\t\t}\n\t\t}\n\t}\n\tvar keys []uint\n\tfor k, _ := range testSum {\n\t\tkeys = append(keys, k)\n\t}\n\tfor _, k := range keys {\t\t\n\t\tfmt.Printf(\"B=%v\\nTEST: %v\\nCOMP: %v\\n\", 1<<k, testSum[k], compSum[k])\n\t}\n}\n\nfunc (pt *PairTest) datasetPairTest(t *xdelta.TestGroup, meanSize int64) {\n\tcfg := pt.Config\n\teargs := []string{\"-e\", fmt.Sprint(\"-B\", cfg.srcbuf_size), // \"-q\",\n\t\tfmt.Sprint(\"-W\", cfg.window_size), \"-s\", pt.source,\n\t\t\"-I0\", \"-S\", \"none\", pt.target}\n\tenc, err := t.Exec(\"encode\", pt.program, false, eargs)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\n\tdargs := []string{\"-dc\", fmt.Sprint(\"-B\", cfg.srcbuf_size), //\"-q\",\n\t\tfmt.Sprint(\"-W\", cfg.window_size), \"-s\", pt.source,\n\t\t\"-S\", \"none\"}\n\n\tdec, err := t.Exec(\"decode\", pt.program, false, dargs)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\ttgt_check, err := os.Open(pt.target)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\ttgt_info, err := tgt_check.Stat()\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\tt.Empty(enc.Stderr, \"encode\")\n\tt.Empty(dec.Stderr, \"decode\")\n\tt.CopyStreams(enc.Stdout, dec.Stdin, &pt.encoded)\n\tt.CompareStreams(dec.Stdout, tgt_check, tgt_info.Size())\n\n\tt.Wait(enc, dec)\n\n\tpt.decDuration = dec.Cmd.ProcessState.UserTime()\n\tpt.encDuration = enc.Cmd.ProcessState.UserTime()\n\tpt.decSysDuration = dec.Cmd.ProcessState.SystemTime()\n\tpt.encSysDuration = enc.Cmd.ProcessState.SystemTime()\n}\n\nfunc (cfg Config) offsetTest(t *xdelta.TestGroup, p xdelta.Program, offset, length int64) {\n\teargs := []string{\"-e\", \"-0\", fmt.Sprint(\"-B\", cfg.srcbuf_size), \"-q\",\n\t\tfmt.Sprint(\"-W\", cfg.window_size)}\n\tenc, err := t.Exec(\"encode\", p, true, eargs)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\t\n\tdargs := []string{\"-d\", fmt.Sprint(\"-B\", cfg.srcbuf_size), \"-q\",\n\t\tfmt.Sprint(\"-W\", cfg.window_size)}\n\tdec, err := t.Exec(\"decode\", p, true, dargs)\n\tif err != nil {\n\t\tt.Panic(err)\n\t}\n\n\t// The pipe used to read the decoder output and compare\n\t// against the target.\n\tread, write := io.Pipe()\n\n\tt.Empty(enc.Stderr, \"encode\")\n\tt.Empty(dec.Stderr, \"decode\")\n\n\tvar encoded_size int64\n\tt.CopyStreams(enc.Stdout, dec.Stdin, &encoded_size)\n\tt.CompareStreams(dec.Stdout, read, length)\n\n\t// The decoder output (\"read\", above) is compared with the\n\t// test-provided output (\"write\", below).  The following\n\t// generates two identical inputs.\n\tt.WriteRstreams(\"encode\", seed, offset, length, enc.Srcin, enc.Stdin)\n\tt.WriteRstreams(\"decode\", seed, offset, length, dec.Srcin, write)\n\tt.Wait(enc, dec)\n\n\texpect := cfg.srcbuf_size - offset\n\tif float64(encoded_size) < (0.95 * float64(expect)) ||\n\t\tfloat64(encoded_size) > (1.05 * float64(expect)) {\n\t\tt.Fail(\"encoded size should be ~=\", expect, \", actual \", encoded_size)\n\t}\n}\n\nfunc main() {\n\tr, err := xdelta.NewRunner()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer r.Cleanup()\n\n\tcfg := NewC()\n\n\tprog := xdelta.Program{xdelta3}\n\n\tr.RunTest(\"smoketest\", func(t *xdelta.TestGroup) { cfg.smokeTest(t, prog) })\n\n\tfor i := uint(29); i <= 33; i += 1 {\n\t\t// The arguments to offsetTest are offset, source\n\t\t// window size, and file size. The source window size\n\t\t// is (2 << i) and (in the 3.0x release branch) is\n\t\t// limited to 2^31, so the the greatest value of i is\n\t\t// 30.\n\t\tcfg.srcbuf_size = 2 << i\n\t\tr.RunTest(fmt.Sprint(\"offset\", i), func(t *xdelta.TestGroup) {\n\t\t\tcfg.offsetTest(t, prog, 1 << i, 3 << i) })\n\t}\n\t\n\tcomp := xdelta.Program{xcompare}\n\n\tr.RunTest(\"dataset\", func(t *xdelta.TestGroup) { cfg.datasetTest(t, prog, comp) })\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/go/src/xdelta/rstream.go",
    "content": "package xdelta\n\n\nimport (\n\t\"io\"\n\t\"math/rand\"\n)\n\nconst (\n\tblocksize = 1<<17\n)\n\nfunc (t *TestGroup) WriteRstreams(desc string, seed, offset, len int64,\n\tsrc, tgt io.WriteCloser) {\n\tt.Go(\"src-write:\"+desc, func (g *Goroutine) {\n\t\twriteOne(g, seed, 0, len, tgt, false)\n\t})\n\tt.Go(\"tgt-write:\"+desc, func (g *Goroutine) {\n\t\twriteOne(g, seed, offset, len, src, true)\n\t})\n}\n\nfunc writeOne(g *Goroutine, seed, offset, len int64, stream io.WriteCloser, readall bool) {\n\tif !readall {\n\t\t// Allow the source-read to fail or block until the process terminates.\n\t\t// This behavior is reserved for the decoder, which is not required to\n\t\t// read the entire source.\n\t\tg.OK()\n\t}\n\tif offset != 0 {\n\t\t// Fill with other random data until the offset\n\t\tif err := writeRand(g, rand.New(rand.NewSource(^seed)), offset, stream); err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t}\n\tif err := writeRand(g, rand.New(rand.NewSource(seed)),\n\t\tlen - offset, stream); err != nil {\n\t\tg.Panic(err)\n\t}\n\tif err := stream.Close(); err != nil {\n\t\tg.Panic(err)\n\t}\n\tg.OK()\n}\n\nfunc writeRand(g *Goroutine, r *rand.Rand, len int64, s io.Writer) error {\n\tblk := make([]byte, blocksize)\n\tfor len > 0 {\n\t\tfillRand(r, blk)\n\t\tc := blocksize\n\t\tif len < blocksize {\n\t\t\tc = int(len)\n\t\t}\n\t\tif _, err := s.Write(blk[0:c]); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlen -= int64(c)\n\t}\n\treturn nil\n}\n\nfunc fillRand(r *rand.Rand, blk []byte) {\n\tfor p := 0; p < len(blk); {\n\t\tv := r.Int63()\n\t\tfor i := 7; i != 0 && p < len(blk); i-- {\n\t\t\tblk[p] = byte(v)\n\t\t\tp++\n\t\t\tv >>= 8\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/go/src/xdelta/run.go",
    "content": "package xdelta\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"os/exec\"\n)\n\ntype Program struct {\n\tPath string\n}\n\ntype Run struct {\n\tCmd exec.Cmd\n\tSrcfile string\n\tStdin io.WriteCloser\n\tSrcin io.WriteCloser\n\tStdout io.ReadCloser\n\tStderr io.ReadCloser\n}\n\ntype Runner struct {\n\tTestdir string\n}\n\nfunc (r *Run) Wait() error {\n\treturn r.Cmd.Wait()\n}\n\nfunc NewRunner() (*Runner, error) {\n\tif dir, err := ioutil.TempDir(tmpDir, \"xrt\"); err != nil {\n\t\treturn nil, err\n\t} else {\n\t\treturn &Runner{dir}, nil\n\t}\n}\n\nfunc (r *Runner) newTestGroup(name string) (*TestGroup) {\n\ttg := &TestGroup{Runner: r}\n\ttg.WaitGroup.Add(1)\n\tg0 := &Goroutine{tg, name, false}\n\ttg.running = append(tg.running, g0)\n\ttg.main = g0\n\treturn tg\n}\n\nfunc (r *Runner) Cleanup() {\n\tos.RemoveAll(r.Testdir)\n}\n\nfunc (r *Runner) RunTest(name string, f func (t *TestGroup)) {\n\tt := r.newTestGroup(name)\n\tc := make(chan interface{})\n\tgo func() {\n\t\tdefer func() {\n\t\t\trec := recover()\n\t\t\tc <- rec\n\t\t}()\n\t\tfmt.Println(\"Testing\", name, \"...\")\n\t\tf(t)\n\t\tc <- nil\n\t}()\n\trec := <- c\n\tif t.errors == nil && rec == nil {\n\t\tfmt.Println(\"Success:\", name)\n\t} else {\n\t\tfmt.Println(\"FAILED:\", name, t.errors, rec)\n\t}\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/go/src/xdelta/test.go",
    "content": "package xdelta\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path\"\n\t\"sync/atomic\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\nvar (\n\ttmpDir = \"/tmp\"\n\tsrcSeq int64\n)\n\nfunc (t *TestGroup) Drain(f io.ReadCloser, desc string) <-chan []byte {\n\tc := make(chan []byte)\n\tt.Go(desc, func(g *Goroutine) {\n\t\tif b, err := ioutil.ReadAll(f); err != nil {\n\t\t\tg.Panic(err)\n\t\t} else {\n\t\t\tc <- b\n\t\t}\n\t\tg.OK()\n\t})\n\treturn c\n}\n\nfunc (t *TestGroup) Empty(f io.ReadCloser, desc string) *Goroutine {\n\treturn t.Go(\"empty:\"+desc, func (g *Goroutine) {\n\t\ts := bufio.NewScanner(f)\n\t\tfor s.Scan() {\n\t\t\tos.Stderr.Write([]byte(fmt.Sprint(desc, \": \", s.Text(), \"\\n\")))\n\t\t}\n\t\terr := s.Err()\n\t\tf.Close()\n\t\tif err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\tg.OK()\n\t})\n}\n\nfunc (t *TestGroup) TestWrite(what string, f io.WriteCloser, b []byte) *Goroutine {\n\treturn t.Go(\"write\", func(g *Goroutine) {\n\t\tif _, err := f.Write(b); err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\tif err := f.Close(); err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\tg.OK()\n\t})\n}\n\nfunc (t *TestGroup) CopyStreams(r io.ReadCloser, w io.WriteCloser, written *int64) *Goroutine {\n\treturn t.Go(\"copy\", func(g *Goroutine) {\n\t\tnwrite, err := io.Copy(w, r)\n\t\tif err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\terr = r.Close()\n\t\tif err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\terr = w.Close()\n\t\tif err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\tg.OK()\n\t\t*written = nwrite\n\t})\n}\n\nfunc (t *TestGroup) CompareStreams(r1 io.ReadCloser, r2 io.ReadCloser, length int64) *Goroutine {\n\treturn t.Go(\"compare\", func(g *Goroutine) {\n\t\tb1 := make([]byte, blocksize)\n\t\tb2 := make([]byte, blocksize)\n\t\tvar idx int64\n\t\tfor length > 0 {\n\t\t\tc := blocksize\n\t\t\tif length < blocksize {\n\t\t\t\tc = int(length)\n\t\t\t}\n\t\t\tif _, err := io.ReadFull(r1, b1[0:c]); err != nil {\n\t\t\t\tg.Panic(err)\n\t\t\t}\n\t\t\tif _, err := io.ReadFull(r2, b2[0:c]); err != nil {\n\t\t\t\tg.Panic(err)\n\t\t\t}\n\t\t\tif bytes.Compare(b1[0:c], b2[0:c]) != 0 {\n\t\t\t\tfmt.Println(\"B1 is\", string(b1[0:c]))\n\t\t\t\tfmt.Println(\"B2 is\", string(b2[0:c]))\t\t\t\n\t\t\t\tg.Panic(errors.New(fmt.Sprint(\"Bytes do not compare at \", idx)))\n\t\t\t}\n\t\t\tlength -= int64(c)\n\t\t\tidx += int64(c)\n\t\t}\n\t\tg.OK()\n\t})\n}\n\nfunc (t *TestGroup) Exec(desc string, p Program, srcfifo bool, flags []string) (*Run, error) {\n\tvar err error\n\trun := &Run{}\n\targs := []string{p.Path}\n\tif srcfifo {\n\t\tnum := atomic.AddInt64(&srcSeq, 1)\n\t\trun.Srcfile = path.Join(t.Runner.Testdir, fmt.Sprint(\"source\", num))\n\t\tif err = unix.Mkfifo(run.Srcfile, 0600); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tread, write := io.Pipe()\n\t\tt.writeFifo(run.Srcfile, read)\n\t\trun.Srcin = write\n\t\targs = append(args, \"-s\")\n\t\targs = append(args, run.Srcfile)\n\t}\n\tif run.Stdin, err = run.Cmd.StdinPipe(); err != nil {\n\t\treturn nil, err\n\t}\n\tif run.Stdout, err = run.Cmd.StdoutPipe(); err != nil {\n\t\treturn nil, err\n\t}\n\tif run.Stderr, err = run.Cmd.StderrPipe(); err != nil {\n\t\treturn nil, err\n\t}\n\n\trun.Cmd.Path = p.Path\n\trun.Cmd.Args = append(args, flags...)\n\trun.Cmd.Dir = t.Runner.Testdir\n\tif serr := run.Cmd.Start(); serr != nil {\n\t\treturn nil, serr\n\t}\n\treturn run, nil\n}\n\nfunc (t *TestGroup) Fail(v ...interface{}) {\n\tpanic(fmt.Sprintln(v...))\n}\n\nfunc (t *TestGroup) writeFifo(srcfile string, read io.Reader) *Goroutine {\n\treturn t.Go(\"compare\", func(g *Goroutine) {\n\t\tfifo, err := os.OpenFile(srcfile, os.O_WRONLY, 0600)\n\t\tif err != nil {\n\t\t\tfifo.Close()\n\t\t\tg.Panic(err)\n\t\t}\n\t\tif _, err := io.Copy(fifo, read); err != nil {\n\t\t\tfifo.Close()\n\t\t\tg.Panic(err)\n\t\t}\n\t\tif err := fifo.Close(); err != nil {\n\t\t\tg.Panic(err)\n\t\t}\n\t\tg.OK()\n\t})\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/go/src/xdelta/tgroup.go",
    "content": "package xdelta\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"sync\"\n)\n\ntype TestGroup struct {\n\t*Runner\n\tmain *Goroutine\n\tsync.Mutex\n\tsync.WaitGroup\n\trunning []*Goroutine\n\terrors []error\n\tnonerrors []error  // For tolerated / expected conditions\n}\n\ntype Goroutine struct {\n\t*TestGroup\n\tname string\n\tdone bool\n}\n\nfunc (g *Goroutine) String() string {\n\treturn fmt.Sprint(\"[\", g.name, \"]\")\n}\n\nfunc (g *Goroutine) finish(err error) {\n\twait := false\n\ttg := g.TestGroup\n\tsbuf := make([]byte, 4096)\n\tsbuf = sbuf[0:runtime.Stack(sbuf, false)]\n\tif err != nil {\n\t\terr = fmt.Errorf(\"%v:%v:%v\", g.name, err, string(sbuf))\n\t}\n\ttg.Lock()\n\tif g.done {\n\t\tif err != nil {\n\t\t\ttg.nonerrors = append(tg.nonerrors, err)\n\t\t}\n\t} else {\n\t\twait = true\n\t\tg.done = true\n\t\tif err != nil {\n\t\t\ttg.errors = append(tg.errors, err)\n\t\t}\n\t}\n\ttg.Unlock()\n\tif wait {\n\t\ttg.WaitGroup.Done()\n\t}\n}\n\nfunc (g *Goroutine) OK() {\n\tg.finish(nil)\n}\n\nfunc (g *Goroutine) Panic(err error) {\n\tg.finish(err)\n\tif g != g.TestGroup.main {\n\t\truntime.Goexit()\n\t}\n}\n\nfunc (t *TestGroup) Main() *Goroutine { return t.main }\n\nfunc (t *TestGroup) Panic(err error) { t.Main().Panic(err) }\n\nfunc (t *TestGroup) Go(name string, f func(*Goroutine)) *Goroutine {\n\tg := &Goroutine{t, name, false}\n\tt.Lock()\n\tt.WaitGroup.Add(1)\n\tt.running = append(t.running, g)\n\tt.Unlock()\n\tgo f(g)\n\treturn g\n}\n\nfunc (t *TestGroup) Wait(procs... *Run) {\n\tt.Main().OK()\n\tt.WaitGroup.Wait()\n\tfor _, p := range procs {\n\t\tif err := p.Wait(); err != nil {\n\t\t\tt.errors = append(t.errors, err)\n\t\t}\n\t}\n\tfor _, err := range t.errors {\n\t\tfmt.Println(\":ERROR:\", err)\n\t}\n\tfor _, err := range t.nonerrors {\n\t\tfmt.Println(\"(ERROR)\", err)\n\t}\n\tif len(t.errors) != 0 {\n\t\tt.Fail(\"Test failed with\", len(t.errors), \"errors\")\n\t}\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/linkxd3lib.c",
    "content": "#include \"xdelta3.h\"\n\nextern int VVV;\n\nint VVV;\n\nvoid use(int r)\n{\n  VVV = r;\n}\n\nint main() {\n  xd3_config config;\n  xd3_stream stream;\n  xd3_source source;\n\n  xd3_init_config (& config, 0);\n  use (xd3_config_stream (&stream, &config));\n  use (xd3_close_stream (&stream));\n  xd3_abort_stream (&stream);\n  xd3_free_stream (&stream);\n  \n  xd3_avail_input (& stream, NULL, 0);\n  xd3_consume_output (& stream);\n  \n  use (xd3_set_source (& stream, & source));\n  xd3_set_flags (& stream, 0);\n  \n  use (xd3_decode_stream (& stream, NULL, 0, NULL, NULL, 0));\n  use (xd3_decode_input (&stream));\n  use (xd3_get_appheader (& stream, NULL, NULL));\n  \n#if XD3_ENCODER\n  use (xd3_encode_input (&stream));\n  use (xd3_encode_stream (& stream, NULL, 0, NULL, NULL, 0));\n  use (xd3_set_appheader (& stream));\n  use (xd3_encoder_used_source (& stream));\n  use (xd3_encoder_srcbase (& stream));\n  use (xd3_encoder_srclen (& stream));\n#endif\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/m4/ax_check_aligned_access_required.m4",
    "content": "# ====================================================================================\n#  http://www.gnu.org/software/autoconf-archive/ax_check_aligned_access_required.html\n# ====================================================================================\n#\n# SYNOPSIS\n#\n#   AC_CHECK_ALIGNED_ACCESS_REQUIRED\n#\n# DESCRIPTION\n#\n#   While the x86 CPUs allow access to memory objects to be unaligned it\n#   happens that most of the modern designs require objects to be aligned -\n#   or they will fail with a buserror. That mode is quite known by\n#   big-endian machines (sparc, etc) however the alpha cpu is little-\n#   endian.\n#\n#   The following function will test for aligned access to be required and\n#   set a config.h define HAVE_ALIGNED_ACCESS_REQUIRED (name derived by\n#   standard usage). Structures loaded from a file (or mmapped to memory)\n#   should be accessed per-byte in that case to avoid segfault type errors.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>\n#\n#   This program is free software; you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation; either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 7\n\nAC_DEFUN([AX_CHECK_ALIGNED_ACCESS_REQUIRED],\n[AC_CACHE_CHECK([if pointers to integers require aligned access],\n  [ax_cv_have_aligned_access_required],\n  [AC_TRY_RUN([\n#include <stdio.h>\n#include <stdlib.h>\n\nint main()\n{\n  char* string = malloc(40);\n  int i;\n  for (i=0; i < 40; i++) string[[i]] = i;\n  {\n     void* s = string;\n     int* p = s+1;\n     int* q = s+2;\n\n     if (*p == *q) { return 1; }\n  }\n  return 0;\n}\n              ],\n     [ax_cv_have_aligned_access_required=yes],\n     [ax_cv_have_aligned_access_required=no],\n     [ax_cv_have_aligned_access_required=no])\n  ])\nif test \"$ax_cv_have_aligned_access_required\" = yes ; then\n  AC_DEFINE([HAVE_ALIGNED_ACCESS_REQUIRED], [1],\n    [Define if pointers to integers require aligned access])\nfi\n])\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/m4/ax_pkg_swig.m4",
    "content": "# ===========================================================================\n#        http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found])\n#\n# DESCRIPTION\n#\n#   This macro searches for a SWIG installation on your system. If found,\n#   then SWIG is AC_SUBST'd; if not found, then $SWIG is empty.  If SWIG is\n#   found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd.\n#\n#   You can use the optional first argument to check if the version of the\n#   available SWIG is greater than or equal to the value of the argument. It\n#   should have the format: N[.N[.N]] (N is a number between 0 and 999. Only\n#   the first N is mandatory.) If the version argument is given (e.g.\n#   1.3.17), AX_PKG_SWIG checks that the swig package is this version number\n#   or higher.\n#\n#   As usual, action-if-found is executed if SWIG is found, otherwise\n#   action-if-not-found is executed.\n#\n#   In configure.in, use as:\n#\n#     AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ])\n#     AX_SWIG_ENABLE_CXX\n#     AX_SWIG_MULTI_MODULE_SUPPORT\n#     AX_SWIG_PYTHON\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>\n#   Copyright (c) 2008 Alan W. Irwin <irwin@beluga.phys.uvic.ca>\n#   Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>\n#   Copyright (c) 2008 Andrew Collier <colliera@ukzn.ac.za>\n#   Copyright (c) 2011 Murray Cumming <murrayc@openismus.com>\n#\n#   This program is free software; you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation; either version 2 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 8\n\nAC_DEFUN([AX_PKG_SWIG],[\n        # Ubuntu has swig 2.0 as /usr/bin/swig2.0\n        AC_PATH_PROGS([SWIG],[swig swig2.0])\n        if test -z \"$SWIG\" ; then\n                m4_ifval([$3],[$3],[:])\n        elif test -n \"$1\" ; then\n                AC_MSG_CHECKING([SWIG version])\n                [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\\([0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\).*/\\1/g'`]\n                AC_MSG_RESULT([$swig_version])\n                if test -n \"$swig_version\" ; then\n                        # Calculate the required version number components\n                        [required=$1]\n                        [required_major=`echo $required | sed 's/[^0-9].*//'`]\n                        if test -z \"$required_major\" ; then\n                                [required_major=0]\n                        fi\n                        [required=`echo $required | sed 's/[0-9]*[^0-9]//'`]\n                        [required_minor=`echo $required | sed 's/[^0-9].*//'`]\n                        if test -z \"$required_minor\" ; then\n                                [required_minor=0]\n                        fi\n                        [required=`echo $required | sed 's/[0-9]*[^0-9]//'`]\n                        [required_patch=`echo $required | sed 's/[^0-9].*//'`]\n                        if test -z \"$required_patch\" ; then\n                                [required_patch=0]\n                        fi\n                        # Calculate the available version number components\n                        [available=$swig_version]\n                        [available_major=`echo $available | sed 's/[^0-9].*//'`]\n                        if test -z \"$available_major\" ; then\n                                [available_major=0]\n                        fi\n                        [available=`echo $available | sed 's/[0-9]*[^0-9]//'`]\n                        [available_minor=`echo $available | sed 's/[^0-9].*//'`]\n                        if test -z \"$available_minor\" ; then\n                                [available_minor=0]\n                        fi\n                        [available=`echo $available | sed 's/[0-9]*[^0-9]//'`]\n                        [available_patch=`echo $available | sed 's/[^0-9].*//'`]\n                        if test -z \"$available_patch\" ; then\n                                [available_patch=0]\n                        fi\n                        # Convert the version tuple into a single number for easier comparison.\n                        # Using base 100 should be safe since SWIG internally uses BCD values\n                        # to encode its version number.\n                        required_swig_vernum=`expr $required_major \\* 10000 \\\n                            \\+ $required_minor \\* 100 \\+ $required_patch`\n                        available_swig_vernum=`expr $available_major \\* 10000 \\\n                            \\+ $available_minor \\* 100 \\+ $available_patch`\n\n                        if test $available_swig_vernum -lt $required_swig_vernum; then\n                                AC_MSG_WARN([SWIG version >= $1 is required.  You have $swig_version.])\n                                SWIG=''\n                                m4_ifval([$3],[$3],[])\n                        else\n                                AC_MSG_CHECKING([for SWIG library])\n                                SWIG_LIB=`$SWIG -swiglib`\n                                AC_MSG_RESULT([$SWIG_LIB])\n                                m4_ifval([$2],[$2],[])\n                        fi\n                else\n                        AC_MSG_WARN([cannot determine SWIG version])\n                        SWIG=''\n                        m4_ifval([$3],[$3],[])\n                fi\n        fi\n        AC_SUBST([SWIG_LIB])\n])\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/m4/ax_python_devel.m4",
    "content": "# ===========================================================================\n#      http://www.gnu.org/software/autoconf-archive/ax_python_devel.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_PYTHON_DEVEL([version])\n#\n# DESCRIPTION\n#\n#   Note: Defines as a precious variable \"PYTHON_VERSION\". Don't override it\n#   in your configure.ac.\n#\n#   This macro checks for Python and tries to get the include path to\n#   'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS)\n#   output variables. It also exports $(PYTHON_EXTRA_LIBS) and\n#   $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code.\n#\n#   You can search for some particular version of Python by passing a\n#   parameter to this macro, for example \">= '2.3.1'\", or \"== '2.4'\". Please\n#   note that you *have* to pass also an operator along with the version to\n#   match, and pay special attention to the single quotes surrounding the\n#   version number. Don't use \"PYTHON_VERSION\" for this: that environment\n#   variable is declared as precious and thus reserved for the end-user.\n#\n#   This macro should work for all versions of Python >= 2.1.0. As an end\n#   user, you can disable the check for the python version by setting the\n#   PYTHON_NOVERSIONCHECK environment variable to something else than the\n#   empty string.\n#\n#   If you need to use this macro for an older Python version, please\n#   contact the authors. We're always open for feedback.\n#\n# LICENSE\n#\n#   Copyright (c) 2009 Sebastian Huber <sebastian-huber@web.de>\n#   Copyright (c) 2009 Alan W. Irwin <irwin@beluga.phys.uvic.ca>\n#   Copyright (c) 2009 Rafael Laboissiere <rafael@laboissiere.net>\n#   Copyright (c) 2009 Andrew Collier <colliera@ukzn.ac.za>\n#   Copyright (c) 2009 Matteo Settenvini <matteo@member.fsf.org>\n#   Copyright (c) 2009 Horst Knorr <hk_classes@knoda.org>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 8\n\nAU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL])\nAC_DEFUN([AX_PYTHON_DEVEL],[\n\t#\n\t# Allow the use of a (user set) custom python version\n\t#\n\tAC_ARG_VAR([PYTHON_VERSION],[The installed Python\n\t\tversion to use, for example '2.3'. This string\n\t\twill be appended to the Python interpreter\n\t\tcanonical name.])\n\n\tAC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]])\n\tif test -z \"$PYTHON\"; then\n\t   AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path])\n\t   PYTHON_VERSION=\"\"\n\tfi\n\n\t#\n\t# Check for a version of Python >= 2.1.0\n\t#\n\tAC_MSG_CHECKING([for a version of Python >= '2.1.0'])\n\tac_supports_python_ver=`$PYTHON -c \"import sys; \\\n\t\tver = sys.version.split ()[[0]]; \\\n\t\tprint (ver >= '2.1.0')\"`\n\tif test \"$ac_supports_python_ver\" != \"True\"; then\n\t\tif test -z \"$PYTHON_NOVERSIONCHECK\"; then\n\t\t\tAC_MSG_RESULT([no])\n\t\t\tAC_MSG_FAILURE([\nThis version of the AC@&t@_PYTHON_DEVEL macro\ndoesn't work properly with versions of Python before\n2.1.0. You may need to re-run configure, setting the\nvariables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG,\nPYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.\nMoreover, to disable this check, set PYTHON_NOVERSIONCHECK\nto something else than an empty string.\n])\n\t\telse\n\t\t\tAC_MSG_RESULT([skip at user request])\n\t\tfi\n\telse\n\t\tAC_MSG_RESULT([yes])\n\tfi\n\n\t#\n\t# if the macro parameter ``version'' is set, honour it\n\t#\n\tif test -n \"$1\"; then\n\t\tAC_MSG_CHECKING([for a version of Python $1])\n\t\tac_supports_python_ver=`$PYTHON -c \"import sys; \\\n\t\t\tver = sys.version.split ()[[0]]; \\\n\t\t\tprint (ver $1)\"`\n\t\tif test \"$ac_supports_python_ver\" = \"True\"; then\n\t\t   AC_MSG_RESULT([yes])\n\t\telse\n\t\t\tAC_MSG_RESULT([no])\n\t\t\tAC_MSG_ERROR([this package requires Python $1.\nIf you have it installed, but it isn't the default Python\ninterpreter in your system path, please pass the PYTHON_VERSION\nvariable to configure. See ``configure --help'' for reference.\n])\n\t\t\tPYTHON_VERSION=\"\"\n\t\tfi\n\tfi\n\n\t#\n\t# Check if you have distutils, else fail\n\t#\n\tAC_MSG_CHECKING([for the distutils Python package])\n\tac_distutils_result=`$PYTHON -c \"import distutils\" 2>&1`\n\tif test -z \"$ac_distutils_result\"; then\n\t\tAC_MSG_RESULT([yes])\n\telse\n\t\tAC_MSG_RESULT([no])\n\t\tAC_MSG_ERROR([cannot import Python module \"distutils\".\nPlease check your Python installation. The error was:\n$ac_distutils_result])\n\t\tPYTHON_VERSION=\"\"\n\tfi\n\n\t#\n\t# Check for Python include path\n\t#\n\tAC_MSG_CHECKING([for Python include path])\n\tif test -z \"$PYTHON_CPPFLAGS\"; then\n\t\tpython_path=`$PYTHON -c \"import distutils.sysconfig; \\\n\t\t\tprint (distutils.sysconfig.get_python_inc ());\"`\n\t\tif test -n \"${python_path}\"; then\n\t\t\tpython_path=\"-I$python_path\"\n\t\tfi\n\t\tPYTHON_CPPFLAGS=$python_path\n\tfi\n\tAC_MSG_RESULT([$PYTHON_CPPFLAGS])\n\tAC_SUBST([PYTHON_CPPFLAGS])\n\n\t#\n\t# Check for Python library path\n\t#\n\tAC_MSG_CHECKING([for Python library path])\n\tif test -z \"$PYTHON_LDFLAGS\"; then\n\t\t# (makes two attempts to ensure we've got a version number\n\t\t# from the interpreter)\n\t\tac_python_version=`cat<<EOD | $PYTHON -\n\n# join all versioning strings, on some systems\n# major/minor numbers could be in different list elements\nfrom distutils.sysconfig import *\nret = ''\nfor e in get_config_vars ('VERSION'):\n\tif (e != None):\n\t\tret += e\nprint (ret)\nEOD`\n\n\t\tif test -z \"$ac_python_version\"; then\n\t\t\tif test -n \"$PYTHON_VERSION\"; then\n\t\t\t\tac_python_version=$PYTHON_VERSION\n\t\t\telse\n\t\t\t\tac_python_version=`$PYTHON -c \"import sys; \\\n\t\t\t\t\tprint (sys.version[[:3]])\"`\n\t\t\tfi\n\t\tfi\n\n\t\t# Make the versioning information available to the compiler\n\t\tAC_DEFINE_UNQUOTED([HAVE_PYTHON], [\"$ac_python_version\"],\n                                   [If available, contains the Python version number currently in use.])\n\n\t\t# First, the library directory:\n\t\tac_python_libdir=`cat<<EOD | $PYTHON -\n\n# There should be only one\nimport distutils.sysconfig\nfor e in distutils.sysconfig.get_config_vars ('LIBDIR'):\n\tif e != None:\n\t\tprint (e)\n\t\tbreak\nEOD`\n\n\t\t# Before checking for libpythonX.Y, we need to know\n\t\t# the extension the OS we're on uses for libraries\n\t\t# (we take the first one, if there's more than one fix me!):\n\t\tac_python_soext=`$PYTHON -c \\\n\t\t  \"import distutils.sysconfig; \\\n\t\t  print (distutils.sysconfig.get_config_vars('SO')[[0]])\"`\n\n\t\t# Now, for the library:\n\t\tac_python_soname=`$PYTHON -c \\\n\t\t  \"import distutils.sysconfig; \\\n\t\t  print (distutils.sysconfig.get_config_vars('LDLIBRARY')[[0]])\"`\n\n\t\t# Strip away extension from the end to canonicalize its name:\n\t\tac_python_library=`echo \"$ac_python_soname\" | sed \"s/${ac_python_soext}$//\"`\n\n\t\t# This small piece shamelessly adapted from PostgreSQL python macro;\n\t\t# credits goes to momjian, I think. I'd like to put the right name\n\t\t# in the credits, if someone can point me in the right direction... ?\n\t\t#\n\t\tif test -n \"$ac_python_libdir\" -a -n \"$ac_python_library\" \\\n\t\t\t-a x\"$ac_python_library\" != x\"$ac_python_soname\"\n\t\tthen\n\t\t\t# use the official shared library\n\t\t\tac_python_library=`echo \"$ac_python_library\" | sed \"s/^lib//\"`\n\t\t\tPYTHON_LDFLAGS=\"-L$ac_python_libdir -l$ac_python_library\"\n\t\telse\n\t\t\t# old way: use libpython from python_configdir\n\t\t\tac_python_libdir=`$PYTHON -c \\\n\t\t\t  \"from distutils.sysconfig import get_python_lib as f; \\\n\t\t\t  import os; \\\n\t\t\t  print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));\"`\n\t\t\tPYTHON_LDFLAGS=\"-L$ac_python_libdir -lpython$ac_python_version\"\n\t\tfi\n\n\t\tif test -z \"PYTHON_LDFLAGS\"; then\n\t\t\tAC_MSG_ERROR([\n  Cannot determine location of your Python DSO. Please check it was installed with\n  dynamic libraries enabled, or try setting PYTHON_LDFLAGS by hand.\n\t\t\t])\n\t\tfi\n\tfi\n\tAC_MSG_RESULT([$PYTHON_LDFLAGS])\n\tAC_SUBST([PYTHON_LDFLAGS])\n\n\t#\n\t# Check for site packages\n\t#\n\tAC_MSG_CHECKING([for Python site-packages path])\n\tif test -z \"$PYTHON_SITE_PKG\"; then\n\t\tPYTHON_SITE_PKG=`$PYTHON -c \"import distutils.sysconfig; \\\n\t\t\tprint (distutils.sysconfig.get_python_lib(0,0));\"`\n\tfi\n\tAC_MSG_RESULT([$PYTHON_SITE_PKG])\n\tAC_SUBST([PYTHON_SITE_PKG])\n\n\t#\n\t# libraries which must be linked in when embedding\n\t#\n\tAC_MSG_CHECKING(python extra libraries)\n\tif test -z \"$PYTHON_EXTRA_LIBS\"; then\n\t   PYTHON_EXTRA_LIBS=`$PYTHON -c \"import distutils.sysconfig; \\\n                conf = distutils.sysconfig.get_config_var; \\\n                print (conf('LOCALMODLIBS') + ' ' + conf('LIBS'))\"`\n\tfi\n\tAC_MSG_RESULT([$PYTHON_EXTRA_LIBS])\n\tAC_SUBST(PYTHON_EXTRA_LIBS)\n\n\t#\n\t# linking flags needed when embedding\n\t#\n\tAC_MSG_CHECKING(python extra linking flags)\n\tif test -z \"$PYTHON_EXTRA_LDFLAGS\"; then\n\t\tPYTHON_EXTRA_LDFLAGS=`$PYTHON -c \"import distutils.sysconfig; \\\n\t\t\tconf = distutils.sysconfig.get_config_var; \\\n\t\t\tprint (conf('LINKFORSHARED'))\"`\n\tfi\n\tAC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS])\n\tAC_SUBST(PYTHON_EXTRA_LDFLAGS)\n\n\t#\n\t# final check to see if everything compiles alright\n\t#\n\tAC_MSG_CHECKING([consistency of all components of python development environment])\n\t# save current global flags\n\tac_save_LIBS=\"$LIBS\"\n\tac_save_CPPFLAGS=\"$CPPFLAGS\"\n\tLIBS=\"$ac_save_LIBS $PYTHON_LDFLAGS $PYTHON_EXTRA_LDFLAGS $PYTHON_EXTRA_LIBS\"\n\tCPPFLAGS=\"$ac_save_CPPFLAGS $PYTHON_CPPFLAGS\"\n\tAC_LANG_PUSH([C])\n\tAC_LINK_IFELSE([\n\t\tAC_LANG_PROGRAM([[#include <Python.h>]],\n\t\t\t\t[[Py_Initialize();]])\n\t\t],[pythonexists=yes],[pythonexists=no])\n\tAC_LANG_POP([C])\n\t# turn back to default flags\n\tCPPFLAGS=\"$ac_save_CPPFLAGS\"\n\tLIBS=\"$ac_save_LIBS\"\n\n\tAC_MSG_RESULT([$pythonexists])\n\n        if test ! \"x$pythonexists\" = \"xyes\"; then\n\t   AC_MSG_FAILURE([\n  Could not link test program to Python. Maybe the main Python library has been\n  installed in some non-standard library path. If so, pass it to configure,\n  via the LDFLAGS environment variable.\n  Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/python/lib\"\n  ============================================================================\n   ERROR!\n   You probably have to install the development version of the Python package\n   for your distribution.  The exact name of this package varies among them.\n  ============================================================================\n\t   ])\n\t  PYTHON_VERSION=\"\"\n\tfi\n\n\t#\n\t# all done!\n\t#\n])\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/m4/ax_swig_python.m4",
    "content": "# ===========================================================================\n#      http://www.gnu.org/software/autoconf-archive/ax_swig_python.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_SWIG_PYTHON([use-shadow-classes = {no, yes}])\n#\n# DESCRIPTION\n#\n#   Checks for Python and provides the $(AX_SWIG_PYTHON_CPPFLAGS), and\n#   $(AX_SWIG_PYTHON_OPT) output variables.\n#\n#   $(AX_SWIG_PYTHON_OPT) contains all necessary SWIG options to generate\n#   code for Python. Shadow classes are enabled unless the value of the\n#   optional first argument is exactly 'no'. If you need multi module\n#   support (provided by the AX_SWIG_MULTI_MODULE_SUPPORT macro) use\n#   $(AX_SWIG_PYTHON_LIBS) to link against the appropriate library. It\n#   contains the SWIG Python runtime library that is needed by the type\n#   check system for example.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>\n#   Copyright (c) 2008 Alan W. Irwin <irwin@beluga.phys.uvic.ca>\n#   Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>\n#   Copyright (c) 2008 Andrew Collier <colliera@ukzn.ac.za>\n#\n#   This program is free software; you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation; either version 2 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 7\n\nAU_ALIAS([SWIG_PYTHON], [AX_SWIG_PYTHON])\nAC_DEFUN([AX_SWIG_PYTHON],[\n        AC_REQUIRE([AX_PKG_SWIG])\n        AC_REQUIRE([AX_PYTHON_DEVEL])\n        test \"x$1\" != \"xno\" || swig_shadow=\" -noproxy\"\n        AC_SUBST([AX_SWIG_PYTHON_OPT],[-python$swig_shadow])\n        AC_SUBST([AX_SWIG_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS])\n])\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/plot.sh",
    "content": "#!/bin/sh\n\nG=/usr/bin/gnuplot\n\nD=./output_dir\n\nI=$1\nO=$D/$2\n\n$G > $O <<EOF\n\n#set terminal jpeg\nset terminal png\n\nf(x) = 1331000 + 30000 * (1 / (x - 2.45))\n\n# plot [x=1:10] [1:10] f(x)\n# plot sin(x), cos(x)\n# , f(x)\n\nplot \"$I\" using 1:2\n\nEOF\n\nmv \"$I\" \"$D\"\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/rcs_junk.cc",
    "content": "typedef struct _RcsWalker               RcsWalker;\ntypedef struct _RcsFile                 RcsFile;\ntypedef struct _RcsVersion              RcsVersion;\ntypedef struct _RcsStats                RcsStats;\ntypedef struct _IntStat                 IntStat;\ntypedef struct _DblStat                 DblStat;\ntypedef struct _BinCounter              BinCounter;\ntypedef struct _ConfigOption            ConfigOption;\n\nstruct _RcsWalker {\n  void*    (* initialize)    (void);\n  int      (* finalize)      (RcsStats* stats, void* data);\n  int      (* onefile)       (RcsFile* rcs, RcsStats* stats, void* data);\n  int      (* dateorder)     (RcsFile* rcs, RcsVersion* v, void* data);\n  int      (* delta_orig)    (RcsFile* rcs, RcsVersion* from, RcsVersion *to, void* data);\n  int      (* delta_date)    (RcsFile* rcs, RcsVersion* from, RcsVersion *to, void* data);\n  int      min_versions;\n  int      max_versions;\n  gboolean write_files;\n};\n\nstruct _RcsVersion {\n  RcsFile    *rcs;\n  time_t      date;\n  int         dateseq;\n  int         chain_length;\n  char       *vname;\n  off_t       size;\n  int         cc;\n  guint8*     segment;\n  char       *filename;\n  RcsVersion *parent;\n  GSList     *children;\n  guint       on_trunk : 1;\n};\n\nstruct _RcsFile {\n  char       *filename;\n  char       *copyname;\n  char       *headname;\n\n  int         version_count;\n  int         forward_count;\n  int         reverse_count;\n  int         branch_count;\n\n  RcsVersion *versions;\n  RcsVersion **versions_date;\n\n  RcsVersion *head_version;\n  RcsVersion *root_version;\n\n  off_t       total_size;\n\n  guint       atflag : 1;\n};\n\nstruct _RcsStats {\n  BinCounter *avg_version_size;\n  IntStat* version_stat;\n  IntStat* forward_stat;\n  IntStat* reverse_stat;\n  IntStat* branch_stat;\n  IntStat* unencoded_stat;\n  IntStat* literal_stat;\n};\n\nstruct _IntStat {\n  const char* name;\n  int count;\n  long long sum;\n  long long min;\n  long long max;\n\n  GArray *values;\n};\n\nstruct _DblStat {\n  const char* name;\n  int count;\n  double sum;\n  double min;\n  double max;\n\n  GArray *values;\n};\n\nstruct _BinCounter {\n  const char *name;\n  GPtrArray  *bins;\n};\n\nenum _ConfigArgument {\n  CO_Required,\n  CO_Optional,\n  CO_None\n};\n\ntypedef enum _ConfigArgument ConfigArgument;\n\nenum _ConfigOptionType {\n  CD_Bool,\n  CD_Int32,\n  CD_Double,\n  CD_String\n};\n\ntypedef enum _ConfigOptionType ConfigOptionType;\n\nenum _ConfigStyle {\n  CS_Ignore,\n  CS_UseAsFile,\n  CS_Use\n};\n\ntypedef enum _ConfigStyle ConfigStyle;\n\nstruct _ConfigOption {\n  const char       *name;\n  const char       *abbrev;\n  ConfigStyle       style;\n  ConfigArgument    arg;\n  ConfigOptionType  type;\n  void             *value;\n  gboolean          found;\n};\n\n/* RCS inspection stuff\n */\n\nvoid                rcswalk_init   (void);\nint            rcswalk        (RcsWalker *walker, const char* copy_base);\nvoid                rcswalk_report (RcsStats* stats);\n\nIntStat*            stat_int_new      (const char* name);\nvoid                stat_int_add_item (IntStat* stat, long long v);\nvoid                stat_int_report   (IntStat* stat);\n\nDblStat*            stat_dbl_new      (const char* name);\nvoid                stat_dbl_add_item (DblStat* stat, double v);\nvoid                stat_dbl_report   (DblStat* stat);\n\nBinCounter*         stat_bincount_new      (const char* name);\nvoid                stat_bincount_add_item (BinCounter* bc, int bin, double val);\nvoid                stat_bincount_report   (BinCounter* bc);\n\n/* Experiment configuration stuff\n */\n\nvoid                config_register   (ConfigOption *opts, int nopts);\nint            config_parse      (const char* config_file);\nint            config_done       (void);\nvoid                config_help       (void);\nvoid                config_set_string (const char* var, const char* val);\nint            config_clear_dir  (const char* dir);\nint            config_create_dir (const char* dir);\nFILE*               config_output     (const char* fmt, ...);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n#include \"rcswalk.h\"\n#include \"edsio.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/wait.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <dirent.h>\n#include <unistd.h>\n#include <math.h>\n\n#undef BUFSIZE\n#define BUFSIZE (1<<14)\n\nchar       *tmp_file_1;\ngboolean    tmp_file_1_free = TRUE;\nchar       *tmp_file_2;\ngboolean    tmp_file_2_free = TRUE;\n\nint         skip_count;\nint         small_count;\nint         large_count;\nint         process_count;\n\nextern time_t str2time (char const *, time_t, long);\n\nstatic guint8 readbuf[BUFSIZE];\n\nstatic const char* rcswalk_input_dir = NULL;\nstatic const char* config_output_base = NULL;\nstatic const char* config_output_dir = NULL;\nstatic const char* rcswalk_experiment = NULL;\n\nstatic ConfigOption rcswalk_options[] = {\n  { \"rcswalk_experiment\", \"ex\", CS_Use,       CO_Required, CD_String, & rcswalk_experiment },\n  { \"rcs_input_dir\",      \"id\", CS_UseAsFile, CO_Required, CD_String, & rcswalk_input_dir }\n};\n\nstatic ConfigOption config_options[] = {\n  { \"config_output_base\", \"ob\", CS_Ignore, CO_Required, CD_String, & config_output_base }\n};\n\n\nvoid\nrcswalk_free_segment (RcsVersion *v)\n{\n  if (v->segment)\n    g_free (v->segment);\n\n  if (v->filename == tmp_file_1)\n    tmp_file_1_free = TRUE;\n  else if (v->filename == tmp_file_2)\n    tmp_file_2_free = TRUE;\n  else if (v->filename)\n    g_free (v->filename);\n\n  v->segment = NULL;\n  v->filename = NULL;\n}\n\nint\nrcswalk_checkout (RcsFile* rcs, RcsWalker* walker, RcsVersion *v)\n{\n  FILE* out;\n  char cmdbuf[1024];\n  int nread;\n  int alloc = BUFSIZE;\n  int pos = 0;\n\n  sprintf (cmdbuf, \"co -ko -p%s %s 2>/dev/null\\n\", v->vname, rcs->filename);\n\n  g_assert (! v->segment);\n\n  v->segment = g_malloc (alloc);\n\n  if (! (out = popen (cmdbuf, \"r\")))\n    {\n      g_warning (\"popen failed: %s: %s\", cmdbuf, g_strerror (errno));\n      return errno;\n    }\n\n  for (;;)\n    {\n      nread = fread (readbuf, 1, BUFSIZE, out);\n\n      if (nread == 0)\n\tbreak;\n\n      if (nread < 0)\n\t{\n\t  g_warning (\"fread failed: %s\", g_strerror (errno));\n\t  return errno;\n\t}\n\n      if (pos + nread > alloc)\n\t{\n\t  alloc *= 2;\n\t  v->segment = g_realloc (v->segment, alloc);\n\t}\n\n      memcpy (v->segment + pos, readbuf, nread);\n\n      pos += nread;\n    }\n\n  if (pclose (out) < 0)\n    {\n      g_warning (\"pclose failed\");\n      return errno;\n    }\n\n  v->size = pos;\n\n  if (walker->write_files)\n    {\n      char* file = NULL;\n\n      if (! file && tmp_file_1_free)\n\t{\n\t  file = tmp_file_1;\n\t  tmp_file_1_free = FALSE;\n\t}\n\n      if (! file && tmp_file_2_free)\n\t{\n\t  file = tmp_file_2;\n\t  tmp_file_2_free = FALSE;\n\t}\n\n      g_assert (file);\n\n      v->filename = file;\n\n      if (! (out = fopen (file, \"w\")))\n\t{\n\t  g_warning (\"fopen failed: %s\\n\", file);\n\t  return errno;\n\t}\n\n      if (fwrite (v->segment, v->size, 1, out) != 1)\n\t{\n\t  g_warning (\"fwrite failed: %s\\n\", file);\n\t  return errno;\n\t}\n\n      if (fclose (out) < 0)\n\t{\n\t  g_warning (\"fclose failed: %s\\n\", file);\n\t  return errno;\n\t}\n    }\n\n  return 0;\n}\n\nint\nrcswalk_delta_date (RcsFile* rcs, RcsWalker* walker, void* data)\n{\n  int i;\n  int ret;\n  RcsVersion *vf = NULL;\n  RcsVersion *vt = NULL;\n\n  for (i = 0; i < (rcs->version_count-1); i += 1)\n    {\n      vf = rcs->versions_date[i+1];\n      vt = rcs->versions_date[i];\n\n      if (! vt->segment && (ret = rcswalk_checkout (rcs, walker, vt))) {\n\treturn ret;\n      }\n\n      if ((ret = rcswalk_checkout (rcs, walker, vf))) {\n\treturn ret;\n      }\n\n      if ((ret = walker->delta_date (rcs, vf, vt, data))) {\n\treturn ret;\n      }\n\n      rcswalk_free_segment (vt);\n    }\n\n  if (vf) rcswalk_free_segment (vf);\n  if (vt) rcswalk_free_segment (vt);\n\n  return 0;\n}\n\nint\nrcswalk_delta_orig (RcsFile* rcs, RcsWalker* walker, RcsVersion* version, int *count, void* data)\n{\n  int ret;\n  GSList *c;\n  RcsVersion *child;\n\n  for (c = version->children; c; c = c->next)\n    {\n      gboolean reverse;\n\n      child = c->data;\n\n      if (! version->segment)\n\t{\n\t  if ((ret = rcswalk_checkout (rcs, walker, version))) {\n\t    return ret;\n\t  }\n\t}\n\n      if ((ret = rcswalk_checkout (rcs, walker, child))) {\n\treturn ret;\n      }\n\n      reverse = version->on_trunk && child->on_trunk;\n\n      (* count) += 1;\n\n      if ((ret = walker->delta_orig (rcs, reverse ? child : version, reverse ? version : child, data))) {\n\treturn ret;\n      }\n\n      rcswalk_free_segment (version);\n\n      if ((ret = rcswalk_delta_orig (rcs, walker, child, count, data))) {\n\treturn ret;\n      }\n    }\n\n  rcswalk_free_segment (version);\n  return 0;\n}\n\nint\nrcswalk_dateorder (RcsFile* rcs, RcsWalker *walker, RcsStats *stats, void* data)\n{\n  int i, ret;\n\n  for (i = 0; i < rcs->version_count; i += 1)\n    {\n      RcsVersion *v = rcs->versions_date[i];\n\n      if ((ret = rcswalk_checkout (rcs, walker, v))) {\n\treturn ret;\n      }\n\n      stat_bincount_add_item (stats->avg_version_size, i, v->size);\n\n      if ((ret = walker->dateorder (rcs, v, data))) {\n\treturn ret;\n      }\n\n      rcswalk_free_segment (v);\n    }\n\n  return 0;\n}\n\ngboolean\nrcswalk_match (char** line_p, char* str)\n{\n  int len = strlen (str);\n\n  if (strncmp (*line_p, str, len) == 0)\n    {\n      (*line_p) += len;\n      return TRUE;\n    }\n\n  return FALSE;\n}\n\nvoid\nrcswalk_find_parent (RcsFile *rcs, GHashTable* hash, RcsVersion *v)\n{\n  char *lastdot;\n  char  mbuf[1024];\n  int   lastn;\n  RcsVersion *p;\n\n  strcpy (mbuf, v->vname);\n\n  if (! (lastdot = strchr (mbuf, '.')))\n    abort ();\n\n  if (! (lastdot = strchr (lastdot+1, '.')))\n    v->on_trunk = TRUE;\n\n  lastdot = strrchr (mbuf, '.');\n  lastn = atoi (lastdot + 1);\n\n  do\n    {\n      if (lastn == 1)\n\t{\n\t  (*lastdot) = 0;\n\n\t  if (strcmp (mbuf, \"1\") == 0)\n\t    {\n\t      /* Assuming the first version is always \"1.1\".\n\t       */\n\t      rcs->root_version = v;\n\t      return;\n\t    }\n\t  else if (! (lastdot = strrchr (mbuf, '.')))\n\t    {\n\t      int i = 1;\n\t      int br = atoi (mbuf) - 1;\n\t      RcsVersion *p2 = NULL;\n\n\t      /* Now we have something like \"2.1\" and need to\n\t       * search for the highest \"1.x\" version.\n\t       */\n\n\t      do\n\t\t{\n\t\t  sprintf (mbuf, \"%d.%d\", br, i++);\n\t\t  p = p2;\n\t\t}\n\t      while ((p2 = g_hash_table_lookup (hash, mbuf)));\n\n\t      if (p == NULL)\n\t\t{\n\t\t  rcs->root_version = v;\n\t\t  return;\n\t\t}\n\n\t      break;\n\t    }\n\t  else\n\t    {\n\t      /* 1.2.3.1 => 1.2 */\n\t      (*lastdot) = 0;\n\t      lastdot = strrchr (mbuf, '.');\n\t      lastn = atoi (lastdot + 1);\n\t    }\n\t}\n      else\n\t{\n\t  lastn -= 1;\n\t  sprintf (lastdot, \".%d\", lastn);\n\t}\n    }\n  while (! (p = g_hash_table_lookup (hash, mbuf)));\n\n  g_assert (p);\n\n  v->parent = p;\n\n  p->children = g_slist_prepend (p->children, v);\n}\n\nint\nrcswalk_traverse_graph (RcsFile* rcs, RcsVersion* version, RcsVersion *parent)\n{\n  GSList *c;\n  int distance = -1;\n\n  version->cc = g_slist_length (version->children);\n\n  if (version->cc > 1)\n    rcs->branch_count += (version->cc - 1);\n\n  if (parent)\n    {\n      /* Insure that there is proper date ordering. */\n      if (version->date <= parent->date)\n\tversion->date = parent->date + 1;\n\n      if (parent->on_trunk && version->on_trunk)\n\trcs->reverse_count += 1;\n      else\n\trcs->forward_count += 1;\n    }\n\n  for (c = version->children; c; c = c->next)\n    {\n      int c_dist = rcswalk_traverse_graph (rcs, c->data, version);\n\n      distance = MAX (distance, c_dist);\n    }\n\n  if (version == rcs->head_version)\n    distance = 0;\n\n  if (distance >= 0)\n    {\n      version->chain_length = distance;\n\n      return distance + 1;\n    }\n\n  return -1;\n}\n\nvoid\nrcswalk_compute_chain_length (RcsFile* rcs, RcsVersion* version, RcsVersion *parent)\n{\n  GSList *c;\n\n  if (! parent)\n    {\n      g_assert (version->chain_length >= 0);\n    }\n  else if (version->chain_length < 0)\n    {\n      version->chain_length = parent->chain_length + 1;\n    }\n\n  for (c = version->children; c; c = c->next)\n    {\n      rcswalk_compute_chain_length (rcs, c->data, version);\n    }\n}\n\nint\nrcswalk_date_compare (const void* a, const void* b)\n{\n  RcsVersion **ra = (void*) a;\n  RcsVersion **rb = (void*) b;\n\n  return (*ra)->date - (*rb)->date;\n}\n\nint\nrcswalk_build_graph (RcsFile* rcs)\n{\n  GHashTable* hash = g_hash_table_new (g_str_hash, g_str_equal);\n  int i;\n\n  for (i = 0; i < rcs->version_count; i += 1)\n    g_hash_table_insert (hash, rcs->versions[i].vname, rcs->versions + i);\n\n  for (i = 0; i < rcs->version_count; i += 1)\n    {\n      RcsVersion *v = rcs->versions + i;\n\n      v->chain_length = -1;\n      v->rcs = rcs;\n\n      rcswalk_find_parent (rcs, hash, v);\n    }\n\n  rcs->head_version = g_hash_table_lookup (hash, rcs->headname);\n\n  rcswalk_traverse_graph (rcs, rcs->root_version, NULL);\n\n  rcswalk_compute_chain_length (rcs, rcs->root_version, NULL);\n\n  for (i = 0; i < rcs->version_count; i += 1)\n    rcs->versions_date[i] = rcs->versions + i;\n\n  qsort (rcs->versions_date, rcs->version_count, sizeof (RcsVersion*), & rcswalk_date_compare);\n\n  for (i = 0; i < rcs->version_count; i += 1)\n    {\n      RcsVersion *v = rcs->versions_date[i];\n\n      v->dateseq = i;\n    }\n\n  g_hash_table_destroy (hash);\n\n  return 0;\n}\n\n#define HEAD_STATE 0\n#define BAR_STATE 1\n#define REV_STATE 2\n#define DATE_STATE 3\n\nint\nrcswalk_load (RcsFile *rcs, gboolean *skip)\n{\n  FILE* rlog;\n  char cmdbuf[1024];\n  char oneline[1024], *oneline_p;\n  char rbuf[1024];\n  int version_i = 0, ret;\n  int read_state = HEAD_STATE;\n\n  sprintf (cmdbuf, \"rlog %s\", rcs->filename);\n\n  if (! (rlog = popen (cmdbuf, \"r\")))\n    {\n      g_warning (\"popen failed: %s\", cmdbuf);\n      return errno;\n    }\n\n  rcs->headname = NULL;\n\n  while (fgets (oneline, 1024, rlog))\n    {\n      oneline_p = oneline;\n\n      if (read_state == HEAD_STATE && rcswalk_match (& oneline_p, \"total revisions: \"))\n\t{\n\t  if (sscanf (oneline_p, \"%d\", & rcs->version_count) != 1)\n\t    goto badscan;\n\n\t  rcs->versions = g_new0 (RcsVersion, rcs->version_count);\n\t  rcs->versions_date = g_new (RcsVersion*, rcs->version_count);\n\t  read_state = BAR_STATE;\n\t}\n      else if (read_state == HEAD_STATE && rcswalk_match (& oneline_p, \"head: \"))\n\t{\n\t  if (sscanf (oneline_p, \"%s\", rbuf) != 1)\n\t    goto badscan;\n\n\t  rcs->headname = g_strdup (rbuf);\n\t  read_state = HEAD_STATE; /* no change */\n\t}\n      else if (read_state == BAR_STATE && rcswalk_match (& oneline_p, \"----------------------------\"))\n\t{\n\t  read_state = REV_STATE;\n\t}\n      else if (read_state == REV_STATE && rcswalk_match (& oneline_p, \"revision \"))\n\t{\n\t  if (version_i >= rcs->version_count)\n\t    {\n\t      /* jkh likes to insert the rlog of one RCS file into the log\n\t       * message of another, and this can confuse things.  Why, oh why,\n\t       * doesn't rlog have an option to not print the log?\n\t       */\n\t      fprintf (stderr, \"rcswalk: too many versions: skipping file %s\\n\", rcs->filename);\n\t      *skip = TRUE;\n\t      skip_count += 1;\n\t      pclose (rlog);\n\t      return 0;\n\t    }\n\n\t  if (sscanf (oneline_p, \"%s\", rbuf) != 1)\n\t    goto badscan;\n\n\t  rcs->versions[version_i].vname = g_strdup (rbuf);\n\t  read_state = DATE_STATE;\n\n\t  g_assert (rcs->versions[version_i].vname);\n\t}\n      else if (read_state == DATE_STATE && rcswalk_match (& oneline_p, \"date: \"))\n\t{\n\t  char* semi = strchr (oneline_p, ';');\n\n\t  if (! semi)\n\t    goto badscan;\n\n\t  strncpy (rbuf, oneline_p, semi - oneline_p);\n\n\t  rbuf[semi - oneline_p] = 0;\n\n\t  rcs->versions[version_i].date = str2time (rbuf, 0, 0);\n\n\t  version_i += 1;\n\t  read_state = BAR_STATE;\n\t}\n    }\n\n  if (! rcs->headname)\n    {\n      fprintf (stderr, \"rcswalk: no head version: skipping file %s\\n\", rcs->filename);\n      *skip = TRUE;\n      skip_count += 1;\n      pclose (rlog);\n      return 0;\n    }\n\n  if (pclose (rlog) < 0)\n    {\n      g_warning (\"pclose failed: %s\", cmdbuf);\n      return errno;\n    }\n\n  if ((ret = rcswalk_build_graph (rcs))) {\n    return ret;\n  }\n\n  return 0;\n\n badscan:\n\n  pclose (rlog);\n\n  g_warning (\"rlog syntax error\");\n  return -1;\n}\n\nvoid\nrcswalk_free (RcsFile* rcs)\n{\n  int i;\n\n  for (i = 0; i < rcs->version_count; i += 1)\n    {\n      g_free (rcs->versions[i].vname);\n      g_slist_free (rcs->versions[i].children);\n    }\n\n  g_free (rcs->filename);\n  g_free (rcs->headname);\n  g_free (rcs->versions);\n  g_free (rcs->versions_date);\n  g_free (rcs);\n}\n\nint\nrcswalk_one (char* rcsfile, char* copyfile, RcsWalker* walker, RcsStats* stats, void* data)\n{\n  RcsFile* rcs;\n  int i, ret;\n  long long maxsize = 0;\n  gboolean skip = FALSE;\n\n  rcs = g_new0 (RcsFile, 1);\n\n  rcs->filename = g_strdup (rcsfile);\n  rcs->copyname = copyfile;\n\n  if ((ret = rcswalk_load (rcs, & skip))) {\n    return ret;\n  }\n\n  if (walker->min_versions > rcs->version_count)\n    {\n      small_count += 1;\n      skip = TRUE;\n    }\n\n  if (walker->max_versions < rcs->version_count)\n    {\n      large_count += 1;\n      skip = TRUE;\n    }\n\n  if (! skip)\n    {\n      process_count += 1;\n\n      if (walker->dateorder && (ret = rcswalk_dateorder (rcs, walker, stats, data))) {\n\treturn ret;\n      }\n\n      if (walker->delta_orig)\n\t{\n\t  int count = 0;\n\n\t  if ((ret = rcswalk_delta_orig (rcs, walker, rcs->root_version, & count, data))) {\n\t    return ret;\n\t  }\n\n\t  g_assert (count == (rcs->version_count - 1));\n\t}\n\n      if (walker->delta_date && (ret = rcswalk_delta_date (rcs, walker, data))) {\n\treturn ret;\n      }\n\n      for (i = 0; i < rcs->version_count; i += 1)\n\t{\n\t  rcs->total_size += rcs->versions[i].size;\n\t  maxsize = MAX (rcs->versions[i].size, maxsize);\n\t}\n\n      stat_int_add_item (stats->version_stat, rcs->version_count);\n      stat_int_add_item (stats->forward_stat, rcs->forward_count);\n      stat_int_add_item (stats->reverse_stat, rcs->reverse_count);\n      stat_int_add_item (stats->branch_stat, rcs->branch_count);\n      stat_int_add_item (stats->unencoded_stat, rcs->total_size);\n      stat_int_add_item (stats->literal_stat, maxsize);\n\n      if (walker->onefile && (ret = walker->onefile (rcs, stats, data))) {\n\treturn ret;\n      }\n    }\n\n  rcswalk_free (rcs);\n\n  return 0;\n}\n\nint\nrcswalk_dir (const char* dir, RcsWalker* walker, RcsStats* stats, void* data, const char* copy_dir)\n{\n  int ret;\n  DIR* thisdir;\n  struct dirent* ent;\n\n  if (copy_dir && (ret = config_create_dir (copy_dir))) {\n    return ret;\n  }\n\n  if (! (thisdir = opendir (dir)))\n    {\n      g_warning (\"opendir failed: %s\", dir);\n      return errno;\n    }\n\n  while ((ent = readdir (thisdir)))\n    {\n      char* name = ent->d_name;\n      int len;\n      struct stat buf;\n      char* fullname;\n      char* copyname = NULL;\n\n      if (strcmp (name, \".\") == 0)\n\tcontinue;\n\n      if (strcmp (name, \"..\") == 0)\n\tcontinue;\n\n      len = strlen (name);\n\n      fullname = g_strdup_printf (\"%s/%s\", dir, name);\n\n      if (copy_dir)\n\tcopyname = g_strdup_printf (\"%s/%s\", copy_dir, name);\n\n      if (len > 2 && strcmp (name + len - 2, \",v\") == 0)\n\t{\n\t  if ((ret = rcswalk_one (fullname, copyname, walker, stats, data))) {\n\t    goto abort;\n\t  }\n\t}\n      else\n\t{\n\t  if (stat (fullname, & buf) < 0)\n\t    {\n\t      g_warning (\"stat failed: %s\\n\", fullname);\n\t      goto abort;\n\t    }\n\n\t  if (S_ISDIR (buf.st_mode))\n\t    {\n\t      if ((ret = rcswalk_dir (fullname, walker, stats, data, copyname))) {\n\t\tgoto abort;\n\t      }\n\t    }\n\t}\n\n      g_free (fullname);\n\n      if (copyname)\n\tg_free (copyname);\n    }\n\n  if (closedir (thisdir) < 0)\n    {\n      g_warning (\"closedir failed: %s\", dir);\n      return errno;\n    }\n\n  return 0;\n\n abort:\n\n  if (thisdir)\n    closedir (thisdir);\n\n  return -1;\n}\n\nvoid\nrcswalk_init (void)\n{\n  config_register (rcswalk_options, ARRAY_SIZE (rcswalk_options));\n}\n\nint\nrcswalk (RcsWalker *walker, const char* copy_base)\n{\n  void* data = NULL;\n  RcsStats stats;\n  int ret;\n\n  skip_count = 0;\n  small_count = 0;\n  process_count = 0;\n  large_count = 0;\n\n  memset (& stats, 0, sizeof (stats));\n\n  stats.avg_version_size = stat_bincount_new (\"AvgVersionSize\"); /* @@@ leak */\n  stats.version_stat = stat_int_new (\"Version\"); /* @@@ leak */\n  stats.forward_stat = stat_int_new (\"Forward\"); /* @@@ leak */\n  stats.reverse_stat = stat_int_new (\"Reverse\"); /* @@@ leak */\n  stats.branch_stat  = stat_int_new (\"Branch\"); /* @@@ leak */\n  stats.unencoded_stat = stat_int_new (\"Unencoded\"); /* @@@ leak */\n  stats.literal_stat   = stat_int_new (\"Literal\"); /* @@@ leak */\n\n  tmp_file_1 = g_strdup_printf (\"%s/rcs1.%d\", g_get_tmp_dir (), (int) getpid ());\n  tmp_file_2 = g_strdup_printf (\"%s/rcs2.%d\", g_get_tmp_dir (), (int) getpid ());\n\n  if (walker->initialize)\n    data = walker->initialize ();\n\n  if ((ret = rcswalk_dir (rcswalk_input_dir, walker, & stats, data, copy_base))) {\n    return ret;\n  }\n\n  if (walker->finalize)\n    {\n      if ((ret = walker->finalize (& stats, data))) {\n\treturn ret;\n      }\n    }\n\n  unlink (tmp_file_1);\n  unlink (tmp_file_2);\n\n  fprintf (stderr, \"rcswalk: processed %d files: too small %d; too large: %d; damaged: %d\\n\", process_count, small_count, large_count, skip_count);\n\n  return 0;\n}\n\n/* Statistics\n */\n\nvoid\nrcswalk_report (RcsStats* set)\n{\n  stat_bincount_report (set->avg_version_size);\n  stat_int_report (set->version_stat);\n  stat_int_report (set->forward_stat);\n  stat_int_report (set->reverse_stat);\n  stat_int_report (set->branch_stat);\n  stat_int_report (set->unencoded_stat);\n  stat_int_report (set->literal_stat);\n}\n\n/* Int stat\n */\nIntStat*\nstat_int_new (const char* name)\n{\n  IntStat* s = g_new0 (IntStat, 1);\n\n  s->name = name;\n  s->values = g_array_new (FALSE, FALSE, sizeof (long long));\n\n  return s;\n}\n\nvoid\nstat_int_add_item (IntStat* stat, long long v)\n{\n  if (! stat->count)\n    stat->min = v;\n  stat->count += 1;\n  stat->min = MIN (v, stat->min);\n  stat->max = MAX (v, stat->max);\n  stat->sum += v;\n\n  g_array_append_val (stat->values, v);\n}\n\ndouble\nstat_int_stddev (IntStat *stat)\n{\n  double f = 0;\n  double m = (double) stat->sum / (double) stat->count;\n  double v;\n  int i;\n\n  for (i = 0; i < stat->count; i += 1)\n    {\n      long long x = g_array_index (stat->values, long long, i);\n\n      f += (m - (double) x) * (m - (double) x);\n    }\n\n  v = f / (double) stat->count;\n\n  return sqrt (v);\n}\n\nint\nll_comp (const void* a, const void* b)\n{\n  const long long* lla = a;\n  const long long* llb = b;\n  return (*lla) - (*llb);\n}\n\nvoid\nstat_int_histogram (IntStat *stat)\n{\n  int i, consec;\n  long long cum = 0;\n\n  FILE* p_out;\n  FILE* s_out;\n\n  if (! (p_out = config_output (\"%s.pop.hist\", stat->name)))\n    abort ();\n\n  if (! (s_out = config_output (\"%s.sum.hist\", stat->name)))\n    abort ();\n\n  qsort (stat->values->data, stat->count, sizeof (long long), ll_comp);\n\n  for (i = 0; i < stat->count; i += consec)\n    {\n      long long ix = g_array_index (stat->values, long long, i);\n\n      for (consec = 1; (i+consec) < stat->count; consec += 1)\n\t{\n\t  long long jx = g_array_index (stat->values, long long, i+consec);\n\n\t  if (ix != jx)\n\t    break;\n\t}\n\n      cum += consec * g_array_index (stat->values, long long, i);\n\n      fprintf (p_out, \"%qd, %0.3f\\n\", g_array_index (stat->values, long long, i), (double) (i+consec) / (double) stat->count);\n      fprintf (s_out, \"%qd, %0.3f\\n\", g_array_index (stat->values, long long, i), (double) cum / (double) stat->sum);\n    }\n\n  if (fclose (p_out) < 0 || fclose (s_out) < 0)\n    {\n      g_error (\"fclose failed\\n\");\n    }\n}\n\nvoid\nstat_int_report (IntStat* stat)\n{\n  FILE* out;\n\n  if (! (out = config_output (\"%s.stat\", stat->name)))\n    abort ();\n\n  fprintf (out, \"Name: %s\\n\", stat->name);\n  fprintf (out, \"Count: %d\\n\", stat->count);\n  fprintf (out, \"Min: %qd\\n\", stat->min);\n  fprintf (out, \"Max: %qd\\n\", stat->max);\n  fprintf (out, \"Sum: %qd\\n\", stat->sum);\n  fprintf (out, \"Mean: %0.2f\\n\", (double) stat->sum / (double) stat->count);\n  fprintf (out, \"Stddev: %0.2f\\n\", stat_int_stddev (stat));\n\n  if (fclose (out) < 0)\n    g_error (\"fclose failed\");\n\n  stat_int_histogram (stat);\n}\n\n/* Dbl stat\n */\n\nDblStat*\nstat_dbl_new (const char* name)\n{\n  DblStat* s = g_new0 (DblStat, 1);\n\n  s->name = name;\n  s->values = g_array_new (FALSE, FALSE, sizeof (double));\n\n  return s;\n}\n\nvoid\nstat_dbl_add_item (DblStat* stat, double v)\n{\n  if (! stat->count)\n    stat->min = v;\n  stat->count += 1;\n  stat->min = MIN (v, stat->min);\n  stat->max = MAX (v, stat->max);\n  stat->sum += v;\n\n  g_array_append_val (stat->values, v);\n}\n\ndouble\nstat_dbl_stddev (DblStat *stat)\n{\n  double f = 0;\n  double m = stat->sum / stat->count;\n  double v;\n  int i;\n\n  for (i = 0; i < stat->count; i += 1)\n    {\n      double x = g_array_index (stat->values, double, i);\n\n      f += (m - x) * (m - x);\n    }\n\n  v = f / stat->count;\n\n  return sqrt (v);\n}\n\nint\ndbl_comp (const void* a, const void* b)\n{\n  const double* da = a;\n  const double* db = b;\n  double diff = (*da) - (*db);\n\n  if (diff > 0.0)\n    return 1;\n  else if (diff < 0.0)\n    return -1;\n  else\n    return 0;\n}\n\nvoid\nstat_dbl_histogram (DblStat *stat)\n{\n  int i, consec;\n  double cum = 0.0;\n\n  FILE* p_out;\n  FILE* s_out;\n\n  if (! (p_out = config_output (\"%s.pop.hist\", stat->name)))\n    abort ();\n\n  if (! (s_out = config_output (\"%s.sum.hist\", stat->name)))\n    abort ();\n\n  qsort (stat->values->data, stat->count, sizeof (double), dbl_comp);\n\n  for (i = 0; i < stat->count; i += consec)\n    {\n      double ix = g_array_index (stat->values, double, i);\n\n      for (consec = 1; (i+consec) < stat->count; consec += 1)\n\t{\n\t  double jx = g_array_index (stat->values, double, i+consec);\n\n\t  if (ix != jx)\n\t    break;\n\t}\n\n      cum += ((double) consec) * g_array_index (stat->values, double, i);\n\n      fprintf (p_out, \"%0.6f, %0.3f\\n\", g_array_index (stat->values, double, i), (double) (i+consec) / (double) stat->count);\n      fprintf (s_out, \"%0.6f, %0.3f\\n\", g_array_index (stat->values, double, i), cum / stat->sum);\n    }\n\n  if (fclose (p_out) < 0 || fclose (s_out) < 0)\n    {\n      g_error (\"fclose failed\\n\");\n    }\n}\n\nvoid\nstat_dbl_report (DblStat* stat)\n{\n  FILE* out;\n\n  if (! (out = config_output (\"%s.stat\", stat->name)))\n    abort ();\n\n  fprintf (out, \"Name:   %s\\n\", stat->name);\n  fprintf (out, \"Count:  %d\\n\", stat->count);\n  fprintf (out, \"Min:    %0.6f\\n\", stat->min);\n  fprintf (out, \"Max:    %0.6f\\n\", stat->max);\n  fprintf (out, \"Sum:    %0.6f\\n\", stat->sum);\n  fprintf (out, \"Mean:   %0.6f\\n\", stat->sum / stat->count);\n  fprintf (out, \"Stddev: %0.6f\\n\", stat_dbl_stddev (stat));\n\n  if (fclose (out) < 0)\n    g_error (\"fclose failed\");\n\n  stat_dbl_histogram (stat);\n}\n\n/* Bincount\n */\nBinCounter*\nstat_bincount_new (const char* name)\n{\n  BinCounter* bc = g_new0 (BinCounter, 1);\n\n  bc->name = name;\n  bc->bins = g_ptr_array_new ();\n\n  return bc;\n}\n\nvoid\nstat_bincount_add_item (BinCounter* bc, int bin, double val)\n{\n  GArray* one;\n  int last;\n\n  if (bin >= bc->bins->len)\n    {\n      g_ptr_array_set_size (bc->bins, bin+1);\n    }\n\n  if (! (one = bc->bins->pdata[bin]))\n    {\n      one = bc->bins->pdata[bin] = g_array_new (FALSE, TRUE, sizeof (double));\n    }\n\n  g_assert (one);\n\n  last = one->len;\n\n  g_array_set_size (one, last + 1);\n\n  g_array_index (one, double, last) = val;\n}\n\nvoid\nstat_bincount_report (BinCounter* bc)\n{\n  FILE *avg_out;\n  FILE *raw_out;\n  int i;\n\n  if (! (avg_out = config_output (\"%s.avg\", bc->name)))\n    abort ();\n\n  if (! (raw_out = config_output (\"%s.raw\", bc->name)))\n    abort ();\n\n  for (i = 0; i < bc->bins->len; i += 1)\n    {\n      GArray* one = bc->bins->pdata[i];\n\n      double sum = 0.0;\n      int j;\n\n      for (j = 0; j < one->len; j += 1)\n\t{\n\t  double d = g_array_index (one, double, j);\n\n\t  sum += d;\n\n\t  fprintf (raw_out, \"%e \", d);\n\t}\n\n      fprintf (raw_out, \"\\n\");\n      fprintf (avg_out, \"%e %d\\n\", sum / one->len, one->len);\n    }\n\n  if (fclose (avg_out) < 0)\n    g_error (\"fclose failed\");\n\n  if (fclose (raw_out) < 0)\n    g_error (\"fclose failed\");\n}\n\n/* Config stuff\n */\n\nint\nconfig_create_dir (const char* dirname)\n{\n  struct stat buf;\n\n  if (stat (dirname, & buf) < 0)\n    {\n      if (mkdir (dirname, 0777) < 0)\n\t{\n\t  fprintf (stderr, \"mkdir failed: %s\\n\", dirname);\n\t  return errno;\n\t}\n    }\n  else\n    {\n      if (! S_ISDIR (buf.st_mode))\n\t{\n\t  fprintf (stderr, \"not a directory: %s\\n\", dirname);\n\t  return errno;\n\t}\n    }\n\n  return 0;\n}\n\nint\nconfig_clear_dir (const char* dir)\n{\n  char buf[1024];\n\n  if (dir)\n    {\n      sprintf (buf, \"rm -rf %s\", dir);\n\n      system (buf);\n    }\n\n  return 0;\n}\n\nstatic ConfigOption all_options[64];\nstatic int          option_count;\n\nvoid\nconfig_init ()\n{\n  static gboolean once = FALSE;\n  if (! once)\n    {\n      once = TRUE;\n      config_register (config_options, ARRAY_SIZE (config_options));\n    }\n}\n\nvoid\nconfig_register (ConfigOption *opts, int nopts)\n{\n  int i;\n\n  config_init ();\n\n  for (i = 0; i < nopts; i += 1)\n    {\n      all_options[option_count++] = opts[i];\n    }\n}\n\nvoid\nconfig_set_string (const char* var, const char* val)\n{\n  int i;\n\n  for (i = 0; i < option_count; i += 1)\n    {\n      ConfigOption *opt = all_options + i;\n\n      if (strcmp (opt->name, var) == 0)\n\t{\n\t  (* (const char**) opt->value) = val;\n\t  opt->found = TRUE;\n\t  return;\n\t}\n    }\n}\n\nint\nconfig_parse (const char* config_file)\n{\n  FILE *in;\n  char oname[1024], value[1024];\n  int i;\n\n  if (! (in = fopen (config_file, \"r\")))\n    {\n      fprintf (stderr, \"fopen failed: %s\\n\", config_file);\n      return errno;\n    }\n\n  for (;;)\n    {\n      ConfigOption *opt = NULL;\n\n      if (fscanf (in, \"%s\", oname) != 1)\n\tbreak;\n\n      for (i = 0; i < option_count; i += 1)\n\t{\n\t  if (strcmp (oname, all_options[i].name) == 0)\n\t    {\n\t      opt = all_options + i;\n\t      break;\n\t    }\n\t}\n\n      if (opt && opt->arg == CO_None)\n\t{\n\t  (* (gboolean*) opt->value) = TRUE;\n\t  opt->found = TRUE;\n\t  continue;\n\t}\n\n      if (fscanf (in, \"%s\", value) != 1)\n\t{\n\t  fprintf (stderr, \"no value for option: %s; file: %s\\n\", oname, config_file);\n\t  goto abort;\n\t}\n\n      if (! opt)\n\t{\n\t  /*fprintf (stderr, \"unrecognized option: %s\\n\", oname);*/\n\t  continue;\n\t}\n\n      switch (opt->type)\n\t{\n\tcase CD_Bool:\n\n\t  if (strcasecmp (value, \"yes\") == 0 ||\n\t      strcasecmp (value, \"true\") == 0 ||\n\t      strcmp     (value, \"1\") == 0 ||\n\t      strcasecmp (value, \"on\") == 0)\n\t    {\n\t      ((gboolean*) opt->value) = TRUE;\n\t    }\n\t  else\n\t    {\n\t      ((gboolean*) opt->value) = FALSE;\n\t    }\n\n\t  break;\n\tcase CD_Int32:\n\n\t  if (sscanf (value, \"%d\", (gint32*) opt->value) != 1)\n\t    {\n\t      fprintf (stderr, \"parse error for option: %s; file: %s\\n\", oname, config_file);\n\t      goto abort;\n\t    }\n\n\t  break;\n\tcase CD_Double:\n\n\t  if (sscanf (value, \"%lf\", (double*) opt->value) != 1)\n\t    {\n\t      fprintf (stderr, \"parse error for option: %s; file: %s\\n\", oname, config_file);\n\t      goto abort;\n\t    }\n\n\t  break;\n\tcase CD_String:\n\n\t  (* (const char**) opt->value) = g_strdup (value);\n\n\t  break;\n\t}\n\n      opt->found = TRUE;\n    }\n\n  fclose (in);\n\n  return 0;\n\n abort:\n\n  fclose (in);\n\n  return -1;\n}\n\nint\nconfig_compute_output_dir ()\n{\n  char tmp[1024];\n  char buf[1024];\n  int i;\n  gboolean last = FALSE;\n\n  buf[0] = 0;\n\n  for (i = 0; i < option_count; i += 1)\n    {\n      ConfigOption *opt = all_options + i;\n\n      if (opt->style == CS_Ignore)\n\tcontinue;\n\n      if (! opt->found)\n\tcontinue;\n\n      if (last)\n\tstrcat (buf, \",\");\n\n      last = TRUE;\n\n      strcat (buf, opt->abbrev);\n      strcat (buf, \"=\");\n\n      switch (opt->type)\n\t{\n\tcase CD_Bool:\n\n\t  if (* (gboolean*) opt->value)\n\t    strcat (buf, \"true\");\n\t  else\n\t    strcat (buf, \"false\");\n\n\t  break;\n\tcase CD_Int32:\n\n\t  sprintf (tmp, \"%d\", (* (gint32*) opt->value));\n\t  strcat (buf, tmp);\n\n\t  break;\n\tcase CD_Double:\n\n\t  sprintf (tmp, \"%0.2f\", (* (double*) opt->value));\n\t  strcat (buf, tmp);\n\n\t  break;\n\tcase CD_String:\n\n\t  if (opt->style == CS_UseAsFile)\n\t    {\n\t      const char* str = (* (const char**) opt->value);\n\t      const char* ls = strrchr (str, '/');\n\n\t      strcat (buf, ls ? (ls + 1) : str);\n\t    }\n\t  else\n\t    {\n\t      strcat (buf, (* (const char**) opt->value));\n\t    }\n\n\t  break;\n\t}\n    }\n\n  config_output_dir = g_strdup_printf (\"%s/%s\", config_output_base, buf);\n\n  return 0;\n}\n\nint\nconfig_done (void)\n{\n  int i, ret;\n  FILE *out;\n\n  for (i = 0; i < option_count; i += 1)\n    {\n      ConfigOption *opt = all_options + i;\n\n      if (! opt->found && opt->arg == CO_Required)\n\t{\n\t  fprintf (stderr, \"required option not found: %s\\n\", all_options[i].name);\n\t  return -1;\n\t}\n    }\n\n  if ((ret = config_compute_output_dir ())) {\n    return ret;\n  }\n\n  if ((ret = config_clear_dir (config_output_dir))) {\n    return ret;\n  }\n\n  if ((ret = config_create_dir (config_output_dir))) {\n    return ret;\n  }\n\n  if (! (out = config_output (\"Options\")))\n    abort ();\n\n  for (i = 0; i < option_count; i += 1)\n    {\n      ConfigOption *opt = all_options + i;\n\n      fprintf (out, \"option: %s; value: \", all_options[i].name);\n\n      switch (opt->type)\n\t{\n\tcase CD_Bool:\n\n\t  fprintf (out, \"%s\", (* (gboolean*) opt->value) ? \"TRUE\" : \"FALSE\");\n\n\t  break;\n\tcase CD_Int32:\n\n\t  fprintf (out, \"%d\", (* (gint32*) opt->value));\n\n\t  break;\n\tcase CD_Double:\n\n\t  fprintf (out, \"%0.2f\", (* (double*) opt->value));\n\n\t  break;\n\tcase CD_String:\n\n\t  fprintf (out, \"%s\", (* (const char**) opt->value));\n\n\t  break;\n\t}\n\n      fprintf (out, \"\\n\");\n    }\n\n  if (fclose (out))\n    {\n      fprintf (stderr, \"fclose failed\\n\");\n      return errno;\n    }\n\n  return 0;\n}\n\nconst char*\nconfig_help_arg (ConfigOption *opt)\n{\n  switch (opt->arg)\n    {\n    case CO_Required:\n      return \"required\";\n    case CO_Optional:\n      return \"optional\";\n    case CO_None:\n      return \"no value\";\n    }\n\n  return \"unknown\";\n}\n\nconst char*\nconfig_help_type (ConfigOption *opt)\n{\n  switch (opt->arg)\n    {\n    case CO_None:\n      return \"boolean\";\n    default:\n      break;\n    }\n\n  switch (opt->type)\n    {\n    case CD_Bool:\n      return \"boolean\";\n    case CD_Int32:\n      return \"int\";\n    case CD_Double:\n      return \"double\";\n    case CD_String:\n      return \"string\";\n    }\n\n  return \"unknown\";\n}\n\nvoid\nconfig_help (void)\n{\n  int i;\n\n  fprintf (stderr, \"Expecting the following options in one or more config files on the command line:\\n\");\n\n  for (i = 0; i < option_count; i += 1)\n    {\n      ConfigOption *opt = all_options + i;\n\n      fprintf (stderr, \"%s: %s %s\\n\",\n\t       opt->name,\n\t       config_help_arg (opt),\n\t       config_help_type (opt));\n    }\n}\n\nFILE*\nconfig_output (const char* format, ...)\n{\n  gchar *buffer;\n  gchar *file;\n  va_list args;\n  FILE *f;\n\n  va_start (args, format);\n  buffer = g_strdup_vprintf (format, args);\n  va_end (args);\n\n  file = g_strdup_printf (\"%s/%s\", config_output_dir, buffer);\n\n  if (! (f = fopen (file, \"w\")))\n    g_error (\"fopen failed: %s\\n\", buffer);\n\n  g_free (file);\n\n  g_free (buffer);\n\n  return f;\n}\n\n\n#include <edsio.h>\n#include <edsiostdio.h>\n#include <ctype.h>\n#include \"xdfs.h\"\n\n/* Warning: very cheesy!\n */\n\n#ifdef DEBUG_EXTRACT\n  FileHandle *fh2 = handle_read_file (filename);\n\n  guint8* debug_buf = g_malloc (buflen);\n\n  if (! handle_read (fh2, debug_buf, buflen))\n    g_error (\"read failed\");\n#endif\n\ngboolean\nrcs_count (const char* filename, guint *encoded_size)\n{\n  char *readbuf0, *readbuf;\n  gboolean in_string = FALSE;\n  gboolean in_text = FALSE;\n  guint string_start = 0;\n  guint string_end = 0;\n  guint current_pos = 0;\n  /*char *current_delta = NULL;*/\n  FileHandle *fh = handle_read_file (filename);\n  guint buflen = handle_length (fh);\n\n  (* encoded_size) = 0;\n\n  readbuf0 = g_new (guint8, buflen);\n\n  for (;;)\n    {\n      int c = handle_gets (fh, readbuf0, buflen);\n\n      readbuf = readbuf0;\n\n      if (c < 0)\n\tbreak;\n\n      if (strncmp (readbuf, \"text\", 4) == 0)\n\tin_text = TRUE;\n\n      if (! in_string && readbuf[0] == '@')\n\t{\n\t  string_start = current_pos + 1;\n\t  in_string = TRUE;\n\t  readbuf += 1;\n\t}\n\n      current_pos += c;\n\n      if (in_string)\n\t{\n\t  while ((readbuf = strchr (readbuf, '@')))\n\t    {\n\t      if (readbuf[1] == '@')\n\t\t{\n\t\t  string_start += 1; /* @@@ bogus, just counting. */\n\t\t  readbuf += 2;\n\t\t  continue;\n\t\t}\n\n\t      in_string = FALSE;\n\t      break;\n\t    }\n\n\t  string_end = current_pos - 2;\n\n\t  if (in_text && ! in_string)\n\t    {\n\t      in_text = FALSE;\n\n\t      /*g_free (current_delta);\n\t\tcurrent_delta = NULL;*/\n\n\t      (* encoded_size) += (string_end - string_start);\n\t    }\n\n\t  continue;\n\t}\n\n      if (isdigit (readbuf[0]))\n\t{\n#if 0\n\t  (* strchr (readbuf, '\\n')) = 0;\n\t  if (current_delta)\n\t    g_free (current_delta);\n\t  current_delta = g_strdup (readbuf);\n#endif\n\t}\n    }\n\n  handle_close (fh);\n\n  g_free (readbuf0);\n\n#if 0\n  if (current_delta)\n    g_free (current_delta);\n#endif\n\n  return TRUE;\n}\n\n#if 0\nint\nmain (int argc, char** argv)\n{\n  guint size;\n\n  if (argc != 2)\n    g_error (\"usage: %s RCS_file\\n\", argv[0]);\n\n  if (! rcs_count (argv[1], &size))\n    g_error (\"rcs_parse failed\");\n\n  return 0;\n}\n#endif\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/run_release.sh",
    "content": "#!/bin/bash\n\n# Run from the source dir.\nSRCDIR=${PWD}\n\n# TODO replace w/ wget\nLZMA=\"xz-5.2.1\"\nLZMA_FILE=\"${SRCDIR}/../${LZMA}.tar.gz\"\n\nMAKEFLAGS=\"-j 10\"\n\nBUILDDIR=${SRCDIR}/build\nLZMASRC=${BUILDDIR}/${LZMA}\n\nNONWIN_CFLAGS=\"\"\nMINGW_CFLAGS=\"-DEXTERNAL_COMPRESSION=0 -DXD3_WIN32=1 -DSHELL_TESTS=0\"\n\nMYOS=`uname`\nDATE=`date`\n\nCLEAN=\"\"\n\nLINUXTGTS=\"\"\nLINUXTEST1=\"\"\nLINUXTEST2=\"\"\n\nWINTGTS=\"\"\nWINTEST1=\"\"\nWINTEST2=\"\"\n\nOSXTGTS=\"\"\nOSXTEST1=\"\"\nOSXTEST2=\"\"\n\nXTMP=\"/tmp\"\nif [ \"${TMP}\" != \"\" ]; then\n    XTMP=\"${TMP}\"\nfi\nif [ \"${TMPDIR}\" != \"\" ]; then\n    XTMP=\"${TMPDIR}\"\nfi\n\nBUILDFILES=`ls -A ${BUILDDIR} 2> /dev/null`\nif [ -d \"${BUILDDIR}\" ]; then\n    if [ -n \"${BUILDFILES}\" ]; then\n\techo \"Directory ${BUILDDIR} should be empty\"\n\texit 1\n    fi\nelse\n    mkdir \"${BUILDDIR}\"\nfi\n\nfunction setup {\n    libtoolize || glibtoolize\n    automake --add-missing\n    aclocal -I m4\n    autoheader\n    automake\n    autoconf\n}\n\nfunction try {\n    local w=$1\n    shift\n    local dir=$1\n    shift\n    echo -n \"\t${w} ... \"\n    (cd \"${dir}\" && \"$@\" >${w}.stdout 2>${w}.stderr)\n    local s=$?\n    if [ ${s} -eq 0 ]; then\n\techo \" success\"\n    else\n\techo \" failed!\"\n\techo \"Error $1 in ${dir}\" >&2\n    fi\n    return ${s}\n}\n\nfunction buildlzma {\n    host=$1\n    march=$2\n    local target=\"${BUILDDIR}/lib-${host}${march}\"\n\n    echo \"\t... liblzma\"\n    \n    mkdir -p ${target}\n\n    try configure-lzma ${target} ${LZMASRC}/configure \\\n\t--host=${host} \\\n\t--prefix=${target} \\\n\t--disable-shared \\\n\t\"CC=${CC}\" \\\n\t\"CXX=${CXX}\" \\\n\t\"CFLAGS=${march}\" \\\n\t\"CXXFLAGS=${march}\" \\\n\t\"LDFLAGS=${march}\"\n    if [ $? -ne 0 ]; then\n\treturn\n    fi\n\n    try build-lzma ${target} make ${MAKEFLAGS}\n    if [ $? -ne 0 ]; then\n    \treturn\n    fi\n    try install-lzma ${target} make install\n    if [ $? -ne 0 ]; then\n    \treturn\n    fi\n}\n\nfunction buildit {\n    local host=$1\n    local march=$2\n    local usizebits=$3\n    local offsetbits=$4\n    local cargs=$5\n    local afl=$6\n    local BM=\"${host}${march}\"\n    local USECC=\"${CC}\"\n    local USECXX=\"${CXX}\"\n    local LIBBM=\"${BM}\"\n\n    if [ \"${afl}\" = \"1\" ]; then\n\tUSECC=\"afl-gcc\"\n\tUSECXX=\"afl-g++\"\n\tBM=\"${BM}-afl\"\n    fi\n\n    local D=\"build/${BM}/usize${usizebits}/xoff${offsetbits}\"\n    local BMD=\"${BM}-${usizebits}-${offsetbits}\"\n\n    local FULLD=\"${SRCDIR}/${D}\"\n    local CFLAGS=\"${march} ${cargs} -I${SRCDIR}/build/lib-${LIBBM}/include\"\n    local CXXFLAGS=\"${march} ${cargs} -I${SRCDIR}/build/lib-${LIBBM}/include\"\n    local CPPFLAGS=\"-I${SRCDIR}/build/lib-${LIBBM}/include\"\n    local LDFLAGS=\"${march} -L${SRCDIR}/build/lib-${LIBBM}/lib\"\n\n    local EXEC_PREAMBLE=\"\"\n    local EXEC_SUFFIX=\"\"\n\n    case ${host} in\n\t*mingw*)\n\t    EXEC_PREAMBLE=\"wine\"\n\t    EXEC_SUFFIX=\".exe\"\n\t    ;;\n    esac\n    \n    mkdir -p ${D}\n\n    echo \"\t... ${BMD}\"\n    \n    cat >> Makefile.test <<EOF\n\n# ${BMD}\n# ${CFLAGS}\n.PHONY: build-${BMD}\nbuild-${BMD}:\n\t(cd ${D} && make all && make install)\n\n.PHONY: clean-${BMD}\nclean-${BMD}:\n\t(cd ${D} && make clean)\n\n.PHONY: regtest-${BMD}\nregtest-${BMD}:\n\t(cd ${D} && ${EXEC_PREAMBLE} ./bin/xdelta3regtest${EXEC_SUFFIX} 1> \\${TMP}/regtest.${BMD}.stdout 2> \\${TMP}/regtest.${BMD}.stderr)\n\n.PHONY: selftest-${BMD}\nselftest-${BMD}:\n\t(cd ${D} && ${EXEC_PREAMBLE} ./bin/xdelta3${EXEC_SUFFIX} test 1> \\${TMP}/selftest.${BMD}.stdout 2> \\${TMP}/selftest.${BMD}.stderr)\n\n\nEOF\n\n    case ${host} in\n\t*linux*)\n\t    LINUXTGTS=\"${LINUXTGTS} build-${BMD}\"\n\t    LINUXTEST1=\"${LINUXTEST1} selftest-${BMD}\"\n\t    LINUXTEST2=\"${LINUXTEST2} regtest-${BMD}\"\n\t    ;;\n\t*mingw*)\n\t    WINTGTS=\"${WINTGTS} build-${BMD}\"\n\t    WINTEST1=\"${WINTEST1} selftest-${BMD}\"\n\t    WINTEST2=\"${WINTEST2} regtest-${BMD}\"\n\t    ;;\n\t*apple*)\n\t    OSXTGTS=\"${OSXTGTS} build-${BMD}\"\n\t    OSXTEST1=\"${OSXTEST1} selftest-${BMD}\"\n\t    OSXTEST2=\"${OSXTEST2} regtest-${BMD}\"\n\t    ;;\n    esac\n    CLEAN=\"${CLEAN} clean-${BMD}\"\n\n    try configure-xdelta ${FULLD} ${SRCDIR}/configure \\\n    \t\t  --host=${host} \\\n    \t\t  --prefix=${FULLD} \\\n    \t\t  --enable-static \\\n    \t\t  --disable-shared \\\n    \t\t  --enable-debug-symbols \\\n\t\t  \"CFLAGS=${CFLAGS}\" \\\n\t\t  \"CXXFLAGS=${CXXFLAGS}\" \\\n\t\t  \"CPPFLAGS=${CPPFLAGS}\" \\\n\t\t  \"LDFLAGS=${LDFLAGS}\" \\\n\t\t  \"CC=${USECC}\" \\\n\t\t  \"CXX=${USECXX}\"\n    if [ $? -ne 0 ]; then\n\treturn\n    fi\n\n    # try build-xdelta ${FULLD} make ${MAKEFLAGS} all\n    # if [ $? -ne 0 ]; then\n    # \treturn\n    # fi\n\n    # try install-xdelta ${FULLD} make install\n}\n\nfunction buildall {\n    echo \"\"\n    echo \"Host $1$2 afl=$4\"\n    echo \"\"\n\n    buildlzma \"$1\" \"$2\"\n    buildit \"$1\" \"$2\" 32 32 \"-DXD3_USE_LARGESIZET=0 -DXD3_USE_LARGEFILE64=0 $3\" \"$4\"\n    buildit \"$1\" \"$2\" 32 64 \"-DXD3_USE_LARGESIZET=0 -DXD3_USE_LARGEFILE64=1 $3\" \"$4\"\n    buildit \"$1\" \"$2\" 64 64 \"-DXD3_USE_LARGESIZET=1 -DXD3_USE_LARGEFILE64=1 $3\" \"$4\"\n}\n\nsetup\n\ntry untar-lzma ${BUILDDIR} tar -xvf \"${LZMA_FILE}\"\nif [ $? -ne 0 ]; then\n    exit $?\nfi\n\ncat > Makefile.test <<EOF\n# Auto-generated ${DATE} -*- Mode: Makefile -*-\nTMP = ${XTMP}\n\nall: linux windows apple\n\nEOF\n\n# Native compiles\nif [ \"${MYOS}\" == \"Linux\" ]; then\n    # Linux\n    buildall x86_64-pc-linux-gnu -m32 \"${NONWIN_CFLAGS}\" \"0\"\n    buildall x86_64-pc-linux-gnu -m32 \"${NONWIN_CFLAGS}\" \"1\"\n    buildall x86_64-pc-linux-gnu -m64 \"${NONWIN_CFLAGS}\" \"0\"\n    buildall x86_64-pc-linux-gnu -m64 \"${NONWIN_CFLAGS}\" \"1\"\nfi\n\nif [ \"${MYOS}\" == \"Darwin\" ]; then\n    # OS X\n    buildall x86_64-apple-darwin -m32 \"${NONWIN_CFLAGS}\" \"0\"\n    buildall x86_64-apple-darwin -m64 \"${NONWIN_CFLAGS}\" \"0\"\nfi\n\n# Cross compile\nbuildall i686-w64-mingw32 -mconsole \"${MINGW_CFLAGS}\" \"0\"\nbuildall x86_64-w64-mingw32 -mconsole \"${MINGW_CFLAGS}\" \"0\"\n\ncat >> Makefile.test <<EOF\n\nclean: ${CLEAN}\n\n.PHONY: linux windows apple\n.PHONY: linux-build windows-build apple-build\n.PHONY: linux-selftest windows-selftest apple-selftest\n.PHONY: linux-regtest windows-regtest apple-regtest\n\nlinux: linux-build linux-selftest linux-regtest\nwindows: windows-build windows-selftest windows-regtest\napple: apple-build apple-selftest apple-regtest\n\nlinux-build: ${LINUXTGTS}\nlinux-selftest: ${LINUXTEST1}\nlinux-regtest: ${LINUXTEST2}\n\nwindows-build: ${WINTGTS}\nwindows-selftest: ${WINTEST1}\nwindows-regtest: ${WINTEST2}\n\napple-build: ${OSXTGTS}\napple-selftest: ${OSXTEST1}\napple-regtest: ${OSXTEST2}\n\nEOF\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/Makefile",
    "content": "all:\n\t(cd .. && make all)\n\nxdelta3regtest:\n\t(cd .. && make xdelta3regtest)\n\nxdelta3checksum:\n\t(cd .. && make xdelta3checksum)\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/checksum_test.cc",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#include \"test.h\"\n#include <assert.h>\n#include <list>\n#include <vector>\n#include <algorithm>\n\n#include \"../cpp-btree/btree_map.h\"\n\nextern \"C\" {\nuint32_t xd3_large32_cksum_old (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look);\nuint32_t xd3_large32_cksum_update_old (xd3_hash_cfg *cfg, uint32_t cksum, \n\t\t\t\t       const uint8_t *base, const usize_t look);\n\nuint64_t xd3_large64_cksum_old (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look);\nuint64_t xd3_large64_cksum_update_old (xd3_hash_cfg *cfg, uint64_t cksum, \n\t\t\t\t       const uint8_t *base, const usize_t look);\n}\n\nusing btree::btree_map;\nusing std::list;\nusing std::vector;\n\n// MLCG parameters\n// a, a*\nuint32_t good_32bit_values[] = {\n  1597334677U, // ...\n  741103597U, 887987685U,\n};\n\n// a, a*\nuint64_t good_64bit_values[] = {\n  1181783497276652981ULL, 4292484099903637661ULL,\n  7664345821815920749ULL, // ...\n};\n\nvoid print_header() {\n  static int hdr_cnt = 0;\n  if (hdr_cnt++ % 20 == 0) {\n    printf(\"%-32sConf\\t\\tCount\\tUniq\\tFull\\tCover\\tColls\"\n\t   \"\\tMB/s\\tIters\\t#Colls\\n\", \"Name\");\n  }\n}\n\nstruct true_type { };\nstruct false_type { };\n\ntemplate <typename Word>\nusize_t bitsof();\n\ntemplate<>\nusize_t bitsof<unsigned int>() {\n  return sizeof(unsigned int) * 8;\n}\n\ntemplate<>\nusize_t bitsof<unsigned long>() {\n  return sizeof(unsigned long) * 8;\n}\n\ntemplate<>\nusize_t bitsof<unsigned long long>() {\n  return sizeof(unsigned long long) * 8;\n}\n\ntemplate <typename Word>\nstruct hhash {  // shift \"s\" bits leaving the high bits as a hash value for\n\t\t// this checksum, which are the most \"distant\" in terms of the\n\t\t// spectral test for the rabin_karp MLCG.  For short windows,\n\t\t// the high bits aren't enough, XOR \"mask\" worth of these in.\n  Word operator()(const Word t, const Word s, const Word mask) {\n    return (t >> s) ^ (t & mask);\n  }\n};\n\ntemplate <typename Word>\nWord good_word();\n\ntemplate<>\nuint32_t good_word<uint32_t>() {\n  return good_32bit_values[0];\n}\n\ntemplate<>\nuint64_t good_word<uint64_t>() {\n  return good_64bit_values[0];\n}\n\n// CLASSES\n\n#define SELF Word, CksumSize, CksumSkip, Hash, Compaction\n#define MEMBER template <typename Word,\t\t\\\n\t\t\t int CksumSize,\t\t\\\n\t\t\t int CksumSkip,\t\t\\\n\t\t\t typename Hash,\t\t\\\n                         int Compaction>\n\nMEMBER\nstruct cksum_params {\n  typedef Word word_type;\n  typedef Hash hash_type;\n\n  static const int cksum_size = CksumSize;\n  static const int cksum_skip = CksumSkip;\n  static const int compaction = Compaction;\n};\n\nMEMBER\nstruct rabin_karp : public cksum_params<SELF> {\n  // (a^cksum_size-1 c_0) + (a^cksum_size-2 c_1) ...\n  rabin_karp()\n    : powers(make_powers()),\n      product(powers[0] * good_word<Word>()),\n      incr_state(0) { }\n\n  static Word* make_powers() {\n    Word *p = new Word[CksumSize];\n    p[CksumSize - 1] = 1;\n    for (int i = CksumSize - 2; i >= 0; i--) {\n      p[i] = p[i + 1] * good_word<Word>();\n    }\n    return p;\n  }\n\n  ~rabin_karp() {\n    delete [] powers;\n  }\n\n  Word step(const uint8_t *ptr) {\n    Word h = 0;\n    for (int i = 0; i < CksumSize; i++) {\n      h += (ptr[i]) * powers[i];\n    }\n    return h;\n  }\n\n  Word state0(const uint8_t *ptr) {\n    incr_state = step(ptr);\n    return incr_state;\n  }\n\n  Word incr(const uint8_t *ptr) {\n    incr_state = good_word<Word>() * incr_state -\n      product * (ptr[-1]) + (ptr[CksumSize - 1]);\n    return incr_state;\n  }\n\n  const Word *const powers;\n  const Word  product;\n  Word        incr_state;\n};\n\nMEMBER\nstruct with_stream : public cksum_params<SELF> {\n  xd3_stream stream;\n\n  with_stream()\n  {\n    xd3_config cfg;\n    memset (&stream, 0, sizeof (stream));\n    xd3_init_config (&cfg, 0);\n    cfg.smatch_cfg = XD3_SMATCH_SOFT;\n    cfg.smatcher_soft.large_look = CksumSize;\n    cfg.smatcher_soft.large_step = CksumSkip;\n    cfg.smatcher_soft.small_look = 4;\n    cfg.smatcher_soft.small_chain = 4;\n    cfg.smatcher_soft.small_lchain = 4;\n    cfg.smatcher_soft.max_lazy = 4;\n    cfg.smatcher_soft.long_enough = 4;\n    CHECK_EQ(0, xd3_config_stream (&stream, &cfg));\n\n    CHECK_EQ(0, xd3_size_hashtable (&stream,\n\t\t\t\t    1<<10 /* ignored */,\n\t\t\t\t    stream.smatcher.large_look,\n\t\t\t\t    & stream.large_hash));\n  }\n  ~with_stream() \n  {\n    xd3_free_stream (&stream);\n  }\n};\n\nMEMBER\nstruct large_cksum : public with_stream<SELF> {\n  Word step(const uint8_t *ptr) {\n    return xd3_large_cksum (&this->stream.large_hash, ptr, CksumSize);\n  }\n\n  Word state0(const uint8_t *ptr) {\n    incr_state = step(ptr);\n    return incr_state;\n  }\n\n  Word incr(const uint8_t *ptr) {\n    incr_state = xd3_large_cksum_update (&this->stream.large_hash, \n\t\t\t\t\t incr_state, ptr - 1, CksumSize);\n    return incr_state;\n  }\n\n  Word incr_state;\n};\n\n#if SIZEOF_USIZE_T == 4\n#define xd3_large_cksum_old         xd3_large32_cksum_old\n#define xd3_large_cksum_update_old  xd3_large32_cksum_update_old\n#elif SIZEOF_USIZE_T == 8\n#define xd3_large_cksum_old         xd3_large64_cksum_old\n#define xd3_large_cksum_update_old  xd3_large64_cksum_update_old\n#endif\n\nMEMBER\nstruct large_cksum_old : public with_stream<SELF> {\n  Word step(const uint8_t *ptr) {\n    return xd3_large_cksum_old (&this->stream.large_hash, ptr, CksumSize);\n  }\n\n  Word state0(const uint8_t *ptr) {\n    incr_state = step(ptr);\n    return incr_state;\n  }\n\n  Word incr(const uint8_t *ptr) {\n    incr_state = xd3_large_cksum_update_old (&this->stream.large_hash, \n\t\t\t\t\t     incr_state, ptr - 1, CksumSize);\n    return incr_state;\n  }\n\n  Word incr_state;\n};\n\n// TESTS\n\ntemplate <typename Word>\nstruct file_stats {\n  typedef const uint8_t* ptr_type;\n  typedef Word word_type;\n  typedef btree::btree_multimap<word_type, ptr_type> table_type;\n  typedef typename table_type::iterator table_iterator;\n\n  usize_t cksum_size;\n  usize_t cksum_skip;\n  usize_t unique;\n  usize_t unique_values;\n  usize_t count;\n  table_type table;\n\n  file_stats(usize_t size, usize_t skip)\n    : cksum_size(size),\n      cksum_skip(skip),\n      unique(0),\n      unique_values(0),\n      count(0) {\n  }\n\n  void reset() {\n    unique = 0;\n    unique_values = 0;\n    count = 0;\n    table.clear();\n  }\n\n  void update(word_type word, ptr_type ptr) {\n    table_iterator t_i = table.find(word);\n\n    count++;\n    if (t_i != table.end()) {\n      int collisions = 0;\n      for (table_iterator p_i = t_i;\n\t   p_i != table.end() && p_i->first == word;\n\t   ++p_i) {\n\tif (memcmp(p_i->second, ptr, cksum_size) == 0) {\n\t  return;\n\t}\n\tcollisions++;\n      }\n      if (collisions >= 1000) {\n\tfprintf(stderr, \"Something is not right, lots of collisions=%d\\n\", \n\t\tcollisions);\n\tabort();\n      }\n    } else {\n      unique_values++;\n    }\n    unique++;\n    table.insert(std::make_pair(word, ptr));\n    return;\n  }\n\n  void freeze() {\n    table.clear();\n  }\n};\n\nstruct test_result_base;\n\nstatic vector<test_result_base*> all_tests;\n\nstruct test_result_base {\n  virtual ~test_result_base() {\n  }\n  virtual void reset() = 0;\n  virtual void print() = 0;\n  virtual void get(const uint8_t* buf, const size_t buf_size, \n\t\t   usize_t iters) = 0;\n  virtual void stat() = 0;\n  virtual usize_t count() = 0;\n  virtual usize_t dups() = 0;\n  virtual double uniqueness() = 0;\n  virtual double fullness() = 0;\n  virtual double collisions() = 0;\n  virtual double coverage() = 0;\n  virtual double compression() = 0;\n  virtual double time() = 0;\n  virtual double total_time() = 0;\n  virtual usize_t total_count() = 0;\n  virtual usize_t total_dups() = 0;\n};\n\ntemplate <typename Checksum>\nstruct test_result : public test_result_base {\n  Checksum cksum;\n  const char *test_name;\n  file_stats<typename Checksum::word_type> fstats;\n  usize_t test_size;\n  usize_t n_steps;\n  usize_t n_incrs;\n  typename Checksum::word_type s_bits;\n  typename Checksum::word_type s_mask;\n  usize_t t_entries;\n  usize_t h_bits;\n  usize_t h_buckets_full;\n  char *hash_table;\n  long accum_millis;\n  usize_t accum_iters;\n\n  // These are not reset\n  double accum_time;\n  usize_t accum_count;\n  usize_t accum_dups;\n  usize_t accum_colls;\n  size_t accum_size;\n\n  test_result(const char *name)\n    : test_name(name),\n      fstats(Checksum::cksum_size, Checksum::cksum_skip),\n      hash_table(NULL),\n      accum_millis(0),\n      accum_iters(0),\n      accum_time(0.0),\n      accum_count(0),\n      accum_dups(0),\n      accum_colls(0),\n      accum_size(0) {\n    all_tests.push_back(this);\n  }\n\n  ~test_result() {\n    reset();\n  }\n\n  void reset() {\n    // size of file\n    test_size = 0;\n\n    // count\n    n_steps = 0;\n    n_incrs = 0;\n\n    // four values used by new_table()/summarize_table()\n    s_bits = 0;\n    s_mask = 0;\n    t_entries = 0;\n    h_bits = 0;\n    h_buckets_full = 0;\n\n    accum_millis = 0;\n    accum_iters = 0;\n\n    fstats.reset();\n\n    // temporary\n    if (hash_table) {\n      delete(hash_table);\n      hash_table = NULL;\n    }\n  }\n\n  usize_t count() {\n    if (Checksum::cksum_skip == 1) {\n      return n_incrs;\n    } else {\n      return n_steps;\n    }\n  }\n\n  usize_t dups() {\n    return fstats.count - fstats.unique;\n  }\n\n  /* Fraction of distinct strings of length cksum_size which are not\n   * represented in the hash table. */\n  double collisions() {\n    return (fstats.unique - fstats.unique_values) / (double) fstats.unique;\n  }\n  usize_t colls() {\n    return (fstats.unique - fstats.unique_values);\n  }\n\n  double uniqueness() {\n    return 1.0 - (double) dups() / count();\n  }\n\n  double fullness() {\n    return (double) h_buckets_full / (1 << h_bits);\n  }\n\n  double coverage() {\n    return (double) h_buckets_full / uniqueness() / count();\n  }\n\n  double compression() {\n    return 1.0 - coverage();\n  }\n\n  double time() {\n    return (double) accum_millis / accum_iters;\n  }\n\n  double total_time() {\n    return accum_time;\n  }\n\n  usize_t total_count() {\n    return accum_count;\n  }\n\n  usize_t total_dups() {\n    return accum_dups;\n  }\n\n  usize_t total_colls() {\n    return accum_dups;\n  }\n\n  void stat() {\n    accum_time += time();\n    accum_count += count();\n    accum_dups += dups();\n    accum_colls += colls();\n    accum_size += test_size;\n  }\n\n  void print() {\n    if (fstats.count != count()) {\n      fprintf(stderr, \"internal error: %\" W \"d != %\" W \"d\\n\", fstats.count, count());\n      abort();\n    }\n    print_header();\n    printf(\"%-32s%d/%d 2^%\" W \"u\\t%\" W \"u\\t%0.4f\\t%.4f\\t%.4f\\t%.1e\\t%.2f\\t\"\n\t   \"%\" W \"u\\t%\" W \"u\\n\",\n\t   test_name,\n\t   Checksum::cksum_size,\n\t   Checksum::cksum_skip,\n\t   h_bits,\n\t   count(),\n\t   uniqueness(),\n\t   fullness(),\n\t   coverage(),\n\t   collisions(),\n\t   0.001 * accum_iters * test_size / accum_millis,\n\t   accum_iters,\n\t   colls());\n  }\n\n  usize_t size_log2 (usize_t slots) {\n    usize_t bits = bitsof<typename Checksum::word_type>() - 1;\n    usize_t i;\n\n    for (i = 3; i <= bits; i += 1) {\n      if (slots <= (1U << i)) {\n\treturn i - Checksum::compaction;\n      }\n    }\n\n    return bits;\n  }\n\n  void new_table(usize_t entries) {\n    t_entries = entries;\n    h_bits = size_log2(entries);\n\n    usize_t n = 1 << h_bits;\n\n    s_bits = bitsof<typename Checksum::word_type>() - h_bits;\n    s_mask = n - 1U;\n\n    hash_table = new char[n / 8];\n    memset(hash_table, 0, n / 8);\n  }\n\n  int get_table_bit(usize_t i) {\n    return hash_table[i/8] & (1 << i%8);\n  }\n\n  int set_table_bit(usize_t i) {\n    return hash_table[i/8] |= (1 << i%8);\n  }\n\n  void summarize_table() {\n    usize_t n = 1 << h_bits;\n    usize_t f = 0;\n    for (usize_t i = 0; i < n; i++) {\n      if (get_table_bit(i)) {\n\tf++;\n      }\n    }\n    h_buckets_full = f;\n  }\n\n  void get(const uint8_t* buf, const size_t buf_size, usize_t test_iters) {\n    typename Checksum::hash_type hash;\n    const uint8_t *ptr;\n    const uint8_t *end;\n    usize_t periods;\n    int64_t last_offset;\n    int64_t stop;\n\n    test_size = buf_size;\n    last_offset = buf_size - Checksum::cksum_size;\n\n    if (last_offset < 0) {\n      periods = 0;\n      n_steps = 0;\n      n_incrs = 0;\n      stop = -Checksum::cksum_size;\n    } else {\n      periods = last_offset / Checksum::cksum_skip;\n      n_steps = periods + 1;\n      n_incrs = last_offset + 1;\n      stop = last_offset - (periods + 1) * Checksum::cksum_skip;\n    }\n\n    // Compute file stats once.\n    if (fstats.unique_values == 0) {\n      if (Checksum::cksum_skip == 1) {\n\tfor (size_t i = 0; i <= buf_size - Checksum::cksum_size; i++) {\n\t  fstats.update(hash(cksum.step(buf + i), s_bits, s_mask), buf + i);\n\t}\n      } else {\n\tptr = buf + last_offset;\n\tend = buf + stop;\n\n\tfor (; ptr != end; ptr -= Checksum::cksum_skip) {\n\t  fstats.update(hash(cksum.step(ptr), s_bits, s_mask), ptr);\n\t}\n      }\n      fstats.freeze();\n    }\n\n    long start_test = get_millisecs_now();\n\n    if (Checksum::cksum_skip != 1) {\n      new_table(n_steps);\n\n      for (usize_t i = 0; i < test_iters; i++) {\n\tptr = buf + last_offset;\n\tend = buf + stop;\n\n\tfor (; ptr != end; ptr -= Checksum::cksum_skip) {\n\t  set_table_bit(hash(cksum.step(ptr), s_bits, s_mask));\n\t}\n      }\n\n      summarize_table();\n    }\n\n    stop = buf_size - Checksum::cksum_size + 1;\n    if (stop < 0) {\n      stop = 0;\n    }\n\n    if (Checksum::cksum_skip == 1) {\n      new_table(n_incrs);\n\n      for (usize_t i = 0; i < test_iters; i++) {\n\tptr = buf;\n\tend = buf + stop;\n\n\tif (ptr != end) {\n\t  set_table_bit(hash(cksum.state0(ptr++), s_bits, s_mask));\n\t}\n\n\tfor (; ptr != end; ptr++) {\n\t  typename Checksum::word_type w = cksum.incr(ptr);\n\t  CHECK_EQ(w, cksum.step(ptr));\n\t  set_table_bit(hash(w, s_bits, s_mask));\n\t}\n      }\n\n      summarize_table();\n    }\n\n    accum_iters += test_iters;\n    accum_millis += get_millisecs_now() - start_test;\n  }\n};\n\nstatic int read_whole_file(const char *name,\n\t\t\t   uint8_t **buf_ptr,\n\t\t\t   size_t *buf_len) {\n  main_file file;\n  int ret;\n  xoff_t len;\n  size_t nread;\n  main_file_init(&file);\n  file.filename = name;\n  ret = main_file_open(&file, name, XO_READ);\n  if (ret != 0) {\n    fprintf(stderr, \"open failed\\n\");\n    goto exit;\n  }\n  ret = main_file_stat(&file, &len);\n  if (ret != 0) {\n    fprintf(stderr, \"stat failed\\n\");\n    goto exit;\n  }\n  \n  (*buf_len) = (size_t)len;\n  (*buf_ptr) = (uint8_t*) main_malloc(*buf_len);\n  ret = main_file_read(&file, *buf_ptr, *buf_len, &nread,\n\t\t       \"read failed\");\n  if (ret == 0 && *buf_len == nread) {\n    ret = 0;\n  } else {\n    fprintf(stderr, \"invalid read\\n\");\n    ret = XD3_INTERNAL;\n  }\n exit:\n  main_file_cleanup(&file);\n  return ret;\n}\n\nint main(int argc, char** argv) {\n  int i;\n  uint8_t *buf = NULL;\n  size_t buf_len = 0;\n  int ret;\n\n  if (argc <= 1) {\n    fprintf(stderr, \"usage: %s file ...\\n\", argv[0]);\n    return 1;\n  }\n\n// TODO: The xdelta3-hash.h code is identical now; add sameness test.\n// using rabin_karp<> template.\n#define TEST(T,Z,S,C)\t\t\t\t\t\\\n  test_result<large_cksum<T,Z,S,hhash<T>,C>>\t\t\\\n    _xck_ ## T ## _ ## Z ## _ ## S ## _ ## C\t\t\\\n    (\"xck_\" #T \"_\" #Z \"_\" #S \"_\" #C);\t\t\t\\\n  test_result<large_cksum_old<T,Z,S,hhash<T>,C>>\t\\\n    _old_ ## T ## _ ## Z ## _ ## S ## _ ## C\t\t\\\n    (\"old_\" #T \"_\" #Z \"_\" #S \"_\" #C)\n\n#define TESTS(SIZE, SKIP)\t \\\n  TEST(usize_t, SIZE, SKIP, 1);  \\\n  TEST(usize_t, SIZE, SKIP, 2)\n   \n  TESTS(5, 1);\n  TESTS(6, 1);\n  TESTS(7, 1);\n  TESTS(8, 1);\n  TESTS(9, 1);\n  TESTS(10, 1);\n  TESTS(11, 1);\n  TESTS(12, 1);\n  TESTS(13, 1);\n  TESTS(14, 1);\n  TESTS(15, 1);\n  TESTS(16, 1);\n  TESTS(17, 1);\n  TESTS(18, 1);\n  TESTS(19, 1);\n  TESTS(20, 1);\n  TESTS(21, 1);\n  TESTS(22, 1);\n  TESTS(23, 1);\n  TESTS(24, 1);\n  TESTS(25, 1);\n  TESTS(26, 1);\n  TESTS(27, 1);\n  TESTS(28, 1);\n  TESTS(29, 1);\n  TESTS(30, 1);\n  TESTS(31, 1);\n  TESTS(32, 1);\n  TESTS(33, 1);\n  TESTS(34, 1);\n  TESTS(35, 1);\n  TESTS(36, 1);\n  TESTS(37, 1);\n  TESTS(38, 1);\n  TESTS(39, 1);\n\n\n  for (i = 1; i < argc; i++) {\n    if ((ret = read_whole_file(argv[i],\n\t\t\t       & buf,\n\t\t\t       & buf_len))) {\n      return 1;\n    }\n\n    fprintf(stderr, \"file %s is %zu bytes\\n\",\n\t    argv[i], buf_len);\n\n    double min_time = -1.0;\n    double min_compression = 0.0;\n\n    for (vector<test_result_base*>::iterator iter = all_tests.begin();\n\t iter != all_tests.end(); ++iter) {\n      test_result_base *test = *iter;\n      test->reset();\n\n      usize_t iters = 1;\n      long start_test = get_millisecs_now();\n\n      do {\n\ttest->get(buf, buf_len, iters);\n\titers *= 3;\n\titers /= 2;\n      } while (get_millisecs_now() - start_test < 2000);\n\n      test->stat();\n\n      if (min_time < 0.0) {\n\tmin_compression = test->compression();\n\tmin_time = test->time();\n      }\n\n      if (min_time > test->time()) {\n\tmin_time = test->time();\n      }\n\n      if (min_compression > test->compression()) {\n\tmin_compression = test->compression();\n      }\n\n      test->print();\n    }\n\n    main_free(buf);\n    buf = NULL;\n  }\n\n  return 0;      \n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/checksum_test_c.c",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#include \"../xdelta3.c\"\n\n// OLD CHECKSUM CODE\n\n#define PERMUTE32(x) (__single_hash32[x])\n#define PERMUTE64(x) (__single_hash64[x])\n\nconst uint16_t __single_hash32[256] =\n{\n  /* This hashes the input alphabet (Scheme SLIB pseudo-random). */\n  0xbcd1, 0xbb65, 0x42c2, 0xdffe, 0x9666, 0x431b, 0x8504, 0xeb46,\n  0x6379, 0xd460, 0xcf14, 0x53cf, 0xdb51, 0xdb08, 0x12c8, 0xf602,\n  0xe766, 0x2394, 0x250d, 0xdcbb, 0xa678, 0x02af, 0xa5c6, 0x7ea6,\n  0xb645, 0xcb4d, 0xc44b, 0xe5dc, 0x9fe6, 0x5b5c, 0x35f5, 0x701a,\n  0x220f, 0x6c38, 0x1a56, 0x4ca3, 0xffc6, 0xb152, 0x8d61, 0x7a58,\n  0x9025, 0x8b3d, 0xbf0f, 0x95a3, 0xe5f4, 0xc127, 0x3bed, 0x320b,\n  0xb7f3, 0x6054, 0x333c, 0xd383, 0x8154, 0x5242, 0x4e0d, 0x0a94,\n  0x7028, 0x8689, 0x3a22, 0x0980, 0x1847, 0xb0f1, 0x9b5c, 0x4176,\n  0xb858, 0xd542, 0x1f6c, 0x2497, 0x6a5a, 0x9fa9, 0x8c5a, 0x7743,\n  0xa8a9, 0x9a02, 0x4918, 0x438c, 0xc388, 0x9e2b, 0x4cad, 0x01b6,\n  0xab19, 0xf777, 0x365f, 0x1eb2, 0x091e, 0x7bf8, 0x7a8e, 0x5227,\n  0xeab1, 0x2074, 0x4523, 0xe781, 0x01a3, 0x163d, 0x3b2e, 0x287d,\n  0x5e7f, 0xa063, 0xb134, 0x8fae, 0x5e8e, 0xb7b7, 0x4548, 0x1f5a,\n  0xfa56, 0x7a24, 0x900f, 0x42dc, 0xcc69, 0x02a0, 0x0b22, 0xdb31,\n  0x71fe, 0x0c7d, 0x1732, 0x1159, 0xcb09, 0xe1d2, 0x1351, 0x52e9,\n  0xf536, 0x5a4f, 0xc316, 0x6bf9, 0x8994, 0xb774, 0x5f3e, 0xf6d6,\n  0x3a61, 0xf82c, 0xcc22, 0x9d06, 0x299c, 0x09e5, 0x1eec, 0x514f,\n  0x8d53, 0xa650, 0x5c6e, 0xc577, 0x7958, 0x71ac, 0x8916, 0x9b4f,\n  0x2c09, 0x5211, 0xf6d8, 0xcaaa, 0xf7ef, 0x287f, 0x7a94, 0xab49,\n  0xfa2c, 0x7222, 0xe457, 0xd71a, 0x00c3, 0x1a76, 0xe98c, 0xc037,\n  0x8208, 0x5c2d, 0xdfda, 0xe5f5, 0x0b45, 0x15ce, 0x8a7e, 0xfcad,\n  0xaa2d, 0x4b5c, 0xd42e, 0xb251, 0x907e, 0x9a47, 0xc9a6, 0xd93f,\n  0x085e, 0x35ce, 0xa153, 0x7e7b, 0x9f0b, 0x25aa, 0x5d9f, 0xc04d,\n  0x8a0e, 0x2875, 0x4a1c, 0x295f, 0x1393, 0xf760, 0x9178, 0x0f5b,\n  0xfa7d, 0x83b4, 0x2082, 0x721d, 0x6462, 0x0368, 0x67e2, 0x8624,\n  0x194d, 0x22f6, 0x78fb, 0x6791, 0xb238, 0xb332, 0x7276, 0xf272,\n  0x47ec, 0x4504, 0xa961, 0x9fc8, 0x3fdc, 0xb413, 0x007a, 0x0806,\n  0x7458, 0x95c6, 0xccaa, 0x18d6, 0xe2ae, 0x1b06, 0xf3f6, 0x5050,\n  0xc8e8, 0xf4ac, 0xc04c, 0xf41c, 0x992f, 0xae44, 0x5f1b, 0x1113,\n  0x1738, 0xd9a8, 0x19ea, 0x2d33, 0x9698, 0x2fe9, 0x323f, 0xcde2,\n  0x6d71, 0xe37d, 0xb697, 0x2c4f, 0x4373, 0x9102, 0x075d, 0x8e25,\n  0x1672, 0xec28, 0x6acb, 0x86cc, 0x186e, 0x9414, 0xd674, 0xd1a5\n};\n\nconst uint32_t __single_hash64[256] =\n{\n  /* http://random.org 2014.10.24 */\n  0xd25e9f0a, 0xb1af9d5e, 0xb753dfa2, 0x157050f7,  /* 0 */\n  0xc84b072c, 0xdd14fe7c, 0xf92208c3, 0xdf08a0c0,\n  0x63a5c118, 0x76f5d90f, 0xa2f8b93e, 0xb6c12d22,\n  0xaf074957, 0x966fb7d9, 0x62f7b785, 0xb40e8a09,\n  0x0a811d5d, 0x323a6daa, 0xb62f7c5b, 0xfdcb9a53,\n  0xf25a9067, 0x4506bc7a, 0xff58a74b, 0x5ae62817,\n  0x74097675, 0x722c0fd9, 0x116a2a66, 0x65f76728,\n  0x72c79651, 0xe043cf9d, 0x64b867c7, 0x6604834f,\n  0xcdca58a6, 0x0f164e2d, 0x24515f05, 0x632cdbf8,\n  0x18091d4a, 0x3eff4128, 0x673d1c33, 0xd8e10c71,\n  0x1a3edf11, 0xba52892f, 0xa56949e0, 0xf3e1dd77,  /* 10 */\n  0x86fcbe3e, 0x138d66d0, 0x4fc98359, 0xc22e5dd6,\n  0xc59f2267, 0x6c6dd739, 0xe03da190, 0x07e8469c,\n  0xadcfb02c, 0x00d3b0d9, 0xa1f44918, 0x8bd84d87,\n  0x08ec9ec1, 0xbbcd156f, 0xb57718e3, 0x3177e752,\n  0xf52a4d70, 0xde7aaad9, 0x075f1da0, 0x21ba00c6,\n  0xb9469a5c, 0xcf08d5ba, 0x91ac9edc, 0xc6167b63,\n  0xc1974919, 0xc8c8d195, 0x4b1996dd, 0xeff8991c,\n  0xf7f66c6b, 0x25b012e2, 0x59d12a98, 0xea40d3cc,\n  0x41f9970b, 0xec48101a, 0xa3bdcf90, 0x99f16905,\n  0x27af6c97, 0xc849af37, 0x49cad89b, 0xf48c2278,  /* 20 */\n  0x5529c3d8, 0x9e7d6dce, 0x16feb52d, 0xf1b0aca1,\n  0xaf28fccb, 0x48e4ce3c, 0xc4436617, 0x64524e3e,\n  0x61806681, 0x6384f2d7, 0x1172880f, 0x34a5ef5f,\n  0xcc8cc0a8, 0x66e8f100, 0x2866085f, 0xba9b1b2d,\n  0x51285949, 0x2be4b574, 0x889b1ef5, 0x3dbe920d,\n  0x9277a62f, 0x0584a9f6, 0x085d8fc4, 0x4b5d403d,\n  0x4e46ca78, 0x3294c2f9, 0x29313e70, 0xe4f09b24,\n  0xe73b331c, 0x072f5552, 0x2e390b78, 0xea0021ca,\n  0xd8f40320, 0xed0e16fd, 0x7de9cf7a, 0xf17e3d6c,\n  0x8df1bd85, 0x052cae67, 0x3486e512, 0x3a1c09b8,  /* 30 */\n  0x6c2a7b4e, 0x83455753, 0xbc0353ac, 0x0ffe20b6,\n  0x5fdcef85, 0x010f506c, 0x595ce972, 0xe28680d0,\n  0xa7e216b2, 0xa392ee0f, 0x25b73faa, 0x2b1f4983,\n  0xeeaefe98, 0x1d3d9cbc, 0x6aebe97b, 0x8b7b3584,\n  0x9e6a9a07, 0xd37f1e99, 0x4ac2a441, 0x8ae9a213,\n  0x7d0e27d7, 0x5de54b9a, 0x8621de1f, 0xf0f2f866,\n  0xcb08d275, 0x49c3f87e, 0xd5ee68c1, 0x9802fc77,\n  0x68be6c5e, 0x65aa8c27, 0xf423d5f7, 0x10ec5502,\n  0x9909bce1, 0x509cdf1b, 0x338fea72, 0x2733e9bf,\n  0xf92f4fd7, 0x87738ea2, 0x931a8bbc, 0x0a5c9155,  /* 40 */\n  0xbe5edd9b, 0xadbf5838, 0x0338f8d2, 0x290da210,\n  0x390c37d8, 0xe7cffae8, 0x20617ebe, 0x464322dd,\n  0x7b3c4e78, 0xac142dcb, 0x2d5cef76, 0xd8fe49fc,\n  0x60f4e9a9, 0x7473816f, 0x0dc35f39, 0x5eed80c1,\n  0x0cb55ab6, 0x1d3ac541, 0x13c7f529, 0x7bffdf4a,\n  0xe334785b, 0x85263ec1, 0xd132ae56, 0x7c868b9e,\n  0x47f60638, 0x1012b979, 0x81c31dd3, 0x1af868c8,\n  0x0c5d0742, 0xd1b3e1a2, 0x5873200a, 0xf848465c,\n  0x0fc4d596, 0x609c18af, 0xc9f5a480, 0xd1a94a84,\n  0xa1431a3f, 0x7de8bb1a, 0x25f1256b, 0x1dcc732c,  /* 50 */\n  0x6aa1549a, 0xa2367281, 0x32f2a77e, 0x82e62a0f,\n  0x045cbb56, 0x74b2027c, 0xd71a32d9, 0x022e7cb5,\n  0xe99be177, 0x60222fdf, 0xd69681ca, 0x9008ee2c,\n  0x32923db4, 0xcf82bf97, 0x38960a5b, 0xb3503d5b,\n  0x9bd4c7f2, 0x33c029c8, 0x1ef504a3, 0xdb249d3b,\n  0x91e89676, 0x4ca43b36, 0x9191433c, 0x465d5dc4,\n  0xf4dcb118, 0x9d11dd00, 0xb592f058, 0xdbe5ce30,\n  0x74790d92, 0x779850a8, 0x7180d25b, 0xfa951d99,\n  0x5990935a, 0x921cb022, 0x3b7c39bc, 0x6a38a7c7,\n  0xdc22703b, 0x142bab3b, 0x4e3d9479, 0x44bb8482,  /* 60 */\n  0x8043abce, 0xfebe832a, 0x8e6a2f98, 0x4d43c4fe,\n  0xd192a70a, 0x802f3c3a, 0x5d11bbab, 0x2665d241,\n  0xb3f3a680, 0x3a8d223f, 0xcf82cdb4, 0x4ed28743,\n};\n\nuint64_t\nxd3_large64_cksum_old (xd3_hash_cfg *ignore, const uint8_t *base, const usize_t look)\n{\n  static const uint64_t kBits = 32;\n  static const uint64_t kMask = 0xffffffff;\n  usize_t i = 0;\n  uint64_t low  = 0;\n  uint64_t high = 0;\n\n  for (; i < look; i += 1)\n    {\n      low  += PERMUTE64(*base++);\n      high += low;\n    }\n\n  return ((high & kMask) << kBits) | (low & kMask);\n}\n\nuint64_t\nxd3_large64_cksum_update_old (xd3_hash_cfg *ignore, const uint64_t cksum,\n\t\t\t      const uint8_t *base, const usize_t look)\n{\n  static const uint64_t kBits = 32;\n  static const uint64_t kMask = 0xffffffff;\n  uint64_t old_c = PERMUTE64(base[0]);\n  uint64_t new_c = PERMUTE64(base[look]);\n  uint64_t low   = ((cksum & kMask) - old_c + new_c) & kMask;\n  uint64_t high  = ((cksum >> kBits) - (old_c * look) + low) & kMask;\n  return (high << kBits) | low;\n}\n\nuint32_t\nxd3_large32_cksum_old (xd3_hash_cfg *ignore, const uint8_t *base, const usize_t look)\n{\n  static const uint32_t kBits = 16;\n  static const uint32_t kMask = 0xffff;\n  usize_t i = 0;\n  uint32_t low  = 0;\n  uint32_t high = 0;\n\n  for (; i < look; i += 1)\n    {\n      low  += PERMUTE32(*base++);\n      high += low;\n    }\n\n  return ((high & kMask) << kBits) | (low & kMask);\n}\n\nuint32_t\nxd3_large32_cksum_update_old (xd3_hash_cfg *ignore, const uint32_t cksum,\n\t\t\t      const uint8_t *base, const usize_t look)\n{\n  static const uint32_t kBits = 16;\n  static const uint32_t kMask = 0xffff;\n  uint32_t old_c = PERMUTE32(base[0]);\n  uint32_t new_c = PERMUTE32(base[look]);\n  uint32_t low   = ((cksum & kMask) - old_c + new_c) & kMask;\n  uint32_t high  = ((cksum >> kBits) - (old_c * look) + low) & kMask;\n  return (high << kBits) | low;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/cmp.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\nstatic size_t CmpDifferentBlockBytes(const Block &a, const Block &b) {\n  size_t total = 0;\n  size_t i = 0; \n  size_t m = min(a.Size(), b.Size());\n\n  for (; i < m; i++) {\n    if (a[i] != b[i]) {\n      total++;\n    }\n  }\n\n  total += a.Size() - i;\n  total += b.Size() - i;\n\n  return total;\n}\n\nstatic xoff_t CmpDifferentBytes(const FileSpec &a, const FileSpec &b) {\n  Block block_a, block_b;\n  xoff_t total = 0;\n  typename FileSpec::iterator a_i(a), b_i(b);\n\n  for (; !a_i.Done() && !b_i.Done(); a_i.Next(), b_i.Next()) {\n\n    a_i.Get(&block_a);\n    b_i.Get(&block_b);\n\n    total += CmpDifferentBlockBytes(block_a, block_b);\n  }\n\n  for (; !a_i.Done(); a_i.Next()) {\n    total += a_i.BytesOnBlock();\n  }\n  for (; !b_i.Done(); b_i.Next()) {\n    total += b_i.BytesOnBlock();\n  }\n\n  return total;\n}\n\nstatic size_t CmpDifferentBlockBytesAtOffset(const Block &a,\n\t\t\t\t\t     const FileSpec &b_spec,\n\t\t\t\t\t     xoff_t offset) {\n  Block b;\n  size_t size = a.Size();\n  CHECK_LE(offset, b_spec.Size());\n  if (b_spec.Size() < offset + size) {\n    size = b_spec.Size() - offset;\n  }\n  b_spec.Get(&b, offset, size);\n  return CmpDifferentBlockBytes(a, b);\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/delta.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\nclass Delta {\npublic:\n  Delta(const Block &block) {\n    int ret;\n    xd3_config config;\n    memset(&stream_, 0, sizeof (stream_));\n    memset(&config, 0, sizeof (config));\n\n    xd3_init_config(&config, XD3_SKIP_EMIT | XD3_ADLER32_NOVER);\n\n    CHECK_EQ(0, xd3_config_stream (&stream_, &config));\n\n    xd3_avail_input (&stream_, block.Data(), block.Size());\n\n    bool done = false;\n    while (!done) {\n      ret = xd3_decode_input(&stream_);\n    \n      switch (ret) {\n      case XD3_INPUT:\n\tdone = true;\n\tbreak;\n      case XD3_OUTPUT:\n\tCHECK_EQ(0, xd3_whole_append_window (&stream_));\n\tbreak;\n      case XD3_GOTHEADER:\n      case XD3_WINSTART:\n      case XD3_WINFINISH:\n\tbreak;\n      default:\n\tcerr << \"decode: \" << done;\n\tabort();\n      }\n    }\n  }\n\n  ~Delta() {\n    xd3_free_stream(&stream_);\n  }\n\n  xoff_t AddedBytes() const {\n    return stream_.whole_target.addslen;\n  }\n\n  xoff_t Windows() const {\n    return stream_.whole_target.wininfolen;\n  }\n\n// Note: This does not benefit from -Wformat= checking, due to the\n// enclosing template. Further, it was not used.\n// void Print() const {\n//     for (size_t i = 0; i < stream_.whole_target.instlen; i++) {\n//       xd3_winst &winst = stream_.whole_target.inst[i];\n//       switch (winst.type) {\n//       case XD3_RUN: \n// \tDP(RINT, \"%\" Q \"u run %\" W \"u\\n\", winst.position, winst.size);\n// \tbreak;\n//       case XD3_ADD: \n// \tDP(RINT \"%\" Q \"u add %\" W \"u\\n\", winst.position, winst.size);\n// \tbreak;\n//       default:\n// \tDP(RINT \"%\" Q \"u copy %\" W \"u @ %\" Q \"u (mode %u)\\n\", \n// \t   winst.position, winst.size, winst.addr, winst.mode);\n// \tbreak;\n//       }\n//     }\n//   }\n\nprivate:\n  xd3_stream stream_;\n};\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/file.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\nclass Block;\nclass BlockIterator;\nclass TmpFile;\n\nclass Block {\npublic:\n  Block()\n    : data_(NULL),\n      data_size_(0),\n      size_(0) { }\n\n  ~Block() {\n    if (data_) {\n      delete [] data_;\n    }\n  }\n\n  size_t Size() const {\n    return size_;\n  }\n\n  uint8_t operator[](size_t i) const {\n    CHECK_LT(i, size_);\n    return data_[i];\n  }\n\n  uint8_t* Data() const {\n    if (data_ == NULL) {\n      CHECK_EQ(0, size_);\n      data_size_ = 1;\n      data_ = new uint8_t[1];\n    }\n    return data_;\n  }\n\n  // For writing to blocks\n  void Append(const uint8_t *data, size_t size) {\n    if (data_ == NULL) {\n      CHECK_EQ(0, size_);\n      CHECK_EQ(0, data_size_);\n      data_ = new uint8_t[Constants::BLOCK_SIZE];\n      data_size_ = Constants::BLOCK_SIZE;\n    }\n\n    if (size_ + size > data_size_) {\n      uint8_t *tmp = data_;\n      while (size_ + size > data_size_) {\n\tdata_size_ *= 2;\n      }\n      data_ = new uint8_t[data_size_];\n      memcpy(data_, tmp, size_);\n      delete [] tmp;\n    }\n\n    memcpy(data_ + size_, data, size);\n    size_ += size;\n  }\n\n  // For cleaing a block\n  void Reset() {\n    size_ = 0;\n  }\n\n  // Note: This does not benefit from -Wformat= checking, due to the\n  // enclosing template. Further, it was not used.\n  // void Print() const {\n  //   xoff_t pos = 0;\n  //   for (size_t i = 0; i < Size(); i++) {\n  //     if (pos % 16 == 0) {\n  // \tDP(RINT \"%5\" Q \"x: \", pos);\n  //     }\n  //     DP(RINT \"%02x \", (*this)[i]);\n  //     if (pos % 16 == 15) {\n  // \tDP(RINT \"\\n\");\n  //     }\n  //     pos++;\n  //   }\n  //   DP(RINT \"\\n\");\n  // }\n\n  void WriteTmpFile(TmpFile *f) const {\n    f->Append(this);\n  }\n\n  void SetSize(size_t size) {\n    uint8_t *t = NULL;\n    if (data_size_ < size) {\n      if (data_) {\n\tt = data_;\n      }\n      data_ = new uint8_t[size];\n      data_size_ = size;\n    }\n    if (t && size < size_) {\n      memcpy(data_, t, size);\n    }\n    delete [] t;\n    size_ = size;\n  }\n\nprivate:\n  friend class BlockIterator;\n\n  mutable uint8_t *data_;\n  mutable size_t data_size_;\n  size_t size_;\n};\n\nclass FileSpec {\n public:\n  FileSpec(MTRandom *rand)\n    : rand_(rand) {\n  }\n\n  // Generates a file with a known size\n  void GenerateFixedSize(xoff_t size) {\n    Reset();\n\n    for (xoff_t p = 0; p < size; ) {\n      xoff_t t = min(Constants::BLOCK_SIZE, size - p);\n      table_.insert(make_pair(p, Segment(t, rand_)));\n      p += t;\n    }\n  }\n\n  // Generates a file with exponential-random distributed size\n  void GenerateRandomSize(xoff_t mean) {\n    GenerateFixedSize(rand_->ExpRand(mean));\n  }\n\n  // Returns the size of the file\n  xoff_t Size() const {\n    if (table_.empty()) {\n      return 0;\n    }\n    ConstSegmentMapIterator i = --table_.end();\n    return i->first + i->second.Size();\n  }\n\n  // Returns the number of blocks\n  xoff_t Blocks(size_t blksize = Constants::BLOCK_SIZE) const {\n    if (table_.empty()) {\n      return 0;\n    }\n    return ((Size() - 1) / blksize) + 1;\n  }\n\n  // Returns the number of segments\n  xoff_t Segments() const {\n    return table_.size();\n  }\n\n  // Create a mutation according to \"what\".\n  void ModifyTo(const Mutator &mutator,\n\t\tFileSpec *modify) const {\n    modify->Reset();\n    mutator.Mutate(&modify->table_, &table_, rand_);\n    modify->CheckSegments();\n  }\n\n  void CheckSegments() const {\n    for (ConstSegmentMapIterator iter(table_.begin());\n\t iter != table_.end(); ) {\n      ConstSegmentMapIterator iter0(iter++);\n      if (iter == table_.end()) {\n\tbreak;\n      }\n      CHECK_EQ(iter0->first + iter0->second.Size(), iter->first);\n    }\n  }\n\n  void Reset() {\n    table_.clear();\n  }\n\n  void Print() const {\n    for (ConstSegmentMapIterator iter(table_.begin());\n\t iter != table_.end();\n\t ++iter) {\n      const Segment &seg = iter->second;\n      cerr << \"Segment at \" << iter->first\n\t   << \" (\" << seg.ToString() << \")\" << endl;\n    }\n  }\n\n  void PrintData() const {\n    Block block;\n    for (BlockIterator iter(*this); !iter.Done(); iter.Next()) {\n      iter.Get(&block);\n      block.Print();\n    }\n  }\n\n  void WriteTmpFile(TmpFile *f) const {\n    Block block;\n    for (BlockIterator iter(*this); !iter.Done(); iter.Next()) {\n      iter.Get(&block);\n      f->Append(&block);\n    }\n  }\n\n  void Get(Block *block, xoff_t offset, size_t size) const {\n    size_t got = 0;\n    block->SetSize(size);\n\n    ConstSegmentMapIterator pos = table_.upper_bound(offset);\n    if (pos == table_.begin()) {\n      CHECK_EQ(0, Size());\n      return;\n    }\n    --pos;\n\n    while (got < size) {\n      CHECK(pos != table_.end());\n      CHECK_GE(offset, pos->first);\n\n      const Segment &seg = pos->second;\n\n      // The position of this segment may start before this block starts,\n      // and then the position of the data may be offset from the seeding\n      // position.\n      size_t seg_offset = offset - pos->first;\n      size_t advance = min(seg.Size() - seg_offset,\n\t\t\t   size - got);\n\n      seg.Fill(seg_offset, advance, block->Data() + got);\n\n      got += advance;\n      offset += advance;\n      ++pos;\n    }\n  }\n\n  typedef BlockIterator iterator;\n\n private:\n  friend class BlockIterator;\n\n  MTRandom *rand_;\n  SegmentMap table_;\n};\n\nclass BlockIterator {\npublic:\n  explicit BlockIterator(const FileSpec& spec)\n    : spec_(spec),\n      blkno_(0),\n      blksize_(Constants::BLOCK_SIZE) { }\n\n  BlockIterator(const FileSpec& spec,\n\t\tsize_t blksize)\n    : spec_(spec),\n      blkno_(0),\n      blksize_(blksize) { }\n\n  bool Done() const {\n    return blkno_ >= spec_.Blocks(blksize_);\n  }\n\n  void Next() {\n    blkno_++;\n  }\n\n  xoff_t Blkno() const {\n    return blkno_;\n  }\n\n  xoff_t Blocks() const {\n    return spec_.Blocks(blksize_);\n  }\n\n  xoff_t Offset() const {\n    return blkno_ * blksize_;\n  }\n\n  void SetBlock(xoff_t blkno) {\n    CHECK_LE(blkno, Blocks());\n    blkno_ = blkno;\n  }\n\n  void Get(Block *block) const {\n    spec_.Get(block, blkno_ * blksize_, BytesOnBlock());\n  }\n\n  size_t BytesOnBlock() const {\n    xoff_t blocks = spec_.Blocks(blksize_);\n    xoff_t size = spec_.Size();\n\n    DCHECK((blkno_ < blocks) ||\n\t   (blkno_ == blocks && size % blksize_ == 0));\n\n    if (blkno_ == blocks) {\n      return 0;\n    }\n    if (blkno_ + 1 == blocks) {\n      return ((size - 1) % blksize_) + 1;\n    }\n    return blksize_;\n  }\n\n  size_t BlockSize() const {\n    return blksize_;\n  }\n\nprivate:\n  const FileSpec& spec_;\n  xoff_t blkno_;\n  size_t blksize_;\n};\n\nclass ExtFile {\npublic:\n  ExtFile() {\n    static int static_counter = 0;\n    pid_t pid = getpid();\n    char buf[64];\n    xoff_t xpid = pid;\n    snprintf(buf, 64, \"/tmp/regtest.%\" Q \"u.%d\", xpid, static_counter++);\n    filename_.append(buf);\n    unlink(filename_.c_str());\n  }\n\n  ~ExtFile() {\n    unlink(filename_.c_str());\n  }\n\n  const char* Name() const {\n    return filename_.c_str();\n  }\n\n  // Check whether a real file matches a file spec.\n  bool EqualsSpec(const FileSpec &spec) const {\n    main_file t;\n    main_file_init(&t);\n    CHECK_EQ(0, main_file_open(&t, Name(), XO_READ));\n\n    Block tblock;\n    Block sblock;\n    for (BlockIterator iter(spec); !iter.Done(); iter.Next()) {\n      iter.Get(&sblock);\n      tblock.SetSize(sblock.Size());\n      size_t tread;\n      CHECK_EQ(0, main_file_read(&t,\n\t\t\t\t tblock.Data(),\n\t\t\t\t tblock.Size(), &tread, \"read failed\"));\n      CHECK_EQ(0, CmpDifferentBlockBytes(tblock, sblock));\n    }\n\n    CHECK_EQ(0, main_file_close(&t));\n    main_file_cleanup(&t);\n    return true;\n  }\n\nprotected:\n  string filename_;\n};\n\nclass TmpFile : public ExtFile {\npublic:\n  TmpFile() {\n    main_file_init(&file_);\n    CHECK_EQ(0, main_file_open(&file_, Name(), XO_WRITE));\n  }\n\n  ~TmpFile() {\n    main_file_cleanup(&file_);\n  }\n\n  void Append(const Block *block) {\n    CHECK_EQ(0, main_file_write(&file_,\n\t\t\t\tblock->Data(), block->Size(),\n\t\t\t\t\"tmpfile write failed\"));\n  }\n\n  const char* Name() const {\n    if (main_file_isopen(&file_)) {\n      CHECK_EQ(0, main_file_close(&file_));\n    }\n    return ExtFile::Name();\n  }\n\nprivate:\n  mutable main_file file_;\n};\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/modify.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\nclass Mutator {\npublic:\n  virtual ~Mutator() { }\n  virtual void Mutate(SegmentMap *table,\n\t\t      const SegmentMap *source_table,\n\t\t      MTRandom *rand) const = 0;\n};\n\nclass Change {\npublic:\n  enum Kind {\n    MODIFY = 1,     // Mutate a certain range w/ random or supplied data\n    ADD = 2,        // Insert random or supplied data\n    DELRANGE = 3,     // Delete a specified range of data\n    COPY = 4,       // Copy from one region, inserting elsewhere\n    MOVE = 5,       // Copy then delete copied-from range\n    COPYOVER = 6    // Copy then delete copied-to range\n\n    // ADD, DELRANGE, and COPY change the file size\n    // MODIFY, MOVE, COPYOVER preserve the file size\n  };\n\n  // Constructor for modify, add, delete.\n  Change(Kind kind0, xoff_t size0, xoff_t addr1_0)\n    : kind(kind0),\n      size(size0),\n      addr1(addr1_0),\n      addr2(0),\n      insert(NULL) {\n    CHECK(kind != MOVE && kind != COPY && kind != COPYOVER);\n  }\n\n  // Constructor for modify, add w/ provided data.\n  Change(Kind kind0, xoff_t size0, xoff_t addr1_0, Segment *insert0)\n    : kind(kind0),\n      size(size0),\n      addr1(addr1_0),\n      addr2(0),\n      insert(insert0) {\n    CHECK(kind != MOVE && kind != COPY && kind != COPYOVER);\n  }\n\n  // Constructor for move, copy, overwrite\n  Change(Kind kind0, xoff_t size0, xoff_t addr1_0, xoff_t addr2_0)\n    : kind(kind0),\n      size(size0),\n      addr1(addr1_0),\n      addr2(addr2_0),\n      insert(NULL) {\n    CHECK(kind == MOVE || kind == COPY || kind == COPYOVER);\n  }\n\n  Kind kind;\n  xoff_t size;\n  xoff_t addr1;\n  xoff_t addr2;\n  Segment *insert;  // For modify and/or add\n};\n\ntypedef list<Change> ChangeList;\ntypedef typename ChangeList::const_iterator ConstChangeListIterator;\ntypedef typename ChangeList::iterator ChangeListIterator;\n\nclass ChangeListMutator : public Mutator {\npublic:\n  ChangeListMutator(const ChangeList &cl)\n    : cl_(cl) { }\n\n  ChangeListMutator() { }\n\n  void Mutate(SegmentMap *table,\n\t      const SegmentMap *source_table,\n\t      MTRandom *rand) const {\n    // The speed of processing gigabytes of data is so slow compared with\n    // these table-copy operations, no attempt to make this fast.\n    SegmentMap tmp;\n\n    for (ConstChangeListIterator iter(cl_.begin());\n\t iter != cl_.end(); ++iter) {\n      const Change &ch = *iter;\n      tmp.clear();\n      Mutate(ch, &tmp, source_table, rand);\n      tmp.swap(*table);\n      source_table = table;\n    }\n  }\n\n  static void Mutate(const Change &ch,\n\t\t     SegmentMap *table,\n\t\t     const SegmentMap *source_table,\n\t\t     MTRandom *rand) {\n    switch (ch.kind) {\n    case Change::ADD:\n      AddChange(ch, table, source_table, rand);\n      break;\n    case Change::MODIFY:\n      ModifyChange(ch, table, source_table, rand);\n      break;\n    case Change::DELRANGE:\n      DeleteChange(ch, table, source_table, rand);\n      break;\n    case Change::COPY:\n      CopyChange(ch, table, source_table, rand);\n      break;\n    case Change::MOVE:\n      MoveChange(ch, table, source_table, rand);\n      break;\n    case Change::COPYOVER:\n      OverwriteChange(ch, table, source_table, rand);\n      break;\n    }\n  }\n\n  static void ModifyChange(const Change &ch,\n\t\t\t   SegmentMap *table,\n\t\t\t   const SegmentMap *source_table,\n\t\t\t   MTRandom *rand) {\n    xoff_t m_start = ch.addr1;\n    xoff_t m_end = m_start + ch.size;\n    xoff_t i_start = 0;\n    xoff_t i_end = 0;\n\n    for (ConstSegmentMapIterator iter(source_table->begin());\n\t iter != source_table->end();\n\t ++iter) {\n      const Segment &seg = iter->second;\n      i_start = iter->first;\n      i_end = i_start + seg.Size();\n\n      if (i_end <= m_start || i_start >= m_end) {\n\ttable->insert(table->end(), make_pair(i_start, seg));\n\tcontinue;\n      }\n\n      if (i_start < m_start) {\n\ttable->insert(table->end(),\n\t\t      make_pair(i_start,\n\t\t\t\tseg.Subseg(0, m_start - i_start)));\n      }\n\n      // Insert the entire segment, even though it may extend into later\n      // segments.  This condition avoids inserting it during later\n      // segments.\n      if (m_start >= i_start) {\n\tif (ch.insert != NULL) {\n\t  table->insert(table->end(), make_pair(m_start, *ch.insert));\n\t} else {\n\t  Segment part(m_end - m_start, rand);\n\t  table->insert(table->end(), make_pair(m_start, part));\n\t}\n      }\n\n      if (i_end > m_end) {\n\ttable->insert(table->end(),\n\t\t      make_pair(m_end,\n\t\t\t\tseg.Subseg(m_end - i_start, i_end - m_end)));\n      }\n    }\n\n    // This check verifies that the modify does not extend past the\n    // source_table EOF.\n    CHECK_LE(m_end, i_end);\n  }\n\n  static void AddChange(const Change &ch,\n\t\t\tSegmentMap *table,\n\t\t\tconst SegmentMap *source_table,\n\t\t\tMTRandom *rand) {\n    xoff_t m_start = ch.addr1;\n    xoff_t i_start = 0;\n    xoff_t i_end = 0;\n\n    for (ConstSegmentMapIterator iter(source_table->begin());\n\t iter != source_table->end();\n\t ++iter) {\n      const Segment &seg = iter->second;\n      i_start = iter->first;\n      i_end = i_start + seg.Size();\n\n      if (i_end <= m_start) {\n\ttable->insert(table->end(), make_pair(i_start, seg));\n\tcontinue;\n      }\n\n      if (i_start > m_start) {\n\ttable->insert(table->end(), make_pair(i_start + ch.size, seg));\n\tcontinue;\n      }\n\n      if (i_start < m_start) {\n\ttable->insert(table->end(),\n\t\t      make_pair(i_start,\n\t\t\t\tseg.Subseg(0, m_start - i_start)));\n      }\n\n      if (ch.insert != NULL) {\n\ttable->insert(table->end(), make_pair(m_start, *ch.insert));\n      } else {\n\tSegment addseg(ch.size, rand);\n\ttable->insert(table->end(), make_pair(m_start, addseg));\n      }\n\n      if (m_start < i_end) {\n\ttable->insert(table->end(),\n\t\t      make_pair(m_start + ch.size,\n\t\t\t\tseg.Subseg(m_start - i_start,\n\t\t\t\t\t   i_end - m_start)));\n      }\n    }\n\n    CHECK_LE(m_start, i_end);\n\n    // Special case for add at end-of-input.\n    if (m_start == i_end) {\n      Segment addseg(ch.size, rand);\n      table->insert(table->end(), make_pair(m_start, addseg));\n    }\n  }\n\n  static void DeleteChange(const Change &ch,\n\t\t\t   SegmentMap *table,\n\t\t\t   const SegmentMap *source_table,\n\t\t\t   MTRandom *rand) {\n    xoff_t m_start = ch.addr1;\n    xoff_t m_end = m_start + ch.size;\n    xoff_t i_start = 0;\n    xoff_t i_end = 0;\n\n    for (ConstSegmentMapIterator iter(source_table->begin());\n\t iter != source_table->end();\n\t ++iter) {\n      const Segment &seg = iter->second;\n      i_start = iter->first;\n      i_end = i_start + seg.Size();\n\n      if (i_end <= m_start) {\n\ttable->insert(table->end(), make_pair(i_start, seg));\n\tcontinue;\n      }\n\n      if (i_start >= m_end) {\n\ttable->insert(table->end(), make_pair(i_start - ch.size, seg));\n\tcontinue;\n      }\n\n      if (i_start < m_start) {\n\ttable->insert(table->end(),\n\t\t      make_pair(i_start,\n\t\t\t\tseg.Subseg(0, m_start - i_start)));\n      }\n\n      if (i_end > m_end) {\n\ttable->insert(table->end(),\n\t\t      make_pair(m_end - ch.size,\n\t\t\t\tseg.Subseg(m_end - i_start, i_end - m_end)));\n      }\n    }\n\n    CHECK_LT(m_start, i_end);\n    CHECK_LE(m_end, i_end);\n  }\n\n  // A move is a copy followed by delete of the copied-from range.\n  static void MoveChange(const Change &ch,\n\t\t\t SegmentMap *table,\n\t\t\t const SegmentMap *source_table,\n\t\t\t MTRandom *rand) {\n    SegmentMap tmp;\n    CHECK_NE(ch.addr1, ch.addr2);\n    CopyChange(ch, &tmp, source_table, rand);\n    Change d(Change::DELRANGE, ch.size,\n\t     ch.addr1 < ch.addr2 ? ch.addr1 : ch.addr1 + ch.size);\n    DeleteChange(d, table, &tmp, rand);\n  }\n\n  // An overwrite is a copy followed by a delete of the copied-to range.\n  static void OverwriteChange(const Change &ch,\n\t\t\t      SegmentMap *table,\n\t\t\t      const SegmentMap *source_table,\n\t\t\t      MTRandom *rand) {\n    SegmentMap tmp;\n    CHECK_NE(ch.addr1, ch.addr2);\n    CopyChange(ch, &tmp, source_table, rand);\n    Change d(Change::DELRANGE, ch.size, ch.addr2 + ch.size);\n    DeleteChange(d, table, &tmp, rand);\n  }\n\n  static void CopyChange(const Change &ch,\n\t\t\t SegmentMap *table,\n\t\t\t const SegmentMap *source_table,\n\t\t\t MTRandom *ignore) {\n    xoff_t m_start = ch.addr2;\n    xoff_t c_start = ch.addr1;\n    xoff_t i_start = 0;\n    xoff_t i_end = 0;\n\n    // Like AddChange() with AppendCopy instead of a random segment.\n    for (ConstSegmentMapIterator iter(source_table->begin());\n\t iter != source_table->end();\n\t ++iter) {\n      const Segment &seg = iter->second;\n      i_start = iter->first;\n      i_end = i_start + seg.Size();\n\n      if (i_end <= m_start) {\n\ttable->insert(table->end(), make_pair(i_start, seg));\n\tcontinue;\n      }\n\n      if (i_start > m_start) {\n\ttable->insert(table->end(), make_pair(i_start + ch.size, seg));\n\tcontinue;\n      }\n\n      if (i_start < m_start) {\n\ttable->insert(table->end(),\n\t\t      make_pair(i_start,\n\t\t\t\tseg.Subseg(0, m_start - i_start)));\n      }\n\n      AppendCopy(table, source_table, c_start, m_start, ch.size);\n\n      if (m_start < i_end) {\n\ttable->insert(table->end(),\n\t\t      make_pair(m_start + ch.size,\n\t\t\t\tseg.Subseg(m_start - i_start, i_end - m_start)));\n      }\n    }\n\n    CHECK_LE(m_start, i_end);\n\n    // Special case for copy to end-of-input.\n    if (m_start == i_end) {\n      AppendCopy(table, source_table, c_start, m_start, ch.size);\n    }\n  }\n\n  static void AppendCopy(SegmentMap *table,\n\t\t\t const SegmentMap *source_table,\n\t\t\t xoff_t copy_offset,\n\t\t\t xoff_t append_offset,\n\t\t\t xoff_t length) {\n    ConstSegmentMapIterator pos(source_table->upper_bound(copy_offset));\n    --pos;\n    xoff_t got = 0;\n\n    while (got < length) {\n      size_t seg_offset = copy_offset - pos->first;\n      size_t advance = min(pos->second.Size() - seg_offset,\n\t\t\t   (size_t)(length - got));\n\n      table->insert(table->end(),\n\t\t    make_pair(append_offset,\n\t\t\t      pos->second.Subseg(seg_offset,\n\t\t\t\t\t\t advance)));\n\n      got += advance;\n      copy_offset += advance;\n      append_offset += advance;\n      ++pos;\n    }\n  }\n\n  ChangeList* Changes() {\n    return &cl_;\n  }\n\n  const ChangeList* Changes() const {\n    return &cl_;\n  }\n\nprivate:\n  ChangeList cl_;\n};\n\nclass Modify1stByte : public Mutator {\npublic:\n  void Mutate(SegmentMap *table,\n\t      const SegmentMap *source_table,\n\t      MTRandom *rand) const {\n    ChangeListMutator::Mutate(Change(Change::MODIFY, 1, 0),\n\t\t\t      table, source_table, rand);\n  }\n};\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/random.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#undef MT_LEN\n#undef MT_IA\nclass MTRandom {\n public:\n  enum Constants { \n    MT_LEN = 624,\n    MT_IA = 397\n  };\n\n  static const uint32_t TEST_SEED1;\n  static const uint32_t UPPER_MASK;\n  static const uint32_t LOWER_MASK;\n  static const uint32_t MATRIX_A;\n\n  MTRandom() {\n    Init(TEST_SEED1);\n  }\n\n  explicit MTRandom(uint32_t seed) {\n    Init(seed);\n  }\n\n  /* This Mersenne Twister code is attributed to Michael Brundage. Thanks!\n   * http://www.qbrundage.com/michaelb/pubs/essays/random_number_generation.html\n   */\n  uint32_t Rand32 () {\n    uint32_t y;\n    static unsigned long mag01[2] = { \n      0 , MATRIX_A\n    };\n\n    if (mt_index_ >= MT_LEN) {\n      int kk;\n\n      for (kk = 0; kk < MT_LEN - MT_IA; kk++) {\n\ty = (mt_buffer_[kk] & UPPER_MASK) | (mt_buffer_[kk + 1] & LOWER_MASK);\n\tmt_buffer_[kk] = mt_buffer_[kk + MT_IA] ^ (y >> 1) ^ mag01[y & 0x1UL];\n      }\n      for (;kk < MT_LEN - 1; kk++) {\n\ty = (mt_buffer_[kk] & UPPER_MASK) | (mt_buffer_[kk + 1] & LOWER_MASK);\n\tmt_buffer_[kk] = mt_buffer_[kk + (MT_IA - MT_LEN)] ^ (y >> 1) ^ mag01[y & 0x1UL];\n      }\n      y = (mt_buffer_[MT_LEN - 1] & UPPER_MASK) | (mt_buffer_[0] & LOWER_MASK);\n      mt_buffer_[MT_LEN - 1] = mt_buffer_[MT_IA - 1] ^ (y >> 1) ^ mag01[y & 0x1UL];\n\n      mt_index_ = 0;\n    }\n  \n    y = mt_buffer_[mt_index_++];\n\n    y ^= (y >> 11);\n    y ^= (y << 7) & 0x9d2c5680UL;\n    y ^= (y << 15) & 0xefc60000UL;\n    y ^= (y >> 18);\n\n    return y;\n  }\n\n  uint32_t ExpRand32(uint32_t mean) {\n    double mean_d = mean;\n    double erand  = log (1.0 / (Rand32() / (double)UINT32_MAX));\n    uint32_t x = (uint32_t) (mean_d * erand + 0.5);\n    return x;\n  }\n\n  uint64_t Rand64() {\n    return ((uint64_t)Rand32() << 32) | Rand32();\n  }\n\n  uint64_t ExpRand64(uint64_t mean) {\n    double mean_d = mean;\n    double erand  = log (1.0 / (Rand64() / (double)UINT32_MAX));\n    uint64_t x = (uint64_t) (mean_d * erand + 0.5);\n    return x;\n  }\n\n  template <typename T>\n  T Rand() {\n    switch (sizeof(T)) {\n    case sizeof(uint32_t):\n      return Rand32();\n    case sizeof(uint64_t):\n      return Rand64();\n    default:\n      cerr << \"Invalid sizeof T\" << endl;\n      abort();\n    }\n  }\n\n  template <typename T>\n  T ExpRand(T mean) {\n    switch (sizeof(T)) {\n    case sizeof(uint32_t):\n      return ExpRand32(mean);\n    case sizeof(uint64_t):\n      return ExpRand64(mean);\n    default:\n      cerr << \"Invalid sizeof T\" << endl;\n      abort();\n    }\n  }\n\n private:\n  void Init(uint32_t seed) {\n    mt_buffer_[0] = seed;\n    mt_index_ = MT_LEN;\n    for (int i = 1; i < MT_LEN; i++) {\n      /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */\n      /* In the previous versions, MSBs of the seed affect   */\n      /* only MSBs of the array mt[].                        */\n      /* 2002/01/09 modified by Makoto Matsumoto             */\n      mt_buffer_[i] = \n\t(1812433253UL * (mt_buffer_[i-1] ^ (mt_buffer_[i-1] >> 30)) + i);\n    }\n  }\n\n  int mt_index_;\n  uint32_t mt_buffer_[MT_LEN];\n};\n\nconst uint32_t MTRandom::TEST_SEED1 = 5489UL;\nconst uint32_t MTRandom::UPPER_MASK = 0x80000000;\nconst uint32_t MTRandom::LOWER_MASK = 0x7FFFFFFF;\nconst uint32_t MTRandom::MATRIX_A = 0x9908B0DF;\n\nclass MTRandom8 {\npublic:\n  MTRandom8(MTRandom *rand)\n    : rand_(rand) {\n  }\n\n  uint8_t Rand8() {\n    uint32_t r = rand_->Rand32();\n\n    // TODO: make this use a single byte at a time?\n    return (r & 0xff) ^ (r >> 7) ^ (r >> 15) ^ (r >> 21);\n  }\n\nprivate:\n  MTRandom *rand_;\n};\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/regtest.cc",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#include \"test.h\"\n#include \"random.h\"\n#include \"sizes.h\"\n\ntemplate <typename Constants>\nclass Regtest {\npublic:\n  typedef typename Constants::Sizes Sizes;\n\n  struct Options {\n    Options()\n      : encode_srcwin_maxsz(1<<20),\n\tblock_size(Constants::BLOCK_SIZE),\n\twindow_size(Constants::WINDOW_SIZE),\n\tsize_known(false),\n\tiopt_size(XD3_DEFAULT_IOPT_SIZE),\n\tsmatch_cfg(XD3_SMATCH_DEFAULT) { }\n\n    xoff_t encode_srcwin_maxsz;\n    size_t block_size;\n    xoff_t window_size;\n    bool size_known;\n    usize_t iopt_size;\n    xd3_smatch_cfg smatch_cfg;\n  };\n\n#include \"segment.h\"\n#include \"modify.h\"\n#include \"file.h\"\n#include \"cmp.h\"\n#include \"delta.h\"\n\n  void InMemoryEncodeDecode(const FileSpec &source_file,\n\t\t\t    const FileSpec &target_file,\n\t\t\t    Block *coded_data,\n\t\t\t    const Options &options) {\n    xd3_stream encode_stream;\n    xd3_config encode_config;\n    xd3_source encode_source;\n\n    xd3_stream decode_stream;\n    xd3_config decode_config;\n    xd3_source decode_source;\n    xoff_t verified_bytes = 0;\n    xoff_t encoded_bytes = 0;\n\n    if (coded_data) {\n      coded_data->Reset();\n    }\n\n    memset(&encode_stream, 0, sizeof (encode_stream));\n    memset(&encode_source, 0, sizeof (encode_source));\n\n    memset(&decode_stream, 0, sizeof (decode_stream));\n    memset(&decode_source, 0, sizeof (decode_source));\n\n    xd3_init_config(&encode_config, XD3_ADLER32);\n    xd3_init_config(&decode_config, XD3_ADLER32);\n\n    encode_config.winsize = options.window_size;\n    encode_config.iopt_size = options.iopt_size;\n    encode_config.smatch_cfg = options.smatch_cfg;\n\n    CHECK_EQ(0, xd3_config_stream (&encode_stream, &encode_config));\n    CHECK_EQ(0, xd3_config_stream (&decode_stream, &decode_config));\n\n    encode_source.blksize = options.block_size;\n    decode_source.blksize = options.block_size;\n\n    encode_source.max_winsize = options.encode_srcwin_maxsz;\n    decode_source.max_winsize = options.encode_srcwin_maxsz;\n\n    if (!options.size_known)\n      {\n\txd3_set_source (&encode_stream, &encode_source);\n\txd3_set_source (&decode_stream, &decode_source);\n      }\n    else\n      {\n\txd3_set_source_and_size (&encode_stream, &encode_source,\n\t\t\t\t source_file.Size());\n\txd3_set_source_and_size (&decode_stream, &decode_source,\n\t\t\t\t source_file.Size());\n      }\n\n    BlockIterator source_iterator(source_file, options.block_size);\n    BlockIterator target_iterator(target_file, Constants::WINDOW_SIZE);\n    Block encode_source_block, decode_source_block;\n    Block decoded_block, target_block;\n    bool encoding = true;\n    bool done = false;\n    bool done_after_input = false;\n\n    IF_DEBUG1 (XPR(NTR \"source %\" Q \"u[%\" Z \"u] target %\" Q \"u winsize %\" Z \"u\\n\",\n\t\t   source_file.Size(), options.block_size,\n\t\t   target_file.Size(),\n\t\t   Constants::WINDOW_SIZE));\n\n    while (!done) {\n      target_iterator.Get(&target_block);\n\n      xoff_t blks = target_iterator.Blocks();\n\n      IF_DEBUG2(XPR(NTR \"target in %s: %\" Q \"u[%\" Z \"u] %\" Q \"u(%\" Q \"u) \"\n\t\t    \"verified %\" Q \"u\\n\",\n\t\t    encoding ? \"encoding\" : \"decoding\",\n\t\t    target_iterator.Offset(),\n\t\t    target_block.Size(),\n\t\t    target_iterator.Blkno(),\n\t\t    blks,\n\t\t    verified_bytes));\n\n      if (blks == 0 || target_iterator.Blkno() == (blks - 1)) {\n\txd3_set_flags(&encode_stream, XD3_FLUSH | encode_stream.flags);\n      }\n\n      xd3_avail_input(&encode_stream, target_block.Data(), target_block.Size());\n      encoded_bytes += target_block.Size();\n\n    process:\n      int ret;\n      const char *msg;\n      if (encoding) {\n\tret = xd3_encode_input(&encode_stream);\n\tmsg = encode_stream.msg;\n      } else {\n\tret = xd3_decode_input(&decode_stream);\n\tmsg = decode_stream.msg;\n      }\n      (void) msg;\n\n      switch (ret) {\n      case XD3_OUTPUT:\n\tif (encoding) {\n\t  if (coded_data != NULL) {\n\t    // Optional encoded-output to the caller\n\t    coded_data->Append(encode_stream.next_out,\n\t\t\t       encode_stream.avail_out);\n\t  }\n\t  // Feed this data to the decoder.\n\t  xd3_avail_input(&decode_stream,\n\t\t\t  encode_stream.next_out,\n\t\t\t  encode_stream.avail_out);\n\t  xd3_consume_output(&encode_stream);\n\t  encoding = false;\n\t} else {\n\t  decoded_block.Append(decode_stream.next_out,\n\t\t\t       decode_stream.avail_out);\n\t  xd3_consume_output(&decode_stream);\n\t}\n\tgoto process;\n\n      case XD3_GETSRCBLK: {\n\txd3_source *src = (encoding ? &encode_source : &decode_source);\n\tBlock *block = (encoding ? &encode_source_block : &decode_source_block);\n\tif (encoding) {\n\t  IF_DEBUG2(XPR(NTR \"[srcblock] %\" Q \"u last srcpos %\" Q \"u \"\n\t\t\t\"encodepos %\" Q \"u\\n\",\n\t\t\tencode_source.getblkno,\n\t\t\tencode_stream.match_last_srcpos,\n\t\t\tencode_stream.input_position + encode_stream.total_in));\n\t}\n\n\tsource_iterator.SetBlock(src->getblkno);\n\tsource_iterator.Get(block);\n\tsrc->curblkno = src->getblkno;\n\tsrc->onblk = block->Size();\n\tsrc->curblk = block->Data();\n\n\tgoto process;\n      }\n\n      case XD3_INPUT:\n\tif (!encoding) {\n\t  encoding = true;\n\t  goto process;\n\t} else {\n\t  if (done_after_input) {\n\t    done = true;\n\t    continue;\n\t  }\n\n\t  if (target_block.Size() < target_iterator.BlockSize()) {\n\t    encoding = false;\n\t  } else {\n\t    target_iterator.Next();\n\t  }\n\t  continue;\n\t}\n\n      case XD3_WINFINISH:\n\tif (encoding) {\n\t  if (encode_stream.flags & XD3_FLUSH) {\n\t    done_after_input = true;\n\t  }\n\t  encoding = false;\n\t} else {\n\t CHECK_EQ(0, CmpDifferentBlockBytesAtOffset(decoded_block,\n\t\t\t\t\t\t    target_file,\n\t\t\t\t\t\t    verified_bytes));\n\t verified_bytes += decoded_block.Size();\n\t decoded_block.Reset();\n\t encoding = true;\n       }\n       goto process;\n\n     case XD3_WINSTART:\n     case XD3_GOTHEADER:\n       goto process;\n\n     default:\n       XPR(NTR \"%s = %s %s\\n\", encoding ? \"E \" : \" D\",\n\t   xd3_strerror(ret),\n\t   msg == NULL ? \"\" : msg);\n\n       CHECK_EQ(0, ret);\n       CHECK_EQ(-1, ret);\n     }\n   }\n\n   CHECK_EQ(target_file.Size(), encoded_bytes);\n   CHECK_EQ(target_file.Size(), verified_bytes);\n   CHECK_EQ(0, xd3_close_stream(&decode_stream));\n   CHECK_EQ(0, xd3_close_stream(&encode_stream));\n   xd3_free_stream(&encode_stream);\n   xd3_free_stream(&decode_stream);\n }\n\n  void MainEncodeDecode(const TmpFile &source_file,\n\t\t\tconst TmpFile &target_file,\n\t\t\tExtFile *coded_data,\n\t\t\tconst Options &options) {\n    vector<const char*> ecmd;\n    char bbuf[16];\n    snprintf(bbuf, sizeof(bbuf), \"-B%\" Q \"u\", options.encode_srcwin_maxsz);\n    ecmd.push_back(\"xdelta3\");\n    ecmd.push_back(bbuf);\n    ecmd.push_back(\"-s\");\n    ecmd.push_back(source_file.Name());\n    ecmd.push_back(target_file.Name());\n    ecmd.push_back(coded_data->Name());\n    ecmd.push_back(NULL);\n\n    CHECK_EQ(0, xd3_main_cmdline(ecmd.size() - 1,\n\t\t\t\t const_cast<char**>(&ecmd[0])));\n\n    vector<const char*> dcmd;\n    ExtFile recon_file;\n    dcmd.push_back(\"xdelta3\");\n    ecmd.push_back(bbuf);\n    dcmd.push_back(\"-d\");\n    dcmd.push_back(\"-s\");\n    dcmd.push_back(source_file.Name());\n    dcmd.push_back(coded_data->Name());\n    dcmd.push_back(recon_file.Name());\n    dcmd.push_back(NULL);\n\n    CHECK_EQ(0, xd3_main_cmdline(dcmd.size() - 1,\n\t\t\t\t const_cast<char**>(&dcmd[0])));\n\n    CHECK_EQ(0, test_compare_files(recon_file.Name(),\n\t\t\t\t   target_file.Name()));\n  }\n\n  // Similar to xd3_process_memory, with support for test Options.\n  // Exercises xd3_process_stream.\n  int TestProcessMemory (int            is_encode,\n\t\t\t int          (*func) (xd3_stream *),\n\t\t\t const uint8_t *input,\n\t\t\t usize_t        input_size,\n\t\t\t const uint8_t *source,\n\t\t\t usize_t        source_size,\n\t\t\t uint8_t       *output,\n\t\t\t usize_t       *output_size,\n\t\t\t usize_t        output_size_max,\n\t\t\t const Options &options) {\n    xd3_stream stream;\n    xd3_config config;\n    xd3_source src;\n    int ret;\n\n    memset (& stream, 0, sizeof (stream));\n    memset (& config, 0, sizeof (config));\n\n    if (is_encode)\n      {\n\tconfig.winsize = input_size;\n\tconfig.iopt_size = options.iopt_size;\n\tconfig.sprevsz = xd3_pow2_roundup (config.winsize);\n      }\n\n    if ((ret = xd3_config_stream (&stream, &config)) != 0)\n      {\n\tgoto exit;\n      }\n\n    if (source != NULL)\n      {\n\tmemset (& src, 0, sizeof (src));\n\n\tsrc.blksize = source_size;\n\tsrc.onblk = source_size;\n\tsrc.curblk = source;\n\tsrc.curblkno = 0;\n\tsrc.max_winsize = source_size;\n\n\tif ((ret = xd3_set_source_and_size (&stream, &src, source_size)) != 0)\n\t  {\n\t    goto exit;\n\t  }\n      }\n\n    if ((ret = xd3_process_stream (is_encode,\n\t\t\t\t   & stream,\n\t\t\t\t   func, 1,\n\t\t\t\t   input, input_size,\n\t\t\t\t   output,\n\t\t\t\t   output_size,\n\t\t\t\t   output_size_max)) != 0)\n      {\n\tgoto exit;\n      }\n\n  exit:\n    if (ret != 0)\n      {\n\tIF_DEBUG2 (DP(RINT \"test_process_memory: %d: %s\\n\", ret, stream.msg));\n      }\n    xd3_free_stream(&stream);\n    return ret;\n  }\n\n  void EncodeDecodeAPI(const FileSpec &spec0, const FileSpec &spec1, \n\t\t       Block *delta, const Options &options) {\n    Block from;\n    Block to;\n    spec0.Get(&from, 0, spec0.Size());\n    spec1.Get(&to, 0, spec1.Size());\n\n    delta->SetSize(to.Size() * 1.5);\n    usize_t out_size;\n    int enc_ret = TestProcessMemory(true,\n\t\t\t\t    &xd3_encode_input,\n\t\t\t\t    to.Data(),\n\t\t\t\t    to.Size(),\n\t\t\t\t    from.Data(),\n\t\t\t\t    from.Size(),\n\t\t\t\t    delta->Data(),\n\t\t\t\t    &out_size,\n\t\t\t\t    delta->Size(),\n\t\t\t\t    options);\n    CHECK_EQ(0, enc_ret);\n    delta->SetSize(out_size);\n\n    Block recon;\n    recon.SetSize(to.Size());\n    usize_t recon_size;\n    int dec_ret = xd3_decode_memory(delta->Data(),\n\t\t\t\t    delta->Size(),\n\t\t\t\t    from.Data(),\n\t\t\t\t    from.Size(),\n\t\t\t\t    recon.Data(),\n\t\t\t\t    &recon_size,\n\t\t\t\t    recon.Size(),\n\t\t\t\t    0);\n    CHECK_EQ(0, dec_ret);\n    CHECK_EQ(0, CmpDifferentBlockBytes(to, recon));\n  }\n\n//////////////////////////////////////////////////////////////////////\n\nvoid TestPrintf() {\n  char buf[64];\n  xoff_t x = XOFF_T_MAX;\n  snprintf_func (buf, sizeof(buf), \"%\" Q \"u\", x);\n  const char *expect = XD3_USE_LARGEFILE64 ?\n    \"18446744073709551615\" : \"4294967295\";\n  XD3_ASSERT(strcmp (buf, expect) == 0);\n}\n\nvoid TestRandomNumbers() {\n  MTRandom rand;\n  int rounds = 1<<20;\n  uint64_t usum = 0;\n  uint64_t esum = 0;\n\n  for (int i = 0; i < rounds; i++) {\n    usum += rand.Rand32();\n    esum += rand.ExpRand32(1024);\n  }\n\n  double allowed_error = 0.01;\n\n  uint32_t umean = usum / rounds;\n  uint32_t emean = esum / rounds;\n\n  uint32_t uexpect = UINT32_MAX / 2;\n  uint32_t eexpect = 1024;\n\n  if (umean < uexpect * (1.0 - allowed_error) ||\n      umean > uexpect * (1.0 + allowed_error)) {\n    XPR(NT \"uniform mean error: %u != %u\\n\", umean, uexpect);\n    abort();\n  }\n\n  if (emean < eexpect * (1.0 - allowed_error) ||\n      emean > eexpect * (1.0 + allowed_error)) {\n    XPR(NT \"exponential mean error: %u != %u\\n\", emean, eexpect);\n    abort();\n  }\n}\n\nvoid TestRandomFile() {\n  MTRandom rand1;\n  FileSpec spec1(&rand1);\n  BlockIterator bi(spec1);\n\n  spec1.GenerateFixedSize(0);\n  CHECK_EQ(0, spec1.Size());\n  CHECK_EQ(0, spec1.Segments());\n  CHECK_EQ(0, spec1.Blocks());\n  bi.SetBlock(0);\n  CHECK_EQ(0, bi.BytesOnBlock());\n\n  spec1.GenerateFixedSize(1);\n  CHECK_EQ(1, spec1.Size());\n  CHECK_EQ(1, spec1.Segments());\n  CHECK_EQ(1, spec1.Blocks());\n  bi.SetBlock(0);\n  CHECK_EQ(1, bi.BytesOnBlock());\n\n  spec1.GenerateFixedSize(Constants::BLOCK_SIZE);\n  CHECK_EQ(Constants::BLOCK_SIZE, spec1.Size());\n  CHECK_EQ(1, spec1.Segments());\n  CHECK_EQ(1, spec1.Blocks());\n  bi.SetBlock(0);\n  CHECK_EQ(Constants::BLOCK_SIZE, bi.BytesOnBlock());\n  bi.SetBlock(1);\n  CHECK_EQ(0, bi.BytesOnBlock());\n\n  spec1.GenerateFixedSize(Constants::BLOCK_SIZE + 1);\n  CHECK_EQ(Constants::BLOCK_SIZE + 1, spec1.Size());\n  CHECK_EQ(2, spec1.Segments());\n  CHECK_EQ(2, spec1.Blocks());\n  bi.SetBlock(0);\n  CHECK_EQ(Constants::BLOCK_SIZE, bi.BytesOnBlock());\n  bi.SetBlock(1);\n  CHECK_EQ(1, bi.BytesOnBlock());\n\n  spec1.GenerateFixedSize(Constants::BLOCK_SIZE * 2);\n  CHECK_EQ(Constants::BLOCK_SIZE * 2, spec1.Size());\n  CHECK_EQ(2, spec1.Segments());\n  CHECK_EQ(2, spec1.Blocks());\n  bi.SetBlock(0);\n  CHECK_EQ(Constants::BLOCK_SIZE, bi.BytesOnBlock());\n  bi.SetBlock(1);\n  CHECK_EQ(Constants::BLOCK_SIZE, bi.BytesOnBlock());\n}\n\nvoid TestFirstByte() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(0);\n  spec1.GenerateFixedSize(1);\n  CHECK_EQ(0, CmpDifferentBytes(spec0, spec0));\n  CHECK_EQ(0, CmpDifferentBytes(spec1, spec1));\n  CHECK_EQ(1, CmpDifferentBytes(spec0, spec1));\n  CHECK_EQ(1, CmpDifferentBytes(spec1, spec0));\n\n  spec0.GenerateFixedSize(1);\n  spec0.ModifyTo(Modify1stByte(), &spec1);\n  CHECK_EQ(1, CmpDifferentBytes(spec0, spec1));\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE + 1);\n  spec0.ModifyTo(Modify1stByte(), &spec1);\n  CHECK_EQ(1, CmpDifferentBytes(spec0, spec1));\n\n  SizeIterator<size_t, Sizes> si(&rand, Constants::TEST_ROUNDS);\n\n  for (; !si.Done(); si.Next()) {\n    size_t size = si.Get();\n    if (size == 0) {\n      continue;\n    }\n    spec0.GenerateFixedSize(size);\n    spec0.ModifyTo(Modify1stByte(), &spec1);\n    InMemoryEncodeDecode(spec0, spec1, NULL, Options());\n  }\n}\n\nvoid TestModifyMutator() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 3);\n\n  struct {\n    size_t size;\n    size_t addr;\n  } test_cases[] = {\n    { Constants::BLOCK_SIZE, 0 },\n    { Constants::BLOCK_SIZE / 2, 1 },\n    { Constants::BLOCK_SIZE, 1 },\n    { Constants::BLOCK_SIZE * 2, 1 },\n  };\n\n  for (size_t i = 0; i < SIZEOF_ARRAY(test_cases); i++) {\n    ChangeList cl1;\n    cl1.push_back(Change(Change::MODIFY, test_cases[i].size,\n\t\t\t test_cases[i].addr));\n    spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n    CHECK_EQ(spec0.Size(), spec1.Size());\n\n    size_t diff = CmpDifferentBytes(spec0, spec1);\n    CHECK_LE(diff, test_cases[i].size);\n\n    // There is a 1/256 probability of the changed byte matching the\n    // original value.  The following allows double the probability to\n    // pass.\n    CHECK_GE(diff, test_cases[i].size - (2 * test_cases[i].size / 256));\n\n    InMemoryEncodeDecode(spec0, spec1, NULL, Options());\n  }\n}\n\nvoid TestAddMutator() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 2);\n  // TODO: fix this test (for all block sizes)!  it's broken because\n  // the same byte could be added?\n\n  struct {\n    size_t size;\n    size_t addr;\n    size_t expected_adds;\n  } test_cases[] = {\n    { 1, 0,                         2 /* 1st byte, last byte (short block) */ },\n    { 1, 1,                         3 /* 1st 2 bytes, last byte */ },\n    { 1, Constants::BLOCK_SIZE - 1, 2 /* changed, last */ },\n    { 1, Constants::BLOCK_SIZE,     2 /* changed, last */ },\n    { 1, Constants::BLOCK_SIZE + 1, 3 /* changed + 1st of 2nd block, last */ },\n    { 1, 2 * Constants::BLOCK_SIZE, 1 /* last byte */ },\n  };\n\n  for (size_t i = 0; i < SIZEOF_ARRAY(test_cases); i++) {\n    ChangeList cl1;\n    cl1.push_back(Change(Change::ADD, test_cases[i].size, test_cases[i].addr));\n    spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n    CHECK_EQ(spec0.Size() + test_cases[i].size, spec1.Size());\n\n    Block coded;\n    InMemoryEncodeDecode(spec0, spec1, &coded, Options());\n\n    Delta delta(coded);\n    CHECK_EQ(test_cases[i].expected_adds,\n\t     delta.AddedBytes());\n  }\n}\n\nvoid TestDeleteMutator() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 4);\n\n  struct {\n    size_t size;\n    size_t addr;\n  } test_cases[] = {\n    // Note: an entry { Constants::BLOCK_SIZE, 0 },\n    // does not work because the xd3_srcwin_move_point logic won't\n    // find a copy if it occurs >= double its size into the file.\n    { Constants::BLOCK_SIZE / 2, 0 },\n    { Constants::BLOCK_SIZE / 2, Constants::BLOCK_SIZE / 2 },\n    { Constants::BLOCK_SIZE, Constants::BLOCK_SIZE / 2 },\n    { Constants::BLOCK_SIZE * 2, Constants::BLOCK_SIZE * 3 / 2 },\n    { Constants::BLOCK_SIZE, Constants::BLOCK_SIZE * 2 },\n  };\n\n  for (size_t i = 0; i < SIZEOF_ARRAY(test_cases); i++) {\n    ChangeList cl1;\n    cl1.push_back(Change(Change::DELRANGE, test_cases[i].size,\n\t\t\t test_cases[i].addr));\n    spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n    CHECK_EQ(spec0.Size() - test_cases[i].size, spec1.Size());\n\n    Block coded;\n    InMemoryEncodeDecode(spec0, spec1, &coded, Options());\n\n    Delta delta(coded);\n    CHECK_EQ(0, delta.AddedBytes());\n  }\n}\n\nvoid TestCopyMutator() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 3);\n\n  struct {\n    size_t size;\n    size_t from;\n    size_t to;\n  } test_cases[] = {\n    // Copy is difficult to write tests for because where Xdelta finds\n    // copies, it does not enter checksums.  So these tests copy data from\n    // later to earlier so that checksumming will start.\n    { Constants::BLOCK_SIZE / 2, Constants::BLOCK_SIZE / 2, 0 },\n    { Constants::BLOCK_SIZE, 2 * Constants::BLOCK_SIZE,\n      Constants::BLOCK_SIZE, },\n  };\n\n  for (size_t i = 0; i < SIZEOF_ARRAY(test_cases); i++) {\n    ChangeList cl1;\n    cl1.push_back(Change(Change::COPY, test_cases[i].size,\n\t\t\t test_cases[i].from, test_cases[i].to));\n    spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n    CHECK_EQ(spec0.Size() + test_cases[i].size, spec1.Size());\n\n    Block coded;\n    InMemoryEncodeDecode(spec0, spec1, &coded, Options());\n\n    Delta delta(coded);\n    CHECK_EQ(0, delta.AddedBytes());\n  }\n}\n\nvoid TestMoveMutator() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 3);\n\n  struct {\n    size_t size;\n    size_t from;\n    size_t to;\n  } test_cases[] = {\n    // This is easier to test than Copy but has the same trouble as Delete.\n    { Constants::BLOCK_SIZE / 2, Constants::BLOCK_SIZE / 2, 0 },\n    { Constants::BLOCK_SIZE / 2, 0, Constants::BLOCK_SIZE / 2 },\n    { Constants::BLOCK_SIZE, Constants::BLOCK_SIZE, 2 *\n      Constants::BLOCK_SIZE },\n    { Constants::BLOCK_SIZE, 2 * Constants::BLOCK_SIZE,\n      Constants::BLOCK_SIZE },\n    { Constants::BLOCK_SIZE * 3 / 2, Constants::BLOCK_SIZE,\n      Constants::BLOCK_SIZE * 3 / 2 },\n\n    // This is a no-op\n    { Constants::BLOCK_SIZE, Constants::BLOCK_SIZE * 2,\n      3 * Constants::BLOCK_SIZE },\n  };\n\n  for (size_t i = 0; i < SIZEOF_ARRAY(test_cases); i++) {\n    ChangeList cl1;\n    cl1.push_back(Change(Change::MOVE, test_cases[i].size,\n\t\t\t test_cases[i].from, test_cases[i].to));\n    spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n    CHECK_EQ(spec0.Size(), spec1.Size());\n\n    Block coded;\n    InMemoryEncodeDecode(spec0, spec1, &coded, Options());\n\n    Delta delta(coded);\n    CHECK_EQ(0, delta.AddedBytes());\n  }\n}\n\nvoid TestOverwriteMutator() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE);\n\n  ChangeList cl1;\n  cl1.push_back(Change(Change::COPYOVER, 10, 0, 20));\n  spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n  CHECK_EQ(spec0.Size(), spec1.Size());\n\n  Block b0, b1;\n  BlockIterator(spec0).Get(&b0);\n  BlockIterator(spec1).Get(&b1);\n\n  CHECK(memcmp(b0.Data(), b1.Data() + 20, 10) == 0);\n  CHECK(memcmp(b0.Data(), b1.Data(), 20) == 0);\n  CHECK(memcmp(b0.Data() + 30, b1.Data() + 30,\n\t       Constants::BLOCK_SIZE - 30) == 0);\n\n  xoff_t zero = 0;\n  cl1.clear();\n  cl1.push_back(Change(Change::COPYOVER, 10, 20, zero));\n  spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n  CHECK_EQ(spec0.Size(), spec1.Size());\n\n  BlockIterator(spec0).Get(&b0);\n  BlockIterator(spec1).Get(&b1);\n\n  CHECK(memcmp(b0.Data() + 20, b1.Data(), 10) == 0);\n  CHECK(memcmp(b0.Data() + 10, b1.Data() + 10,\n\t       Constants::BLOCK_SIZE - 10) == 0);\n}\n\n// Note: this test is written to expose a problem, but the problem was\n// only exposed with BLOCK_SIZE = 128.\nvoid TestNonBlocking() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n  FileSpec spec2(&rand);\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 3);\n\n  // This is a lazy target match\n  Change ct(Change::COPYOVER, 22,\n\t    Constants::BLOCK_SIZE + 50,\n\t    Constants::BLOCK_SIZE + 20);\n\n  // This is a source match just after the block boundary, shorter\n  // than the lazy target match.\n  Change cs1(Change::COPYOVER, 16,\n\t     Constants::BLOCK_SIZE + 51,\n\t     Constants::BLOCK_SIZE - 1);\n\n  // This overwrites the original source bytes.\n  Change cs2(Change::MODIFY, 108,\n\t     Constants::BLOCK_SIZE + 20);\n\n  // This changes the first blocks\n  Change c1st(Change::MODIFY, Constants::BLOCK_SIZE - 2, 0);\n\n  ChangeList csl;\n  csl.push_back(cs1);\n  csl.push_back(cs2);\n  csl.push_back(c1st);\n\n  spec0.ModifyTo(ChangeListMutator(csl), &spec1);\n\n  ChangeList ctl;\n  ctl.push_back(ct);\n  ctl.push_back(c1st);\n\n  spec0.ModifyTo(ChangeListMutator(ctl), &spec2);\n\n  InMemoryEncodeDecode(spec1, spec2, NULL, Options());\n}\n\nvoid TestEmptyInMemory() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n  Block block;\n\n  spec0.GenerateFixedSize(0);\n  spec1.GenerateFixedSize(0);\n\n  InMemoryEncodeDecode(spec0, spec1, &block, Options());\n\n  Delta delta(block);\n  CHECK_LT(0, block.Size());\n  CHECK_EQ(1, delta.Windows());\n}\n\nvoid TestBlockInMemory() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n  Block block;\n\n  spec0.GenerateFixedSize(Constants::BLOCK_SIZE);\n  spec1.GenerateFixedSize(Constants::BLOCK_SIZE);\n\n  InMemoryEncodeDecode(spec0, spec1, &block, Options());\n\n  Delta delta(block);\n  CHECK_EQ(spec1.Blocks(Constants::WINDOW_SIZE), delta.Windows());\n}\n\nvoid TestSmallStride() {\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  usize_t size = Constants::BLOCK_SIZE * 4;\n  spec0.GenerateFixedSize(size);\n\n  // Note: Not very good performance due to hash collisions, note 3x\n  // multiplier below.\n  for (int s = 15; s < 101; s++) {\n    usize_t changes = 0;\n    ChangeList cl;\n    for (usize_t j = s; j < size; j += s, ++changes)\n      {\n\tcl.push_back(Change(Change::MODIFY, 1, j));\n      }\n\n    FileSpec spec1(&rand);\n    spec0.ModifyTo(ChangeListMutator(cl), &spec1);\n\n    Options options;\n    options.encode_srcwin_maxsz = size;\n    options.iopt_size = 128;\n    options.smatch_cfg = XD3_SMATCH_SLOW;\n    options.size_known = false;\n\n    Block block;\n    InMemoryEncodeDecode(spec0, spec1, &block, options);\n    Delta delta(block);\n\n    IF_DEBUG1(DP(RINT \"[stride=%d] changes=%\" W \"u adds=%\" Q \"u\\n\",\n\t\t s, changes, delta.AddedBytes()));\n    double allowance = Constants::BLOCK_SIZE < 8192 || s < 30 ? 3.0 : 1.1;\n    CHECK_GE(allowance * changes, (double)delta.AddedBytes());\n  }\n}\n\nvoid TestCopyWindow() {\n  // Construct an input that has many copies, to fill the IOPT buffer\n  // and force a source window decision.  \"srclen\" may be set to a\n  // value that goes beyond the end-of-source.\n  const int clen = 16;\n  const int size = 4096;\n  const int nmov = size / clen;\n  const int iters = 16;\n  uint32_t added_01 = 0;\n  uint32_t added_10 = 0;\n  for (int i = 1; i <= iters; i++) {\n    MTRandom rand(MTRandom::TEST_SEED1 * i);\n    FileSpec spec0(&rand);\n    ChangeList cl;\n\n    spec0.GenerateFixedSize(size);\n\n    for (int j = 0; j < nmov; j += 2)\n      {\n\tcl.push_back(Change(Change::MOVE,\n\t\t\t    clen, (j + 1) * clen, j * clen));\n      }\n\n    FileSpec spec1(&rand);\n    spec0.ModifyTo(ChangeListMutator(cl), &spec1);\n\n    Options options;\n    options.encode_srcwin_maxsz = size;\n    options.iopt_size = 128;\n    options.smatch_cfg = XD3_SMATCH_SLOW;\n\n    Block block1;\n    InMemoryEncodeDecode(spec0, spec1, &block1, options);\n    Delta delta1(block1);\n    // Allow one missed window (e.g., hash collisions)\n    added_01 += delta1.AddedBytes();\n\n    Block block2;\n    InMemoryEncodeDecode(spec1, spec0, &block2, options);\n    Delta delta2(block2);\n    // Allow one missed window (e.g., hash collisions)\n    added_10 += delta2.AddedBytes();\n\n    Block block3;\n    Block block4;\n    EncodeDecodeAPI(spec0, spec1, &block3, options);\n    EncodeDecodeAPI(spec1, spec0, &block4, options);\n  }\n  // Average less than 0.5 misses (of length clen) per iteration.\n  CHECK_GE(clen * iters / 2, added_01);\n  CHECK_GE(clen * iters / 2, added_10);\n}\n\nvoid TestCopyFromEnd() {\n  // Copies from the end of the source buffer, which reach a block\n  // boundary end-of-file.\n  const int size = 4096;\n  const int clen = 16;\n  const int nmov = (size / 2) / clen;\n  const int iters = 16;\n  uint32_t added_01 = 0;\n  uint32_t added_10 = 0;\n  for (int i = 1; i <= iters; i++) {\n    MTRandom rand(MTRandom::TEST_SEED1 * i);\n    FileSpec spec0(&rand);\n    ChangeList cl;\n\n    spec0.GenerateFixedSize(size);\n\n    cl.push_back(Change(Change::MODIFY, 2012, 2048));\n\n    for (int j = 0; j < nmov; j += 2)\n      {\n\tcl.push_back(Change(Change::MOVE,\n\t\t\t    clen, (j + 1) * clen, j * clen));\n      }\n\n    cl.push_back(Change(Change::COPYOVER, 28, 4068, 3000));\n    cl.push_back(Change(Change::COPYOVER, 30, 4066, 3100));\n    cl.push_back(Change(Change::COPYOVER, 32, 4064, 3200));\n\n    FileSpec spec1(&rand);\n    spec0.ModifyTo(ChangeListMutator(cl), &spec1);\n\n    Options options;\n    options.encode_srcwin_maxsz = size;\n    options.iopt_size = 128;\n    options.smatch_cfg = XD3_SMATCH_SLOW;\n\n    Block block1;\n    InMemoryEncodeDecode(spec0, spec1, &block1, options);\n    Delta delta1(block1);\n    added_01 += delta1.AddedBytes();\n\n    Block block2;\n    InMemoryEncodeDecode(spec1, spec0, &block2, options);\n    Delta delta2(block2);\n    added_10 += delta2.AddedBytes();\n\n    Block block3;\n    Block block4;\n    EncodeDecodeAPI(spec0, spec1, &block3, options);\n    EncodeDecodeAPI(spec1, spec0, &block4, options);\n  }\n  CHECK_GE(2000 * iters, added_01);\n  CHECK_LE(2000 * iters, added_10);\n}\n\nvoid TestHalfBlockCopy() {\n  // Create a half-block copy, 7.5 blocks apart, in a pair of files:\n  //       0             1     ...     6             7\n  // spec0 [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb][ccccc][bbbb_]\n  // spec1 [aaaaa][ccccc][aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_]\n  // where stage=\n  // 0: the final block is full\n  //   a. (source)spec1->(target)spec0 copies block C: reads 8 source\n  //      blocks during target block 0.\n  //   b. (source)spec0->(target)spec1 does not copy block C b/c attempt\n  //      to read past EOF empties block 0 from (virtual) block cache\n  // 1: the final block is less than full.\n  //   a. (same) copies block C\n  //   b. (same) copies block C, unlike 0a, no attempt to read past EOF\n  //\n  // \"virtual\" above refers to XD3_TOOFARBACK, since there is no caching\n  // in the API, there is simply a promise not to request blocks that are\n  // beyond source->max_winsize from the last known source file position.\n  for (int stage = 0; stage < 2; stage++)\n    {\n      IF_DEBUG1 (DP(RINT \"half_block_copy stage %d\\n\", stage));\n\n      MTRandom rand;\n      FileSpec spec0(&rand);\n      FileSpec spec1(&rand);\n\n      spec0.GenerateFixedSize(Constants::BLOCK_SIZE * 8 - stage);\n\n      ChangeList cl1;\n      cl1.push_back(Change(Change::MODIFY,\n\t\t\t   Constants::BLOCK_SIZE / 2,  // size\n\t\t\t   0));\n      cl1.push_back(Change(Change::COPYOVER,\n\t\t\t   Constants::BLOCK_SIZE / 2,  // size\n\t\t\t   Constants::BLOCK_SIZE * 7,  // offset\n\t\t\t   Constants::BLOCK_SIZE / 2));\n      cl1.push_back(Change(Change::MODIFY,\n\t\t\t   Constants::BLOCK_SIZE * 7,\n\t\t\t   Constants::BLOCK_SIZE - stage));\n      spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n\n      Options options;\n      options.encode_srcwin_maxsz = Constants::BLOCK_SIZE * 8;\n\n      Block block0;\n      Block block1;\n      InMemoryEncodeDecode(spec0, spec1, &block0, options);\n      InMemoryEncodeDecode(spec1, spec0, &block1, options);\n\n      Delta delta0(block0);\n      Delta delta1(block1);\n\n      const int yes =\n\tConstants::BLOCK_SIZE * 8 - Constants::BLOCK_SIZE / 2;\n      const int no =\n\tConstants::BLOCK_SIZE * 8 - Constants::BLOCK_SIZE / 2;\n\n      if (stage == 0)\n\t{\n\t  CHECK_EQ(yes, delta0.AddedBytes());\n\t  CHECK_EQ(no, delta1.AddedBytes());\n\t}\n      else\n\t{\n\t  CHECK_EQ(yes, delta0.AddedBytes());\n\t  CHECK_EQ(yes, delta1.AddedBytes());\n\t}\n    }\n}\n\nvoid FourWayMergeTest(const FileSpec &spec0,\n\t\t      const FileSpec &spec1,\n\t\t      const FileSpec &spec2,\n\t\t      const FileSpec &spec3) {\n  TmpFile f0, f1, f2, f3;\n  ExtFile d01, d12, d23;\n  Options options;\n  options.encode_srcwin_maxsz =\n    std::max(spec0.Size(), options.encode_srcwin_maxsz);\n\n  spec0.WriteTmpFile(&f0);\n  spec1.WriteTmpFile(&f1);\n  spec2.WriteTmpFile(&f2);\n  spec3.WriteTmpFile(&f3);\n\n  MainEncodeDecode(f0, f1, &d01, options);\n  MainEncodeDecode(f1, f2, &d12, options);\n  MainEncodeDecode(f2, f3, &d23, options);\n\n  // Merge 2\n  ExtFile out;\n  vector<const char*> mcmd;\n  mcmd.push_back(\"xdelta3\");\n  mcmd.push_back(\"merge\");\n  mcmd.push_back(\"-m\");\n  mcmd.push_back(d01.Name());\n  mcmd.push_back(d12.Name());\n  mcmd.push_back(out.Name());\n  mcmd.push_back(NULL);\n\n  // XPR(NTR \"Running one merge: %s\\n\", CommandToString(mcmd).c_str());\n  CHECK_EQ(0, xd3_main_cmdline(mcmd.size() - 1,\n\t\t\t       const_cast<char**>(&mcmd[0])));\n\n  ExtFile recon;\n  vector<const char*> tcmd;\n  tcmd.push_back(\"xdelta3\");\n  tcmd.push_back(\"-d\");\n  tcmd.push_back(\"-s\");\n  tcmd.push_back(f0.Name());\n  tcmd.push_back(out.Name());\n  tcmd.push_back(recon.Name());\n  tcmd.push_back(NULL);\n\n  // XPR(NTR \"Running one recon! %s\\n\", CommandToString(tcmd).c_str());\n  CHECK_EQ(0, xd3_main_cmdline(tcmd.size() - 1,\n\t\t\t       const_cast<char**>(&tcmd[0])));\n  // XPR(NTR \"Should equal! %s\\n\", f2.Name());\n\n  CHECK(recon.EqualsSpec(spec2));\n\n  // Merge 3\n  ExtFile out3;\n  vector<const char*> mcmd3;\n  mcmd3.push_back(\"xdelta3\");\n  mcmd3.push_back(\"merge\");\n  mcmd3.push_back(\"-m\");\n  mcmd3.push_back(d01.Name());\n  mcmd3.push_back(\"-m\");\n  mcmd3.push_back(d12.Name());\n  mcmd3.push_back(d23.Name());\n  mcmd3.push_back(out3.Name());\n  mcmd3.push_back(NULL);\n\n  // XPR(NTR \"Running one 3-merge: %s\\n\", CommandToString(mcmd3).c_str());\n  CHECK_EQ(0, xd3_main_cmdline(mcmd3.size() - 1,\n\t\t\t       const_cast<char**>(&mcmd3[0])));\n\n  ExtFile recon3;\n  vector<const char*> tcmd3;\n  tcmd3.push_back(\"xdelta3\");\n  tcmd3.push_back(\"-d\");\n  tcmd3.push_back(\"-s\");\n  tcmd3.push_back(f0.Name());\n  tcmd3.push_back(out3.Name());\n  tcmd3.push_back(recon3.Name());\n  tcmd3.push_back(NULL);\n\n  // XPR(NTR \"Running one 3-recon %s\\n\", CommandToString(tcmd3).c_str());\n  CHECK_EQ(0, xd3_main_cmdline(tcmd3.size() - 1,\n\t\t\t       const_cast<char**>(&tcmd3[0])));\n  // XPR(NTR \"Should equal %s\\n\", f3.Name());\n\n  CHECK(recon3.EqualsSpec(spec3));\n}\n\nvoid TestMergeCommand1() {\n  /* Repeat random-input testing for a number of iterations.\n   * Test 2, 3, and 4-file scenarios (i.e., 1, 2, and 3-delta merges). */\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n  FileSpec spec2(&rand);\n  FileSpec spec3(&rand);\n\n  SizeIterator<size_t, Sizes> si0(&rand, 10);\n\n  for (; !si0.Done(); si0.Next()) {\n    size_t size0 = si0.Get();\n\n    SizeIterator<size_t, Sizes> si1(&rand, 10);\n    for (; !si1.Done(); si1.Next()) {\n      size_t change1 = si1.Get();\n\n      if (change1 == 0) {\n\tcontinue;\n      }\n\n      // XPR(NTR \"S0 = %lu\\n\", size0);\n      // XPR(NTR \"C1 = %lu\\n\", change1);\n      // XPR(NTR \".\");\n\n      size_t add1_pos = size0 ? rand.Rand32() % size0 : 0;\n      size_t del2_pos = size0 ? rand.Rand32() % size0 : 0;\n\n      spec0.GenerateFixedSize(size0);\n\n      ChangeList cl1, cl2, cl3;\n\n      size_t change3 = change1;\n      size_t change3_pos;\n\n      if (change3 >= size0) {\n\tchange3 = size0;\n\tchange3_pos = 0;\n      } else {\n\tchange3_pos = rand.Rand32() % (size0 - change3);\n      }\n\n      cl1.push_back(Change(Change::ADD, change1, add1_pos));\n      cl2.push_back(Change(Change::DELRANGE, change1, del2_pos));\n      cl3.push_back(Change(Change::MODIFY, change3, change3_pos));\n\n      spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n      spec1.ModifyTo(ChangeListMutator(cl2), &spec2);\n      spec2.ModifyTo(ChangeListMutator(cl3), &spec3);\n\n      FourWayMergeTest(spec0, spec1, spec2, spec3);\n      FourWayMergeTest(spec3, spec2, spec1, spec0);\n    }\n  }\n}\n\nvoid TestMergeCommand2() {\n  /* Same as above, different mutation pattern. */\n  /* TODO: run this with large sizes too */\n  /* TODO: run this with small sizes too */\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n  FileSpec spec2(&rand);\n  FileSpec spec3(&rand);\n\n  SizeIterator<size_t, Sizes> si0(&rand, 10);\n  for (; !si0.Done(); si0.Next()) {\n    size_t size0 = si0.Get();\n\n    SizeIterator<size_t, Sizes> si1(&rand, 10);\n    for (; !si1.Done(); si1.Next()) {\n      size_t size1 = si1.Get();\n\n      SizeIterator<size_t, Sizes> si2(&rand, 10);\n      for (; !si2.Done(); si2.Next()) {\n\tsize_t size2 = si2.Get();\n\n\tSizeIterator<size_t, Sizes> si3(&rand, 10);\n\tfor (; !si3.Done(); si3.Next()) {\n\t  size_t size3 = si3.Get();\n\n\t  // We're only interested in three sizes, strictly decreasing. */\n\t  if (size3 >= size2 || size2 >= size1 || size1 >= size0) {\n\t    continue;\n\t  }\n\n\t  // XPR(NTR \"S0 = %lu\\n\", size0);\n\t  // XPR(NTR \"S1 = %lu\\n\", size1);\n\t  // XPR(NTR \"S2 = %lu\\n\", size2);\n\t  // XPR(NTR \"S3 = %lu\\n\", size3);\n\t  // XPR(NTR \".\");\n\n\t  spec0.GenerateFixedSize(size0);\n\n\t  ChangeList cl1, cl2, cl3;\n\n\t  cl1.push_back(Change(Change::DELRANGE, size0 - size1, 0));\n\t  cl2.push_back(Change(Change::DELRANGE, size0 - size2, 0));\n\t  cl3.push_back(Change(Change::DELRANGE, size0 - size3, 0));\n\n\t  spec0.ModifyTo(ChangeListMutator(cl1), &spec1);\n\t  spec0.ModifyTo(ChangeListMutator(cl2), &spec2);\n\t  spec0.ModifyTo(ChangeListMutator(cl3), &spec3);\n\n\t  FourWayMergeTest(spec0, spec1, spec2, spec3);\n\t  FourWayMergeTest(spec3, spec2, spec1, spec0);\n\t}\n      }\n    }\n  }\n}\n\nvoid TestLastFrontierBlock() {\n  // This test constructs an input that can expose\n  // https://github.com/jmacd/xdelta/issues/188\n  // when run through the command-line with source via a FIFO.\n  // That is not tested here, but the test stays.\n  if (Constants::WINDOW_SIZE < XD3_ALLOCSIZE)\n    {\n      return;\n    }\n\n  MTRandom rand;\n  FileSpec spec0(&rand);\n  FileSpec spec1(&rand);\n  const xoff_t size = XD3_ALLOCSIZE * 64;  // == XD3_MINSRCWINSZ * 2\n  const xoff_t edit = XD3_ALLOCSIZE;\n\n  Options options;\n  options.encode_srcwin_maxsz = XD3_MINSRCWINSZ;\n  options.block_size = XD3_ALLOCSIZE;\n  options.window_size = XD3_MINSRCWINSZ;\n  options.size_known = false;\n\n  spec0.GenerateFixedSize(size);\n\n  ChangeList cl;\n\n  // Modify the 0th byte in order to induce indexing of subsequent\n  // bytes, but allow copying most of the file to keep the test fast.\n  cl.push_back(Change(Change::MODIFY, 1, edit * 31));\n  cl.push_back(Change(Change::COPYOVER, edit, edit * 31, edit * 63));\n\n  spec0.ModifyTo(ChangeListMutator(cl), &spec1);\n\n  Block noblock;\n  InMemoryEncodeDecode(spec0, spec1, &noblock, options);\n  InMemoryEncodeDecode(spec1, spec0, &noblock, options);\n}\n\n};  // class Regtest<Constants>\n\n#define TEST(x) XPR(NTR #x \"...\\n\"); regtest.x()\n\n// These tests are primarily tests of the testing framework itself.\ntemplate <class T>\nvoid UnitTest() {\n  Regtest<T> regtest;\n  TEST(TestPrintf);\n  TEST(TestRandomNumbers);\n  TEST(TestRandomFile);\n  TEST(TestFirstByte);\n  TEST(TestModifyMutator);\n  TEST(TestAddMutator);\n  TEST(TestDeleteMutator);\n  TEST(TestCopyMutator);\n  TEST(TestMoveMutator);\n  TEST(TestOverwriteMutator);\n}\n\n// These are Xdelta tests.\ntemplate <class T>\nvoid MainTest() {\n  XPR(NT \"Blocksize %\" Q \"u windowsize %\" Z \"u\\n\",\n      T::BLOCK_SIZE, T::WINDOW_SIZE);\n  Regtest<T> regtest;\n  TEST(TestEmptyInMemory);\n  TEST(TestBlockInMemory);\n  TEST(TestSmallStride);\n  TEST(TestCopyWindow);\n  TEST(TestCopyFromEnd);\n  TEST(TestNonBlocking);\n  TEST(TestHalfBlockCopy);\n  TEST(TestLastFrontierBlock);\n  TEST(TestMergeCommand1);\n  TEST(TestMergeCommand2);\n}\n\n#undef TEST\n\nint main(int argc, char **argv)\n{\n  vector<const char*> mcmd;\n  string pn;\n  const char *sp = strrchr(argv[0], '/');\n  if (sp != NULL) {\n    pn.append(argv[0], sp - argv[0] + 1);\n  }\n  pn.append(\"xdelta3\");\n  mcmd.push_back(pn.c_str());\n  mcmd.push_back(\"test\");\n  mcmd.push_back(NULL);\n\n  UnitTest<SmallBlock>();\n  MainTest<SmallBlock>();\n  MainTest<MixedBlock>();\n  MainTest<OversizeBlock>();\n  MainTest<LargeBlock>();\n\n  CHECK_EQ(0, xd3_main_cmdline(mcmd.size() - 1,\n  \t\t\t       const_cast<char**>(&mcmd[0])));\n\n  return 0;\n}\n\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/regtest_c.c",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#include \"../xdelta3.c\"\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/run_release.sh",
    "content": "#!/bin/sh\n(cd .. && ./run_release.sh)\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/segment.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\nclass Segment {\n public:\n  Segment(size_t size, MTRandom *rand)\n    : size_(size),\n      seed_(rand->Rand32()),\n      seed_offset_(0),\n      data_(NULL) {\n    CHECK_GT(size_, 0);\n  }\n\n  Segment(size_t size, uint32_t seed)\n    : size_(size),\n      seed_(seed),\n      seed_offset_(0),\n      data_(NULL) {\n    CHECK_GT(size_, 0);\n  }\n\n  Segment(size_t size, uint8_t *data)\n    : size_(size),\n      seed_(0),\n      seed_offset_(0),\n      data_(data) {\n    CHECK_GT(size_, 0);\n  }\n\n  size_t Size() const {\n    return size_;\n  }\n\n  Segment Subseg(size_t start, size_t size) const {\n    CHECK_LE(start + size, size_);\n    if (data_) {\n      return Segment(size, data_ + start);\n    } else {\n      return Segment(size, seed_, seed_offset_ + start);\n    }\n  }\n\n  void Fill(size_t seg_offset, size_t size, uint8_t *data) const {\n    CHECK_LE(seg_offset + size, size_);\n    if (data_) {\n      memcpy(data, data_ + seg_offset, size);\n    } else {\n      size_t skip = seg_offset + seed_offset_;\n      MTRandom gen(seed_);\n      MTRandom8 gen8(&gen);\n      while (skip--) {\n\tgen8.Rand8();\n      }\n      for (size_t i = 0; i < size; i++) {\n\tdata[i] = gen8.Rand8();\n      }\n    }\n  }\n\n  string ToString() const {\n    string r;\n    if (data_) {\n      for (size_t i = 0; i < size_; i++) {\n\tchar buf[10];\n\tsprintf(buf, \"%02x \", data_[i]);\n\tr.append(buf);\n      }\n    } else {\n      char buf[256];\n      sprintf(buf, \"size=%ld,seed=%ud,skip=%ld\", size_, seed_, seed_offset_);\n      r.append(buf);\n    }\n    return r;\n  }\n\nprivate:\n  // Used by Subseg()\n  Segment(size_t size, uint32_t seed, size_t seed_offset)\n    : size_(size),\n      seed_(seed),\n      seed_offset_(seed_offset),\n      data_(NULL) {\n    CHECK_GT(size_, 0);\n  }\n\n  size_t size_;  // Size of this segment\n\n  // For random segments\n  uint32_t seed_;  // Seed used for generating byte sequence\n  size_t seed_offset_;  // Seed positions the sequence this many bytes\n                        // before its beginning.\n\n  // For literal segments (data is not owned)\n  uint8_t *data_;\n};\n\ntypedef map<xoff_t, Segment> SegmentMap;\ntypedef typename SegmentMap::const_iterator ConstSegmentMapIterator;\ntypedef typename SegmentMap::iterator SegmentMapIterator;\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/sizes.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\ntemplate <typename T, typename U>\nclass SizeIterator {\n public:\n  SizeIterator(MTRandom *rand, size_t howmany)\n    : rand_(rand),\n      count_(0),\n      fixed_(U::sizes),\n      fixed_size_(SIZEOF_ARRAY(U::sizes)),\n      howmany_(howmany) { }\n\n  T Get() {\n    if (count_ < fixed_size_) {\n      return fixed_[count_];\n    }\n    return rand_->Rand<T>() % U::max_value;\n  }\n\n  bool Done() {\n    return count_ >= fixed_size_ && count_ >= howmany_;\n  }\n\n  void Next() {\n    count_++;\n  }\n\n private:\n  MTRandom *rand_;\n  size_t count_;\n  T* fixed_;\n  size_t fixed_size_;\n  size_t howmany_;\n};\n\n// Small sizes\nclass SmallSizes {\npublic:\n  static size_t sizes[];\n  static size_t max_value;\n};\n\nsize_t SmallSizes::sizes[] = {\n  0, 1, 128 / 4, 3333, \n  128 - (128 / 3),\n  128,\n  128 + (128 / 3),\n  2 * 128 - (128 / 3),\n  2 * 128,\n  2 * 128 + (128 / 3),\n};\n\nsize_t SmallSizes::max_value = 128 * 3;\n\n// Large sizes\nclass LargeSizes {\npublic:\n  static size_t sizes[];\n  static size_t max_value;\n};\n\nsize_t LargeSizes::sizes[] = {\n  1 << 20,\n  1 << 18,\n  1 << 16,\n};\n\nsize_t LargeSizes::max_value = 1<<20;\n\n// Base constants\nstruct BaseConstants {\n  static const size_t TEST_ROUNDS;\n};\n\nconst size_t BaseConstants::TEST_ROUNDS = 10;\n\n// Regtest<> arguments\nstruct SmallBlock : public BaseConstants {\n  static const xoff_t BLOCK_SIZE;\n  static const size_t WINDOW_SIZE;\n  typedef SmallSizes Sizes;\n};\n\nconst xoff_t SmallBlock::BLOCK_SIZE = 1<<7;\nconst size_t SmallBlock::WINDOW_SIZE = 1<<7;\n\nstruct LargeBlock : public BaseConstants {\n  static const xoff_t BLOCK_SIZE;\n  static const size_t WINDOW_SIZE;\n  typedef LargeSizes Sizes;\n};\n\nconst xoff_t LargeBlock::BLOCK_SIZE = (1 << 13);\nconst size_t LargeBlock::WINDOW_SIZE = (1 << 13);\n\nstruct MixedBlock : public BaseConstants {\n  static const xoff_t BLOCK_SIZE;\n  static const size_t WINDOW_SIZE;\n  typedef SmallSizes Sizes;\n};\n\nconst xoff_t MixedBlock::BLOCK_SIZE = 1<<7;\nconst size_t MixedBlock::WINDOW_SIZE = 1<<8;\n\nstruct OversizeBlock : public BaseConstants {\n  static const xoff_t BLOCK_SIZE;\n  static const size_t WINDOW_SIZE;\n  typedef SmallSizes Sizes;\n};\n\nconst xoff_t OversizeBlock::BLOCK_SIZE = 1<<8;\nconst size_t OversizeBlock::WINDOW_SIZE = 1<<7;\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/test.h",
    "content": "/* xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\nextern \"C\" {\n#include \"../xdelta3.h\"\n#include \"../xdelta3-internal.h\"\n}\n\n#include <unistd.h>\n#include <math.h>\n#include <string>\n\n#define CHECK_EQ(x,y) CHECK_OP(x,y,==)\n#define CHECK_NE(x,y) CHECK_OP(x,y,!=)\n#define CHECK_LT(x,y) CHECK_OP(x,y,<)\n#define CHECK_GT(x,y) CHECK_OP(x,y,>)\n#define CHECK_LE(x,y) CHECK_OP(x,y,<=)\n#define CHECK_GE(x,y) CHECK_OP(x,y,>=)\n\n#define CHECK_OP(x,y,OP) \\\n  do { \\\n    __typeof__(x) _x(x); \\\n    __typeof__(x) _y(y); \\\n    if (!(_x OP _y)) { \\\n      cerr << __FILE__ << \":\" << __LINE__ << \" Check failed: \" << #x \" \" #OP \" \" #y << endl; \\\n      cerr << __FILE__ << \":\" << __LINE__ << \" {0} \" << _x << endl; \\\n      cerr << __FILE__ << \":\" << __LINE__ << \" {1} \" << _y << endl; \\\n    abort(); \\\n    } } while (false)\n#undef CHECK\n#define CHECK(x) \\\n  do {if (!(x)) {\t\t\t\t       \\\n  cerr << __FILE__ << \":\" << __LINE__ << \" Check failed: \" << #x << endl; \\\n  abort(); \\\n    } } while (false)\n\n#define DCHECK(x)\n\nusing std::string;\n\n#include <vector>\nusing std::vector;\n\ninline string CommandToString(const vector<const char*> &v) {\n  string s(v[0]);\n  for (size_t i = 1; i < v.size() && v[i] != NULL; i++) {\n    s.append(\" \");\n    s.append(v[i]);\n  }\n  return s;\n}\n\n#include <iostream>\nusing std::cerr;\nusing std::endl;\nusing std::ostream;\n\n#include <map> \nusing std::map;\nusing std::pair;\n\n#include <list>\nusing std::list;\n\ntemplate <typename T, typename U>\npair<T, U> make_pair(const T& t, const U& u) {\n  return pair<T, U>(t, u);\n}\n\nusing std::min;\nusing std::max;\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/xdelta3-regtest.py",
    "content": "#!/usr/bin/python2.7\n# xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n# Copyright 2016 Joshua MacDonald\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# TODO This code is no longer maintained :(\n\nimport os, sys, math, re, time, types, array, random\nimport xdelta3\n\nRCSDIR = '/tmp/rcs'\nSAMPLEDIR = \"/tmp/diff\"\n\n#\nMIN_SIZE       = 0\n\nTIME_TOO_SHORT = 0.050\n\nSKIP_TRIALS    = 2\nMIN_TRIALS     = 3\nMAX_TRIALS     = 15\n\n# 10 = fast 1.5 = slow\nMIN_STDDEV_PCT = 1.5\n\n# How many results per round\nMAX_RESULTS = 500\nTEST_ROUNDS = 10\nKEEP_P = (0.5)\n\n# For RCS testing, what percent to select\nFILE_P = (0.50)\n\n# For run-speed tests\nMIN_RUN = 1000 * 1000 * 1\nMAX_RUN = 1000 * 1000 * 10\n\n# Testwide defaults\nALL_ARGS = [\n    '-q'  # '-vv'\n    ]\n\n# The first 7 args go to -C\nSOFT_CONFIG_CNT = 7\n\nCONFIG_ORDER = [ 'large_look',\n                 'large_step',\n                 'small_look',\n                 'small_chain',\n                 'small_lchain',\n                 'max_lazy',\n                 'long_enough',\n\n                 # > SOFT_CONFIG_CNT\n                 'nocompress',\n                 'winsize',\n                 'srcwinsize',\n                 'sprevsz',\n                 'iopt',\n                 'djw',\n                 'altcode',\n                 ]\n\nCONFIG_ARGMAP = {\n    'winsize'    : '-W',\n    'srcwinsize' : '-B',\n    'sprevsz'    : '-P',\n    'iopt'       : '-I',\n    'nocompress' : '-N',\n    'djw'        : '-Sdjw',\n    'altcode'    : '-T',\n    }\n\ndef INPUT_SPEC(rand):\n    return {\n\n    # Time/space costs:\n\n    # -C 1,2,3,4,5,6,7\n    'large_look' : lambda d: rand.choice([9, 10, 11, 12]),\n    'large_step' : lambda d: rand.choice([25, 26, 27, 28, 29, 30]),\n    'small_look'   : lambda d: rand.choice([4]),\n    'small_chain'  : lambda d: rand.choice([1]),\n    'small_lchain' : lambda d: rand.choice([1]),\n    'max_lazy'     : lambda d: rand.choice([4, 5, 6, 7, 8, 9, 10 ]),\n\n    # Note: long_enough only refers to small matching and has no effect if\n    # small_chain == 1.\n    'long_enough'  : lambda d: rand.choice([4]),\n\n    # -N\n    'nocompress'   : lambda d: rand.choice(['false']),\n\n    # -T\n    'altcode'      : lambda d: rand.choice(['false']),\n\n    # -S djw\n    'djw'          : lambda d: rand.choice(['false']),\n\n    # Memory costs:\n\n    # -W\n    'winsize'      : lambda d: 8 * (1<<20),\n\n    # -B\n    'srcwinsize'   : lambda d: 64 * (1<<20),\n\n    # -I 0 is unlimited\n    'iopt'         : lambda d: 0,\n\n    # -P only powers of two\n    'sprevsz'      : lambda d: rand.choice([x * (1<<16) for x in [4]]),\n  }\n#end\n\n#\nTMPDIR = '/tmp/xd3regtest.%d' % os.getpid()\n\nRUNFILE = os.path.join(TMPDIR, 'run')\nDFILE   = os.path.join(TMPDIR, 'output')\nRFILE   = os.path.join(TMPDIR, 'recon')\nCMPTMP1 = os.path.join(TMPDIR, 'cmptmp1')\nCMPTMP2 = os.path.join(TMPDIR, 'cmptmp2')\n\nHEAD_STATE = 0\nBAR_STATE  = 1\nREV_STATE  = 2\nDATE_STATE = 3\n\n#\nIGNORE_FILENAME  = re.compile('.*\\\\.(gif|jpg).*')\n\n# rcs output\nRE_TOTREV  = re.compile('total revisions: (\\\\d+)')\nRE_BAR     = re.compile('----------------------------')\nRE_REV     = re.compile('revision (.+)')\nRE_DATE    = re.compile('date: ([^;]+);.*')\n# xdelta output\nRE_HDRSZ   = re.compile('VCDIFF header size: +(\\\\d+)')\nRE_EXTCOMP = re.compile('XDELTA ext comp.*')\n\ndef c2str(c):\n    return ' '.join(['%s' % x for x in c])\n#end\n\ndef SumList(l):\n    return reduce(lambda x,y: x+y, l)\n#end\n\n# returns (total, mean, stddev, q2 (median),\n#          (q3-q1)/2 (\"semi-interquartile range\"), max-min (spread))\nclass StatList:\n    def __init__(self,l,desc):\n        cnt = len(l)\n        assert(cnt > 1)\n        l.sort()\n        self.cnt    = cnt\n        self.l      = l\n        self.total  = SumList(l)\n        self.mean   = self.total / float(self.cnt)\n        self.s      = math.sqrt(SumList([(x-self.mean) * \n                                         (x - self.mean) for x in l]) / \n                                float(self.cnt-1))\n        self.q0     = l[0]\n        self.q1     = l[int(self.cnt/4.0+0.5)]\n        self.q2     = l[int(self.cnt/2.0+0.5)]\n        self.q3     = l[min(self.cnt-1,int((3.0*self.cnt)/4.0+0.5))]\n        self.q4     = l[self.cnt-1]\n        self.siqr   = (self.q3-self.q1)/2.0;\n        self.spread = (self.q4-self.q0)\n        if len(l) == 1:\n            self.str = '%s %s' % (desc, l[0])\n        else:\n            self.str = '%s mean %.1f: 25%-ile %d %d %d %d %d' % \\\n                (desc, self.mean, self.q0, self.q1, self.q2, self.q3, self.q4)\n    #end\n#end\n\ndef RunCommand(args, ok = [0]):\n    #print 'run command %s' % (' '.join(args))\n    p = os.spawnvp(os.P_WAIT, args[0], args)\n    if p not in ok:\n        raise CommandError(args, 'exited %d' % p)\n    #end\n#end\n\ndef RunCommandIO(args,infn,outfn):\n    p = os.fork()\n    if p == 0:\n        os.dup2(os.open(infn,os.O_RDONLY),0)\n        os.dup2(os.open(outfn,os.O_CREAT|os.O_TRUNC|os.O_WRONLY),1)\n        os.execvp(args[0], args)\n    else:\n        s = os.waitpid(p,0)\n        o = os.WEXITSTATUS(s[1])\n        if not os.WIFEXITED(s[1]) or o != 0:\n            raise CommandError(args, 'exited %d' % o)\n        #end\n    #end\n#end\n\nclass TimedTest:\n    def __init__(self, target, source, runnable,\n                 skip_trials = SKIP_TRIALS,\n                 min_trials = MIN_TRIALS,\n                 max_trials = MAX_TRIALS,\n                 min_stddev_pct = MIN_STDDEV_PCT):\n        self.target = target\n        self.source = source\n        self.runnable = runnable\n\n        self.skip_trials = skip_trials\n        self.min_trials = min(min_trials, max_trials)\n        self.max_trials = max_trials\n        self.min_stddev_pct = min_stddev_pct\n\n        self.encode_time = self.DoTest(DFILE,\n                                       lambda x: x.Encode(self.target, \n                                                          self.source, DFILE))\n        self.encode_size = runnable.EncodeSize(DFILE)\n\n        self.decode_time = self.DoTest(RFILE,\n                                       lambda x: x.Decode(DFILE, \n                                                          self.source, RFILE),\n                                       )\n        runnable.Verify(self.target, RFILE)\n    #end\n\n    def DoTest(self, fname, func):\n        trials   = 0\n        measured = []\n\n        while 1:\n            try:\n                os.remove(fname)\n            except OSError:\n                pass\n\n            start_time  = time.time()\n            start_clock = time.clock()\n\n            func(self.runnable)\n\n            total_clock = (time.clock() - start_clock)\n            total_time  = (time.time() - start_time)\n\n            elap_time  = max(total_time,  0.0000001)\n            elap_clock = max(total_clock, 0.0000001)\n\n            trials = trials + 1\n\n            # skip some of the first trials\n            if trials > self.skip_trials:\n                measured.append((elap_clock, elap_time))\n                #print 'measurement total: %.1f ms' % (total_time * 1000.0)\n\n            # at least so many\n            if trials < (self.skip_trials + self.min_trials):\n                #print 'continue: need more trials: %d' % trials\n                continue\n\n            # compute %variance\n            done = 0\n            if self.skip_trials + self.min_trials <= 2:\n                measured = measured + measured;\n                done = 1\n            #end\n\n            time_stat = StatList([x[1] for x in measured], 'elap time')\n            sp = float(time_stat.s) / float(time_stat.mean)\n\n            # what if MAX_TRIALS is exceeded?\n            too_many = (trials - self.skip_trials) >= self.max_trials\n            good = (100.0 * sp) < self.min_stddev_pct\n            if done or too_many or good:\n                trials = trials - self.skip_trials\n                if not done and not good:\n                    #print 'too many trials: %d' % trials\n                    pass\n                #clock = StatList([x[0] for x in measured], 'elap clock')\n                return time_stat\n            #end\n        #end\n    #end\n#end\n\ndef Decimals(start, end):\n    l = []\n    step = start\n    while 1:\n        r = range(step, step * 10, step)\n        l = l + r\n        if step * 10 >= end:\n            l.append(step * 10)\n            break\n        step = step * 10\n    return l\n#end\n\n# This tests the raw speed of 0-byte inputs\ndef RunSpeedTest():\n    for L in Decimals(MIN_RUN, MAX_RUN):\n        SetFileSize(RUNFILE, L)\n\n        trx = TimedTest(RUNFILE, None, Xdelta3Runner(['-W', str(1<<20)]))\n        ReportSpeed(L, trx, '1MB ')\n\n        trx = TimedTest(RUNFILE, None, Xdelta3Runner(['-W', str(1<<19)]))\n        ReportSpeed(L, trx, '512k')\n\n        trx = TimedTest(RUNFILE, None, Xdelta3Runner(['-W', str(1<<18)]))\n        ReportSpeed(L, trx, '256k')\n\n        trm = TimedTest(RUNFILE, None, Xdelta3Mod1(RUNFILE))\n        ReportSpeed(L, trm, 'swig')\n\n        trg = TimedTest(RUNFILE, None, GzipRun1())\n        ReportSpeed(L,trg,'gzip')\n    #end\n#end\n\ndef SetFileSize(F,L):\n    fd = os.open(F, os.O_CREAT | os.O_WRONLY)\n    os.ftruncate(fd,L)\n    assert os.fstat(fd).st_size == L\n    os.close(fd)\n#end\n\ndef ReportSpeed(L,tr,desc):\n    print '%s run length %u: size %u: time %.3f ms: decode %.3f ms' % \\\n          (desc, L,\n           tr.encode_size,\n           tr.encode_time.mean * 1000.0,\n           tr.decode_time.mean * 1000.0)\n#end\n\nclass Xdelta3RunClass:\n    def __init__(self, extra):\n        self.extra = extra\n    #end\n\n    def __str__(self):\n        return ' '.join(self.extra)\n    #end\n\n    def New(self):\n        return Xdelta3Runner(self.extra)\n    #end\n#end\n\nclass Xdelta3Runner:\n    # Use \"forkexec\" to get special command-line only features like\n    # external compression support.\n    def __init__(self, extra, forkexec=False):\n        self.forkexec = forkexec\n        self.extra = extra\n    #end\n\n    def Encode(self, target, source, output):\n        args = (ALL_ARGS +\n                self.extra +\n                ['-e'])\n        if source:\n            args.append('-s')\n            args.append(source)\n        #end\n        args = args + [target, output]\n        self.Main(args)\n    #end\n\n    def Decode(self, input, source, output):\n        args = (ALL_ARGS +\n                ['-d'])\n        if source:\n            args.append('-s')\n            args.append(source)\n        #end\n        args = args + [input, output]\n        self.Main(args)\n    #end\n\n    def Verify(self, target, recon):\n        if target[-3:] == \".gz\":\n            RunCommandIO(('gzip', '-dc'), target, CMPTMP1)\n            RunCommandIO(('gzip', '-dc'), recon, CMPTMP2)\n            RunCommand(('cmp', CMPTMP1, CMPTMP2))\n        else:\n            RunCommand(('cmp', target, recon))\n    #end\n\n    def EncodeSize(self, output):\n        return os.stat(output).st_size\n    #end\n\n    def Main(self, args):\n        try:\n            if self.forkexec:\n                RunCommand(['../xdelta3'] + args)\n            else:\n                xdelta3.xd3_main_cmdline(args)\n        except Exception, e:\n            raise CommandError(args, \"xdelta3.main exception: %s\" % e)\n        #end\n    #end\n#end\n\nclass Xdelta3Mod1:\n    def __init__(self, file):\n        self.target_data = open(file, 'r').read()\n    #end\n\n    def Encode(self, ignore1, ignore2, ignore3):\n        r1, encoded = xdelta3.xd3_encode_memory(self.target_data, None, 1000000, 1<<10)\n        if r1 != 0:\n            raise CommandError('memory', 'encode failed: %s' % r1)\n        #end\n        self.encoded = encoded\n    #end\n\n    def Decode(self, ignore1, ignore2, ignore3):\n        r2, data1 = xdelta3.xd3_decode_memory(self.encoded, None, len(self.target_data))\n        if r2 != 0:\n            raise CommandError('memory', 'decode failed: %s' % r1)\n        #end\n        self.decoded = data1\n    #end\n\n    def Verify(self, ignore1, ignore2):\n        if self.target_data != self.decoded:\n            raise CommandError('memory', 'bad decode')\n        #end\n    #end\n\n    def EncodeSize(self, ignore1):\n        return len(self.encoded)\n    #end\n#end\n\nclass GzipRun1:\n    def Encode(self, target, source, output):\n        assert source == None\n        RunCommandIO(['gzip', '-cf'], target, output)\n    #end\n\n    def Decode(self, input, source, output):\n        assert source == None\n        RunCommandIO(['gzip', '-dcf'], input, output)\n    #end\n\n    def Verify(self, target, recon):\n        RunCommand(('cmp', target, recon))\n    #end\n\n    def EncodeSize(self, output):\n        return os.stat(output).st_size\n    #end\n#end\n\nclass Xdelta1RunClass:\n    def __str__(self):\n        return 'xdelta1'\n    #end\n\n    def New(self):\n        return Xdelta1Runner()\n    #end\n#end\n\nclass Xdelta1Runner:\n    def Encode(self, target, source, output):\n        assert source != None\n        args = ['xdelta1', 'delta', '-q', source, target, output]\n        RunCommand(args, [0, 1])\n    #end\n\n    def Decode(self, input, source, output):\n        assert source != None\n        args = ['xdelta1', 'patch', '-q', input, source, output]\n        # Note: for dumb historical reasons, xdelta1 returns 1 or 0\n        RunCommand(args)\n    #end\n\n    def Verify(self, target, recon):\n        RunCommand(('cmp', target, recon))\n    #end\n\n    def EncodeSize(self, output):\n        return os.stat(output).st_size\n    #end\n#end\n\n# exceptions\nclass SkipRcsException:\n    def __init__(self,reason):\n        self.reason = reason\n    #end\n#end\n\nclass NotEnoughVersions:\n    def __init__(self):\n        pass\n    #end\n#end\n\nclass CommandError:\n    def __init__(self,cmd,str):\n        if type(cmd) is types.TupleType or \\\n           type(cmd) is types.ListType:\n            cmd = reduce(lambda x,y: '%s %s' % (x,y),cmd)\n        #end\n        print 'command was: ',cmd\n        print 'command failed: ',str\n        print 'have fun debugging'\n    #end\n#end\n\nclass RcsVersion:\n    def __init__(self,vstr):\n        self.vstr = vstr\n    #end\n    def __cmp__(self,other):\n        return cmp(self.date, other.date)\n    #end\n    def __str__(self):\n        return str(self.vstr)\n    #end\n#end\n\nclass RcsFile:\n\n    def __init__(self, fname):\n        self.fname    = fname\n        self.versions = []\n        self.state    = HEAD_STATE\n    #end\n\n    def SetTotRev(self,s):\n        self.totrev = int(s)\n    #end\n\n    def Rev(self,s):\n        self.rev = RcsVersion(s)\n        if len(self.versions) >= self.totrev:\n            raise SkipRcsException('too many versions (in log messages)')\n        #end\n        self.versions.append(self.rev)\n    #end\n\n    def Date(self,s):\n        self.rev.date = s\n    #end\n\n    def Match(self, line, state, rx, gp, newstate, f):\n        if state == self.state:\n            m = rx.match(line)\n            if m:\n                if f:\n                    f(m.group(gp))\n                #end\n                self.state = newstate\n                return 1\n            #end\n        #end\n        return None\n    #end\n\n    def Sum1Rlog(self):\n        f = os.popen('rlog '+self.fname, \"r\")\n        l = f.readline()\n        while l:\n            if self.Match(l, HEAD_STATE, RE_TOTREV, 1, BAR_STATE, self.SetTotRev):\n                pass\n            elif self.Match(l, BAR_STATE, RE_BAR, 1, REV_STATE, None):\n                pass\n            elif self.Match(l, REV_STATE, RE_REV, 1, DATE_STATE, self.Rev):\n                pass\n            elif self.Match(l, DATE_STATE, RE_DATE, 1, BAR_STATE, self.Date):\n                pass\n            #end\n            l = f.readline()\n        #end\n        c = f.close()\n        if c != None:\n            raise c\n        #end\n    #end\n\n    def Sum1(self):\n        st = os.stat(self.fname)\n        self.rcssize = st.st_size\n        self.Sum1Rlog()\n        if self.totrev != len(self.versions):\n            raise SkipRcsException('wrong version count')\n        #end\n        self.versions.sort()\n    #end\n\n    def Checkout(self,n):\n        v      = self.versions[n]\n        out    = open(self.Verf(n), \"w\")\n        cmd    = 'co -ko -p%s %s' % (v.vstr, self.fname)\n        total  = 0\n        (inf,\n         stream,\n         err)  = os.popen3(cmd, \"r\")\n        inf.close()\n        buf    = stream.read()\n        while buf:\n            total = total + len(buf)\n            out.write(buf)\n            buf = stream.read()\n        #end\n        v.vsize = total\n        estr = ''\n        buf = err.read()\n        while buf:\n            estr = estr + buf\n            buf = err.read()\n        #end\n        if stream.close():\n            raise CommandError(cmd, 'checkout failed: %s\\n%s\\n%s' % (v.vstr, self.fname, estr))\n        #end\n        out.close()\n        err.close()\n    #end\n\n    def Vdate(self,n):\n        return self.versions[n].date\n    #end\n\n    def Vstr(self,n):\n        return self.versions[n].vstr\n    #end\n\n    def Verf(self,n):\n        return os.path.join(TMPDIR, 'input.%d' % n)\n    #end\n\n    def FilePairsByDate(self, runclass):\n        if self.totrev < 2:\n            raise NotEnoughVersions()\n        #end\n        self.Checkout(0)\n        ntrials = []\n        if self.totrev < 2:\n            return vtrials\n        #end\n        for v in range(0,self.totrev-1):\n            if v > 1:\n                os.remove(self.Verf(v-1))\n            #end\n            self.Checkout(v+1)\n            if os.stat(self.Verf(v)).st_size < MIN_SIZE or \\\n               os.stat(self.Verf(v+1)).st_size < MIN_SIZE:\n                continue\n            #end\n\n            result = TimedTest(self.Verf(v+1),\n                               self.Verf(v),\n                               runclass.New())\n\n            target_size = os.stat(self.Verf(v+1)).st_size\n\n            ntrials.append(result)\n        #end\n\n        os.remove(self.Verf(self.totrev-1))\n        os.remove(self.Verf(self.totrev-2))\n        return ntrials\n    #end\n\n    def AppendVersion(self, f, n):\n        self.Checkout(n)\n        rf = open(self.Verf(n), \"r\")\n        data = rf.read()\n        f.write(data)\n        rf.close()\n        return len(data)\n    #end\n\nclass RcsFinder:\n    def __init__(self):\n        self.subdirs  = []\n        self.rcsfiles = []\n        self.others   = []\n        self.skipped  = []\n        self.biground = 0\n    #end\n\n    def Scan1(self,dir):\n        dents = os.listdir(dir)\n        subdirs  = []\n        rcsfiles = []\n        others   = []\n        for dent in dents:\n            full = os.path.join(dir, dent)\n            if os.path.isdir(full):\n                subdirs.append(full)\n            elif dent[len(dent)-2:] == \",v\":\n                rcsfiles.append(RcsFile(full))\n            else:\n                others.append(full)\n            #end\n        #end\n        self.subdirs  = self.subdirs  + subdirs\n        self.rcsfiles = self.rcsfiles + rcsfiles\n        self.others   = self.others   + others\n        return subdirs\n    #end\n\n    def Crawl(self, dir):\n        subdirs = [dir]\n        while subdirs:\n            s1 = self.Scan1(subdirs[0])\n            subdirs = subdirs[1:] + s1\n        #end\n    #end\n\n    def Summarize(self):\n        good = []\n        for rf in self.rcsfiles:\n            try:\n                rf.Sum1()\n                if rf.totrev < 2:\n                    raise SkipRcsException('too few versions (< 2)')\n                #end\n            except SkipRcsException, e:\n                #print 'skipping file %s: %s' % (rf.fname, e.reason)\n                self.skipped.append(rf)\n            else:\n                good.append(rf)\n            #end\n        self.rcsfiles = good\n    #end\n\n    def AllPairsByDate(self, runclass):\n        results = []\n        good = []\n        for rf in self.rcsfiles:\n            try:\n                results = results + rf.FilePairsByDate(runclass)\n            except SkipRcsException:\n                print 'file %s has compressed versions: skipping' % (rf.fname)\n            except NotEnoughVersions:\n                print 'testing %s on %s: not enough versions' % (runclass, rf.fname)\n            else:\n                good.append(rf)\n            #end\n        self.rcsfiles = good\n        self.ReportPairs(runclass, results)\n        return results\n    #end\n\n    def ReportPairs(self, name, results):\n        encode_time = 0\n        decode_time = 0\n        encode_size = 0\n        for r in results:\n            encode_time += r.encode_time.mean\n            decode_time += r.decode_time.mean\n            encode_size += r.encode_size\n        #end\n        print '%s rcs: encode %.2f s: decode %.2f s: size %d' % \\\n              (name, encode_time, decode_time, encode_size)\n    #end\n\n    def MakeBigFiles(self, rand):\n        f1 = open(TMPDIR + \"/big.1\", \"w\")\n        f2 = open(TMPDIR + \"/big.2\", \"w\")\n        population = []\n        for file in self.rcsfiles:\n            if len(file.versions) < 2:\n                continue\n            population.append(file)\n        #end\n        f1sz = 0\n        f2sz = 0\n        fcount = int(len(population) * FILE_P)\n        assert fcount > 0\n        for file in rand.sample(population, fcount):\n            m = IGNORE_FILENAME.match(file.fname)\n            if m != None:\n                continue\n            #end\n            r1, r2 = rand.sample(xrange(0, len(file.versions)), 2)\n            f1sz += file.AppendVersion(f1, r1)\n            f2sz += file.AppendVersion(f2, r2)\n            #m.update('%s,%s,%s ' % (file.fname[len(RCSDIR):], \n            #file.Vstr(r1), file.Vstr(r2)))\n        #end\n        testkey = 'rcs%d' % self.biground\n        self.biground = self.biground + 1\n\n        print '%s; source %u bytes; target %u bytes' % (testkey, f1sz, f2sz)\n        f1.close()\n        f2.close()\n        return (TMPDIR + \"/big.1\",\n                TMPDIR + \"/big.2\",\n                testkey)\n    #end\n\n    def Generator(self):\n        return lambda rand: self.MakeBigFiles(rand)\n    #end\n#end\n\n# find a set of RCS files for testing\ndef GetTestRcsFiles():\n    rcsf = RcsFinder()\n    rcsf.Crawl(RCSDIR)\n    if len(rcsf.rcsfiles) == 0:\n        raise CommandError('', 'no RCS files')\n    #end\n    rcsf.Summarize()\n    print \"rcsfiles: rcsfiles %d; subdirs %d; others %d; skipped %d\" % (\n        len(rcsf.rcsfiles),\n        len(rcsf.subdirs),\n        len(rcsf.others),\n        len(rcsf.skipped))\n    print StatList([x.rcssize for x in rcsf.rcsfiles], \"rcssize\").str\n    print StatList([x.totrev for x in rcsf.rcsfiles], \"totrev\").str\n    return rcsf\n#end\n\nclass SampleDataTest:\n    def __init__(self, dirs):\n        dirs_in = dirs\n        self.pairs = []\n        while dirs:\n            d = dirs[0]\n            dirs = dirs[1:]\n            l = os.listdir(d)\n            files = []\n            for e in l:\n                p = os.path.join(d, e)\n                if os.path.isdir(p):\n                    dirs.append(p)\n                else:\n                    files.append(p)\n                #end\n            #end\n            if len(files) > 1:\n                files.sort()\n                for x in xrange(len(files)):\n                    for y in xrange(len(files)):\n                        self.pairs.append((files[x], files[y],\n                                           '%s-%s' % (files[x], files[y])))\n                    #end\n                #end\n            #end\n        #end\n        print \"Sample data test using %d file pairs in %s\" % (\n            len(self.pairs), dirs_in)\n    #end\n\n    def Generator(self):\n        return lambda rand: rand.choice(self.pairs)\n    #end\n#end\n\n# configs are represented as a list of values,\n# program takes a list of strings:\ndef ConfigToArgs(config):\n    args = [ '-C',\n             ','.join([str(x) for x in config[0:SOFT_CONFIG_CNT]])]\n    for i in range(SOFT_CONFIG_CNT, len(CONFIG_ORDER)):\n        key = CONFIG_ARGMAP[CONFIG_ORDER[i]]\n        val = config[i]\n        if val == 'true' or val == 'false':\n            if val == 'true':\n                args.append('%s' % key)\n            #end\n        else:\n            args.append('%s=%s' % (key, val))\n        #end\n    #end\n    return args\n#end\n\n#\nclass RandomTest:\n    def __init__(self, tnum, tinput, config, syntuple = None):\n        self.mytinput = tinput[2]\n        self.myconfig = config\n        self.tnum = tnum\n\n        if syntuple != None:\n            self.runtime = syntuple[0]\n            self.compsize = syntuple[1]\n            self.decodetime = None\n        else:\n            args = ConfigToArgs(config)\n            result = TimedTest(tinput[1], tinput[0], Xdelta3Runner(args))\n\n            self.runtime = result.encode_time.mean\n            self.compsize = result.encode_size\n            self.decodetime = result.decode_time.mean\n        #end\n\n        self.score = None\n        self.time_pos = None\n        self.size_pos = None\n        self.score_pos = None\n    #end\n\n    def __str__(self):\n        decodestr = ' %s' % self.decodetime\n        return 'time %.6f%s size %d%s << %s >>%s' % (\n            self.time(), ((self.time_pos != None) and \n                          (\" (%s)\" % self.time_pos) or \"\"),\n            self.size(), ((self.size_pos != None) and \n                          (\" (%s)\" % self.size_pos) or \"\"),\n            c2str(self.config()),\n            decodestr)\n    #end\n\n    def time(self):\n        return self.runtime\n    #end\n\n    def size(self):\n        return self.compsize\n    #end\n\n    def config(self):\n        return self.myconfig\n    #end\n\n    def score(self):\n        return self.score\n    #end\n\n    def tinput(self):\n        return self.mytinput\n    #end\n#end\n\ndef PosInAlist(l, e):\n    for i in range(0, len(l)):\n        if l[i][1] == e:\n            return i;\n        #end\n    #end\n    return -1\n#end\n\n# Generates a set of num_results test configurations, given the list of\n# retest-configs.\ndef RandomTestConfigs(rand, input_configs, num_results):\n\n    outputs = input_configs[:]\n    have_set = dict([(c,c) for c in input_configs])\n\n    # Compute a random configuration\n    def RandomConfig():\n        config = []\n        cmap = {}\n        for key in CONFIG_ORDER:\n            val = cmap[key] = (INPUT_SPEC(rand)[key])(cmap)\n            config.append(val)\n        #end\n        return tuple(config)\n    #end\n\n    while len(outputs) < num_results:\n        newc = None\n        for i in xrange(100):\n            c = RandomConfig()\n            if have_set.has_key(c):\n                continue\n            #end\n            have_set[c] = c\n            newc = c\n            break\n        if newc is None:\n            print 'stopped looking for configs at %d' % len(outputs)\n            break\n        #end\n        outputs.append(c)\n    #end\n    outputs.sort()\n    return outputs\n#end\n\ndef RunOptimizationLoop(rand, generator, rounds):\n    configs = []\n    for rnum in xrange(rounds):\n        configs = RandomTestConfigs(rand, configs, MAX_RESULTS)\n        tinput = generator(rand)\n        tests = []\n        for x in xrange(len(configs)):\n            t = RandomTest(x, tinput, configs[x])\n            print 'Round %d test %d: %s' % (rnum, x, t)\n            tests.append(t)\n        #end\n        results = ScoreTests(tests)\n\n        for r in results:\n            c = r.config()\n            if not test_all_config_results.has_key(c):\n                test_all_config_results[c] = [r]\n            else:\n                test_all_config_results[c].append(r)\n            #end\n        #end\n\n        #GraphResults('expt%d' % rnum, results)\n        #GraphSummary('sum%d' % rnum, results)\n\n        # re-test some fraction\n        configs = [r.config() for r in results[0:int(MAX_RESULTS * KEEP_P)]]\n    #end\n#end\n\n# TODO: cleanup\ntest_all_config_results = {}\n\ndef ScoreTests(results):\n    scored = []\n    timed = []\n    sized = []\n\n    t_min = float(min([test.time() for test in results]))\n    #t_max = float(max([test.time() for test in results]))\n    s_min = float(min([test.size() for test in results]))\n    #s_max = float(max([test.size() for test in results]))\n\n    for test in results:\n\n        # Hyperbolic function. Smaller scores still better\n        red = 0.999  # minimum factors for each dimension are 1/1000\n        test.score = ((test.size() - s_min * red) *\n                      (test.time() - t_min * red))\n\n        scored.append((test.score, test))\n        timed.append((test.time(), test))\n        sized.append((test.size(), test))\n    #end\n\n    scored.sort()\n    timed.sort()\n    sized.sort()\n\n    best_by_size = []\n    best_by_time = []\n\n    pos = 0\n    for (score, test) in scored:\n        pos += 1\n        test.score_pos = pos\n    #end\n\n    scored = [x[1] for x in scored]\n\n    for test in scored:\n        test.size_pos = PosInAlist(sized, test)\n        test.time_pos = PosInAlist(timed, test)\n    #end\n\n    for test in scored:\n        c = test.config()\n        s = 0.0\n        print 'H-Score: %0.9f %s' % (test.score, test)\n    #end\n\n    return scored\n#end\n\ndef GraphResults(desc, results):\n    f = open(\"data-%s.csv\" % desc, \"w\")\n    for r in results:\n        f.write(\"%0.9f\\t%d\\t# %s\\n\" % (r.time(), r.size(), r))\n    #end\n    f.close()\n    os.system(\"./plot.sh data-%s.csv plot-%s.jpg\" % (desc, desc))\n#end\n\ndef GraphSummary(desc, results_ignore):\n    test_population = 0\n    config_ordered = []\n\n    # drops duplicate test/config pairs (TODO: don't retest them)\n    for config, cresults in test_all_config_results.items():\n        input_config_map = {}\n        uniq = []\n        for test in cresults:\n            assert test.config() == config\n            test_population += 1\n            key = test.tinput()\n            if not input_config_map.has_key(key):\n                input_config_map[key] = {}\n            #end\n            if input_config_map[key].has_key(config):\n                print 'skipping repeat test %s vs. %s' % (input_config_map[key][config], test)\n                continue\n            #end\n            input_config_map[key][config] = test\n            uniq.append(test)\n        #end\n        config_ordered.append(uniq)\n    #end\n\n    # sort configs descending by number of tests\n    config_ordered.sort(lambda x, y: len(y) - len(x))\n\n    print 'population %d: %d configs %d results' % \\\n          (test_population,\n           len(config_ordered),\n           len(config_ordered[0]))\n\n    if config_ordered[0] == 1:\n        return\n    #end\n\n    # a map from test-key to test-list w/ various configs\n    input_set = {}\n    osize = len(config_ordered)\n\n    for i in xrange(len(config_ordered)):\n        config = config_ordered[i][0].config()\n        config_tests = config_ordered[i]\n\n        #print '%s has %d tested inputs' % (config, len(config_tests))\n\n        if len(input_set) == 0:\n            input_set = dict([(t.tinput(), [t]) for t in config_tests])\n            continue\n        #end\n\n        # a map from test-key to test-list w/ various configs\n        update_set = {}\n        for r in config_tests:\n            t = r.tinput()\n            if input_set.has_key(t):\n                update_set[t] = input_set[t] + [r]\n            else:\n                #print 'config %s does not have test %s' % (config, t)\n                pass\n            #end\n        #end\n\n        if len(update_set) <= 1:\n            break\n        #end\n\n        input_set = update_set\n\n        # continue if there are more w/ the same number of inputs\n        if i < (len(config_ordered) - 1) and \\\n           len(config_ordered[i + 1]) == len(config_tests):\n            continue\n        #end\n\n        # synthesize results for multi-test inputs\n        config_num = None\n\n        # map of config to sum(various test-keys)\n        smap = {}\n        for (key, tests) in input_set.items():\n            if config_num == None:\n                # config_num should be the same in all elements\n                config_num = len(tests)\n                smap = dict([(r.config(),\n                              (r.time(),\n                               r.size()))\n                             for r in tests])\n            else:\n                # compuate the per-config sum of time/size\n                assert config_num == len(tests)\n                smap = dict([(r.config(),\n                              (smap[r.config()][0] + r.time(),\n                               smap[r.config()][1] + r.size()))\n                             for r in tests])\n            #end\n        #end\n\n        if config_num == 1:\n            continue\n        #end\n\n        if len(input_set) == osize:\n            break\n        #end\n\n        summary = '%s-%d' % (desc, len(input_set))\n        osize = len(input_set)\n\n        print 'generate %s w/ %d configs' % (summary, config_num)\n        syn = [RandomTest(0, (None, None, summary), config,\n                          syntuple = (smap[config][0], smap[config][1]))\n               for config in smap.keys()]\n        syn = ScoreTests(syn)\n        #print 'smap is %s' % (smap,)\n        #print 'syn is %s' % (' and '.join([str(x) for x in syn]))\n        #GraphResults(summary, syn)\n    #end\n#end\n\ndef RunRegressionTest(pairs, rounds):\n    for args in [\n        [],\n        ['-S=djw'],\n        ['-B=412907520'],\n        ['-B 412907520', ],\n\n                 ]:\n        print \"Args %s\" % (args)\n        for (file1, file2, testkey) in pairs:\n            ttest = TimedTest(file1, file2, Xdelta3Runner(args, forkexec=True),\n                              skip_trials = 0,\n                              min_trials = 1,\n                              max_trials = 1)\n            print \"Source %s\\nTarget %s\\nEncode %s\\nDecode %s\\nSize %s\\n\\n\" % (\n                file1, file2,\n                ttest.encode_time.str,\n                ttest.decode_time.str,\n                ttest.encode_size)\n    #end\n#end\n\nif __name__ == \"__main__\":\n    try:\n        RunCommand(['rm', '-rf', TMPDIR])\n        os.mkdir(TMPDIR)\n\n        #rcsf = GetTestRcsFiles()\n        #generator = rcsf.Generator()\n\n        sample = SampleDataTest([SAMPLEDIR])\n        generator = sample.Generator()\n\n        rand = random.Random(135135135135135)\n\n        RunRegressionTest(sample.pairs, TEST_ROUNDS)\n\n        #RunSpeedTest()\n\n        # the idea below is to add the default configurations and\n        # xdelta1 to the optimization loop:\n        #x3r = rcsf.AllPairsByDate(Xdelta3RunClass(['-1', '-3', '-6']))\n        #x3r = rcsf.AllPairsByDate(Xdelta3RunClass(['-9']))\n        #x3r = rcsf.AllPairsByDate(Xdelta3RunClass(['-9', '-S', 'djw']))\n        #x3r = rcsf.AllPairsByDate(Xdelta3RunClass(['-1', '-S', 'djw']))\n        #x3r = rcsf.AllPairsByDate(Xdelta3RunClass(['-9', '-T']))\n        #x1r = rcsf.AllPairsByDate(Xdelta1RunClass())\n\n    except CommandError:\n        pass\n    else:\n        RunCommand(['rm', '-rf', TMPDIR])\n        pass\n    #end\n#end\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/testing/xdelta3-test.py",
    "content": "#!/usr/bin/python2.7\n# xdelta3 - delta compression tools and library -*- Mode: C++ -*-\n# Copyright 2016 Joshua MacDonald\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport xdelta3\n\n# the test data section is expected to be len('target')\nsource = 'source source input0 source source'\ntarget = 'source source target source source'\n\n#\n#\n\nprint 'encode: basic ...'\nresult, patch = xdelta3.xd3_encode_memory(target, source, 50)\n\nassert result == 0\nassert len(patch) < len(source)\n\nprint 'encode: adler32 ...'\nresult, patch_adler32 = xdelta3.xd3_encode_memory(target, source, 50,\n                                                  xdelta3.XD3_ADLER32)\n\nassert result == 0\nassert len(patch_adler32) < len(source)\nassert len(patch_adler32) > len(patch)\n\nprint 'encode: secondary ...'\nresult, patch_djw = xdelta3.xd3_encode_memory(target, source, 50,\n                                              xdelta3.XD3_SEC_DJW)\n\nassert result == 0\n# secondary compression doesn't help\nassert len(patch_djw) > len(patch)\n\nprint 'encode: exact ...'\nresult, ignore = xdelta3.xd3_encode_memory(target, source, len(patch))\n\nassert result == 0\nassert len(ignore) < len(source)\n\nprint 'encode: out of space ...'\nresult, ignore = xdelta3.xd3_encode_memory(target, source, len(patch) - 1)\n\nassert result == 28\nassert ignore == None\n\nprint 'encode: zero space ...'\nresult, ignore = xdelta3.xd3_encode_memory(target, source, 0)\n\nassert result == 28\nassert ignore == None\n\nprint 'encode: no source ...'\nresult, zdata = xdelta3.xd3_encode_memory(target, None, 50)\n\nassert result == 0\nassert len(zdata) > len(patch)\n\nprint 'encode: no input ...'\nresult, ignore = xdelta3.xd3_encode_memory(None, None, 50)\n\nassert result != 0\n\nprint 'decode: basic ...'\nresult, target1 = xdelta3.xd3_decode_memory(patch, source, len(target))\n\nassert result == 0\nassert len(target1) == len(target)\nassert target1 == target\n\nprint 'decode: out of space ...'\nresult, ignore = xdelta3.xd3_decode_memory(patch, source, len(target) - 1)\n\nassert result == 28\nassert ignore == None\n\nprint 'decode: zero space ...'\nresult, ignore = xdelta3.xd3_decode_memory(patch, source, 0)\n\nassert result == 28\nassert ignore == None\n\nprint 'decode: single byte error ...'\n# a few expected single-byte errors, e.g., unused address cache bits, see\n# xdelta3-test.h's single-bit error tests\nextra_count = 4\nnoverify_count = 0\nfor corrupt_pos in range(len(patch_adler32)):\n    input = ''.join([j == corrupt_pos and '\\xff' or patch_adler32[j]\n                     for j in range(len(patch_adler32))])\n\n    result, ignore = xdelta3.xd3_decode_memory(input, source, len(target), 0)\n    assert result == -17712\n    assert ignore == None\n\n    # without adler32 verification, the error may be in the data section which\n    # in this case is 6 bytes 'target'\n    result, corrupt = xdelta3.xd3_decode_memory(input, source, len(target),\n                                                xdelta3.XD3_ADLER32_NOVER)\n    if result == 0:\n        noverify_count = noverify_count + 1\n        #print \"got %s\" % corrupt\n    #end\n#end\nassert noverify_count == len('target') + extra_count\n\nprint 'decode: no source ...'\nresult, target2 = xdelta3.xd3_decode_memory(zdata, None, len(target))\n\nassert result == 0\nassert target == target2\n\n# Test compression level setting via flags.  assumes a 9 byte checksum\n# and that level 9 steps 2, level 1 steps 15:\n#         01234567890123456789012345678901\n# level 1 only indexes 2 checksums \"abcdefghi\" and \"ABCDEFGHI\"\n# outputs 43 vs. 23 bytes\nprint 'encode: compression level ...'\n\nsource = '_la_la_abcdefghi_la_la_ABCDEFGHI'\ntarget = 'la_la_ABCDEFGH__la_la_abcdefgh__'\n\nresult1, level1 = xdelta3.xd3_encode_memory(target, source, 50, xdelta3.XD3_COMPLEVEL_1)\nresult9, level9 = xdelta3.xd3_encode_memory(target, source, 50, xdelta3.XD3_COMPLEVEL_9)\n\nassert result1 == 0 and result9 == 0\nassert len(level1) > len(level9)\n\n#\n# Issue 65\nprint 'encode: 65 ...'\nsource = 'Hello World' \ntarget = 'Hello everyone' \nresult, patch = xdelta3.xd3_encode_memory(target, source, len(target))\nassert result != 0\n\nresult, patch = xdelta3.xd3_encode_memory(target, source, 2 * len(target))\nassert result == 0\n\nprint 'PASS'\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-blkcache.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#include \"xdelta3-internal.h\"\n\ntypedef struct _main_blklru      main_blklru;\ntypedef struct _main_blklru_list main_blklru_list;\n\n\n#define XD3_INVALID_OFFSET XOFF_T_MAX\n\nstruct _main_blklru_list\n{\n  main_blklru_list  *next;\n  main_blklru_list  *prev;\n};\n\nstruct _main_blklru\n{\n  uint8_t          *blk;\n  xoff_t            blkno;\n  usize_t           size;\n  main_blklru_list  link;\n};\n\nXD3_MAKELIST(main_blklru_list,main_blklru,link);\n\nstatic usize_t           lru_size = 0;\nstatic main_blklru      *lru = NULL;  /* array of lru_size elts */\nstatic main_blklru_list  lru_list;\nstatic int               do_src_fifo = 0;  /* set to avoid lru */\n\nstatic int lru_hits   = 0;\nstatic int lru_misses = 0;\nstatic int lru_filled = 0;\n\nstatic void main_lru_reset (void)\n{\n  lru_size = 0;\n  lru = NULL;\n  do_src_fifo = 0;\n  lru_hits   = 0;\n  lru_misses = 0;\n  lru_filled = 0;\n}\n\nstatic void main_lru_cleanup (void)\n{\n  if (lru != NULL)\n    {\n      main_buffree (lru[0].blk);\n    }\n\n  main_free (lru);\n  lru = NULL;\n\n  lru_hits = 0;\n  lru_misses = 0;\n  lru_filled = 0;\n}\n\n/* This is called at different times for encoding and decoding.  The\n * encoder calls it immediately, the decoder delays until the\n * application header is received.  */\nstatic int\nmain_set_source (xd3_stream *stream, xd3_cmd cmd,\n\t\t main_file *sfile, xd3_source *source)\n{\n  int ret = 0;\n  usize_t i;\n  xoff_t source_size = 0;\n  usize_t blksize;\n\n  XD3_ASSERT (lru == NULL);\n  XD3_ASSERT (stream->src == NULL);\n  XD3_ASSERT (option_srcwinsz >= XD3_MINSRCWINSZ);\n\n  /* TODO: this code needs refactoring into FIFO, LRU, FAKE.  Yuck!\n   * This is simplified from 3.0z which had issues with sizing the\n   * source buffer memory allocation and the source blocksize. */\n\n  /* LRU-specific */\n  main_blklru_list_init (& lru_list);\n\n  if (allow_fake_source)\n    {\n      /* TODO: refactor\n       * TOOLS/recode-specific: Check \"allow_fake_source\" mode looks\n       * broken now. */\n      sfile->mode = XO_READ;\n      sfile->realname = sfile->filename;\n      sfile->nread = 0;\n    }\n  else\n    {\n      /* Either a regular file (possibly compressed) or a FIFO\n       * (possibly compressed). */\n      if ((ret = main_file_open (sfile, sfile->filename, XO_READ)))\n\t{\n\t  return ret;\n\t}\n\n      /* If the file is regular we know it's size.  If the file turns\n       * out to be externally compressed, size_known may change. */\n      sfile->size_known = (main_file_stat (sfile, &source_size) == 0);\n    }\n\n  /* Note: The API requires a power-of-two blocksize and srcwinsz\n   * (-B).  The logic here will use a single block if the entire file\n   * is known to fit into srcwinsz. */\n  option_srcwinsz = xd3_xoff_roundup (option_srcwinsz);\n\n  /* Though called \"lru\", it is not LRU-specific.  We always allocate\n   * a maximum number of source block buffers.  If the entire file\n   * fits into srcwinsz, this buffer will stay as the only\n   * (lru_size==1) source block.  Otherwise, we know that at least\n   * option_srcwinsz bytes are available.  Split the source window\n   * into buffers. */\n  if ((lru = (main_blklru*) main_malloc (MAX_LRU_SIZE *\n\t\t\t\t\t sizeof (main_blklru))) == NULL)\n    {\n      ret = ENOMEM;\n      return ret;\n    }\n\n  memset (lru, 0, sizeof(lru[0]) * MAX_LRU_SIZE);\n\n  /* Allocate the entire buffer. */\n  if ((lru[0].blk = (uint8_t*) main_bufalloc (option_srcwinsz)) == NULL)\n    {\n      ret = ENOMEM;\n      return ret;\n    }\n\n  /* Main calls main_getblk_func() once before xd3_set_source().  This\n   * is the point at which external decompression may begin.  Set the\n   * system for a single block. */\n  lru_size = 1;\n  lru[0].blkno = XD3_INVALID_OFFSET;\n  blksize = option_srcwinsz;\n  main_blklru_list_push_back (& lru_list, & lru[0]);\n  XD3_ASSERT (blksize != 0);\n\n  /* Initialize xd3_source. */\n  source->blksize  = blksize;\n  source->name     = sfile->filename;\n  source->ioh      = sfile;\n  source->curblkno = XD3_INVALID_OFFSET;\n  source->curblk   = NULL;\n  source->max_winsize = option_srcwinsz;\n\n  if ((ret = main_getblk_func (stream, source, 0)) != 0)\n    {\n      XPR(NT \"error reading source: %s: %s\\n\",\n\t  sfile->filename,\n\t  xd3_mainerror (ret));\n      return ret;\n    }\n\n  source->onblk = lru[0].size;  /* xd3 sets onblk */\n\n  /* If the file is smaller than a block, size is known. */\n  if (!sfile->size_known && source->onblk < blksize)\n    {\n      source_size = source->onblk;\n      source->onlastblk = source_size;\n      sfile->size_known = 1;\n    }\n\n  /* If the size is not known or is greater than the buffer size, we\n   * split the buffer across MAX_LRU_SIZE blocks (already allocated in\n   * \"lru\"). */\n  if (!sfile->size_known || source_size > option_srcwinsz)\n    {\n      /* Modify block 0, change blocksize. */\n      blksize = option_srcwinsz / MAX_LRU_SIZE;\n      source->blksize = blksize;\n      source->onblk = blksize;\n      source->onlastblk = blksize;\n      source->max_blkno = MAX_LRU_SIZE - 1;\n\n      lru[0].size = blksize;\n      lru_size = MAX_LRU_SIZE;\n\n      /* Setup rest of blocks. */\n      for (i = 1; i < lru_size; i += 1)\n\t{\n\t  lru[i].blk = lru[0].blk + (blksize * i);\n\t  lru[i].blkno = i;\n\t  lru[i].size = blksize;\n\t  main_blklru_list_push_back (& lru_list, & lru[i]);\n\t}\n    }\n\n  if (! sfile->size_known)\n    {\n      /* If the size is not know, we must use FIFO discipline. */\n      do_src_fifo = 1;\n    }\n\n  /* Call the appropriate set_source method, handle errors, print\n   * verbose message, etc. */\n  if (sfile->size_known)\n    {\n      ret = xd3_set_source_and_size (stream, source, source_size);\n    }\n  else\n    {\n      ret = xd3_set_source (stream, source);\n    }\n\n  if (ret)\n    {\n      XPR(NT XD3_LIB_ERRMSG (stream, ret));\n      return ret;\n    }\n\n  XD3_ASSERT (stream->src == source);\n  XD3_ASSERT (source->blksize == blksize);\n\n  if (option_verbose)\n    {\n      static shortbuf srcszbuf;\n      static shortbuf srccntbuf;\n      static shortbuf winszbuf;\n      static shortbuf blkszbuf;\n      static shortbuf nbufs;\n\n      if (sfile->size_known)\n\t{\n\t  short_sprintf (srcszbuf, \"source size %s [%\"Q\"u]\",\n\t\t\t main_format_bcnt (source_size, &srccntbuf),\n\t\t\t source_size);\n\t}\n      else\n\t{\n\t  short_sprintf (srcszbuf, \"%s\", \"source size unknown\");\n\t}\n\n      nbufs.buf[0] = 0;\n\n      if (option_verbose > 1)\n\t{\n\t  short_sprintf (nbufs, \" #bufs %\"W\"u\", lru_size);\n\t}\n\n      XPR(NT \"source %s %s blksize %s window %s%s%s\\n\",\n\t  sfile->filename,\n\t  srcszbuf.buf,\n\t  main_format_bcnt (blksize, &blkszbuf),\n\t  main_format_bcnt (option_srcwinsz, &winszbuf),\n\t  nbufs.buf,\n\t  do_src_fifo ? \" (FIFO)\" : \"\");\n    }\n\n  return 0;\n}\n\nstatic int\nmain_getblk_lru (xd3_source *source, xoff_t blkno,\n\t\t main_blklru** blrup, int *is_new)\n{\n  main_blklru *blru = NULL;\n  usize_t i;\n\n  (*is_new) = 0;\n\n  if (do_src_fifo)\n    {\n      /* Direct lookup assumes sequential scan w/o skipping blocks. */\n      int idx = blkno % lru_size;\n      blru = & lru[idx];\n      if (blru->blkno == blkno)\n\t{\n\t  (*blrup) = blru;\n\t  return 0;\n\t}\n      /* No going backwards in a sequential scan. */\n      if (blru->blkno != XD3_INVALID_OFFSET && blru->blkno > blkno)\n\t{\n\t  return XD3_TOOFARBACK;\n\t}\n    }\n  else\n    {\n      /* Sequential search through LRU. */\n      for (i = 0; i < lru_size; i += 1)\n\t{\n\t  blru = & lru[i];\n\t  if (blru->blkno == blkno)\n\t    {\n\t      main_blklru_list_remove (blru);\n\t      main_blklru_list_push_back (& lru_list, blru);\n\t      (*blrup) = blru;\n\t      IF_DEBUG1 (DP(RINT \"[getblk_lru] HIT blkno = %\"Q\"u lru_size=%\"W\"u\\n\",\n\t\t    blkno, lru_size));\n\t      return 0;\n\t    }\n\t}\n      IF_DEBUG1 (DP(RINT \"[getblk_lru] MISS blkno = %\"Q\"u lru_size=%\"W\"u\\n\",\n\t\t    blkno, lru_size));\n    }\n\n  if (do_src_fifo)\n    {\n      int idx = blkno % lru_size;\n      blru = & lru[idx];\n    }\n  else\n    {\n      XD3_ASSERT (! main_blklru_list_empty (& lru_list));\n      blru = main_blklru_list_pop_front (& lru_list);\n      main_blklru_list_push_back (& lru_list, blru);\n    }\n\n  lru_filled += 1;\n  (*is_new) = 1;\n  (*blrup) = blru;\n  blru->blkno = XD3_INVALID_OFFSET;\n  return 0;\n}\n\nstatic int\nmain_read_seek_source (xd3_stream *stream,\n\t\t       xd3_source *source,\n\t\t       xoff_t      blkno) {\n  xoff_t pos = blkno * source->blksize;\n  main_file *sfile = (main_file*) source->ioh;\n  main_blklru *blru;\n  int is_new;\n  size_t nread = 0;\n  int ret = 0;\n\n  if (!sfile->seek_failed)\n    {\n      ret = main_file_seek (sfile, pos);\n\n      if (ret == 0)\n\t{\n\t  sfile->source_position = pos;\n\t}\n    }\n\n  if (sfile->seek_failed || ret != 0)\n    {\n      /* For an unseekable file (or other seek error, does it\n       * matter?) */\n      if (sfile->source_position > pos)\n\t{\n\t  /* Could assert !IS_ENCODE(), this shouldn't happen\n\t   * because of do_src_fifo during encode. */\n\t  if (!option_quiet)\n\t    {\n\t      XPR(NT \"source can't seek backwards; requested block offset \"\n\t\t  \"%\"Q\"u source position is %\"Q\"u\\n\",\n\t\t  pos, sfile->source_position);\n\t    }\n\n\t  sfile->seek_failed = 1;\n\t  stream->msg = \"non-seekable source: \"\n\t    \"copy is too far back (try raising -B)\";\n\t  return XD3_TOOFARBACK;\n\t}\n\n      /* There's a chance here, that an genuine lseek error will cause\n       * xdelta3 to shift into non-seekable mode, entering a degraded\n       * condition.  */\n      if (!sfile->seek_failed && option_verbose)\n\t{\n\t  XPR(NT \"source can't seek, will use FIFO for %s\\n\",\n\t      sfile->filename);\n\n\t  if (option_verbose > 1)\n\t    {\n\t      XPR(NT \"seek error at offset %\"Q\"u: %s\\n\",\n\t\t  pos, xd3_mainerror (ret));\n\t    }\n\t}\n\n      sfile->seek_failed = 1;\n\n      if (option_verbose > 1 && pos != sfile->source_position)\n\t{\n\t  XPR(NT \"non-seekable source skipping %\"Q\"u bytes @ %\"Q\"u\\n\",\n\t      pos - sfile->source_position,\n\t      sfile->source_position);\n\t}\n\n      while (sfile->source_position < pos)\n\t{\n\t  xoff_t skip_blkno;\n\t  usize_t skip_offset;\n\n\t  xd3_blksize_div (sfile->source_position, source,\n\t\t\t   &skip_blkno, &skip_offset);\n\n\t  /* Read past unused data */\n\t  XD3_ASSERT (pos - sfile->source_position >= source->blksize);\n\t  XD3_ASSERT (skip_offset == 0);\n\n\t  if ((ret = main_getblk_lru (source, skip_blkno,\n\t\t\t\t      & blru, & is_new)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  XD3_ASSERT (is_new);\n\t  blru->blkno = skip_blkno;\n\n\t  if ((ret = main_read_primary_input (sfile,\n\t\t\t\t\t      (uint8_t*) blru->blk,\n\t\t\t\t\t      source->blksize,\n\t\t\t\t\t      & nread)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  if (nread != source->blksize)\n\t    {\n\t      IF_DEBUG1 (DP(RINT \"[getblk] short skip block nread = %\"Z\"u\\n\",\n\t\t\t    nread));\n\t      stream->msg = \"non-seekable input is short\";\n\t      return XD3_INVALID_INPUT;\n\t    }\n\n\t  sfile->source_position += nread;\n\t  blru->size = nread;\n\n\t  IF_DEBUG1 (DP(RINT \"[getblk] skip blkno %\"Q\"u size %\"W\"u\\n\",\n\t\t\tskip_blkno, blru->size));\n\n\t  XD3_ASSERT (sfile->source_position <= pos);\n\t}\n    }\n\n  return 0;\n}\n\n/* This is the callback for reading a block of source.  This function\n * is blocking and it implements a small LRU.\n *\n * Note that it is possible for main_input() to handle getblk requests\n * in a non-blocking manner.  If the callback is NULL then the caller\n * of xd3_*_input() must handle the XD3_GETSRCBLK return value and\n * fill the source in the same way.  See xd3_getblk for details.  To\n * see an example of non-blocking getblk, see xdelta-test.h. */\nstatic int\nmain_getblk_func (xd3_stream *stream,\n\t\t  xd3_source *source,\n\t\t  xoff_t      blkno)\n{\n  int ret = 0;\n  xoff_t pos = blkno * source->blksize;\n  main_file *sfile = (main_file*) source->ioh;\n  main_blklru *blru;\n  int is_new;\n  size_t nread = 0;\n\n  if (allow_fake_source)\n    {\n      source->curblkno = blkno;\n      source->onblk    = 0;\n      source->curblk   = lru[0].blk;\n      lru[0].size = 0;\n      return 0;\n    }\n\n  if ((ret = main_getblk_lru (source, blkno, & blru, & is_new)))\n    {\n      return ret;\n    }\n\n  if (!is_new)\n    {\n      source->curblkno = blkno;\n      source->onblk    = blru->size;\n      source->curblk   = blru->blk;\n      lru_hits++;\n      return 0;\n    }\n\n  lru_misses += 1;\n\n  if (pos != sfile->source_position)\n    {\n      /* Only try to seek when the position is wrong.  This means the\n       * decoder will fail when the source buffer is too small, but\n       * only when the input is non-seekable. */\n      if ((ret = main_read_seek_source (stream, source, blkno)))\n\t{\n\t  return ret;\n\t}\n    }\n\n  XD3_ASSERT (sfile->source_position == pos);\n\n  if ((ret = main_read_primary_input (sfile,\n\t\t\t\t      (uint8_t*) blru->blk,\n\t\t\t\t      source->blksize,\n\t\t\t\t      & nread)))\n    {\n      return ret;\n    }\n\n  /* Save the last block read, used to handle non-seekable files. */\n  sfile->source_position = pos + nread;\n\n  if (option_verbose > 3)\n    {\n      if (blru->blkno != XD3_INVALID_OFFSET)\n\t{\n\t  if (blru->blkno != blkno)\n\t    {\n\t      XPR(NT \"source block %\"Q\"u read %\"Z\"u ejects %\"Q\"u (lru_hits=%u, \"\n\t\t  \"lru_misses=%u, lru_filled=%u)\\n\",\n\t\t  blkno, nread, blru->blkno, lru_hits, lru_misses, lru_filled);\n\t    }\n\t  else\n\t    {\n\t      XPR(NT \"source block %\"Q\"u read %\"Z\"u (lru_hits=%u, \"\n\t\t  \"lru_misses=%u, lru_filled=%u)\\n\",\n\t\t  blkno, nread, lru_hits, lru_misses, lru_filled);\n\t    }\n\t}\n      else\n\t{\n\t  XPR(NT \"source block %\"Q\"u read %\"Z\"u (lru_hits=%u, lru_misses=%u, \"\n\t      \"lru_filled=%u)\\n\", blkno, nread, \n\t      lru_hits, lru_misses, lru_filled);\n\t}\n    }\n\n  source->curblk   = blru->blk;\n  source->curblkno = blkno;\n  source->onblk    = nread;\n  blru->size       = nread;\n  blru->blkno      = blkno;\n\n  IF_DEBUG1 (DP(RINT \"[main_getblk] blkno %\"Q\"u onblk %\"Z\"u pos %\"Q\"u \"\n\t\t\"srcpos %\"Q\"u\\n\",\n\t\tblkno, nread, pos, sfile->source_position));\n\n  return 0;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-cfgs.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n/******************************************************************\n SOFT string matcher\n ******************************************************************/\n\n#if XD3_BUILD_SOFT\n\n#define TEMPLATE      soft\n#define LLOOK         stream->smatcher.large_look\n#define LSTEP         stream->smatcher.large_step\n#define SLOOK         stream->smatcher.small_look\n#define SCHAIN        stream->smatcher.small_chain\n#define SLCHAIN       stream->smatcher.small_lchain\n#define MAXLAZY       stream->smatcher.max_lazy\n#define LONGENOUGH    stream->smatcher.long_enough\n\n#define SOFTCFG 1\n#include \"xdelta3.c\"\n#undef  SOFTCFG\n\n#undef  TEMPLATE\n#undef  LLOOK\n#undef  SLOOK\n#undef  LSTEP\n#undef  SCHAIN\n#undef  SLCHAIN\n#undef  MAXLAZY\n#undef  LONGENOUGH\n#endif\n\n#define SOFTCFG 0\n\n/************************************************************\n FASTEST string matcher\n **********************************************************/\n#if XD3_BUILD_FASTEST\n#define TEMPLATE      fastest\n#define LLOOK         9\n#define LSTEP         26\n#define SLOOK         4U\n#define SCHAIN        1\n#define SLCHAIN       1\n#define MAXLAZY       6\n#define LONGENOUGH    6\n\n#include \"xdelta3.c\"\n\n#undef  TEMPLATE\n#undef  LLOOK\n#undef  SLOOK\n#undef  LSTEP\n#undef  SCHAIN\n#undef  SLCHAIN\n#undef  MAXLAZY\n#undef  LONGENOUGH\n#endif\n\n/************************************************************\n FASTER string matcher\n **********************************************************/\n#if XD3_BUILD_FASTER\n#define TEMPLATE      faster\n#define LLOOK         9\n#define LSTEP         15\n#define SLOOK         4U\n#define SCHAIN        1\n#define SLCHAIN       1\n#define MAXLAZY       18\n#define LONGENOUGH    18\n\n#include \"xdelta3.c\"\n\n#undef  TEMPLATE\n#undef  LLOOK\n#undef  SLOOK\n#undef  LSTEP\n#undef  SCHAIN\n#undef  SLCHAIN\n#undef  MAXLAZY\n#undef  LONGENOUGH\n#endif\n\n/******************************************************\n FAST string matcher\n ********************************************************/\n#if XD3_BUILD_FAST\n#define TEMPLATE      fast\n#define LLOOK         9\n#define LSTEP         8\n#define SLOOK         4U\n#define SCHAIN        4\n#define SLCHAIN       1\n#define MAXLAZY       18\n#define LONGENOUGH    35\n\n#include \"xdelta3.c\"\n\n#undef  TEMPLATE\n#undef  LLOOK\n#undef  SLOOK\n#undef  LSTEP\n#undef  SCHAIN\n#undef  SLCHAIN\n#undef  MAXLAZY\n#undef  LONGENOUGH\n#endif\n\n/**************************************************\n SLOW string matcher\n **************************************************************/\n#if XD3_BUILD_SLOW\n#define TEMPLATE      slow\n#define LLOOK         9\n#define LSTEP         2\n#define SLOOK         4U\n#define SCHAIN        44\n#define SLCHAIN       13\n#define MAXLAZY       90\n#define LONGENOUGH    70\n\n#include \"xdelta3.c\"\n\n#undef  TEMPLATE\n#undef  LLOOK\n#undef  SLOOK\n#undef  LSTEP\n#undef  SCHAIN\n#undef  SLCHAIN\n#undef  MAXLAZY\n#undef  LONGENOUGH\n#endif\n\n/********************************************************\n DEFAULT string matcher\n ************************************************************/\n#if XD3_BUILD_DEFAULT\n#define TEMPLATE      default\n#define LLOOK         9\n#define LSTEP         3\n#define SLOOK         4U\n#define SCHAIN        8\n#define SLCHAIN       2\n#define MAXLAZY       36\n#define LONGENOUGH    70\n\n#include \"xdelta3.c\"\n\n#undef  TEMPLATE\n#undef  LLOOK\n#undef  SLOOK\n#undef  LSTEP\n#undef  SCHAIN\n#undef  SLCHAIN\n#undef  MAXLAZY\n#undef  LONGENOUGH\n#endif\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-decode.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#ifndef _XDELTA3_DECODE_H_\n#define _XDELTA3_DECODE_H_\n\n#include \"xdelta3-internal.h\"\n\n#define SRCORTGT(x) ((((x) & VCD_SRCORTGT) == VCD_SOURCE) ? \\\n                     VCD_SOURCE : ((((x) & VCD_SRCORTGT) == \\\n                                    VCD_TARGET) ? VCD_TARGET : 0))\n\nstatic inline int\nxd3_decode_byte (xd3_stream *stream, usize_t *val)\n{\n  if (stream->avail_in == 0)\n    {\n      stream->msg = \"further input required\";\n      return XD3_INPUT;\n    }\n\n  (*val) = stream->next_in[0];\n\n  DECODE_INPUT (1);\n  return 0;\n}\n\nstatic inline int\nxd3_decode_bytes (xd3_stream *stream, uint8_t *buf, usize_t *pos, usize_t size)\n{\n  usize_t want;\n  usize_t take;\n\n  /* Note: The case where (*pos == size) happens when a zero-length\n   * appheader or code table is transmitted, but there is nothing in\n   * the standard against that. */\n  while (*pos < size)\n    {\n      if (stream->avail_in == 0)\n\t{\n\t  stream->msg = \"further input required\";\n\t  return XD3_INPUT;\n\t}\n\n      want = size - *pos;\n      take = xd3_min (want, stream->avail_in);\n\n      memcpy (buf + *pos, stream->next_in, (size_t) take);\n\n      DECODE_INPUT (take);\n      (*pos) += take;\n    }\n\n  return 0;\n}\n\n/* Initialize the decoder for a new window.  The dec_tgtlen value is\n * preserved across successive window decodings, and the update to\n * dec_winstart is delayed until a new window actually starts.  This\n * is to avoid throwing an error due to overflow until the last\n * possible moment.  This makes it possible to encode exactly 4GB\n * through a 32-bit encoder. */\nstatic int\nxd3_decode_init_window (xd3_stream *stream)\n{\n  stream->dec_cpylen = 0;\n  stream->dec_cpyoff = 0;\n  stream->dec_cksumbytes = 0;\n\n  xd3_init_cache (& stream->acache);\n\n  return 0;\n}\n\n/* Allocates buffer space for the target window and possibly the\n * VCD_TARGET copy-window.  Also sets the base of the two copy\n * segments. */\nstatic int\nxd3_decode_setup_buffers (xd3_stream *stream)\n{\n  /* If VCD_TARGET is set then the previous buffer may be reused. */\n  if (stream->dec_win_ind & VCD_TARGET)\n    {\n      /* Note: this implementation is untested, since Xdelta3 itself\n       * does not implement an encoder for VCD_TARGET mode. Thus, mark\n       * unimplemented until needed. */\n      if (1)\n\t{\n\t  stream->msg = \"VCD_TARGET not implemented\";\n\t  return XD3_UNIMPLEMENTED;\n\t}\n\n      /* But this implementation only supports copying from the last\n       * target window.  If the offset is outside that range, it can't\n       * be done. */\n      if (stream->dec_cpyoff < stream->dec_laststart)\n\t{\n\t  stream->msg = \"unsupported VCD_TARGET offset\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      /* See if the two windows are the same.  This indicates the\n       * first time VCD_TARGET is used.  This causes a second buffer\n       * to be allocated, after that the two are swapped in the\n       * DEC_FINISH case. */\n      if (stream->dec_lastwin == stream->next_out)\n\t{\n\t  stream->next_out  = NULL;\n\t  stream->space_out = 0;\n\t}\n\n      /* TODO: (See note above, this looks incorrect) */\n      stream->dec_cpyaddrbase = stream->dec_lastwin +\n\t(usize_t) (stream->dec_cpyoff - stream->dec_laststart);\n    }\n\n  /* See if the current output window is large enough. */\n  if (stream->space_out < stream->dec_tgtlen)\n    {\n      xd3_free (stream, stream->dec_buffer);\n\n      stream->space_out =\n\txd3_round_blksize (stream->dec_tgtlen, XD3_ALLOCSIZE);\n\n      if ((stream->dec_buffer =\n\t   (uint8_t*) xd3_alloc (stream, stream->space_out, 1)) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n\n      stream->next_out = stream->dec_buffer;\n    }\n\n  /* dec_tgtaddrbase refers to an invalid base address, but it is\n   * always used with a sufficiently large instruction offset (i.e.,\n   * beyond the copy window).  This condition is enforced by\n   * xd3_decode_output_halfinst. */\n  stream->dec_tgtaddrbase = stream->next_out - stream->dec_cpylen;\n\n  return 0;\n}\n\nstatic int\nxd3_decode_allocate (xd3_stream  *stream,\n\t\t     usize_t       size,\n\t\t     uint8_t    **buf_ptr,\n\t\t     usize_t      *buf_alloc)\n{\n  IF_DEBUG2 (DP(RINT \"[xd3_decode_allocate] size %\"W\"u alloc %\"W\"u\\n\",\n\t\tsize, *buf_alloc));\n  \n  if (*buf_ptr != NULL && *buf_alloc < size)\n    {\n      xd3_free (stream, *buf_ptr);\n      *buf_ptr = NULL;\n    }\n\n  if (*buf_ptr == NULL)\n    {\n      *buf_alloc = xd3_round_blksize (size, XD3_ALLOCSIZE);\n\n      if ((*buf_ptr = (uint8_t*) xd3_alloc (stream, *buf_alloc, 1)) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n    }\n\n  return 0;\n}\n\nstatic int\nxd3_decode_section (xd3_stream *stream,\n\t\t    xd3_desect *section,\n\t\t    xd3_decode_state nstate,\n\t\t    int copy)\n{\n  XD3_ASSERT (section->pos <= section->size);\n  XD3_ASSERT (stream->dec_state != nstate);\n\n  if (section->pos < section->size)\n    {\n      usize_t sect_take;\n\n      if (stream->avail_in == 0)\n\t{\n\t  return XD3_INPUT;\n\t}\n\n      if ((copy == 0) && (section->pos == 0))\n\t{\n\t  /* No allocation/copy needed */\n\t  section->buf = stream->next_in;\n\t  sect_take    = section->size;\n\t  IF_DEBUG1 (DP(RINT \"[xd3_decode_section] zerocopy %\"W\"u @ %\"W\"u avail %\"W\"u\\n\",\n\t\t\tsect_take, section->pos, stream->avail_in));\n\t}\n      else\n\t{\n\t  usize_t sect_need = section->size - section->pos;\n\n\t  /* Allocate and copy */\n\t  sect_take = xd3_min (sect_need, stream->avail_in);\n\n\t  if (section->pos == 0)\n\t    {\n\t      int ret;\n\n\t      if ((ret = xd3_decode_allocate (stream,\n\t\t\t\t\t      section->size,\n\t\t\t\t\t      & section->copied1,\n\t\t\t\t\t      & section->alloc1)))\n\t\t{\n\t\t  return ret;\n\t\t}\n\n\t      section->buf = section->copied1;\n\t    }\n\n\t  IF_DEBUG2 (DP(RINT \"[xd3_decode_section] take %\"W\"u @ %\"W\"u [need %\"W\"u] avail %\"W\"u\\n\",\n\t\t\tsect_take, section->pos, sect_need, stream->avail_in));\n\t  XD3_ASSERT (section->pos + sect_take <= section->alloc1);\n\n\t  memcpy (section->copied1 + section->pos,\n\t\t  stream->next_in,\n\t\t  sect_take);\n\t}\n\n      section->pos += sect_take;\n\n      stream->dec_winbytes += sect_take;\n\n      DECODE_INPUT (sect_take);\n    }\n\n  if (section->pos < section->size)\n    {\n      IF_DEBUG1 (DP(RINT \"[xd3_decode_section] further input required %\"W\"u\\n\",\n\t\t    section->size - section->pos));\n      stream->msg = \"further input required\";\n      return XD3_INPUT;\n    }\n\n  XD3_ASSERT (section->pos == section->size);\n\n  stream->dec_state = nstate;\n  section->buf_max  = section->buf + section->size;\n  section->pos      = 0;\n  return 0;\n}\n\n/* Decode the size and address for half of an instruction (i.e., a\n * single opcode).  This updates the stream->dec_position, which are\n * bytes already output prior to processing this instruction.  Perform\n * bounds checking for sizes and copy addresses, which uses the\n * dec_position (which is why these checks are done here). */\nstatic int\nxd3_decode_parse_halfinst (xd3_stream *stream, xd3_hinst *inst)\n{\n  int ret;\n\n  /* If the size from the instruction table is zero then read a size value. */\n  if ((inst->size == 0) &&\n      (ret = xd3_read_size (stream,\n \t\t\t    & stream->inst_sect.buf,\n\t\t\t      stream->inst_sect.buf_max,\n\t\t\t    & inst->size)))\n    {\n      return XD3_INVALID_INPUT;\n    }\n\n  /* For copy instructions, read address. */\n  if (inst->type >= XD3_CPY)\n    {\n      IF_DEBUG2 ({\n\tstatic int cnt = 0;\n\tXPR(NT \"DECODE:%u: COPY at %\"Q\"u (winoffset %\"W\"u) \"\n\t    \"size %\"W\"u winaddr %\"W\"u\\n\",\n\t    cnt++,\n\t    stream->total_out + (stream->dec_position -\n\t\t\t\t stream->dec_cpylen),\n\t    (stream->dec_position - stream->dec_cpylen),\n\t    inst->size,\n\t    inst->addr);\n      });\n\n      if ((ret = xd3_decode_address (stream,\n\t\t\t\t     stream->dec_position,\n\t\t\t\t     inst->type - XD3_CPY,\n\t\t\t\t     & stream->addr_sect.buf,\n\t\t\t\t     stream->addr_sect.buf_max,\n\t\t\t\t     & inst->addr)))\n\t{\n\t  return ret;\n\t}\n\n      /* Cannot copy an address before it is filled-in. */\n      if (inst->addr >= stream->dec_position)\n\t{\n\t  stream->msg = \"address too large\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      /* Check: a VCD_TARGET or VCD_SOURCE copy cannot exceed the remaining\n       * buffer space in its own segment. */\n      if (inst->addr < stream->dec_cpylen &&\n\t  inst->addr + inst->size > stream->dec_cpylen)\n\t{\n\t  stream->msg = \"size too large\";\n\t  return XD3_INVALID_INPUT;\n\t}\n    }\n  else\n    {\n      IF_DEBUG2 ({\n\tif (inst->type == XD3_ADD)\n\t  {\n\t    static int cnt;\n\t    XPR(NT \"DECODE:%d: ADD at %\"Q\"u (winoffset %\"W\"u) size %\"W\"u\\n\",\n\t       cnt++,\n\t       (stream->total_out + stream->dec_position - stream->dec_cpylen),\n\t       stream->dec_position - stream->dec_cpylen,\n\t       inst->size);\n\t  }\n\telse\n\t  {\n\t    static int cnt;\n\t    XD3_ASSERT (inst->type == XD3_RUN);\n\t    XPR(NT \"DECODE:%d: RUN at %\"Q\"u (winoffset %\"W\"u) size %\"W\"u\\n\",\n\t       cnt++,\n\t       stream->total_out + stream->dec_position - stream->dec_cpylen,\n\t       stream->dec_position - stream->dec_cpylen,\n\t       inst->size);\n\t  }\n      });\n    }\n\n  /* Check: The instruction will not overflow the output buffer. */\n  if (stream->dec_position + inst->size > stream->dec_maxpos)\n    {\n      stream->msg = \"size too large\";\n      return XD3_INVALID_INPUT;\n    }\n\n  stream->dec_position += inst->size;\n  return 0;\n}\n\n/* Decode a single opcode and then decode the two half-instructions. */\nstatic int\nxd3_decode_instruction (xd3_stream *stream)\n{\n  int ret;\n  const xd3_dinst *inst;\n\n  if (stream->inst_sect.buf == stream->inst_sect.buf_max)\n    {\n      stream->msg = \"instruction underflow\";\n      return XD3_INVALID_INPUT;\n    }\n\n  inst = &stream->code_table[*stream->inst_sect.buf++];\n\n  stream->dec_current1.type = inst->type1;\n  stream->dec_current2.type = inst->type2;\n  stream->dec_current1.size = inst->size1;\n  stream->dec_current2.size = inst->size2;\n\n  /* For each instruction with a real operation, decode the\n   * corresponding size and addresses if necessary.  Assume a\n   * code-table may have NOOP in either position, although this is\n   * unlikely. */\n  if (inst->type1 != XD3_NOOP &&\n      (ret = xd3_decode_parse_halfinst (stream, & stream->dec_current1)))\n    {\n      return ret;\n    }\n  if (inst->type2 != XD3_NOOP &&\n      (ret = xd3_decode_parse_halfinst (stream, & stream->dec_current2)))\n    {\n      return ret;\n    }\n  return 0;\n}\n\n/* Output the result of a single half-instruction. OPT: This the\n   decoder hotspot.  Modifies \"hinst\", see below.  */\nstatic int\nxd3_decode_output_halfinst (xd3_stream *stream, xd3_hinst *inst)\n{\n  /* This method is reentrant for copy instructions which may return\n   * XD3_GETSRCBLK to the caller.  Each time through a copy takes the\n   * minimum of inst->size and the available space on whichever block\n   * supplies the data */\n  usize_t take = inst->size;\n\n  if (USIZE_T_OVERFLOW (stream->avail_out, take) ||\n      stream->avail_out + take > stream->space_out)\n    {\n      stream->msg = \"overflow while decoding\";\n      return XD3_INVALID_INPUT;\n    }\n\n  XD3_ASSERT (inst->type != XD3_NOOP);\n\n  switch (inst->type)\n    {\n    case XD3_RUN:\n      {\n\t/* Only require a single data byte. */\n\tif (stream->data_sect.buf == stream->data_sect.buf_max)\n\t  {\n\t    stream->msg = \"data underflow\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tmemset (stream->next_out + stream->avail_out,\n\t\tstream->data_sect.buf[0],\n\t\ttake);\n\n\tstream->data_sect.buf += 1;\n\tstream->avail_out += take;\n\tinst->type = XD3_NOOP;\n\tbreak;\n      }\n    case XD3_ADD:\n      {\n\t/* Require at least TAKE data bytes. */\n\tif (stream->data_sect.buf + take > stream->data_sect.buf_max)\n\t  {\n\t    stream->msg = \"data underflow\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tmemcpy (stream->next_out + stream->avail_out,\n\t\tstream->data_sect.buf,\n\t\ttake);\n\n\tstream->data_sect.buf += take;\n\tstream->avail_out += take;\n\tinst->type = XD3_NOOP;\n\tbreak;\n      }\n    default:\n      {\n\tusize_t i;\n\tconst uint8_t *src;\n\tuint8_t *dst;\n\tint overlap;\n\n\t/* See if it copies from the VCD_TARGET/VCD_SOURCE window or\n\t * the target window.  Out-of-bounds checks for the addresses\n\t * and sizes are performed in xd3_decode_parse_halfinst.  This\n\t * if/else must set \"overlap\", \"src\", and \"dst\". */\n\tif (inst->addr < stream->dec_cpylen)\n\t  {\n\t    /* In both branches we are copying from outside the\n\t     * current decoder window, the first (VCD_TARGET) is\n\t     * unimplemented. */\n\t    overlap = 0;\n\t    \n\t    /* This branch sets \"src\".  As a side-effect, we modify\n\t     * \"inst\" so that if we reenter this method after a\n\t     * XD3_GETSRCBLK response the state is correct.  So if the\n\t     * instruction can be fulfilled by a contiguous block of\n\t     * memory then we will set:\n\t     *\n\t     *  inst->type = XD3_NOOP;\n\t     *  inst->size = 0;\n\t     */\n\t    if (stream->dec_win_ind & VCD_TARGET)\n\t      {\n\t\t/* TODO: Users have requested long-distance copies of\n\t\t * similar material within a target (e.g., for dup\n\t\t * supression in backups). This code path is probably\n\t\t * dead due to XD3_UNIMPLEMENTED in xd3_decode_setup_buffers */\n\t\tinst->size = 0;\n\t\tinst->type = XD3_NOOP;\n\t\tstream->msg = \"VCD_TARGET not implemented\";\n\t\treturn XD3_UNIMPLEMENTED;\n\t      }\n\t    else\n\t      {\n\t\t/* In this case we have to read a source block, which\n\t\t * could return control to the caller.  We need to\n\t\t * know the first block number needed for this\n\t\t * copy. */\n\t\txd3_source *source = stream->src;\n\t\txoff_t block = source->cpyoff_blocks;\n\t\tusize_t blkoff = source->cpyoff_blkoff;\n\t\tconst usize_t blksize = source->blksize;\n\t\tint ret;\n\n\t\txd3_blksize_add (&block, &blkoff, source, inst->addr);\n\t\tXD3_ASSERT (blkoff < blksize);\n\n\t\tif ((ret = xd3_getblk (stream, block)))\n\t\t  {\n\t\t    /* could be a XD3_GETSRCBLK failure. */\n\t\t    if (ret == XD3_TOOFARBACK)\n\t\t      {\n\t\t\tstream->msg = \"non-seekable source in decode\";\n\t\t\tret = XD3_INTERNAL;\n\t\t      }\n\t\t    return ret;\n\t\t  }\n\n\t\tsrc = source->curblk + blkoff;\n\n\t\t/* This block is either full, or a partial block that\n\t\t * must contain enough bytes. */\n\t\tif ((source->onblk != blksize) &&\n\t\t    (blkoff + take > source->onblk))\n\t\t  {\n\t\t    IF_DEBUG1 (XPR(NT \"[srcfile] short at blkno %\"Q\"u onblk \"\n\t\t\t\t   \"%\"W\"u blksize %\"W\"u blkoff %\"W\"u take %\"W\"u\\n\",\n\t\t\t\t   block,\n\t\t\t\t   source->onblk,\n\t\t\t\t   blksize,\n\t\t\t\t   blkoff,\n\t\t\t\t   take));\n\t\t    stream->msg = \"source file too short\";\n\t\t    return XD3_INVALID_INPUT;\n\t\t  }\n\n\t\tXD3_ASSERT (blkoff != blksize);\n\n\t\t/* Check if we have enough data on this block to\n\t\t * finish the instruction. */\n\t\tif (blkoff + take <= blksize)\n\t\t  {\n\t\t    inst->type = XD3_NOOP;\n\t\t    inst->size = 0;\n\t\t  }\n\t\telse\n\t\t  {\n\t\t    take = blksize - blkoff;\n\t\t    inst->size -= take;\n\t\t    inst->addr += take;\n\n\t\t    /* because (blkoff + take > blksize), above */\n\t\t    XD3_ASSERT (inst->size != 0);\n\t\t  }\n\t      }\n\t  }\n\telse\n\t  {\n\t    /* TODO: the memcpy/overlap optimization, etc.  Overlap\n\t     * here could be more specific, it's whether (inst->addr -\n\t     * srclen) + inst->size > input_pos ?  And is the system\n\t     * memcpy really any good? */\n\t    overlap = 1;\n\n\t    /* For a target-window copy, we know the entire range is\n\t     * in-memory.  The dec_tgtaddrbase is negatively offset by\n\t     * dec_cpylen because the addresses start beyond that\n\t     * point. */\n\t    src = stream->dec_tgtaddrbase + inst->addr;\n\t    inst->type = XD3_NOOP;\n\t    inst->size = 0;\n\t  }\n\n \tdst = stream->next_out + stream->avail_out;\n\n\tstream->avail_out += take;\n\n\tif (overlap)\n\t  {\n\t    /* Can't just memcpy here due to possible overlap. */\n\t    for (i = take; i != 0; i -= 1)\n\t      {\n\t\t*dst++ = *src++;\n\t      }\n\t  }\n\telse\n\t  {\n\t    memcpy (dst, src, take);\n\t  }\n      }\n    }\n\n  return 0;\n}\n\nstatic int\nxd3_decode_finish_window (xd3_stream *stream)\n{\n  stream->dec_winbytes  = 0;\n  stream->dec_state     = DEC_FINISH;\n\n  stream->data_sect.pos = 0;\n  stream->inst_sect.pos = 0;\n  stream->addr_sect.pos = 0;\n\n  return XD3_OUTPUT;\n}\n\nstatic int\nxd3_decode_secondary_sections (xd3_stream *secondary_stream)\n{\n#if SECONDARY_ANY\n  int ret;\n#define DECODE_SECONDARY_SECTION(UPPER,LOWER) \\\n  ((secondary_stream->dec_del_ind & VCD_ ## UPPER ## COMP) && \\\n   (ret = xd3_decode_secondary (secondary_stream, \\\n\t\t\t\t& secondary_stream-> LOWER ## _sect,\t\\\n\t\t\t\t& xd3_sec_ ## LOWER (secondary_stream))))\n\n  if (DECODE_SECONDARY_SECTION (DATA, data) ||\n      DECODE_SECONDARY_SECTION (INST, inst) ||\n      DECODE_SECONDARY_SECTION (ADDR, addr))\n    {\n      return ret;\n    }\n#undef DECODE_SECONDARY_SECTION\n#endif\n  return 0;\n}\n\nstatic int\nxd3_decode_sections (xd3_stream *stream)\n{\n  usize_t need, more, take;\n  int copy, ret;\n\n  if ((stream->flags & XD3_JUST_HDR) != 0)\n    {\n      /* Nothing left to do. */\n      return xd3_decode_finish_window (stream);\n    }\n\n  /* To avoid extra copying, allocate three sections at once (but\n   * check for overflow). */\n  need = stream->inst_sect.size;\n\n  if (USIZE_T_OVERFLOW (need, stream->addr_sect.size))\n    {\n      stream->msg = \"decoder section size overflow\";\n      return XD3_INTERNAL;\n    }\n  need += stream->addr_sect.size;\n\n  if (USIZE_T_OVERFLOW (need, stream->data_sect.size))\n    {\n      stream->msg = \"decoder section size overflow\";\n      return XD3_INTERNAL;\n    }\n  need += stream->data_sect.size;\n\n  /* The window may be entirely processed. */\n  XD3_ASSERT (stream->dec_winbytes <= need);\n\n  /* Compute how much more input is needed. */\n  more = (need - stream->dec_winbytes);\n\n  /* How much to consume. */\n  take = xd3_min (more, stream->avail_in);\n\n  /* See if the input is completely available, to avoid copy. */\n  copy = (take != more);\n\n  /* If the window is skipped... */\n  if ((stream->flags & XD3_SKIP_WINDOW) != 0)\n    {\n      /* Skip the available input. */\n      DECODE_INPUT (take);\n\n      stream->dec_winbytes += take;\n\n      if (copy)\n\t{\n\t  stream->msg = \"further input required\";\n\t  return XD3_INPUT;\n\t}\n\n      return xd3_decode_finish_window (stream);\n    }\n\n  /* Process all but the DATA section. */\n  switch (stream->dec_state)\n    {\n    default:\n      stream->msg = \"internal error\";\n      return XD3_INVALID_INPUT;\n\n    case DEC_DATA:\n      if ((ret = xd3_decode_section (stream, & stream->data_sect,\n\t\t\t\t     DEC_INST, copy))) { return ret; }\n    case DEC_INST:\n      if ((ret = xd3_decode_section (stream, & stream->inst_sect,\n\t\t\t\t     DEC_ADDR, copy))) { return ret; }\n    case DEC_ADDR:\n      if ((ret = xd3_decode_section (stream, & stream->addr_sect,\n\t\t\t\t     DEC_EMIT, copy))) { return ret; }\n    }\n\n  XD3_ASSERT (stream->dec_winbytes == need);\n\n  if ((ret = xd3_decode_secondary_sections (stream))) { return ret; }\n\n  if (stream->flags & XD3_SKIP_EMIT)\n    {\n      return xd3_decode_finish_window (stream);\n    }\n\n  /* OPT: A possible optimization is to avoid allocating memory in\n   * decode_setup_buffers and to avoid a large memcpy when the window\n   * consists of a single VCD_SOURCE copy instruction. */\n  if ((ret = xd3_decode_setup_buffers (stream))) { return ret; }\n\n  return 0;\n}\n\nstatic int\nxd3_decode_emit (xd3_stream *stream)\n{\n  int ret;\n\n  /* Produce output: originally structured to allow reentrant code\n   * that fills as much of the output buffer as possible, but VCDIFF\n   * semantics allows to copy from anywhere from the target window, so\n   * instead allocate a sufficiently sized buffer after the target\n   * window length is decoded.\n   *\n   * This code still needs to be reentrant to allow XD3_GETSRCBLK to\n   * return control.  This is handled by setting the\n   * stream->dec_currentN instruction types to XD3_NOOP after they\n   * have been processed. */\n  XD3_ASSERT (! (stream->flags & XD3_SKIP_EMIT));\n  XD3_ASSERT (stream->dec_tgtlen <= stream->space_out);\n\n  while (stream->inst_sect.buf != stream->inst_sect.buf_max ||\n\t stream->dec_current1.type != XD3_NOOP ||\n\t stream->dec_current2.type != XD3_NOOP)\n    {\n      /* Decode next instruction pair. */\n      if ((stream->dec_current1.type == XD3_NOOP) &&\n\t  (stream->dec_current2.type == XD3_NOOP) &&\n\t  (ret = xd3_decode_instruction (stream))) { return ret; }\n\n      /* Output dec_current1 */\n      while ((stream->dec_current1.type != XD3_NOOP))\n\t{\n\t  if ((ret = xd3_decode_output_halfinst (stream, & stream->dec_current1)))\n\t    {\n\t      return ret;\n\t    }\n\t}\n      /* Output dec_current2 */\n      while (stream->dec_current2.type != XD3_NOOP)\n\t{\n\t  if ((ret = xd3_decode_output_halfinst (stream, & stream->dec_current2)))\n\t    {\n\t      return ret;\n\t    }\n\t}\n    }\n\n  if (stream->avail_out != stream->dec_tgtlen)\n    {\n      IF_DEBUG2 (DP(RINT \"AVAIL_OUT(%\"W\"u) != DEC_TGTLEN(%\"W\"u)\\n\",\n\t\t    stream->avail_out, stream->dec_tgtlen));\n      stream->msg = \"wrong window length\";\n      return XD3_INVALID_INPUT;\n    }\n\n  if (stream->data_sect.buf != stream->data_sect.buf_max)\n    {\n      stream->msg = \"extra data section\";\n      return XD3_INVALID_INPUT;\n    }\n\n  if (stream->addr_sect.buf != stream->addr_sect.buf_max)\n    {\n      stream->msg = \"extra address section\";\n      return XD3_INVALID_INPUT;\n    }\n\n  /* OPT: Should cksum computation be combined with the above loop? */\n  if ((stream->dec_win_ind & VCD_ADLER32) != 0 &&\n      (stream->flags & XD3_ADLER32_NOVER) == 0)\n    {\n      uint32_t a32 = adler32 (1L, stream->next_out, stream->avail_out);\n\n      if (a32 != stream->dec_adler32)\n\t{\n\t  stream->msg = \"target window checksum mismatch\";\n\t  return XD3_INVALID_INPUT;\n\t}\n    }\n\n  /* Finished with a window. */\n  return xd3_decode_finish_window (stream);\n}\n\nint\nxd3_decode_input (xd3_stream *stream)\n{\n  int ret;\n\n  if (stream->enc_state != 0)\n    {\n      stream->msg = \"encoder/decoder transition\";\n      return XD3_INVALID_INPUT;\n    }\n\n#define BYTE_CASE(expr,x,nstate) \\\n      do { \\\n      if ( (expr) && \\\n           ((ret = xd3_decode_byte (stream, & (x))) != 0) ) { return ret; } \\\n      stream->dec_state = (nstate); \\\n      } while (0)\n\n#define OFFSET_CASE(expr,x,nstate) \\\n      do { \\\n      if ( (expr) && \\\n           ((ret = xd3_decode_offset (stream, & (x))) != 0) ) { return ret; } \\\n      stream->dec_state = (nstate); \\\n      } while (0)\n\n#define SIZE_CASE(expr,x,nstate) \\\n      do { \\\n      if ( (expr) && \\\n           ((ret = xd3_decode_size (stream, & (x))) != 0) ) { return ret; } \\\n      stream->dec_state = (nstate); \\\n      } while (0)\n\n  switch (stream->dec_state)\n    {\n    case DEC_VCHEAD:\n      {\n\tif ((ret = xd3_decode_bytes (stream, stream->dec_magic,\n\t\t\t\t     & stream->dec_magicbytes, 4)))\n\t  {\n\t    return ret;\n\t  }\n\n\tif (stream->dec_magic[0] != VCDIFF_MAGIC1 ||\n\t    stream->dec_magic[1] != VCDIFF_MAGIC2 ||\n\t    stream->dec_magic[2] != VCDIFF_MAGIC3)\n\t  {\n\t    stream->msg = \"not a VCDIFF input\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tif (stream->dec_magic[3] != 0)\n\t  {\n\t    stream->msg = \"VCDIFF input version > 0 is not supported\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tstream->dec_state = DEC_HDRIND;\n      }\n    case DEC_HDRIND:\n      {\n\tif ((ret = xd3_decode_byte (stream, & stream->dec_hdr_ind)))\n\t  {\n\t    return ret;\n\t  }\n\n\tif ((stream->dec_hdr_ind & VCD_INVHDR) != 0)\n\t  {\n\t    stream->msg = \"unrecognized header indicator bits set\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tstream->dec_state = DEC_SECONDID;\n      }\n\n    case DEC_SECONDID:\n      /* Secondary compressor ID: only if VCD_SECONDARY is set */\n      if ((stream->dec_hdr_ind & VCD_SECONDARY) != 0)\n\t{\n\t  BYTE_CASE (1, stream->dec_secondid, DEC_TABLEN);\n\n\t  switch (stream->dec_secondid)\n\t    {\n\t    case VCD_FGK_ID:\n\t      FGK_CASE (stream);\n\t    case VCD_DJW_ID:\n\t      DJW_CASE (stream);\n\t    case VCD_LZMA_ID:\n\t      LZMA_CASE (stream);\n\t    default:\n\t      stream->msg = \"unknown secondary compressor ID\";\n\t      return XD3_INVALID_INPUT;\n\t    }\n\t}\n\n    case DEC_TABLEN:\n      /* Length of code table data: only if VCD_CODETABLE is set */\n      SIZE_CASE ((stream->dec_hdr_ind & VCD_CODETABLE) != 0,\n\t\t stream->dec_codetblsz, DEC_NEAR);\n\n      /* The codetblsz counts the two NEAR/SAME bytes */\n      if ((stream->dec_hdr_ind & VCD_CODETABLE) != 0) {\n\tif (stream->dec_codetblsz <= 2) {\n\t  stream->msg = \"invalid code table size\";\n\t  return ENOMEM;\n\t}\n\tstream->dec_codetblsz -= 2;\n      }\n    case DEC_NEAR:\n      /* Near modes: only if VCD_CODETABLE is set */\n      BYTE_CASE((stream->dec_hdr_ind & VCD_CODETABLE) != 0,\n\t\tstream->acache.s_near, DEC_SAME);\n    case DEC_SAME:\n      /* Same modes: only if VCD_CODETABLE is set */\n      BYTE_CASE((stream->dec_hdr_ind & VCD_CODETABLE) != 0,\n\t\tstream->acache.s_same, DEC_TABDAT);\n    case DEC_TABDAT:\n      /* Compressed code table data */\n\n      if ((stream->dec_hdr_ind & VCD_CODETABLE) != 0)\n\t{\n\t  stream->msg = \"VCD_CODETABLE support was removed\";\n\t  return XD3_UNIMPLEMENTED;\n\t}\n      else\n\t{\n\t  /* Use the default table. */\n\t  stream->acache.s_near = __rfc3284_code_table_desc.near_modes;\n\t  stream->acache.s_same = __rfc3284_code_table_desc.same_modes;\n\t  stream->code_table    = xd3_rfc3284_code_table ();\n\t}\n\n      if ((ret = xd3_alloc_cache (stream))) { return ret; }\n\n      stream->dec_state = DEC_APPLEN;\n\n    case DEC_APPLEN:\n      /* Length of application data */\n      SIZE_CASE((stream->dec_hdr_ind & VCD_APPHEADER) != 0,\n\t\tstream->dec_appheadsz, DEC_APPDAT);\n\n    case DEC_APPDAT:\n      /* Application data */\n      if (stream->dec_hdr_ind & VCD_APPHEADER)\n\t{\n\t  /* Note: we add an additional byte for padding, to allow\n\t     0-termination. Check for overflow: */\n\t  if (USIZE_T_OVERFLOW(stream->dec_appheadsz, 1))\n\t    {\n\t      stream->msg = \"exceptional appheader size\";\n\t      return XD3_INVALID_INPUT;\n\t    }\n\n\t  if ((stream->dec_appheader == NULL) &&\n\t      (stream->dec_appheader =\n\t       (uint8_t*) xd3_alloc (stream,\n\t\t\t\t     stream->dec_appheadsz+1, 1)) == NULL)\n\t    {\n\t      return ENOMEM;\n\t    }\n\n\t  stream->dec_appheader[stream->dec_appheadsz] = 0;\n\n\t  if ((ret = xd3_decode_bytes (stream, stream->dec_appheader,\n\t\t\t\t       & stream->dec_appheadbytes,\n\t\t\t\t       stream->dec_appheadsz)))\n\t    {\n\t      return ret;\n\t    }\n\t}\n\n      /* xoff_t -> usize_t is safe because this is the first block. */\n      stream->dec_hdrsize = (usize_t) stream->total_in;\n      stream->dec_state = DEC_WININD;\n\n    case DEC_WININD:\n      {\n\t/* Start of a window: the window indicator */\n\tif ((ret = xd3_decode_byte (stream, & stream->dec_win_ind)))\n\t  {\n\t    return ret;\n\t  }\n\n\tstream->current_window = stream->dec_window_count;\n\n\tif (XOFF_T_OVERFLOW (stream->dec_winstart, stream->dec_tgtlen))\n\t  {\n\t    stream->msg = \"decoder file offset overflow\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tstream->dec_winstart += stream->dec_tgtlen;\n\n\tif ((stream->dec_win_ind & VCD_INVWIN) != 0)\n\t  {\n\t    stream->msg = \"unrecognized window indicator bits set\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n\n\tif ((ret = xd3_decode_init_window (stream))) { return ret; }\n\n\tstream->dec_state = DEC_CPYLEN;\n\n\tIF_DEBUG2 (DP(RINT \"--------- TARGET WINDOW %\"Q\"u -----------\\n\",\n\t\t      stream->current_window));\n      }\n\n    case DEC_CPYLEN:\n      /* Copy window length: only if VCD_SOURCE or VCD_TARGET is set */\n      SIZE_CASE(SRCORTGT (stream->dec_win_ind), stream->dec_cpylen,\n\t\tDEC_CPYOFF);\n\n      /* Set the initial, logical decoder position (HERE address) in\n       * dec_position.  This is set to just after the source/copy\n       * window, as we are just about to output the first byte of\n       * target window. */\n      stream->dec_position = stream->dec_cpylen;\n\n    case DEC_CPYOFF:\n      /* Copy window offset: only if VCD_SOURCE or VCD_TARGET is set */\n      OFFSET_CASE(SRCORTGT (stream->dec_win_ind), stream->dec_cpyoff,\n\t\t  DEC_ENCLEN);\n\n      /* Copy offset and copy length may not overflow. */\n      if (XOFF_T_OVERFLOW (stream->dec_cpyoff, stream->dec_cpylen))\n\t{\n\t  stream->msg = \"decoder copy window overflows a file offset\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      /* Check copy window bounds: VCD_TARGET window may not exceed\n\t current position. */\n      if ((stream->dec_win_ind & VCD_TARGET) &&\n\t  (stream->dec_cpyoff + stream->dec_cpylen >\n\t   stream->dec_winstart))\n\t{\n\t  stream->msg = \"VCD_TARGET window out of bounds\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n    case DEC_ENCLEN:\n      /* Length of the delta encoding */\n      SIZE_CASE(1, stream->dec_enclen, DEC_TGTLEN);\n    case DEC_TGTLEN:\n      /* Length of target window */\n      SIZE_CASE(1, stream->dec_tgtlen, DEC_DELIND);\n\n      /* Set the maximum decoder position, beyond which we should not\n       * decode any data.  This is the maximum value for dec_position.\n       * This may not exceed the size of a usize_t. */\n      if (USIZE_T_OVERFLOW (stream->dec_cpylen, stream->dec_tgtlen))\n\t{\n\t  stream->msg = \"decoder target window overflows a usize_t\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      /* Check for malicious files. */\n      if (stream->dec_tgtlen > XD3_HARDMAXWINSIZE)\n\t{\n\t  stream->msg = \"hard window size exceeded\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      stream->dec_maxpos = stream->dec_cpylen + stream->dec_tgtlen;\n\n    case DEC_DELIND:\n      /* Delta indicator */\n      BYTE_CASE(1, stream->dec_del_ind, DEC_DATALEN);\n\n      if ((stream->dec_del_ind & VCD_INVDEL) != 0)\n\t{\n\t  stream->msg = \"unrecognized delta indicator bits set\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      /* Delta indicator is only used with secondary compression. */\n      if ((stream->dec_del_ind != 0) && (stream->sec_type == NULL))\n\t{\n\t  stream->msg = \"invalid delta indicator bits set\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      /* Section lengths */\n    case DEC_DATALEN:\n      SIZE_CASE(1, stream->data_sect.size, DEC_INSTLEN);\n    case DEC_INSTLEN:\n      SIZE_CASE(1, stream->inst_sect.size, DEC_ADDRLEN);\n    case DEC_ADDRLEN:\n      SIZE_CASE(1, stream->addr_sect.size, DEC_CKSUM);\n\n    case DEC_CKSUM:\n      /* Window checksum. */\n      if ((stream->dec_win_ind & VCD_ADLER32) != 0)\n\t{\n\t  int i;\n\n\t  if ((ret = xd3_decode_bytes (stream, stream->dec_cksum,\n\t\t\t\t       & stream->dec_cksumbytes, 4)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  for (i = 0; i < 4; i += 1)\n\t    {\n\t      stream->dec_adler32 =\n\t\t(stream->dec_adler32 << 8) | stream->dec_cksum[i];\n\t    }\n\t}\n\n      stream->dec_state = DEC_DATA;\n\n      /* Check dec_enclen for redundency, otherwise it is not really used. */\n      {\n\tusize_t enclen_check =\n\t  (1 + (xd3_sizeof_size (stream->dec_tgtlen) +\n\t\txd3_sizeof_size (stream->data_sect.size) +\n\t\txd3_sizeof_size (stream->inst_sect.size) +\n\t\txd3_sizeof_size (stream->addr_sect.size)) +\n\t   stream->data_sect.size +\n\t   stream->inst_sect.size +\n\t   stream->addr_sect.size +\n\t   ((stream->dec_win_ind & VCD_ADLER32) ? 4 : 0));\n\n\tif (stream->dec_enclen != enclen_check)\n\t  {\n\t    stream->msg = \"incorrect encoding length (redundent)\";\n\t    return XD3_INVALID_INPUT;\n\t  }\n      }\n\n      /* Returning here gives the application a chance to inspect the\n       * header, skip the window, etc. */\n      if (stream->current_window == 0) { return XD3_GOTHEADER; }\n      else                             { return XD3_WINSTART; }\n\n    case DEC_DATA:\n    case DEC_INST:\n    case DEC_ADDR:\n      /* Next read the three sections. */\n     if ((ret = xd3_decode_sections (stream))) { return ret; }\n\n    case DEC_EMIT:\n\n      /* To speed VCD_SOURCE block-address calculations, the source\n       * cpyoff_blocks and cpyoff_blkoff are pre-computed. */\n      if (stream->dec_win_ind & VCD_SOURCE)\n\t{\n\t  xd3_source *src = stream->src;\n\n\t  if (src == NULL)\n\t    {\n\t      stream->msg = \"source input required\";\n\t      return XD3_INVALID_INPUT;\n\t    }\n\n\t  xd3_blksize_div(stream->dec_cpyoff, src,\n\t\t\t  &src->cpyoff_blocks,\n\t\t\t  &src->cpyoff_blkoff);\n\t  \n\t  IF_DEBUG2(DP(RINT\n\t\t       \"[decode_cpyoff] %\"Q\"u \"\n\t\t       \"cpyblkno %\"Q\"u \"\n\t\t       \"cpyblkoff %\"W\"u \"\n\t\t       \"blksize %\"W\"u\\n\",\n\t\t       stream->dec_cpyoff,\n\t\t       src->cpyoff_blocks,\n\t\t       src->cpyoff_blkoff,\n\t\t       src->blksize));\n\t}\n\n      /* xd3_decode_emit returns XD3_OUTPUT on every success. */\n      if ((ret = xd3_decode_emit (stream)) == XD3_OUTPUT)\n\t{\n\t  stream->total_out += stream->avail_out;\n\t}\n\n      return ret;\n\n    case DEC_FINISH:\n      {\n\tif (stream->dec_win_ind & VCD_TARGET)\n\t  {\n\t    if (stream->dec_lastwin == NULL)\n\t      {\n\t\tstream->dec_lastwin   = stream->next_out;\n\t\tstream->dec_lastspace = stream->space_out;\n\t      }\n\t    else\n\t      {\n\t\txd3_swap_uint8p (& stream->dec_lastwin,\n\t\t\t\t & stream->next_out);\n\t\txd3_swap_usize_t (& stream->dec_lastspace,\n\t\t\t\t  & stream->space_out);\n\t      }\n\t  }\n\n\tstream->dec_lastlen   = stream->dec_tgtlen;\n\tstream->dec_laststart = stream->dec_winstart;\n\tstream->dec_window_count += 1;\n\n\t/* Note: the updates to dec_winstart & current_window are\n\t * deferred until after the next DEC_WININD byte is read. */\n\tstream->dec_state = DEC_WININD;\n\treturn XD3_WINFINISH;\n      }\n\n    default:\n      stream->msg = \"invalid state\";\n      return XD3_INVALID_INPUT;\n    }\n}\n\n#endif // _XDELTA3_DECODE_H_\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-djw.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n#ifndef _XDELTA3_DJW_H_\n#define _XDELTA3_DJW_H_\n\n/* The following people deserve much credit for the algorithms and\n * techniques contained in this file:\n\n Julian Seward\n Bzip2 sources, implementation of the multi-table Huffman technique.\n\n Jean-loup Gailly and Mark Adler and L. Peter Deutsch\n Zlib source code, RFC 1951\n\n Daniel S. Hirschberg and Debra A. LeLewer\n \"Efficient Decoding of Prefix Codes\"\n Communications of the ACM, April 1990 33(4).\n\n David J. Wheeler\n Program bred3.c, bexp3 and accompanying documents bred3.ps, huff.ps.\n This contains the idea behind the multi-table Huffman and 1-2 coding\n techniques.\n ftp://ftp.cl.cam.ac.uk/users/djw3/\n\n*/\n\n/* OPT: during the multi-table iteration, pick the worst-overall\n * performing table and replace it with exactly the frequencies of the\n * worst-overall performing sector or N-worst performing sectors. */\n\n/* REF: See xdfs-0.222 and xdfs-0.226 for some old experiments with\n * the Bzip prefix coding strategy.  xdfs-0.256 contains the last of\n * the other-format tests, including RFC1950 and the RFC1950+MTF\n * tests. */\n\n#define DJW_MAX_CODELEN      20U /* Maximum length of an alphabet code. */\n\n/* Code lengths are themselves code-length encoded, so the total number of\n * codes is: [RUN_0, RUN_1, 1-DJW_MAX_CODELEN] */\n#define DJW_TOTAL_CODES      (DJW_MAX_CODELEN+2)\n\n#define RUN_0                0U /* Symbols used in MTF+1/2 coding. */\n#define RUN_1                1U\n\n/* Number of code lengths always encoded (djw_encode_basic array) */\n#define DJW_BASIC_CODES      5U  \n#define DJW_RUN_CODES        2U  /* Number of run codes */\n\n/* Offset of extra codes */\n#define DJW_EXTRA_12OFFSET   (DJW_BASIC_CODES + DJW_RUN_CODES)\n\n/* Number of optionally encoded code lengths (djw_encode_extra array) */\n#define DJW_EXTRA_CODES      15U\n\n/* Number of bits to code [0-DJW_EXTRA_CODES] */\n#define DJW_EXTRA_CODE_BITS  4U  \n\n#define DJW_MAX_GROUPS       8U  /* Max number of group coding tables */\n#define DJW_GROUP_BITS       3U  /* Number of bits to code [1-DJW_MAX_GROUPS] */\n\n#define DJW_SECTORSZ_MULT     5U  /* Multiplier for encoded sectorsz */\n#define DJW_SECTORSZ_BITS     5U  /* Number of bits to code group size */\n#define DJW_SECTORSZ_MAX      ((1U << DJW_SECTORSZ_BITS) * DJW_SECTORSZ_MULT)\n\n/* Maximum number of iterations to find group tables. */\n#define DJW_MAX_ITER         6U\n/* Minimum number of bits an iteration must reduce coding by. */\n#define DJW_MIN_IMPROVEMENT  20U \n\n/* Maximum code length of a prefix code length */\n#define DJW_MAX_CLCLEN       15U\n\n/* Number of bits to code [0-DJW_MAX_CLCLEN] */\n#define DJW_CLCLEN_BITS      4U  \n\n#define DJW_MAX_GBCLEN       7U  /* Maximum code length of a group selector */\n\n/* Number of bits to code [0-DJW_MAX_GBCLEN]\n * TODO: Actually, should never have zero code lengths here, or else a group\n * went unused.  Write a test for this: if a group goes unused, eliminate\n * it? */\n#define DJW_GBCLEN_BITS      3U\n\n/* It has to save at least this many bits... */\n#define EFFICIENCY_BITS      16U\n\ntypedef struct _djw_stream   djw_stream;\ntypedef struct _djw_heapen   djw_heapen;\ntypedef struct _djw_prefix   djw_prefix;\ntypedef uint32_t             djw_weight;\n\nstruct _djw_heapen\n{\n  uint32_t depth;\n  uint32_t freq;\n  uint32_t parent;\n};\n\nstruct _djw_prefix\n{\n  usize_t   scount;\n  uint8_t *symbol;\n  usize_t   mcount;\n  uint8_t *mtfsym;\n  uint8_t *repcnt;\n};\n\nstruct _djw_stream\n{\n  int unused;\n};\n\n/* Each Huffman table consists of 256 \"code length\" (CLEN) codes,\n * which are themselves Huffman coded after eliminating repeats and\n * move-to-front coding.  The prefix consists of all the CLEN codes in\n * djw_encode_basic plus a 4-bit value stating how many of the\n * djw_encode_extra codes are actually coded (the rest are presumed\n * zero, or unused CLEN codes).\n *\n * These values of these two arrays were arrived at by studying the\n * distribution of min and max clen over a collection of DATA, INST,\n * and ADDR inputs.  The goal is to specify the order of\n * djw_extra_codes that is most likely to minimize the number of extra\n * codes that must be encoded.\n *\n * Results: 158896 sections were counted by compressing files (window\n * size 512K) listed with: `find / -type f ( -user jmacd -o -perm +444\n * )`\n *\n * The distribution of CLEN codes for each efficient invocation of the\n * secondary compressor (taking the best number of groups/sector size)\n * was recorded.  Then we look at the distribution of min and max clen\n * values, counting the number of times the value C_low is less than\n * the min and C_high is greater than the max.  Values >= C_high and\n * <= C_low will not have their lengths coded.  The results are sorted\n * and the least likely 15 are placed into the djw_encode_extra[]\n * array in order.  These values are used as the initial MTF ordering.\n\n clow[1] = 155119\n clow[2] = 140325\n clow[3] = 84072\n ---\n clow[4] = 7225\n clow[5] = 1093\n clow[6] = 215\n ---\n chigh[4] = 1\n chigh[5] = 30\n chigh[6] = 218\n chigh[7] = 2060\n chigh[8] = 13271\n ---\n chigh[9] = 39463\n chigh[10] = 77360\n chigh[11] = 118298\n chigh[12] = 141360\n chigh[13] = 154086\n chigh[14] = 157967\n chigh[15] = 158603\n chigh[16] = 158864\n chigh[17] = 158893\n chigh[18] = 158895\n chigh[19] = 158896\n chigh[20] = 158896\n\n*/\n\nstatic const uint8_t djw_encode_12extra[DJW_EXTRA_CODES] =\n  {\n    9, 10, 3, 11, 2, 12, 13, 1, 14, 15, 16, 17, 18, 19, 20,\n  };\n\nstatic const uint8_t djw_encode_12basic[DJW_BASIC_CODES] =\n  {\n    4, 5, 6, 7, 8,\n  };\n\n/*********************************************************************/\n/*                              DECLS                                */\n/*********************************************************************/\n\nstatic djw_stream*     djw_alloc           (xd3_stream *stream);\nstatic int             djw_init            (xd3_stream *stream, \n\t\t\t\t\t    djw_stream *h,\n\t\t\t\t\t    int is_encode);\nstatic void            djw_destroy         (xd3_stream *stream,\n\t\t\t\t\t    djw_stream *h);\n\n#if XD3_ENCODER\nstatic int             xd3_encode_huff     (xd3_stream   *stream,\n\t\t\t\t\t    djw_stream  *sec_stream,\n\t\t\t\t\t    xd3_output   *input,\n\t\t\t\t\t    xd3_output   *output,\n\t\t\t\t\t    xd3_sec_cfg  *cfg);\n#endif\n\nstatic int             xd3_decode_huff     (xd3_stream     *stream,\n\t\t\t\t\t    djw_stream    *sec_stream,\n\t\t\t\t\t    const uint8_t **input,\n\t\t\t\t\t    const uint8_t  *const input_end,\n\t\t\t\t\t    uint8_t       **output,\n\t\t\t\t\t    const uint8_t  *const output_end);\n\n/*********************************************************************/\n/*                             HUFFMAN                               */\n/*********************************************************************/\n\nstatic djw_stream*\ndjw_alloc (xd3_stream *stream)\n{\n  return (djw_stream*) xd3_alloc (stream, sizeof (djw_stream), 1);\n}\n\nstatic int\ndjw_init (xd3_stream *stream, djw_stream *h, int is_encode)\n{\n  /* Fields are initialized prior to use. */\n  return 0;\n}\n\nstatic void\ndjw_destroy (xd3_stream *stream,\n\t     djw_stream *h)\n{\n  xd3_free (stream, h);\n}\n\n\n/*********************************************************************/\n/*                               HEAP                                */\n/*********************************************************************/\n\nstatic inline int\nheap_less (const djw_heapen *a, const djw_heapen *b)\n{\n  return a->freq   < b->freq ||\n    (a->freq  == b->freq &&\n     a->depth  < b->depth);\n}\n\nstatic inline void\nheap_insert (usize_t *heap, const djw_heapen *ents, usize_t p, const usize_t e)\n{\n  /* Insert ents[e] into next slot heap[p] */\n  usize_t pp = p/2; /* P's parent */\n\n  while (heap_less (& ents[e], & ents[heap[pp]]))\n    {\n      heap[p] = heap[pp];\n      p  = pp;\n      pp = p/2;\n    }\n\n  heap[p] = e;\n}\n\nstatic inline djw_heapen*\nheap_extract (usize_t *heap, const djw_heapen *ents, usize_t heap_last)\n{\n  usize_t smallest = heap[1];\n  usize_t p, pc, t;\n\n  /* Caller decrements heap_last, so heap_last+1 is the replacement elt. */\n  heap[1] = heap[heap_last+1];\n\n  /* Re-heapify */\n  for (p = 1; ; p = pc)\n    {\n      pc = p*2;\n\n      /* Reached bottom of heap */\n      if (pc > heap_last) { break; }\n\n      /* See if second child is smaller. */\n      if (pc < heap_last && heap_less (& ents[heap[pc+1]], & ents[heap[pc]]))\n\t{\n\t  pc += 1;\n\t}\n\n      /* If pc is not smaller than p, heap property re-established. */\n      if (! heap_less (& ents[heap[pc]], & ents[heap[p]])) { break; }\n\n      t = heap[pc];\n      heap[pc] = heap[p];\n      heap[p] = t;\n    }\n\n  return (djw_heapen*) & ents[smallest];\n}\n\n#if XD3_DEBUG\nstatic void\nheap_check (usize_t *heap, djw_heapen *ents, usize_t heap_last)\n{\n  usize_t i;\n  for (i = 1; i <= heap_last; i += 1)\n    {\n      /* Heap property: child not less than parent */\n      XD3_ASSERT (! heap_less (& ents[heap[i]], & ents[heap[i/2]]));\n\n      IF_DEBUG2 (DP(RINT \"heap[%\"W\"u] = %u\\n\", i, ents[heap[i]].freq));\n    }\n}\n#endif\n\n/*********************************************************************/\n/*                             MTF, 1/2                              */\n/*********************************************************************/\n\nstatic inline usize_t\ndjw_update_mtf (uint8_t *mtf, usize_t mtf_i)\n{\n  int k;\n  usize_t sym = mtf[mtf_i];\n\n  for (k = mtf_i; k != 0; k -= 1) { mtf[k] = mtf[k-1]; }\n\n  mtf[0] = sym;\n  return sym;\n}\n\nstatic inline void\ndjw_update_1_2 (int *mtf_run, usize_t *mtf_i,\n\t\tuint8_t *mtfsym, djw_weight *freq)\n{\n  uint8_t code;\n  \n  do\n    {\n      /* Offset by 1, since any number of RUN_ symbols implies run>0... */\n      *mtf_run -= 1;\n\n      code = (*mtf_run & 1) ? RUN_1 : RUN_0;\n\n      mtfsym[(*mtf_i)++] = code;\n      freq[code] += 1;\n      *mtf_run >>= 1;\n    }\n  while (*mtf_run >= 1);\n\n  *mtf_run = 0;\n}\n\nstatic void\ndjw_init_clen_mtf_1_2 (uint8_t *clmtf)\n{\n  usize_t i, cl_i = 0;\n\n  clmtf[cl_i++] = 0;\n  for (i = 0; i < DJW_BASIC_CODES; i += 1)\n    {\n      clmtf[cl_i++] = djw_encode_12basic[i];\n    }\n  for (i = 0; i < DJW_EXTRA_CODES; i += 1)\n    {\n      clmtf[cl_i++] = djw_encode_12extra[i];\n    }\n}\n\n/*********************************************************************/\n/*                           PREFIX CODES                            */\n/*********************************************************************/\n#if XD3_ENCODER\nstatic usize_t\ndjw_build_prefix (const djw_weight *freq, uint8_t *clen, usize_t asize, usize_t maxlen)\n{\n  /* Heap with 0th entry unused, prefix tree with up to ALPHABET_SIZE-1\n   * internal nodes, never more than ALPHABET_SIZE entries actually in the\n   * heap (minimum weight subtrees during prefix construction).  First\n   * ALPHABET_SIZE entries are the actual symbols, next ALPHABET_SIZE-1 are\n   * internal nodes. */\n  djw_heapen ents[ALPHABET_SIZE * 2];\n  usize_t heap[ALPHABET_SIZE + 1];\n\n  usize_t heap_last; /* Index of the last _valid_ heap entry. */\n  usize_t ents_size; /* Number of entries, including 0th fake entry */\n  usize_t  overflow;  /* Number of code lengths that overflow */\n  usize_t total_bits;\n  usize_t i;\n\n  IF_DEBUG (usize_t first_bits = 0);\n\n  /* Insert real symbol frequences. */\n  for (i = 0; i < asize; i += 1)\n    {\n      ents[i+1].freq = freq[i];\n      IF_DEBUG2 (DP(RINT \"ents[%\"W\"i] = freq[%\"W\"u] = %d\\n\",\n\t\t\ti+1, i, freq[i]));\n    }\n\n again:\n\n  /* The loop is re-entered each time an overflow occurs.  Re-initialize... */\n  heap_last = 0;\n  ents_size = 1;\n  overflow  = 0;\n  total_bits = 0;\n\n  /* 0th entry terminates the while loop in heap_insert (it's the parent of\n   * the smallest element, always less-than) */\n  heap[0] = 0;\n  ents[0].depth = 0;\n  ents[0].freq  = 0;\n\n  /* Initial heap. */\n  for (i = 0; i < asize; i += 1, ents_size += 1)\n    {\n      ents[ents_size].depth  = 0;\n      ents[ents_size].parent = 0;\n\n      if (ents[ents_size].freq != 0)\n\t{\n\t  heap_insert (heap, ents, ++heap_last, ents_size);\n\t}\n    }\n\n  IF_DEBUG (heap_check (heap, ents, heap_last));\n\n  /* Must be at least one symbol, or else we can't get here. */\n  XD3_ASSERT (heap_last != 0);\n\n  /* If there is only one symbol, fake a second to prevent zero-length\n   * codes. */\n  if (heap_last == 1)\n    {\n      /* Pick either the first or last symbol. */\n      usize_t s = freq[0] ? asize-1 : 0;\n      ents[s+1].freq = 1;\n      goto again;\n    }\n\n  /* Build prefix tree. */\n  while (heap_last > 1)\n    {\n      djw_heapen *h1 = heap_extract (heap, ents, --heap_last);\n      djw_heapen *h2 = heap_extract (heap, ents, --heap_last);\n\n      ents[ents_size].freq   = h1->freq + h2->freq;\n      ents[ents_size].depth  = 1 + xd3_max (h1->depth, h2->depth);\n      ents[ents_size].parent = 0;\n\n      h1->parent = h2->parent = ents_size;\n\n      heap_insert (heap, ents, ++heap_last, ents_size++);\n    }\n\n  IF_DEBUG (heap_check (heap, ents, heap_last));\n\n  /* Now compute prefix code lengths, counting parents. */\n  for (i = 1; i < asize+1; i += 1)\n    {\n      usize_t b = 0;\n\n      if (ents[i].freq != 0)\n\t{\n\t  usize_t p = i;\n\n\t  while ((p = ents[p].parent) != 0) { b += 1; }\n\n\t  if (b > maxlen) { overflow = 1; }\n\n\t  total_bits += b * freq[i-1];\n\t}\n\n      /* clen is 0-origin, unlike ents. */\n      IF_DEBUG2 (DP(RINT \"clen[%\"W\"u] = %\"W\"u\\n\", i-1, b));\n      clen[i-1] = b;\n    }\n\n  IF_DEBUG (if (first_bits == 0) first_bits = total_bits);\n\n  if (! overflow)\n    {\n      IF_DEBUG2 (if (first_bits != total_bits)\n      {\n\tDP(RINT \"code length overflow changed %\"W\"u bits\\n\",\n\t   total_bits - first_bits);\n      });\n      return total_bits;\n    }\n\n  /* OPT: There is a non-looping way to fix overflow shown in zlib, but this\n   * is easier (for now), as done in bzip2. */\n  for (i = 1; i < asize+1; i += 1)\n    {\n      ents[i].freq = ents[i].freq / 2 + 1;\n    }\n\n  goto again;\n}\n\nstatic void\ndjw_build_codes (usize_t *codes, const uint8_t *clen, usize_t asize, usize_t abs_max)\n{\n  usize_t i, l;\n  usize_t min_clen = DJW_MAX_CODELEN;\n  usize_t max_clen = 0;\n  usize_t code = 0;\n\n  /* Find the min and max code length */\n  for (i = 0; i < asize; i += 1)\n    {\n      if (clen[i] > 0 && clen[i] < min_clen)\n\t{\n\t  min_clen = clen[i];\n\t}\n\n      max_clen = xd3_max (max_clen, (usize_t) clen[i]);\n    }\n\n  XD3_ASSERT (max_clen <= abs_max);\n\n  /* Generate a code for each symbol with the appropriate length. */\n  for (l = min_clen; l <= max_clen; l += 1)\n    {\n      for (i = 0; i < asize; i += 1)\n\t{\n\t  if (clen[i] == l)\n\t    {\n\t      codes[i] = code++;\n\t    } \n\t}\n\n      code <<= 1;\n    }\n\n  IF_DEBUG2 ({\n      for (i = 0; i < asize; i += 1)\n\t{\n\t  DP(RINT \"code[%\"W\"u] = %\"W\"u\\n\", i, codes[i]);\n\t}\n    });\n}\n\n/*********************************************************************/\n/*\t\t\t      MOVE-TO-FRONT                          */\n/*********************************************************************/\nstatic void\ndjw_compute_mtf_1_2 (djw_prefix  *prefix,\n\t\t     uint8_t     *mtf,\n\t\t     djw_weight  *freq_out,\n\t\t     usize_t      nsym)\n{\n  size_t i, j, k;\n  usize_t sym;\n  usize_t size = prefix->scount;\n  usize_t mtf_i = 0;\n  int mtf_run = 0;\n\n  /* This +2 is for the RUN_0, RUN_1 codes */\n  memset (freq_out, 0, sizeof (freq_out[0]) * (nsym+2));\n\n  for (i = 0; i < size; )\n    {\n      /* OPT: Bzip optimizes this algorithm a little by effectively checking\n       * j==0 before the MTF update. */\n      sym = prefix->symbol[i++];\n\n      for (j = 0; mtf[j] != sym; j += 1) { }\n\n      XD3_ASSERT (j <= nsym);\n\n      for (k = j; k >= 1; k -= 1) { mtf[k] = mtf[k-1]; }\n\n      mtf[0] = sym;\n\n      if (j == 0)\n\t{\n\t  mtf_run += 1;\n\t  continue;\n\t}\n\n      if (mtf_run > 0)\n\t{\n\t  djw_update_1_2 (& mtf_run, & mtf_i, prefix->mtfsym, freq_out);\n\t}\n\n      /* Non-zero symbols are offset by RUN_1 */\n      prefix->mtfsym[mtf_i++] = (uint8_t)(j+RUN_1);\n      freq_out[j+RUN_1] += 1;\n    }\n\n  if (mtf_run > 0)\n    {\n      djw_update_1_2 (& mtf_run, & mtf_i, prefix->mtfsym, freq_out);\n    }\n\n  prefix->mcount = mtf_i;\n}\n\n/* Counts character frequencies of the input buffer, returns the size. */\nstatic usize_t\ndjw_count_freqs (djw_weight *freq, xd3_output *input)\n{\n  xd3_output *in;\n  usize_t size = 0;\n\n  memset (freq, 0, sizeof (freq[0]) * ALPHABET_SIZE);\n\n  for (in = input; in; in = in->next_page)\n    {\n      const uint8_t *p     = in->base;\n      const uint8_t *p_max = p + in->next;\n\n      size += in->next;\n\n      do\n\t{\n\t  ++freq[*p];\n\t}\n      while (++p < p_max);\n    }\n\n  IF_DEBUG2 ({int i;\n  DP(RINT \"freqs: \");\n  for (i = 0; i < ALPHABET_SIZE; i += 1)\n    {\n      DP(RINT \"%u \", freq[i]);\n    }\n  DP(RINT \"\\n\");});\n\n  return size;\n}\n\nstatic void\ndjw_compute_multi_prefix (usize_t     groups,\n\t\t\t  uint8_t     clen[DJW_MAX_GROUPS][ALPHABET_SIZE],\n\t\t\t  djw_prefix *prefix)\n{\n  usize_t gp, i;\n      \n  prefix->scount = ALPHABET_SIZE;\n  memcpy (prefix->symbol, clen[0], ALPHABET_SIZE);\n\n  for (gp = 1; gp < groups; gp += 1)\n    {\n      for (i = 0; i < ALPHABET_SIZE; i += 1)\n\t{\n\t  if (clen[gp][i] == 0)\n\t    {\n\t      continue;\n\t    }\n\n\t  prefix->symbol[prefix->scount++] = clen[gp][i];\n\t}\n    }\n}\n\nstatic void\ndjw_compute_prefix_1_2 (djw_prefix *prefix, djw_weight *freq)\n{\n  /* This +1 is for the 0 code-length. */\n  uint8_t clmtf[DJW_MAX_CODELEN+1];\n\n  djw_init_clen_mtf_1_2 (clmtf);\n\n  djw_compute_mtf_1_2 (prefix, clmtf, freq, DJW_MAX_CODELEN);\n}\n\nstatic int\ndjw_encode_prefix (xd3_stream   *stream,\n\t\t   xd3_output  **output,\n\t\t   bit_state    *bstate,\n\t\t   djw_prefix   *prefix)\n{\n  int ret;\n  size_t i;\n  usize_t num_to_encode;\n  djw_weight clfreq[DJW_TOTAL_CODES];\n  uint8_t    clclen[DJW_TOTAL_CODES];\n  usize_t    clcode[DJW_TOTAL_CODES];\n\n  /* Move-to-front encode prefix symbols, count frequencies */\n  djw_compute_prefix_1_2 (prefix, clfreq);\n\n  /* Compute codes */\n  djw_build_prefix (clfreq, clclen, DJW_TOTAL_CODES, DJW_MAX_CLCLEN);\n  djw_build_codes  (clcode, clclen, DJW_TOTAL_CODES, DJW_MAX_CLCLEN);\n\n  /* Compute number of extra codes beyond basic ones for this template. */\n  num_to_encode = DJW_TOTAL_CODES;\n  while (num_to_encode > DJW_EXTRA_12OFFSET && clclen[num_to_encode-1] == 0)\n    {\n      num_to_encode -= 1;\n    }\n  XD3_ASSERT (num_to_encode - DJW_EXTRA_12OFFSET < (1 << DJW_EXTRA_CODE_BITS));\n\n  /* Encode: # of extra codes */\n  if ((ret = xd3_encode_bits (stream, output, bstate, DJW_EXTRA_CODE_BITS,\n\t\t\t      num_to_encode - DJW_EXTRA_12OFFSET)))\n    {\n      return ret;\n    }\n\n  /* Encode: MTF code lengths */\n  for (i = 0; i < num_to_encode; i += 1)\n    {\n      if ((ret = xd3_encode_bits (stream, output, bstate,\n\t\t\t\t  DJW_CLCLEN_BITS, clclen[i])))\n\t{\n\t  return ret;\n\t}\n    }\n\n  /* Encode: CLEN code lengths */\n  for (i = 0; i < prefix->mcount; i += 1)\n    {\n      usize_t mtf_sym = prefix->mtfsym[i];\n      usize_t bits    = clclen[mtf_sym];\n      usize_t code    = clcode[mtf_sym];\n\n      if ((ret = xd3_encode_bits (stream, output, bstate, bits, code)))\n\t{\n\t  return ret;\n\t}\n    }\n\n  return 0;\n}\n\nstatic void\ndjw_compute_selector_1_2 (djw_prefix *prefix,\n\t\t\t  usize_t     groups,\n\t\t\t  djw_weight *gbest_freq)\n{\n  uint8_t grmtf[DJW_MAX_GROUPS];\n  usize_t i;\n\n  for (i = 0; i < groups; i += 1) { grmtf[i] = i; }\n\n  djw_compute_mtf_1_2 (prefix, grmtf, gbest_freq, groups);\n}\n\nstatic int\nxd3_encode_howmany_groups (xd3_stream *stream,\n\t\t\t   xd3_sec_cfg *cfg,\n\t\t\t   usize_t input_size,\n\t\t\t   usize_t *ret_groups,\n\t\t\t   usize_t *ret_sector_size)\n{\n  usize_t cfg_groups = 0;\n  usize_t cfg_sector_size = 0;\n  usize_t sugg_groups = 0;\n  usize_t sugg_sector_size = 0;\n\n  if (cfg->ngroups != 0)\n    {\n      if (cfg->ngroups > DJW_MAX_GROUPS)\n\t{\n\t  stream->msg = \"invalid secondary encoder group number\";\n\t  return XD3_INTERNAL;\n\t}\n\n      cfg_groups = cfg->ngroups;\n    }\n\n  if (cfg->sector_size != 0)\n    {\n      if (cfg->sector_size < DJW_SECTORSZ_MULT ||\n\t  cfg->sector_size > DJW_SECTORSZ_MAX ||\n\t  (cfg->sector_size % DJW_SECTORSZ_MULT) != 0)\n\t{\n\t  stream->msg = \"invalid secondary encoder sector size\";\n\t  return XD3_INTERNAL;\n\t}\n\n      cfg_sector_size = cfg->sector_size;\n    }\n\n  if (cfg_groups == 0 || cfg_sector_size == 0)\n    {\n      /* These values were found empirically using xdelta3-tune around version\n       * xdfs-0.256. */\n      switch (cfg->data_type)\n\t{\n\tcase DATA_SECTION:\n\t  if      (input_size < 1000)   { sugg_groups = 1; sugg_sector_size = 0; }\n\t  else if (input_size < 4000)   { sugg_groups = 2; sugg_sector_size = 10; }\n\t  else if (input_size < 7000)   { sugg_groups = 3; sugg_sector_size = 10; }\n\t  else if (input_size < 10000)  { sugg_groups = 4; sugg_sector_size = 10; }\n\t  else if (input_size < 25000)  { sugg_groups = 5; sugg_sector_size = 10; }\n\t  else if (input_size < 50000)  { sugg_groups = 7; sugg_sector_size = 20; }\n\t  else if (input_size < 100000) { sugg_groups = 8; sugg_sector_size = 30; }\n\t  else                          { sugg_groups = 8; sugg_sector_size = 70; }\n\t  break;\n\tcase INST_SECTION:\n\t  if      (input_size < 7000)   { sugg_groups = 1; sugg_sector_size = 0; }\n\t  else if (input_size < 10000)  { sugg_groups = 2; sugg_sector_size = 50; }\n\t  else if (input_size < 25000)  { sugg_groups = 3; sugg_sector_size = 50; }\n\t  else if (input_size < 50000)  { sugg_groups = 6; sugg_sector_size = 40; }\n\t  else if (input_size < 100000) { sugg_groups = 8; sugg_sector_size = 40; }\n\t  else                          { sugg_groups = 8; sugg_sector_size = 40; }\n\t  break;\n\tcase ADDR_SECTION:\n\t  if      (input_size < 9000)   { sugg_groups = 1; sugg_sector_size = 0; }\n\t  else if (input_size < 25000)  { sugg_groups = 2; sugg_sector_size = 130; }\n\t  else if (input_size < 50000)  { sugg_groups = 3; sugg_sector_size = 130; }\n\t  else if (input_size < 100000) { sugg_groups = 5; sugg_sector_size = 130; }\n\t  else                          { sugg_groups = 7; sugg_sector_size = 130; }\n\t  break;\n\t}\n\n      if (cfg_groups == 0)\n\t{\n\t  cfg_groups = sugg_groups;\n\t}\n\n      if (cfg_sector_size == 0)\n\t{\n\t  cfg_sector_size = sugg_sector_size;\n\t}\n    }\n\n  if (cfg_groups != 1 && cfg_sector_size == 0)\n    {\n      switch (cfg->data_type)\n\t{\n\tcase DATA_SECTION:\n\t  cfg_sector_size = 20;\n\t  break;\n\tcase INST_SECTION:\n\t  cfg_sector_size = 50;\n\t  break;\n\tcase ADDR_SECTION:\n\t  cfg_sector_size = 130;\n\t  break;\n\t}\n    }\n\n  (*ret_groups)     = cfg_groups;\n  (*ret_sector_size) = cfg_sector_size;\n\n  XD3_ASSERT (cfg_groups > 0 && cfg_groups <= DJW_MAX_GROUPS);\n  XD3_ASSERT (cfg_groups == 1 ||\n\t      (cfg_sector_size >= DJW_SECTORSZ_MULT &&\n\t       cfg_sector_size <= DJW_SECTORSZ_MAX));\n\n  return 0;\n}\n\nstatic int\nxd3_encode_huff (xd3_stream   *stream,\n\t\t djw_stream   *h,\n\t\t xd3_output   *input,\n\t\t xd3_output   *output,\n\t\t xd3_sec_cfg  *cfg)\n{\n  int         ret;\n  usize_t     groups, sector_size;\n  bit_state   bstate = BIT_STATE_ENCODE_INIT;\n  xd3_output *in;\n  usize_t     output_bits;\n  usize_t     input_bits;\n  usize_t     input_bytes;\n  usize_t     initial_offset = output->next;\n  djw_weight  real_freq[ALPHABET_SIZE];\n  uint8_t    *gbest = NULL;\n  uint8_t    *gbest_mtf = NULL;\n\n  input_bytes = djw_count_freqs (real_freq, input);\n  input_bits  = input_bytes * 8;\n\n  XD3_ASSERT (input_bytes > 0);\n\n  if ((ret = xd3_encode_howmany_groups (stream, cfg, input_bytes,\n\t\t\t\t\t& groups, & sector_size)))\n    {\n      return ret;\n    }\n\n  if (0)\n    {\n    regroup:\n      /* Sometimes we dynamically decide there are too many groups.  Arrive\n       * here. */\n      output->next = initial_offset;\n      xd3_bit_state_encode_init (& bstate);\n    }\n\n  /* Encode: # of groups (3 bits) */\n  if ((ret = xd3_encode_bits (stream, & output, & bstate,\n\t\t\t      DJW_GROUP_BITS, groups-1))) { goto failure; }\n\n  if (groups == 1)\n    {\n      /* Single Huffman group. */\n      usize_t    code[ALPHABET_SIZE]; /* Codes */\n      uint8_t    clen[ALPHABET_SIZE];\n      uint8_t    prefix_mtfsym[ALPHABET_SIZE];\n      djw_prefix prefix;\n\n      output_bits =\n\tdjw_build_prefix (real_freq, clen, ALPHABET_SIZE, DJW_MAX_CODELEN);\n      djw_build_codes (code, clen, ALPHABET_SIZE, DJW_MAX_CODELEN);\n\n      if (output_bits + EFFICIENCY_BITS >= input_bits && ! cfg->inefficient)\n\t{\n\t  goto nosecond;\n\t}\n\n      /* Encode: prefix */\n      prefix.mtfsym = prefix_mtfsym;\n      prefix.symbol = clen;\n      prefix.scount = ALPHABET_SIZE;\n\n      if ((ret = djw_encode_prefix (stream, & output, & bstate, & prefix)))\n\t{\n\t  goto failure;\n\t}\n\n      if (output_bits + (8 * output->next) + EFFICIENCY_BITS >=\n\t  input_bits && ! cfg->inefficient)\n\t{\n\t  goto nosecond;\n\t}\n\n      /* Encode: data */\n      for (in = input; in; in = in->next_page)\n\t{\n\t  const uint8_t *p     = in->base;\n\t  const uint8_t *p_max = p + in->next;\n\n\t  do\n\t    {\n\t      usize_t sym  = *p++;\n\t      usize_t bits = clen[sym];\n\n\t      IF_DEBUG (output_bits -= bits);\n\n\t      if ((ret = xd3_encode_bits (stream, & output,\n\t\t\t\t\t  & bstate, bits, code[sym])))\n\t\t{\n\t\t  goto failure;\n\t\t}\n\t    }\n\t  while (p < p_max);\n\t}\n\n      XD3_ASSERT (output_bits == 0);\n    }\n  else\n    {\n      /* DJW Huffman */\n      djw_weight evolve_freq[DJW_MAX_GROUPS][ALPHABET_SIZE];\n      uint8_t evolve_clen[DJW_MAX_GROUPS][ALPHABET_SIZE];\n      djw_weight left = input_bytes;\n      usize_t gp;\n      usize_t niter = 0;\n      usize_t select_bits;\n      usize_t sym1 = 0, sym2 = 0, s;\n      usize_t gcost[DJW_MAX_GROUPS];\n      usize_t gbest_code[DJW_MAX_GROUPS+2];\n      uint8_t gbest_clen[DJW_MAX_GROUPS+2];\n      usize_t  gbest_max = 1 + (input_bytes - 1) / sector_size;\n      usize_t best_bits = 0;\n      usize_t  gbest_no;\n      usize_t  gpcnt;\n      const uint8_t *p;\n      IF_DEBUG2 (usize_t gcount[DJW_MAX_GROUPS]);\n\n      /* Encode: sector size (5 bits) */\n      if ((ret = xd3_encode_bits (stream, & output, & bstate,\n\t\t\t\t  DJW_SECTORSZ_BITS,\n\t\t\t\t  (sector_size/DJW_SECTORSZ_MULT)-1)))\n\t{\n\t  goto failure;\n\t}\n\n      /* Dynamic allocation. */\n      if (gbest == NULL)\n\t{\n\t  if ((gbest = (uint8_t*) xd3_alloc (stream, gbest_max, 1)) == NULL)\n\t    {\n\t      ret = ENOMEM;\n\t      goto failure;\n\t    }\n\t}\n\n      if (gbest_mtf == NULL)\n\t{\n\t  if ((gbest_mtf = (uint8_t*) xd3_alloc (stream, gbest_max, 1)) == NULL)\n\t    {\n\t      ret = ENOMEM;\n\t      goto failure;\n\t    }\n\t}\n\n      /* OPT: Some of the inner loops can be optimized, as shown in bzip2 */\n\n      /* Generate initial code length tables. */\n      for (gp = 0; gp < groups; gp += 1)\n\t{\n\t  djw_weight sum  = 0;\n\t  djw_weight goal = left / (groups - gp);\n\n\t  IF_DEBUG2 (usize_t nz = 0);\n\n\t  /* Due to the single-code granularity of this distribution, it may\n\t   * be that we can't generate a distribution for each group.  In that\n\t   * case subtract one group and try again.  If (inefficient), we're\n\t   * testing group behavior, so don't mess things up. */\n\t  if (goal == 0 && !cfg->inefficient)\n\t    {\n\t      IF_DEBUG2 (DP(RINT \"too many groups (%\"W\"u), dropping one\\n\",\n\t\t\t    groups));\n\t      groups -= 1;\n\t      goto regroup;\n\t    }\n\n\t  /* Sum == goal is possible when (cfg->inefficient)... */\n\t  while (sum < goal)\n\t    {\n\t      XD3_ASSERT (sym2 < ALPHABET_SIZE);\n\t      IF_DEBUG2 (nz += real_freq[sym2] != 0);\n\t      sum += real_freq[sym2++];\n\t    }\n\n\t  IF_DEBUG2(DP(RINT \"group %\"W\"u has symbols %\"W\"u..%\"W\"u (%\"W\"u non-zero) \"\n\t\t       \"(%u/%\"W\"u = %.3f)\\n\",\n\t\t       gp, sym1, sym2, nz, sum,\n\t\t       input_bytes, sum / (double)input_bytes););\n\n\t  for (s = 0; s < ALPHABET_SIZE; s += 1)\n\t    {\n\t      evolve_clen[gp][s] = (s >= sym1 && s <= sym2) ? 1 : 16;\n\t    }\n\n\t  left -= sum;\n\t  sym1  = sym2+1;\n\t}\n\n    repeat:\n\n      niter += 1;\n      gbest_no = 0;\n      memset (evolve_freq, 0, sizeof (evolve_freq[0]) * groups);\n      IF_DEBUG2 (memset (gcount, 0, sizeof (gcount[0]) * groups));\n\n      /* For each input page (loop is irregular to allow non-pow2-size group\n       * size. */\n      in = input;\n      p  = in->base;\n\n      /* For each group-size sector. */\n      do\n\t{\n\t  const uint8_t *p0  = p;\n\t  xd3_output    *in0 = in;\n\t  usize_t best   = 0;\n\t  usize_t winner = 0;\n\n\t  /* Select best group for each sector, update evolve_freq. */\n\t  memset (gcost, 0, sizeof (gcost[0]) * groups);\n\n\t  /* For each byte in sector. */\n\t  for (gpcnt = 0; gpcnt < sector_size; gpcnt += 1)\n\t    {\n\t      /* For each group. */\n\t      for (gp = 0; gp < groups; gp += 1)\n\t\t{\n\t\t  gcost[gp] += evolve_clen[gp][*p];\n\t\t}\n\n\t      /* Check end-of-input-page. */\n#             define GP_PAGE()                \\\n\t      if ((usize_t)(++p - in->base) == in->next) \\\n\t\t{                             \\\n\t\t  in = in->next_page;         \\\n\t\t  if (in == NULL) { break; }  \\\n\t\t  p  = in->base;              \\\n\t\t}\n\n\t      GP_PAGE ();\n\t    }\n\n\t  /* Find min cost group for this sector */\n\t  best = USIZE_T_MAX;\n\t  for (gp = 0; gp < groups; gp += 1)\n\t    {\n\t      if (gcost[gp] < best) \n\t\t{ \n\t\t  best = gcost[gp]; \n\t\t  winner = gp; \n\t\t}\n\t    }\n\n\t  XD3_ASSERT(gbest_no < gbest_max);\n\t  gbest[gbest_no++] = winner;\n\t  IF_DEBUG2 (gcount[winner] += 1);\n\n\t  p  = p0;\n\t  in = in0;\n\n\t  /* Update group frequencies. */\n\t  for (gpcnt = 0; gpcnt < sector_size; gpcnt += 1)\n\t    {\n\t      evolve_freq[winner][*p] += 1;\n\n\t      GP_PAGE ();\n\t    }\n\t}\n      while (in != NULL);\n\n      XD3_ASSERT (gbest_no == gbest_max);\n\n      /* Recompute code lengths. */\n      output_bits = 0;\n      for (gp = 0; gp < groups; gp += 1)\n\t{\n\t  int i;\n\t  uint8_t evolve_zero[ALPHABET_SIZE];\n\t  int any_zeros = 0;\n\n\t  memset (evolve_zero, 0, sizeof (evolve_zero));\n\n\t  /* Cannot allow a zero clen when the real frequency is non-zero.\n\t   * Note: this means we are going to encode a fairly long code for\n\t   * these unused entries.  An improvement would be to implement a\n\t   * NOTUSED code for when these are actually zero, but this requires\n\t   * another data structure (evolve_zero) since we don't know when\n\t   * evolve_freq[i] == 0...  Briefly tested, looked worse. */\n\t  for (i = 0; i < ALPHABET_SIZE; i += 1)\n\t    {\n\t      if (evolve_freq[gp][i] == 0 && real_freq[i] != 0)\n\t\t{\n\t\t  evolve_freq[gp][i] = 1;\n\t\t  evolve_zero[i] = 1;\n\t\t  any_zeros = 1;\n\t\t}\n\t    }\n\n\t  output_bits += djw_build_prefix (evolve_freq[gp], evolve_clen[gp],\n\t\t\t\t\t   ALPHABET_SIZE, DJW_MAX_CODELEN);\n\n\t  /* The above faking of frequencies does not matter for the last\n\t   * iteration, but we don't know when that is yet.  However, it also\n\t   * breaks the output_bits computation.  Necessary for accuracy, and\n\t   * for the (output_bits==0) assert after all bits are output. */\n\t  if (any_zeros)\n\t    {\n\t      IF_DEBUG2 (usize_t save_total = output_bits);\n\n\t      for (i = 0; i < ALPHABET_SIZE; i += 1)\n\t\t{\n\t\t  if (evolve_zero[i]) { output_bits -= evolve_clen[gp][i]; }\n\t\t}\n\n\t      IF_DEBUG2 (DP(RINT \"evolve_zero reduced %\"W\"u bits in group %\"W\"u\\n\",\n\t\t\t    save_total - output_bits, gp));\n\t    }\n\t}\n\n      IF_DEBUG2(\n\tDP(RINT \"pass %\"W\"u total bits: %\"W\"u group uses: \", niter, output_bits);\n\tfor (gp = 0; gp < groups; gp += 1) { DP(RINT \"%\"W\"u \", gcount[gp]); }\n\tDP(RINT \"\\n\");\n\t);\n\n      /* End iteration. */\n\n      IF_DEBUG2 (if (niter > 1 && best_bits < output_bits) {\n\tDP(RINT \"iteration lost %\"W\"u bits\\n\", output_bits - best_bits); });\n\n      if (niter == 1 || (niter < DJW_MAX_ITER &&\n\t\t\t (best_bits - output_bits) >= DJW_MIN_IMPROVEMENT))\n\t{\n\t  best_bits = output_bits;\n\t  goto repeat;\n\t}\n\n      /* Efficiency check. */\n      if (output_bits + EFFICIENCY_BITS >= input_bits && ! cfg->inefficient)\n\t{\n\t  goto nosecond;\n\t}\n\n      IF_DEBUG2 (DP(RINT \"djw compression: %\"W\"u -> %0.3f\\n\",\n\t\t    input_bytes, output_bits / 8.0));\n\n      /* Encode: prefix */\n      {\n\tuint8_t     prefix_symbol[DJW_MAX_GROUPS * ALPHABET_SIZE];\n\tuint8_t     prefix_mtfsym[DJW_MAX_GROUPS * ALPHABET_SIZE];\n\tuint8_t     prefix_repcnt[DJW_MAX_GROUPS * ALPHABET_SIZE];\n\tdjw_prefix prefix;\n\n\tprefix.symbol = prefix_symbol;\n\tprefix.mtfsym = prefix_mtfsym;\n\tprefix.repcnt = prefix_repcnt;\n\n\tdjw_compute_multi_prefix (groups, evolve_clen, & prefix);\n\tif ((ret = djw_encode_prefix (stream, & output, & bstate, & prefix)))\n\t  {\n\t    goto failure;\n\t  }\n      }\n\n      /* Encode: selector frequencies */\n      {\n\t/* DJW_MAX_GROUPS +2 is for RUN_0, RUN_1 symbols. */\n\tdjw_weight gbest_freq[DJW_MAX_GROUPS+2];\n\tdjw_prefix gbest_prefix;\n\tusize_t i;\n\n\tgbest_prefix.scount = gbest_no;\n\tgbest_prefix.symbol = gbest;\n\tgbest_prefix.mtfsym = gbest_mtf;\n\n\tdjw_compute_selector_1_2 (& gbest_prefix, groups, gbest_freq);\n\n\tselect_bits =\n\t  djw_build_prefix (gbest_freq, gbest_clen, groups+1, DJW_MAX_GBCLEN);\n\tdjw_build_codes  (gbest_code, gbest_clen, groups+1, DJW_MAX_GBCLEN);\n\n\tfor (i = 0; i < groups+1; i += 1)\n\t  {\n\t    if ((ret = xd3_encode_bits (stream, & output, & bstate,\n\t\t\t\t\tDJW_GBCLEN_BITS, gbest_clen[i])))\n\t      {\n\t\tgoto failure;\n\t      }\n\t  }\n\n\tfor (i = 0; i < gbest_prefix.mcount; i += 1)\n\t  {\n\t    usize_t gp_mtf      = gbest_mtf[i];\n\t    usize_t gp_sel_bits = gbest_clen[gp_mtf];\n\t    usize_t gp_sel_code = gbest_code[gp_mtf];\n\n\t    XD3_ASSERT (gp_mtf < groups+1);\n\n\t    if ((ret = xd3_encode_bits (stream, & output, & bstate,\n\t\t\t\t\tgp_sel_bits, gp_sel_code)))\n\t      {\n\t\tgoto failure;\n\t      }\n\n\t    IF_DEBUG (select_bits -= gp_sel_bits);\n\t  }\n\n\tXD3_ASSERT (select_bits == 0);\n      }\n\n      /* Efficiency check. */\n      if (output_bits + select_bits + (8 * output->next) +\n\t  EFFICIENCY_BITS >= input_bits && ! cfg->inefficient)\n\t{\n\t  goto nosecond;\n\t}\n\n      /* Encode: data */\n      {\n\tusize_t evolve_code[DJW_MAX_GROUPS][ALPHABET_SIZE];\n\tusize_t sector = 0;\n\n\t/* Build code tables for each group. */\n\tfor (gp = 0; gp < groups; gp += 1)\n\t  {\n\t    djw_build_codes (evolve_code[gp], evolve_clen[gp],\n\t\t\t     ALPHABET_SIZE, DJW_MAX_CODELEN);\n\t  }\n\n\t/* Now loop over the input. */\n\tin = input;\n\tp  = in->base;\n\n\tdo\n\t  {\n\t    /* For each sector. */\n\t    usize_t   gp_best  = gbest[sector];\n\t    usize_t *gp_codes = evolve_code[gp_best];\n\t    uint8_t *gp_clens = evolve_clen[gp_best];\n\n\t    XD3_ASSERT (sector < gbest_no);\n\n\t    sector += 1;\n\n\t    /* Encode the sector data. */\n\t    for (gpcnt = 0; gpcnt < sector_size; gpcnt += 1)\n\t      {\n\t\tusize_t sym  = *p;\n\t\tusize_t bits = gp_clens[sym];\n\t\tusize_t code = gp_codes[sym];\n\n\t\tIF_DEBUG (output_bits -= bits);\n\n\t\tif ((ret = xd3_encode_bits (stream, & output, & bstate,\n\t\t\t\t\t    bits, code)))\n\t\t  {\n\t\t    goto failure;\n\t\t  }\n\n\t\tGP_PAGE ();\n\t      }\n\t  }\n\twhile (in != NULL);\n\n\tXD3_ASSERT (select_bits == 0);\n\tXD3_ASSERT (output_bits == 0);\n      }\n    }\n\n  ret = xd3_flush_bits (stream, & output, & bstate);\n\n  if (0)\n    {\n    nosecond:\n      stream->msg = \"secondary compression was inefficient\";\n      ret = XD3_NOSECOND;\n    }\n\n failure:\n\n  xd3_free (stream, gbest);\n  xd3_free (stream, gbest_mtf);\n  return ret;\n}\n#endif /* XD3_ENCODER */\n\n/*********************************************************************/\n/*                              DECODE                               */\n/*********************************************************************/\n\nstatic void\ndjw_build_decoder (xd3_stream    *stream,\n\t\t   usize_t        asize,\n\t\t   usize_t        abs_max,\n\t\t   const uint8_t *clen,\n\t\t   uint8_t       *inorder,\n\t\t   usize_t       *base,\n\t\t   usize_t       *limit,\n\t\t   usize_t       *min_clenp,\n\t\t   usize_t       *max_clenp)\n{\n  usize_t i, l;\n  const uint8_t *ci;\n  usize_t nr_clen [DJW_TOTAL_CODES];\n  usize_t tmp_base[DJW_TOTAL_CODES];\n  usize_t min_clen;\n  usize_t max_clen;\n\n  /* Assumption: the two temporary arrays are large enough to hold abs_max. */\n  XD3_ASSERT (abs_max <= DJW_MAX_CODELEN);\n\n  /* This looks something like the start of zlib's inftrees.c */\n  memset (nr_clen, 0, sizeof (nr_clen[0]) * (abs_max+1));\n\n  /* Count number of each code length */\n  i  = asize;\n  ci = clen;\n  do\n    {\n      /* Caller _must_ check that values are in-range.  Most of the time the\n       * caller decodes a specific number of bits, which imply the max value,\n       * and the other time the caller decodes a huffman value, which must be\n       * in-range.  Therefore, its an assertion and this function cannot\n       * otherwise fail. */\n      XD3_ASSERT (*ci <= abs_max);\n\n      nr_clen[*ci++]++;\n    }\n  while (--i != 0);\n\n  /* Compute min, max. */\n  for (i = 1; i <= abs_max; i += 1) { if (nr_clen[i]) { break; } }\n  min_clen = i;\n  for (i = abs_max; i != 0; i -= 1) { if (nr_clen[i]) { break; } }\n  max_clen = i;\n\n  /* Fill the BASE, LIMIT table. */\n  tmp_base[min_clen] = 0;\n  base[min_clen]     = 0;\n  limit[min_clen]    = nr_clen[min_clen] - 1;\n  for (i = min_clen + 1; i <= max_clen; i += 1)\n    {\n      usize_t last_limit = ((limit[i-1] + 1) << 1);\n      tmp_base[i] = tmp_base[i-1] + nr_clen[i-1];\n      limit[i]    = last_limit + nr_clen[i] - 1;\n      base[i]     = last_limit - tmp_base[i];\n    }\n\n  /* Fill the inorder array, canonically ordered codes. */\n  ci = clen;\n  for (i = 0; i < asize; i += 1)\n    {\n      if ((l = *ci++) != 0)\n\t{\n\t  inorder[tmp_base[l]++] = i;\n\t}\n    }\n\n  *min_clenp = min_clen;\n  *max_clenp = max_clen;\n}\n\nstatic inline int\ndjw_decode_symbol (xd3_stream     *stream,\n\t\t   bit_state      *bstate,\n\t\t   const uint8_t **input,\n\t\t   const uint8_t  *input_end,\n\t\t   const uint8_t  *inorder,\n\t\t   const usize_t  *base,\n\t\t   const usize_t  *limit,\n\t\t   usize_t         min_clen,\n\t\t   usize_t         max_clen,\n\t\t   usize_t         *sym,\n\t\t   usize_t          max_sym)\n{\n  usize_t code = 0;\n  usize_t bits = 0;\n\n  /* OPT: Supposedly a small lookup table improves speed here... */\n\n  /* Code outline is similar to xd3_decode_bits... */\n  if (bstate->cur_mask == 0x100) { goto next_byte; }\n\n  for (;;)\n    {\n      do\n\t{\n\t  if (bits == max_clen) { goto corrupt; }\n\n\t  bits += 1;\n\t  code  = (code << 1);\n\n\t  if (bstate->cur_byte & bstate->cur_mask) { code |= 1; }\n\n\t  bstate->cur_mask <<= 1;\n\n\t  if (bits >= min_clen && code <= limit[bits]) { goto done; }\n\t}\n      while (bstate->cur_mask != 0x100);\n\n    next_byte:\n\n      if (*input == input_end)\n\t{\n\t  stream->msg = \"secondary decoder end of input\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      bstate->cur_byte = *(*input)++;\n      bstate->cur_mask = 1;\n    }\n\n done:\n\n  if (base[bits] <= code)\n    {\n      usize_t offset = code - base[bits];\n\n      if (offset <= max_sym)\n\t{\n\t  IF_DEBUG2 (DP(RINT \"(j) %\"W\"u \", code));\n\t  *sym = inorder[offset];\n\t  return 0;\n\t}\n    }\n\n corrupt:\n  stream->msg = \"secondary decoder invalid code\";\n  return XD3_INVALID_INPUT;\n}\n\nstatic int\ndjw_decode_clclen (xd3_stream     *stream,\n\t\t   bit_state      *bstate,\n\t\t   const uint8_t **input,\n\t\t   const uint8_t  *input_end,\n\t\t   uint8_t        *cl_inorder,\n\t\t   usize_t        *cl_base,\n\t\t   usize_t        *cl_limit,\n\t\t   usize_t        *cl_minlen,\n\t\t   usize_t        *cl_maxlen,\n\t\t   uint8_t        *cl_mtf)\n{\n  int ret;\n  uint8_t cl_clen[DJW_TOTAL_CODES];\n  usize_t num_codes, value;\n  usize_t i;\n\n  /* How many extra code lengths to encode. */\n  if ((ret = xd3_decode_bits (stream, bstate, input,\n\t\t\t      input_end, DJW_EXTRA_CODE_BITS, & num_codes)))\n    {\n      return ret;\n    }\n\n  num_codes += DJW_EXTRA_12OFFSET;\n\n  /* Read num_codes. */\n  for (i = 0; i < num_codes; i += 1)\n    {\n      if ((ret = xd3_decode_bits (stream, bstate, input,\n\t\t\t\t  input_end, DJW_CLCLEN_BITS, & value)))\n\t{\n\t  return ret;\n\t}\n\n      cl_clen[i] = value;\n    }\n\n  /* Set the rest to zero. */\n  for (; i < DJW_TOTAL_CODES; i += 1) { cl_clen[i] = 0; }\n\n  /* No need to check for in-range clen values, because: */\n  XD3_ASSERT (1 << DJW_CLCLEN_BITS == DJW_MAX_CLCLEN + 1);\n\n  /* Build the code-length decoder. */\n  djw_build_decoder (stream, DJW_TOTAL_CODES, DJW_MAX_CLCLEN,\n\t\t     cl_clen, cl_inorder, cl_base,\n\t\t     cl_limit, cl_minlen, cl_maxlen);\n\n  /* Initialize the MTF state. */\n  djw_init_clen_mtf_1_2 (cl_mtf);\n\n  return 0;\n}\n\nstatic inline int\ndjw_decode_1_2 (xd3_stream     *stream,\n\t\tbit_state      *bstate,\n\t\tconst uint8_t **input,\n\t\tconst uint8_t  *input_end,\n\t\tconst uint8_t  *inorder,\n\t\tconst usize_t  *base,\n\t\tconst usize_t  *limit,\n\t\tconst usize_t  *minlen,\n\t\tconst usize_t  *maxlen,\n\t\tuint8_t        *mtfvals,\n\t\tusize_t         elts,\n\t\tusize_t         skip_offset,\n\t\tuint8_t        *values)\n{\n  usize_t n = 0, rep = 0, mtf = 0, s = 0;\n  int ret;\n  \n  while (n < elts)\n    {\n      /* Special case inside generic code: CLEN only: If not the first group,\n       * we already know the zero frequencies. */\n      if (skip_offset != 0 && n >= skip_offset && values[n-skip_offset] == 0)\n\t{\n\t  values[n++] = 0;\n\t  continue;\n\t}\n\n      /* Repeat last symbol. */\n      if (rep != 0)\n\t{\n\t  values[n++] = mtfvals[0];\n\t  rep -= 1;\n\t  continue;\n\t}\n\n      /* Symbol following last repeat code. */\n      if (mtf != 0)\n\t{\n\t  usize_t sym = djw_update_mtf (mtfvals, mtf);\n\t  values[n++] = sym;\n\t  mtf = 0;\n\t  continue;\n\t}\n\n      /* Decode next symbol/repeat code. */\n      if ((ret = djw_decode_symbol (stream, bstate, input, input_end,\n\t\t\t\t    inorder, base, limit, *minlen, *maxlen,\n\t\t\t\t    & mtf, DJW_TOTAL_CODES))) { return ret; }\n\n      if (mtf <= RUN_1)\n\t{\n\t  /* Repetition. */\n\t  rep = ((mtf + 1) << s);\n\t  mtf = 0;\n\t  s += 1;\n\t}\n      else\n\t{\n\t  /* Remove the RUN_1 MTF offset. */\n\t  mtf -= 1;\n\t  s = 0;\n\t}\n    }\n\n  /* If (rep != 0) there were too many codes received. */\n  if (rep != 0)\n    {\n      stream->msg = \"secondary decoder invalid repeat code\";\n      return XD3_INVALID_INPUT;\n    }\n  \n  return 0;\n}\n\nstatic inline int\ndjw_decode_prefix (xd3_stream     *stream,\n\t\t   bit_state      *bstate,\n\t\t   const uint8_t **input,\n\t\t   const uint8_t  *input_end,\n\t\t   const uint8_t  *cl_inorder,\n\t\t   const usize_t  *cl_base,\n\t\t   const usize_t  *cl_limit,\n\t\t   const usize_t  *cl_minlen,\n\t\t   const usize_t  *cl_maxlen,\n\t\t   uint8_t        *cl_mtf,\n\t\t   usize_t         groups,\n\t\t   uint8_t        *clen)\n{\n  return djw_decode_1_2 (stream, bstate, input, input_end,\n\t\t\t cl_inorder, cl_base, cl_limit,\n\t\t\t cl_minlen, cl_maxlen, cl_mtf,\n\t\t\t ALPHABET_SIZE * groups, ALPHABET_SIZE, clen);\n}\n\nstatic int\nxd3_decode_huff (xd3_stream     *stream,\n\t\t djw_stream    *h,\n\t\t const uint8_t **input_pos,\n\t\t const uint8_t  *const input_end,\n\t\t uint8_t       **output_pos,\n\t\t const uint8_t  *const output_end)\n{\n  const uint8_t *input = *input_pos;\n  uint8_t  *output = *output_pos;\n  bit_state bstate = BIT_STATE_DECODE_INIT;\n  uint8_t  *sel_group = NULL;\n  usize_t    groups, gp;\n  usize_t    output_bytes = (usize_t)(output_end - output);\n  usize_t    sector_size;\n  usize_t    sectors;\n  int ret;\n\n  /* Invalid input. */\n  if (output_bytes == 0)\n    {\n      stream->msg = \"secondary decoder invalid input\";\n      return XD3_INVALID_INPUT;\n    }\n\n  /* Decode: number of groups */\n  if ((ret = xd3_decode_bits (stream, & bstate, & input,\n\t\t\t      input_end, DJW_GROUP_BITS, & groups)))\n    {\n      goto fail;\n    }\n\n  groups += 1;\n\n  if (groups > 1)\n    {\n      /* Decode: group size */\n      if ((ret = xd3_decode_bits (stream, & bstate, & input,\n\t\t\t\t  input_end, DJW_SECTORSZ_BITS,\n\t\t\t\t  & sector_size))) { goto fail; }\n      \n      sector_size = (sector_size + 1) * DJW_SECTORSZ_MULT;\n    }\n  else\n    {\n      /* Default for groups == 1 */\n      sector_size = output_bytes;\n    }\n\n  sectors = 1 + (output_bytes - 1) / sector_size;\n\n  /* TODO: In the case of groups==1, lots of extra stack space gets used here.\n   * Could dynamically allocate this memory, which would help with excess\n   * parameter passing, too.  Passing too many parameters in this file,\n   * simplify it! */\n\n  /* Outer scope: per-group symbol decoder tables. */\n  {\n    uint8_t inorder[DJW_MAX_GROUPS][ALPHABET_SIZE];\n    usize_t base   [DJW_MAX_GROUPS][DJW_TOTAL_CODES];\n    usize_t limit  [DJW_MAX_GROUPS][DJW_TOTAL_CODES];\n    usize_t minlen [DJW_MAX_GROUPS];\n    usize_t maxlen [DJW_MAX_GROUPS];\n\n    /* Nested scope: code length decoder tables. */\n    {\n      uint8_t clen      [DJW_MAX_GROUPS][ALPHABET_SIZE];\n      uint8_t cl_inorder[DJW_TOTAL_CODES];\n      usize_t cl_base   [DJW_MAX_CLCLEN+2];\n      usize_t cl_limit  [DJW_MAX_CLCLEN+2];\n      uint8_t cl_mtf    [DJW_TOTAL_CODES];\n      usize_t cl_minlen;\n      usize_t cl_maxlen;\n\n      /* Compute the code length decoder. */\n      if ((ret = djw_decode_clclen (stream, & bstate, & input, input_end,\n\t\t\t\t    cl_inorder, cl_base, cl_limit, & cl_minlen,\n\t\t\t\t    & cl_maxlen, cl_mtf))) { goto fail; }\n\n      /* Now decode each group decoder. */\n      if ((ret = djw_decode_prefix (stream, & bstate, & input, input_end,\n\t\t\t\t    cl_inorder, cl_base, cl_limit,\n\t\t\t\t    & cl_minlen, & cl_maxlen, cl_mtf,\n\t\t\t\t    groups, clen[0]))) { goto fail; }\n\n      /* Prepare the actual decoding tables. */\n      for (gp = 0; gp < groups; gp += 1)\n\t{\n\t  djw_build_decoder (stream, ALPHABET_SIZE, DJW_MAX_CODELEN,\n\t\t\t     clen[gp], inorder[gp], base[gp], limit[gp],\n\t\t\t     & minlen[gp], & maxlen[gp]);\n\t}\n    }\n\n    /* Decode: selector clens. */\n    {\n      uint8_t sel_inorder[DJW_MAX_GROUPS+2];\n      usize_t sel_base   [DJW_MAX_GBCLEN+2];\n      usize_t sel_limit  [DJW_MAX_GBCLEN+2];\n      uint8_t sel_mtf    [DJW_MAX_GROUPS+2];\n      usize_t sel_minlen;\n      usize_t sel_maxlen;\n\n      /* Setup group selection. */\n      if (groups > 1)\n\t{\n\t  uint8_t sel_clen[DJW_MAX_GROUPS+1];\n\n\t  for (gp = 0; gp < groups+1; gp += 1)\n\t    {\n\t      usize_t value;\n\n\t      if ((ret = xd3_decode_bits (stream, & bstate, & input,\n\t\t\t\t\t  input_end, DJW_GBCLEN_BITS,\n\t\t\t\t\t  & value))) { goto fail; }\n\n\t      sel_clen[gp] = value;\n\t      sel_mtf[gp]  = gp;\n\t    }\n\n\t  if ((sel_group = (uint8_t*) xd3_alloc (stream, sectors, 1)) == NULL)\n\t    {\n\t      ret = ENOMEM;\n\t      goto fail;\n\t    }\n\n\t  djw_build_decoder (stream, groups+1, DJW_MAX_GBCLEN, sel_clen,\n\t\t\t     sel_inorder, sel_base, sel_limit,\n\t\t\t     & sel_minlen, & sel_maxlen);\n\n\t  if ((ret = djw_decode_1_2 (stream, & bstate, & input, input_end,\n\t\t\t\t     sel_inorder, sel_base,\n\t\t\t\t     sel_limit, & sel_minlen,\n\t\t\t\t     & sel_maxlen, sel_mtf,\n\t\t\t\t     sectors, 0, sel_group))) { goto fail; }\n\t}\n\n      /* Now decode each sector. */\n      {\n\t/* Initialize for (groups==1) case. */\n\tuint8_t *gp_inorder = inorder[0]; \n\tusize_t *gp_base    = base[0];\n\tusize_t *gp_limit   = limit[0];\n\tusize_t  gp_minlen  = minlen[0];\n\tusize_t  gp_maxlen  = maxlen[0];\n\tusize_t c;\n\n\tfor (c = 0; c < sectors; c += 1)\n\t  {\n\t    usize_t n;\n\n\t    if (groups >= 2)\n\t      {\n\t\tgp = sel_group[c];\n\n\t\tXD3_ASSERT (gp < groups);\n\n\t\tgp_inorder = inorder[gp];\n\t\tgp_base    = base[gp];\n\t\tgp_limit   = limit[gp];\n\t\tgp_minlen  = minlen[gp];\n\t\tgp_maxlen  = maxlen[gp];\n\t      }\n\n\t    if (output_end < output)\n\t      {\n\t\tstream->msg = \"secondary decoder invalid input\";\n\t\treturn XD3_INVALID_INPUT;\n\t      }\n\t    \n\t    /* Decode next sector. */\n\t    n = xd3_min (sector_size, (usize_t) (output_end - output));\n\n\t    do\n\t      {\n\t\tusize_t sym;\n\n\t\tif ((ret = djw_decode_symbol (stream, & bstate,\n\t\t\t\t\t      & input, input_end,\n\t\t\t\t\t      gp_inorder, gp_base,\n\t\t\t\t\t      gp_limit, gp_minlen, gp_maxlen,\n\t\t\t\t\t      & sym, ALPHABET_SIZE)))\n\t\t  {\n\t\t    goto fail;\n\t\t  }\n\n\t\t*output++ = sym;\n\t      }\n\t    while (--n);\n\t  }\n      }\n    }\n  }\n\n  IF_REGRESSION (if ((ret = xd3_test_clean_bits (stream, & bstate)))\n\t\t   { goto fail; });\n  XD3_ASSERT (ret == 0);\n\n fail:\n  xd3_free (stream, sel_group);\n\n  (*input_pos) = input;\n  (*output_pos) = output;\n  return ret;\n}\n\n#endif\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-fgk.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n   For demonstration purposes only.\n */\n\n#ifndef _XDELTA3_FGK_h_\n#define _XDELTA3_FGK_h_\n\n/* An implementation of the FGK algorithm described by D.E. Knuth in\n * \"Dynamic Huffman Coding\" in Journal of Algorithms 6. */\n\n/* A 32bit counter (fgk_weight) is used as the frequency counter for\n * nodes in the huffman tree.  TODO: Need oto test for overflow and/or\n * reset stats. */\n\ntypedef struct _fgk_stream fgk_stream;\ntypedef struct _fgk_node   fgk_node;\ntypedef struct _fgk_block  fgk_block;\ntypedef unsigned int       fgk_bit;\ntypedef uint32_t           fgk_weight;\n\nstruct _fgk_block {\n  union {\n    fgk_node  *un_leader;\n    fgk_block *un_freeptr;\n  } un;\n};\n\n#define block_leader  un.un_leader\n#define block_freeptr un.un_freeptr\n\n/* The code can also support fixed huffman encoding/decoding. */\n#define IS_ADAPTIVE 1\n\n/* weight is a count of the number of times this element has been seen\n * in the current encoding/decoding.  parent, right_child, and\n * left_child are pointers defining the tree structure.  right and\n * left point to neighbors in an ordered sequence of weights.  The\n * left child of a node is always guaranteed to have weight not\n * greater than its sibling.  fgk_blockLeader points to the element\n * with the same weight as itself which is closest to the next\n * increasing weight block.  */\nstruct _fgk_node\n{\n  fgk_weight  weight;\n  fgk_node   *parent;\n  fgk_node   *left_child;\n  fgk_node   *right_child;\n  fgk_node   *left;\n  fgk_node   *right;\n  fgk_block  *my_block;\n};\n\n/* alphabet_size is the a count of the number of possible leaves in\n * the huffman tree.  The number of total nodes counting internal\n * nodes is ((2 * alphabet_size) - 1).  zero_freq_count is the number\n * of elements remaining which have zero frequency.  zero_freq_exp and\n * zero_freq_rem satisfy the equation zero_freq_count =\n * 2^zero_freq_exp + zero_freq_rem.  root_node is the root of the\n * tree, which is initialized to a node with zero frequency and\n * contains the 0th such element.  free_node contains a pointer to the\n * next available fgk_node space.  alphabet contains all the elements\n * and is indexed by N.  remaining_zeros points to the head of the\n * list of zeros.  */\nstruct _fgk_stream\n{\n  usize_t alphabet_size;\n  usize_t zero_freq_count;\n  usize_t zero_freq_exp;\n  usize_t zero_freq_rem;\n  usize_t coded_depth;\n\n  usize_t total_nodes;\n  usize_t total_blocks;\n\n  fgk_bit *coded_bits;\n\n  fgk_block *block_array;\n  fgk_block *free_block;\n\n  fgk_node *decode_ptr;\n  fgk_node *remaining_zeros;\n  fgk_node *alphabet;\n  fgk_node *root_node;\n  fgk_node *free_node;\n};\n\n/*********************************************************************/\n/*                             Encoder                               */\n/*********************************************************************/\n\nstatic fgk_stream*     fgk_alloc           (xd3_stream *stream /*, usize_t alphabet_size */);\nstatic int             fgk_init            (xd3_stream *stream,\n\t\t\t\t\t    fgk_stream *h, \n\t\t\t\t\t    int is_encode);\nstatic usize_t         fgk_encode_data     (fgk_stream *h,\n\t\t\t\t\t    usize_t    n);\nstatic inline fgk_bit  fgk_get_encoded_bit (fgk_stream *h);\n\nstatic int             xd3_encode_fgk      (xd3_stream  *stream,\n\t\t\t\t\t    fgk_stream  *sec_stream,\n\t\t\t\t\t    xd3_output  *input,\n\t\t\t\t\t    xd3_output  *output,\n\t\t\t\t\t    xd3_sec_cfg *cfg);\n\n/*********************************************************************/\n/* \t\t\t       Decoder                               */\n/*********************************************************************/\n\nstatic inline int      fgk_decode_bit      (fgk_stream *h,\n\t\t\t\t\t    fgk_bit     b);\nstatic usize_t         fgk_decode_data     (fgk_stream *h);\nstatic void            fgk_destroy         (xd3_stream *stream,\n\t\t\t\t\t    fgk_stream *h);\n\nstatic int             xd3_decode_fgk      (xd3_stream     *stream,\n\t\t\t\t\t    fgk_stream     *sec_stream,\n\t\t\t\t\t    const uint8_t **input,\n\t\t\t\t\t    const uint8_t  *const input_end,\n\t\t\t\t\t    uint8_t       **output,\n\t\t\t\t\t    const uint8_t  *const output_end);\n\n/*********************************************************************/\n/* \t\t\t       Private                               */\n/*********************************************************************/\n\nstatic unsigned int fgk_find_nth_zero        (fgk_stream *h, usize_t n);\nstatic usize_t      fgk_nth_zero             (fgk_stream *h, usize_t n);\nstatic void         fgk_update_tree          (fgk_stream *h, usize_t n);\nstatic fgk_node*    fgk_increase_zero_weight (fgk_stream *h, usize_t n);\nstatic void         fgk_eliminate_zero       (fgk_stream* h, fgk_node *node);\nstatic void         fgk_move_right           (fgk_stream *h, fgk_node *node);\nstatic void         fgk_promote              (fgk_stream *h, fgk_node *node);\nstatic void         fgk_init_node            (fgk_node *node, usize_t i, usize_t size);\nstatic fgk_block*   fgk_make_block           (fgk_stream *h, fgk_node *l);\nstatic void         fgk_free_block           (fgk_stream *h, fgk_block *b);\nstatic void         fgk_factor_remaining     (fgk_stream *h);\nstatic inline void  fgk_swap_ptrs            (fgk_node **one, fgk_node **two);\n\n/*********************************************************************/\n/* \t\t\t    Basic Routines                           */\n/*********************************************************************/\n\n/* returns an initialized huffman encoder for an alphabet with the\n * given size.  returns NULL if enough memory cannot be allocated */\nstatic fgk_stream* fgk_alloc (xd3_stream *stream /*, int alphabet_size0 */)\n{\n  usize_t alphabet_size0 = ALPHABET_SIZE;\n  fgk_stream *h;\n\n  if ((h = (fgk_stream*) xd3_alloc (stream, 1, sizeof (fgk_stream))) == NULL)\n    {\n      return NULL;\n    }\n\n  h->total_nodes  = (2 * alphabet_size0) - 1;\n  h->total_blocks = (2 * h->total_nodes);\n  h->alphabet     = (fgk_node*)  xd3_alloc (stream, h->total_nodes,    sizeof (fgk_node));\n  h->block_array  = (fgk_block*) xd3_alloc (stream, h->total_blocks,   sizeof (fgk_block));\n  h->coded_bits   = (fgk_bit*)   xd3_alloc (stream, alphabet_size0, sizeof (fgk_bit));\n\n  if (h->coded_bits  == NULL ||\n      h->alphabet    == NULL ||\n      h->block_array == NULL)\n    {\n      fgk_destroy (stream, h);\n      return NULL;\n    }\n\n  h->alphabet_size   = alphabet_size0;\n\n  return h;\n}\n\nstatic int fgk_init (xd3_stream *stream, fgk_stream *h, int is_encode)\n{\n  usize_t ui;\n  ssize_t si;\n\n  h->root_node       = h->alphabet;\n  h->decode_ptr      = h->root_node;\n  h->free_node       = h->alphabet + h->alphabet_size;\n  h->remaining_zeros = h->alphabet;\n  h->coded_depth     = 0;\n  h->zero_freq_count = h->alphabet_size + 2;\n\n  /* after two calls to factor_remaining, zero_freq_count == alphabet_size */\n  fgk_factor_remaining(h); /* set ZFE and ZFR */\n  fgk_factor_remaining(h); /* set ZFDB according to prev state */\n\n  IF_DEBUG (memset (h->alphabet, 0, sizeof (h->alphabet[0]) * h->total_nodes));\n\n  for (ui = 0; ui < h->total_blocks-1; ui += 1)\n    {\n      h->block_array[ui].block_freeptr = &h->block_array[ui + 1];\n    }\n\n  h->block_array[h->total_blocks - 1].block_freeptr = NULL;\n  h->free_block = h->block_array;\n\n  /* Zero frequency nodes are inserted in the first alphabet_size\n   * positions, with Value, weight, and a pointer to the next zero\n   * frequency node.  */\n  for (si = h->alphabet_size - 1; si >= 0; si -= 1)\n    {\n      fgk_init_node (h->alphabet + si, (usize_t) si, h->alphabet_size);\n    }\n\n  return 0;\n}\n\nstatic void fgk_swap_ptrs(fgk_node **one, fgk_node **two)\n{\n  fgk_node *tmp = *one;\n  *one = *two;\n  *two = tmp;\n}\n\n/* Takes huffman transmitter h and n, the nth elt in the alphabet, and\n * returns the number of required to encode n. */\nstatic usize_t fgk_encode_data (fgk_stream* h, usize_t n)\n{\n  fgk_node *target_ptr = h->alphabet + n;\n\n  XD3_ASSERT (n < h->alphabet_size);\n\n  h->coded_depth = 0;\n\n  /* First encode the binary representation of the nth remaining\n   * zero frequency element in reverse such that bit, which will be\n   * encoded from h->coded_depth down to 0 will arrive in increasing\n   * order following the tree path.  If there is only one left, it\n   * is not neccesary to encode these bits. */\n  if (IS_ADAPTIVE && target_ptr->weight == 0)\n    {\n      usize_t where, shift;\n      usize_t bits;\n\n      where = fgk_find_nth_zero(h, n);\n      shift = 1;\n\n      if (h->zero_freq_rem == 0)\n\t{\n\t  bits = h->zero_freq_exp;\n\t}\n      else\n\t{\n\t  bits = h->zero_freq_exp + 1;\n\t}\n\n      while (bits > 0)\n\t{\n\t  h->coded_bits[h->coded_depth++] = (shift & where) && 1;\n\n\t  bits   -= 1;\n\t  shift <<= 1;\n\t};\n\n      target_ptr = h->remaining_zeros;\n    }\n\n  /* The path from root to node is filled into coded_bits in reverse so\n   * that it is encoded in the right order */\n  while (target_ptr != h->root_node)\n    {\n      h->coded_bits[h->coded_depth++] = (target_ptr->parent->right_child == target_ptr);\n\n      target_ptr = target_ptr->parent;\n    }\n\n  if (IS_ADAPTIVE)\n    {\n      fgk_update_tree(h, n);\n    }\n\n  return h->coded_depth;\n}\n\n/* Should be called as many times as fgk_encode_data returns.\n */\nstatic inline fgk_bit fgk_get_encoded_bit (fgk_stream *h)\n{\n  XD3_ASSERT (h->coded_depth > 0);\n\n  return h->coded_bits[--h->coded_depth];\n}\n\n/* This procedure updates the tree after alphabet[n] has been encoded\n * or decoded.\n */\nstatic void fgk_update_tree (fgk_stream *h, usize_t n)\n{\n  fgk_node *incr_node;\n\n  if (h->alphabet[n].weight == 0)\n    {\n      incr_node = fgk_increase_zero_weight (h, n);\n    }\n  else\n    {\n      incr_node = h->alphabet + n;\n    }\n\n  while (incr_node != h->root_node)\n    {\n      fgk_move_right (h, incr_node);\n      fgk_promote    (h, incr_node);\n      incr_node->weight += 1;   /* incr the parent */\n      incr_node = incr_node->parent; /* repeat */\n    }\n\n  h->root_node->weight += 1;\n}\n\nstatic void fgk_move_right (fgk_stream *h, fgk_node *move_fwd)\n{\n  fgk_node **fwd_par_ptr, **back_par_ptr;\n  fgk_node *move_back, *tmp;\n\n  move_back = move_fwd->my_block->block_leader;\n\n  if (move_fwd         == move_back ||\n      move_fwd->parent == move_back ||\n      move_fwd->weight == 0)\n    {\n      return;\n    }\n\n  move_back->right->left = move_fwd;\n\n  if (move_fwd->left)\n    {\n      move_fwd->left->right = move_back;\n    }\n\n  tmp = move_fwd->right;\n  move_fwd->right = move_back->right;\n\n  if (tmp == move_back)\n    {\n      move_back->right = move_fwd;\n    }\n  else\n    {\n      tmp->left = move_back;\n      move_back->right = tmp;\n    }\n\n  tmp = move_back->left;\n  move_back->left = move_fwd->left;\n\n  if (tmp == move_fwd)\n    {\n      move_fwd->left = move_back;\n    }\n  else\n    {\n      tmp->right = move_fwd;\n      move_fwd->left = tmp;\n    }\n\n  if (move_fwd->parent->right_child == move_fwd)\n    {\n      fwd_par_ptr = &move_fwd->parent->right_child;\n    }\n  else\n    {\n      fwd_par_ptr = &move_fwd->parent->left_child;\n    }\n\n  if (move_back->parent->right_child == move_back)\n    {\n      back_par_ptr = &move_back->parent->right_child;\n    }\n  else\n    {\n      back_par_ptr = &move_back->parent->left_child;\n    }\n\n  fgk_swap_ptrs (&move_fwd->parent, &move_back->parent);\n  fgk_swap_ptrs (fwd_par_ptr, back_par_ptr);\n\n  move_fwd->my_block->block_leader = move_fwd;\n}\n\n/* Shifts node, the leader of its block, into the next block. */\nstatic void fgk_promote (fgk_stream *h, fgk_node *node)\n{\n  fgk_node *my_left, *my_right;\n  fgk_block *cur_block;\n\n  my_right  = node->right;\n  my_left   = node->left;\n  cur_block = node->my_block;\n\n  if (node->weight == 0)\n    {\n      return;\n    }\n\n  /* if left is right child, parent of remaining zeros case (?), means parent\n   * has same weight as right child. */\n  if (my_left == node->right_child &&\n      node->left_child &&\n      node->left_child->weight == 0)\n    {\n      XD3_ASSERT (node->left_child == h->remaining_zeros);\n      XD3_ASSERT (node->right_child->weight == (node->weight+1)); /* child weight was already incremented */\n      \n      if (node->weight == (my_right->weight - 1) && my_right != h->root_node)\n\t{\n\t  fgk_free_block (h, cur_block);\n\t  node->my_block    = my_right->my_block;\n\t  my_left->my_block = my_right->my_block;\n\t}\n\n      return;\n    }\n\n  if (my_left == h->remaining_zeros)\n    {\n      return;\n    }\n\n  /* true if not the leftmost node */\n  if (my_left->my_block == cur_block)\n    {\n      my_left->my_block->block_leader = my_left;\n    }\n  else\n    {\n      fgk_free_block (h, cur_block);\n    }\n\n  /* node->parent != my_right */\n  if ((node->weight == (my_right->weight - 1)) && (my_right != h->root_node))\n    {\n      node->my_block = my_right->my_block;\n    }\n  else\n    {\n      node->my_block = fgk_make_block (h, node);\n    }\n}\n\n/* When an element is seen the first time this is called to remove it from the list of\n * zero weight elements and introduce a new internal node to the tree.  */\nstatic fgk_node* fgk_increase_zero_weight (fgk_stream *h, usize_t n)\n{\n  fgk_node *this_zero, *new_internal, *zero_ptr;\n\n  this_zero = h->alphabet + n;\n\n  if (h->zero_freq_count == 1)\n    {\n      /* this is the last one */\n      this_zero->right_child = NULL;\n\n      if (this_zero->right->weight == 1)\n\t{\n\t  this_zero->my_block = this_zero->right->my_block;\n\t}\n      else\n\t{\n\t  this_zero->my_block = fgk_make_block (h, this_zero);\n\t}\n\n      h->remaining_zeros = NULL;\n\n      return this_zero;\n    }\n\n  zero_ptr = h->remaining_zeros;\n\n  new_internal = h->free_node++;\n\n  new_internal->parent      = zero_ptr->parent;\n  new_internal->right       = zero_ptr->right;\n  new_internal->weight      = 0;\n  new_internal->right_child = this_zero;\n  new_internal->left        = this_zero;\n\n  if (h->remaining_zeros == h->root_node)\n    {\n      /* This is the first element to be coded */\n      h->root_node           = new_internal;\n      this_zero->my_block    = fgk_make_block (h, this_zero);\n      new_internal->my_block = fgk_make_block (h, new_internal);\n    }\n  else\n    {\n      new_internal->right->left = new_internal;\n\n      if (zero_ptr->parent->right_child == zero_ptr)\n\t{\n\t  zero_ptr->parent->right_child = new_internal;\n\t}\n      else\n\t{\n\t  zero_ptr->parent->left_child = new_internal;\n\t}\n\n      if (new_internal->right->weight == 1)\n\t{\n\t  new_internal->my_block = new_internal->right->my_block;\n\t}\n      else\n\t{\n\t  new_internal->my_block = fgk_make_block (h, new_internal);\n\t}\n\n      this_zero->my_block = new_internal->my_block;\n    }\n\n  fgk_eliminate_zero (h, this_zero);\n\n  new_internal->left_child = h->remaining_zeros;\n\n  this_zero->right       = new_internal;\n  this_zero->left        = h->remaining_zeros;\n  this_zero->parent      = new_internal;\n  this_zero->left_child  = NULL;\n  this_zero->right_child = NULL;\n\n  h->remaining_zeros->parent = new_internal;\n  h->remaining_zeros->right  = this_zero;\n\n  return this_zero;\n}\n\n/* When a zero frequency element is encoded, it is followed by the\n * binary representation of the index into the remaining elements.\n * Sets a cache to the element before it so that it can be removed\n * without calling this procedure again.  */\nstatic unsigned int fgk_find_nth_zero (fgk_stream* h, usize_t n)\n{\n  fgk_node *target_ptr = h->alphabet + n;\n  fgk_node *head_ptr = h->remaining_zeros;\n  unsigned int idx = 0;\n\n  while (target_ptr != head_ptr)\n    {\n      head_ptr = head_ptr->right_child;\n      idx += 1;\n    }\n\n  return idx;\n}\n\n/* Splices node out of the list of zeros. */\nstatic void fgk_eliminate_zero (fgk_stream* h, fgk_node *node)\n{\n  if (h->zero_freq_count == 1)\n    {\n      return;\n    }\n\n  fgk_factor_remaining(h);\n\n  if (node->left_child == NULL)\n    {\n      h->remaining_zeros = h->remaining_zeros->right_child;\n      h->remaining_zeros->left_child = NULL;\n    }\n  else if (node->right_child == NULL)\n    {\n      node->left_child->right_child = NULL;\n    }\n  else\n    {\n      node->right_child->left_child = node->left_child;\n      node->left_child->right_child = node->right_child;\n    }\n}\n\nstatic void fgk_init_node (fgk_node *node, usize_t i, usize_t size)\n{\n  if (i < size - 1)\n    {\n      node->right_child = node + 1;\n    }\n  else\n    {\n      node->right_child = NULL;\n    }\n\n  if (i >= 1)\n    {\n      node->left_child = node - 1;\n    }\n  else\n    {\n      node->left_child = NULL;\n    }\n\n  node->weight      = 0;\n  node->parent      = NULL;\n  node->right = NULL;\n  node->left  = NULL;\n  node->my_block    = NULL;\n}\n\n/* The data structure used is an array of blocks, which are unions of\n * free pointers and huffnode pointers.  free blocks are a linked list\n * of free blocks, the front of which is h->free_block.  The used\n * blocks are pointers to the head of each block.  */\nstatic fgk_block* fgk_make_block (fgk_stream *h, fgk_node* lead)\n{\n  fgk_block *ret = h->free_block;\n\n  XD3_ASSERT (h->free_block != NULL);\n\n  h->free_block = h->free_block->block_freeptr;\n\n  ret->block_leader = lead;\n\n  return ret;\n}\n\n/* Restores the block to the front of the free list. */\nstatic void fgk_free_block (fgk_stream *h, fgk_block *b)\n{\n  b->block_freeptr = h->free_block;\n  h->free_block = b;\n}\n\n/* sets zero_freq_count, zero_freq_rem, and zero_freq_exp to satsity\n * the equation given above.  */\nstatic void fgk_factor_remaining (fgk_stream *h)\n{\n  unsigned int i;\n\n  i = (--h->zero_freq_count);\n  h->zero_freq_exp = 0;\n\n  while (i > 1)\n    {\n      h->zero_freq_exp += 1;\n      i >>= 1;\n    }\n\n  i = 1 << h->zero_freq_exp;\n\n  h->zero_freq_rem = h->zero_freq_count - i;\n}\n\n/* receives a bit at a time and returns true when a complete code has\n * been received.\n */\nstatic inline int fgk_decode_bit (fgk_stream* h, fgk_bit b)\n{\n  XD3_ASSERT (b == 1 || b == 0);\n\n  if (IS_ADAPTIVE && h->decode_ptr->weight == 0)\n    {\n      usize_t bitsreq;\n\n      if (h->zero_freq_rem == 0)\n\t{\n\t  bitsreq = h->zero_freq_exp;\n\t}\n      else\n\t{\n\t  bitsreq = h->zero_freq_exp + 1;\n\t}\n\n      h->coded_bits[h->coded_depth] = b;\n      h->coded_depth += 1;\n\n      return h->coded_depth >= bitsreq;\n    }\n  else\n    {\n      if (b)\n\t{\n\t  h->decode_ptr = h->decode_ptr->right_child;\n\t}\n      else\n\t{\n\t  h->decode_ptr = h->decode_ptr->left_child;\n\t}\n\n      if (h->decode_ptr->left_child == NULL)\n\t{\n\t  /* If the weight is non-zero, finished. */\n\t  if (h->decode_ptr->weight != 0)\n\t    {\n\t      return 1;\n\t    }\n\n\t  /* zero_freq_count is dropping to 0, finished. */\n\t  return h->zero_freq_count == 1;\n\t}\n      else\n\t{\n\t  return 0;\n\t}\n    }\n}\n\nstatic usize_t fgk_nth_zero (fgk_stream* h, usize_t n)\n{\n  fgk_node *ret = h->remaining_zeros;\n\n  /* ERROR: if during this loop (ret->right_child == NULL) then the\n   * encoder's zero count is too high.  Could return an error code\n   * now, but is probably unnecessary overhead, since the caller\n   * should check integrity anyway. */\n  for (; n != 0 && ret->right_child != NULL; n -= 1)\n    {\n      ret = ret->right_child;\n    }\n\n  return (usize_t)(ret - h->alphabet);\n}\n\n/* once fgk_decode_bit returns 1, this retrieves an index into the\n * alphabet otherwise this returns 0, indicating more bits are\n * required.\n */\nstatic usize_t fgk_decode_data (fgk_stream* h)\n{\n  usize_t elt = (usize_t)(h->decode_ptr - h->alphabet);\n\n  if (IS_ADAPTIVE && h->decode_ptr->weight == 0) {\n    usize_t i = 0;\n    usize_t n = 0;\n\n    if (h->coded_depth > 0) \n      {\n\tfor (; i < h->coded_depth - 1; i += 1)\n\t  {\n\t    n |= h->coded_bits[i];\n\t    n <<= 1;\n\t  }\n      }\n\n    n |= h->coded_bits[i];\n    elt = fgk_nth_zero(h, n);\n  }\n\n  h->coded_depth = 0;\n\n  if (IS_ADAPTIVE)\n    {\n      fgk_update_tree(h, elt);\n    }\n\n  h->decode_ptr = h->root_node;\n\n  return elt;\n}\n\nstatic void fgk_destroy (xd3_stream *stream,\n\t\t\t fgk_stream *h)\n{\n  if (h != NULL)\n    {\n      xd3_free (stream, h->alphabet);\n      xd3_free (stream, h->coded_bits);\n      xd3_free (stream, h->block_array);\n      xd3_free (stream, h);\n    }\n}\n\n/*********************************************************************/\n/* \t\t\t       Xdelta                                */\n/*********************************************************************/\n\nstatic int\nxd3_encode_fgk (xd3_stream *stream, fgk_stream *sec_stream, xd3_output *input, xd3_output *output, xd3_sec_cfg *cfg)\n{\n  bit_state   bstate = BIT_STATE_ENCODE_INIT;\n  xd3_output *cur_page;\n  int ret;\n\n  /* OPT: quit compression early if it looks bad */\n  for (cur_page = input; cur_page; cur_page = cur_page->next_page)\n    {\n      const uint8_t *inp     = cur_page->base;\n      const uint8_t *inp_max = inp + cur_page->next;\n\n      while (inp < inp_max)\n\t{\n\t  usize_t bits = fgk_encode_data (sec_stream, *inp++);\n\n\t  while (bits--)\n\t    {\n\t      if ((ret = xd3_encode_bit (stream, & output, & bstate, fgk_get_encoded_bit (sec_stream)))) { return ret; }\n\t    }\n\t}\n    }\n\n  return xd3_flush_bits (stream, & output, & bstate);\n}\n\nstatic int\nxd3_decode_fgk (xd3_stream     *stream,\n\t\tfgk_stream     *sec_stream,\n\t\tconst uint8_t **input_pos,\n\t\tconst uint8_t  *const input_max,\n\t\tuint8_t       **output_pos,\n\t\tconst uint8_t  *const output_max)\n{\n  bit_state bstate;\n  uint8_t *output = *output_pos;\n  const uint8_t *input = *input_pos;\n\n  for (;;)\n    {\n      if (input == input_max)\n\t{\n\t  stream->msg = \"secondary decoder end of input\";\n\t  return XD3_INTERNAL;\n\t}\n\n      bstate.cur_byte = *input++;\n\n      for (bstate.cur_mask = 1; bstate.cur_mask != 0x100; bstate.cur_mask <<= 1)\n\t{\n\t  int done = fgk_decode_bit (sec_stream, (bstate.cur_byte & bstate.cur_mask) ? 1U : 0U);\n\n\t  if (! done) { continue; }\n\n\t  *output++ = fgk_decode_data (sec_stream);\n\n\t  if (output == output_max)\n\t    {\n\t      /* During regression testing: */\n\t      IF_REGRESSION ({\n\t\tint ret;\n\t\tbstate.cur_mask <<= 1;\n\t\tif ((ret = xd3_test_clean_bits (stream, & bstate))) { return ret; }\n\t      });\n\n\t      (*output_pos) = output;\n\t      (*input_pos) = input;\n\t      return 0;\n\t    }\n\t}\n    }\n}\n\n#endif /* _XDELTA3_FGK_ */\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-hash.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#ifndef _XDELTA3_HASH_H_\n#define _XDELTA3_HASH_H_\n\n#include \"xdelta3-internal.h\"\n\n#if XD3_DEBUG\n#define SMALL_HASH_DEBUG1(s,inp)                                  \\\n  uint32_t debug_state;                                           \\\n  uint32_t debug_hval = xd3_checksum_hash (& (s)->small_hash,     \\\n              xd3_scksum (&debug_state, (inp), (s)->smatcher.small_look))\n#define SMALL_HASH_DEBUG2(s,inp)                                  \\\n  XD3_ASSERT (debug_hval == xd3_checksum_hash (& (s)->small_hash, \\\n              xd3_scksum (&debug_state, (inp), (s)->smatcher.small_look)))\n#else\n#define SMALL_HASH_DEBUG1(s,inp)\n#define SMALL_HASH_DEBUG2(s,inp)\n#endif /* XD3_DEBUG */\n\n#if UNALIGNED_OK\n#define UNALIGNED_READ32(dest,src) (*(dest)) = (*(uint32_t*)(src))\n#else\n#define UNALIGNED_READ32(dest,src) memcpy((dest), (src), 4);\n#endif\n\n/* These are good hash multipliers for 32-bit and 64-bit LCGs: see\n * \"linear congruential generators of different sizes and good lattice\n * structure\" */\n#define xd3_hash_multiplier32 1597334677U\n#define xd3_hash_multiplier64 1181783497276652981ULL\n\n/* TODO: small cksum is hard-coded for 4 bytes (i.e., \"look\" is unused) */\nstatic inline uint32_t\nxd3_scksum (uint32_t *state,\n            const uint8_t *base,\n            const usize_t look)\n{\n  UNALIGNED_READ32(state, base);\n  return (*state) * xd3_hash_multiplier32;\n}\nstatic inline uint32_t\nxd3_small_cksum_update (uint32_t *state,\n\t\t\tconst uint8_t *base,\n\t\t\tusize_t look)\n{\n  UNALIGNED_READ32(state, base+1);\n  return (*state) * xd3_hash_multiplier32;\n}\n\n#if XD3_ENCODER\ninline usize_t\nxd3_checksum_hash (const xd3_hash_cfg *cfg, const usize_t cksum)\n{\n  return (cksum >> cfg->shift) ^ (cksum & cfg->mask);\n}\n\n#if SIZEOF_USIZE_T == 4\ninline uint32_t\nxd3_large32_cksum (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look)\n{\n  uint32_t h = 0;\n  for (usize_t i = 0; i < look; i++) {\n    h += base[i] * cfg->powers[i];\n  }\n  return h;\n}\n\ninline uint32_t\nxd3_large32_cksum_update (xd3_hash_cfg *cfg, const uint32_t cksum,\n\t\t\t  const uint8_t *base, const usize_t look)\n{\n  return xd3_hash_multiplier32 * cksum - cfg->multiplier * base[0] + base[look];\n}\n#endif\n\n#if SIZEOF_USIZE_T == 8\ninline uint64_t\nxd3_large64_cksum (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look)\n{\n  uint64_t h = 0;\n  for (usize_t i = 0; i < look; i++) {\n    h += base[i] * cfg->powers[i];\n  }\n  return h;\n}\n\ninline uint64_t\nxd3_large64_cksum_update (xd3_hash_cfg *cfg, const uint64_t cksum,\n\t\t\t  const uint8_t *base, const usize_t look)\n{\n  return xd3_hash_multiplier64 * cksum - cfg->multiplier * base[0] + base[look];\n}\n#endif\n\nstatic usize_t\nxd3_size_hashtable_bits (usize_t slots)\n{\n  usize_t bits = (SIZEOF_USIZE_T * 8) - 1;\n  usize_t i;\n\n  for (i = 3; i <= bits; i += 1)\n    {\n      if (slots < (1U << i))\n\t{\n\t  /* Note: this is the compaction=1 setting measured in\n\t   * checksum_test */\n\t  bits = i - 1;\n\t  break;\n\t}\n    }\n\n  return bits;\n}\n\nint\nxd3_size_hashtable (xd3_stream   *stream,\n\t\t    usize_t       slots,\n\t\t    usize_t       look,\n\t\t    xd3_hash_cfg *cfg)\n{\n  usize_t bits = xd3_size_hashtable_bits (slots);\n\n  cfg->size  = (1U << bits);\n  cfg->mask  = (cfg->size - 1);\n  cfg->shift = (SIZEOF_USIZE_T * 8) - bits;\n  cfg->look  = look;\n\n  if ((cfg->powers = \n       (usize_t*) xd3_alloc0 (stream, look, sizeof (usize_t))) == NULL)\n    {\n      return ENOMEM;\n    }\n\n  cfg->powers[look-1] = 1;\n  for (int i = look-2; i >= 0; i--)\n    {\n      cfg->powers[i] = cfg->powers[i+1] * xd3_hash_multiplier;\n    }\n  cfg->multiplier = cfg->powers[0] * xd3_hash_multiplier;\n\n  return 0;\n}\n\n#endif /* XD3_ENCODER */\n#endif /* _XDELTA3_HASH_H_ */\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-internal.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#ifndef XDELTA3_INTERNAL_H__\n#define XDELTA3_INTERNAL_H__\n\n#include \"xdelta3.h\"\n\ntypedef struct _main_file        main_file;\ntypedef struct _main_extcomp     main_extcomp;\n\nvoid main_buffree (void *ptr);\nvoid* main_bufalloc (size_t size);\nvoid main_file_init (main_file *xfile);\nint main_file_close (main_file *xfile);\nvoid main_file_cleanup (main_file *xfile);\nint main_file_isopen (main_file *xfile);\nint main_file_open (main_file *xfile, const char* name, int mode);\nint main_file_exists (main_file *xfile);\nint main_file_stat (main_file *xfile, xoff_t *size);\nint xd3_whole_append_window (xd3_stream *stream);\nint xd3_main_cmdline (int argc, char **argv);\nint main_file_read (main_file  *ifile,\n\t\t    uint8_t    *buf,\n\t\t    size_t     size,\n\t\t    size_t    *nread,\n\t\t    const char *msg);\nint main_file_write (main_file *ofile, uint8_t *buf, \n\t\t     usize_t size, const char *msg);\nvoid* main_malloc (size_t size);\nvoid main_free (void *ptr);\n\nint test_compare_files (const char* f0, const char* f1);\nusize_t xd3_bytes_on_srcblk (xd3_source *src, xoff_t blkno);\nxoff_t xd3_source_eof(const xd3_source *src);\n\nuint32_t xd3_large_cksum_update (uint32_t cksum,\n\t\t\t\t const uint8_t *base,\n\t\t\t\t usize_t look);\nint xd3_emit_byte (xd3_stream  *stream,\n\t\t   xd3_output **outputp,\n\t\t   uint8_t      code);\n\nint xd3_emit_bytes (xd3_stream     *stream,\n\t\t    xd3_output    **outputp,\n\t\t    const uint8_t  *base,\n\t\t    usize_t          size);\nxd3_output* xd3_alloc_output (xd3_stream *stream,\n\t\t\t      xd3_output *old_output);\n\nint xd3_encode_init_full (xd3_stream *stream);\nusize_t xd3_pow2_roundup (usize_t x);\nlong get_millisecs_now (void);\nint xd3_process_stream (int            is_encode,\n\t\t\txd3_stream    *stream,\n\t\t\tint          (*func) (xd3_stream *),\n\t\t\tint            close_stream,\n\t\t\tconst uint8_t *input,\n\t\t\tusize_t        input_size,\n\t\t\tuint8_t       *output,\n\t\t\tusize_t       *output_size,\n\t\t\tusize_t        output_size_max);\n\n#if PYTHON_MODULE || SWIG_MODULE || NOT_MAIN\nint xd3_main_cmdline (int argc, char **argv);\n#endif\n\n#if REGRESSION_TEST\nint xd3_selftest (void);\n#endif\n\n/* main_file->mode values */\ntypedef enum\n{\n  XO_READ  = 0,\n  XO_WRITE = 1\n} main_file_modes;\n\n#ifndef XD3_POSIX\n#define XD3_POSIX 0\n#endif\n#ifndef XD3_STDIO\n#define XD3_STDIO 0\n#endif\n#ifndef XD3_WIN32\n#define XD3_WIN32 0\n#endif\n#ifndef NOT_MAIN\n#define NOT_MAIN 0\n#endif\n\n/* If none are set, default to posix. */\n#if (XD3_POSIX + XD3_STDIO + XD3_WIN32) == 0\n#undef XD3_POSIX\n#define XD3_POSIX 1\n#endif\n\nstruct _main_file\n{\n#if XD3_WIN32\n  HANDLE              file;\n#elif XD3_STDIO\n  FILE               *file;\n#elif XD3_POSIX\n  int                 file;\n#endif\n\n  int                 mode;          /* XO_READ and XO_WRITE */\n  const char         *filename;      /* File name or /dev/stdin,\n\t\t\t\t      * /dev/stdout, /dev/stderr. */\n  char               *filename_copy; /* File name or /dev/stdin,\n\t\t\t\t      * /dev/stdout, /dev/stderr. */\n  const char         *realname;      /* File name or /dev/stdin,\n\t\t\t\t      * /dev/stdout, /dev/stderr. */\n  const main_extcomp *compressor;    /* External compression struct. */\n  int                 flags;         /* RD_FIRST, RD_NONEXTERNAL, ... */\n  xoff_t              nread;         /* for input position */\n  xoff_t              nwrite;        /* for output position */\n  uint8_t            *snprintf_buf;  /* internal snprintf() use */\n  int                 size_known;    /* Set by main_set_souze */\n  xoff_t              source_position;  /* for avoiding seek in getblk_func */\n  int                 seek_failed;   /* after seek fails once, try FIFO */\n};\n\n#ifndef UINT32_MAX\n#define UINT32_MAX 4294967295U\n#endif\n\n#ifndef UINT64_MAX\n#define UINT64_MAX 18446744073709551615ULL\n#endif\n\n#define UINT32_OFLOW_MASK 0xfe000000U\n#define UINT64_OFLOW_MASK 0xfe00000000000000ULL\n\n/*********************************************************************\n Integer encoder/decoder functions\n **********************************************************************/\n\n/* Consume N bytes of input, only used by the decoder. */\n#define DECODE_INPUT(n)             \\\n  do {                              \\\n  stream->total_in += (xoff_t) (n); \\\n  stream->avail_in -= (n);          \\\n  stream->next_in  += (n);          \\\n  } while (0)\n\n#define DECODE_INTEGER_TYPE(PART,OFLOW)                                \\\n  while (stream->avail_in != 0)                                        \\\n    {                                                                  \\\n      usize_t next = stream->next_in[0];                               \\\n                                                                       \\\n      DECODE_INPUT(1);                                                 \\\n                                                                       \\\n      if (PART & OFLOW)                                                \\\n\t{                                                              \\\n\t  stream->msg = \"overflow in decode_integer\";                  \\\n\t  return XD3_INVALID_INPUT;                                    \\\n\t}                                                              \\\n                                                                       \\\n      PART = (PART << 7) | (next & 127);                               \\\n                                                                       \\\n      if ((next & 128) == 0)                                           \\\n\t{                                                              \\\n\t  (*val) = PART;                                               \\\n\t  PART = 0;                                                    \\\n\t  return 0;                                                    \\\n\t}                                                              \\\n    }                                                                  \\\n                                                                       \\\n  stream->msg = \"further input required\";                              \\\n  return XD3_INPUT\n\n#define READ_INTEGER_TYPE(TYPE, OFLOW)                                 \\\n  TYPE val = 0;                                                        \\\n  const uint8_t *inp = (*inpp);                                        \\\n  usize_t next;                                                        \\\n                                                                       \\\n  do                                                                   \\\n    {                                                                  \\\n      if (inp == maxp)\t\t\t\t\t\t       \\\n\t{                                                              \\\n\t  stream->msg = \"end-of-input in read_integer\";                \\\n\t  return XD3_INVALID_INPUT;                                    \\\n\t}                                                              \\\n                                                                       \\\n      if (val & OFLOW)                                                 \\\n\t{                                                              \\\n\t  stream->msg = \"overflow in read_intger\";                     \\\n\t  return XD3_INVALID_INPUT;                                    \\\n\t}                                                              \\\n                                                                       \\\n      next = (*inp++);                                                 \\\n      val  = (val << 7) | (next & 127);                                \\\n    }                                                                  \\\n  while (next & 128);                                                  \\\n                                                                       \\\n  (*valp) = val;                                                       \\\n  (*inpp) = inp;                                                       \\\n                                                                       \\\n  return 0\n\n#define EMIT_INTEGER_TYPE()                                            \\\n  /* max 64-bit value in base-7 encoding is 9.1 bytes */               \\\n  uint8_t buf[10];                                                     \\\n  usize_t  bufi = 10;                                                  \\\n                                                                       \\\n  /* This loop performs division and turns on all MSBs. */             \\\n  do                                                                   \\\n    {                                                                  \\\n      buf[--bufi] = (num & 127) | 128;                                 \\\n      num >>= 7U;                                                      \\\n    }                                                                  \\\n  while (num != 0);                                                    \\\n                                                                       \\\n  /* Turn off MSB of the last byte. */                                 \\\n  buf[9] &= 127;                                                       \\\n                                                                       \\\n  return xd3_emit_bytes (stream, output, buf + bufi, 10 - bufi)\n\n#define IF_SIZEOF32(x) if (num < (1U   << (7 * (x)))) return (x);\n#define IF_SIZEOF64(x) if (num < (1ULL << (7 * (x)))) return (x);\n\n#if USE_UINT32\nstatic inline uint32_t\nxd3_sizeof_uint32_t (uint32_t num)\n{\n  IF_SIZEOF32(1);\n  IF_SIZEOF32(2);\n  IF_SIZEOF32(3);\n  IF_SIZEOF32(4);\n  return 5;\n}\n\nstatic inline int\nxd3_decode_uint32_t (xd3_stream *stream, uint32_t *val)\n{ DECODE_INTEGER_TYPE (stream->dec_32part, UINT32_OFLOW_MASK); }\n\nstatic inline int\nxd3_read_uint32_t (xd3_stream *stream, const uint8_t **inpp,\n\t\t   const uint8_t *maxp, uint32_t *valp)\n{ READ_INTEGER_TYPE (uint32_t, UINT32_OFLOW_MASK); }\n\n#if XD3_ENCODER\nstatic inline int\nxd3_emit_uint32_t (xd3_stream *stream, xd3_output **output, uint32_t num)\n{ EMIT_INTEGER_TYPE (); }\n#endif  /* XD3_ENCODER */\n#endif  /* USE_UINT32 */\n\n#if USE_UINT64\nstatic inline uint32_t\nxd3_sizeof_uint64_t (uint64_t num)\n{\n  IF_SIZEOF64(1);\n  IF_SIZEOF64(2);\n  IF_SIZEOF64(3);\n  IF_SIZEOF64(4);\n  IF_SIZEOF64(5);\n  IF_SIZEOF64(6);\n  IF_SIZEOF64(7);\n  IF_SIZEOF64(8);\n  IF_SIZEOF64(9);\n\n  return 10;\n}\n\nstatic inline int\nxd3_decode_uint64_t (xd3_stream *stream, uint64_t *val)\n{ DECODE_INTEGER_TYPE (stream->dec_64part, UINT64_OFLOW_MASK); }\n\nstatic inline int\nxd3_read_uint64_t (xd3_stream *stream, const uint8_t **inpp,\n\t\t   const uint8_t *maxp, uint64_t *valp)\n{ READ_INTEGER_TYPE (uint64_t, UINT64_OFLOW_MASK); }\n\n#if XD3_ENCODER\nstatic inline int\nxd3_emit_uint64_t (xd3_stream *stream, xd3_output **output, uint64_t num)\n{ EMIT_INTEGER_TYPE (); }\n#endif  /* XD3_ENCODER */\n#endif  /* USE_UINT64 */\n\n#if SIZEOF_USIZE_T == 4\n#define USIZE_T_MAX             UINT32_MAX\n#define USIZE_T_MAXBLKSZ        0x80000000U\n#define XD3_MAXSRCWINSZ         (1ULL << 31)\n#define xd3_large_cksum         xd3_large32_cksum\n#define xd3_large_cksum_update  xd3_large32_cksum_update\n#define xd3_hash_multiplier     xd3_hash_multiplier32\n\nstatic inline uint32_t xd3_sizeof_size (usize_t num)\n{ return xd3_sizeof_uint32_t (num); }\nstatic inline int xd3_decode_size (xd3_stream *stream, usize_t *valp)\n{ return xd3_decode_uint32_t (stream, (uint32_t*) valp); }\nstatic inline int xd3_read_size (xd3_stream *stream, const uint8_t **inpp,\n\t\t   const uint8_t *maxp, usize_t *valp)\n{ return xd3_read_uint32_t (stream, inpp, maxp, (uint32_t*) valp); }\n#if XD3_ENCODER\nstatic inline int xd3_emit_size (xd3_stream *stream, xd3_output **output, usize_t num)\n{ return xd3_emit_uint32_t (stream, output, num); }\n#endif\n\n#elif SIZEOF_USIZE_T == 8\n#define USIZE_T_MAX             UINT64_MAX\n#define USIZE_T_MAXBLKSZ        0x8000000000000000ULL\n#define XD3_MAXSRCWINSZ         (1ULL << 61)\n#define xd3_large_cksum         xd3_large64_cksum\n#define xd3_large_cksum_update  xd3_large64_cksum_update\n#define xd3_hash_multiplier     xd3_hash_multiplier64\n\nstatic inline uint32_t xd3_sizeof_size (usize_t num)\n{ return xd3_sizeof_uint64_t (num); }\nstatic inline int xd3_decode_size (xd3_stream *stream, usize_t *valp)\n{ return xd3_decode_uint64_t (stream, (uint64_t*) valp); }\nstatic inline int xd3_read_size (xd3_stream *stream, const uint8_t **inpp,\n\t\t   const uint8_t *maxp, usize_t *valp)\n{ return xd3_read_uint64_t (stream, inpp, maxp, (uint64_t*) valp); }\n#if XD3_ENCODER\nstatic inline int xd3_emit_size (xd3_stream *stream, xd3_output **output, usize_t num)\n{ return xd3_emit_uint64_t (stream, output, num); }\n#endif\n\n#endif /* SIZEOF_USIZE_T */\n\n#if SIZEOF_XOFF_T == 4\n#define XOFF_T_MAX        UINT32_MAX\n\nstatic inline int xd3_decode_offset (xd3_stream *stream, xoff_t *valp)\n{ return xd3_decode_uint32_t (stream, (uint32_t*) valp); }\n#if XD3_ENCODER\nstatic inline int xd3_emit_offset (xd3_stream *stream, xd3_output **output, xoff_t num)\n{ return xd3_emit_uint32_t (stream, output, num); }\n#endif\n\n#elif SIZEOF_XOFF_T == 8\n#define XOFF_T_MAX        UINT64_MAX\n\nstatic inline int xd3_decode_offset (xd3_stream *stream, xoff_t *valp)\n{ return xd3_decode_uint64_t (stream, (uint64_t*) valp); }\n#if XD3_ENCODER\nstatic inline int xd3_emit_offset (xd3_stream *stream, xd3_output **output, xoff_t num)\n{ return xd3_emit_uint64_t (stream, output, num); }\n#endif\n\n#endif\n\n#define USIZE_T_OVERFLOW(a,b) ((USIZE_T_MAX - (usize_t) (a)) < (usize_t) (b))\n#define XOFF_T_OVERFLOW(a,b) ((XOFF_T_MAX - (xoff_t) (a)) < (xoff_t) (b))\n\nint xd3_size_hashtable (xd3_stream   *stream,\n\t\t\tusize_t       slots,\n\t\t\tusize_t       look,\n\t\t\txd3_hash_cfg *cfg);\n\nusize_t xd3_checksum_hash (const xd3_hash_cfg *cfg, const usize_t cksum);\n\n#if USE_UINT32\nuint32_t xd3_large32_cksum (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look);\nuint32_t xd3_large32_cksum_update (xd3_hash_cfg *cfg, const uint32_t cksum,\n\t\t\t\t   const uint8_t *base, const usize_t look);\n#endif /* USE_UINT32 */\n\n#if USE_UINT64\nuint64_t xd3_large64_cksum (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look);\nuint64_t xd3_large64_cksum_update (xd3_hash_cfg *cfg, const uint64_t cksum,\n\t\t\t\t   const uint8_t *base, const usize_t look);\n#endif /* USE_UINT64 */\n\n#define MAX_LRU_SIZE 32U\n#define XD3_MINSRCWINSZ (XD3_ALLOCSIZE * MAX_LRU_SIZE)\n\n#endif // XDELTA3_INTERNAL_H__\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-list.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#ifndef __XDELTA3_LIST__\n#define __XDELTA3_LIST__\n\n#define XD3_MAKELIST(LTYPE,ETYPE,LNAME)                                 \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _entry (LTYPE* l)                                              \\\n{                                                                       \\\n  return (ETYPE*) ((char*) l - (ptrdiff_t) &((ETYPE*) 0)->LNAME);       \\\n}                                                                       \\\n                                                                        \\\nstatic inline void                                                      \\\nLTYPE ## _init (LTYPE *l)                                               \\\n{                                                                       \\\n  l->next = l;                                                          \\\n  l->prev = l;                                                          \\\n}                                                                       \\\n                                                                        \\\nstatic inline void                                                      \\\nLTYPE ## _add (LTYPE *prev, LTYPE *next, LTYPE *ins)                    \\\n{                                                                       \\\n  next->prev = ins;                                                     \\\n  prev->next = ins;                                                     \\\n  ins->next  = next;                                                    \\\n  ins->prev  = prev;                                                    \\\n}                                                                       \\\n                                                                        \\\nstatic inline void                                                      \\\nLTYPE ## _push_back (LTYPE *l, ETYPE *i)                                \\\n{                                                                       \\\n  LTYPE ## _add (l->prev, l, & i->LNAME);                               \\\n}                                                                       \\\n                                                                        \\\nstatic inline void                                                      \\\nLTYPE ## _del (LTYPE *next,                                             \\\n\t       LTYPE *prev)                                             \\\n{                                                                       \\\n  next->prev = prev;                                                    \\\n  prev->next = next;                                                    \\\n}                                                                       \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _remove (ETYPE *f)                                             \\\n{                                                                       \\\n  LTYPE *i = f->LNAME.next;                                             \\\n  LTYPE ## _del (f->LNAME.next, f->LNAME.prev);                         \\\n  return LTYPE ## _entry (i);                                           \\\n}                                                                       \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _pop_back (LTYPE *l)                                           \\\n{                                                                       \\\n  LTYPE *i = l->prev;                                                   \\\n  LTYPE ## _del (i->next, i->prev);                                     \\\n  return LTYPE ## _entry (i);                                           \\\n}                                                                       \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _pop_front (LTYPE *l)                                          \\\n{                                                                       \\\n  LTYPE *i = l->next;                                                   \\\n  LTYPE ## _del (i->next, i->prev);                                     \\\n  return LTYPE ## _entry (i);                                           \\\n}                                                                       \\\n                                                                        \\\nstatic inline int                                                       \\\nLTYPE ## _empty (LTYPE *l)                                              \\\n{                                                                       \\\n  return l == l->next;                                                  \\\n}                                                                       \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _front (LTYPE *f)                                              \\\n{                                                                       \\\n  return LTYPE ## _entry (f->next);                                     \\\n}                                                                       \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _back (LTYPE *f)                                               \\\n{                                                                       \\\n  return LTYPE ## _entry (f->prev);                                     \\\n}                                                                       \\\n                                                                        \\\nstatic inline int                                                       \\\nLTYPE ## _end (LTYPE *f, ETYPE *i)                                      \\\n{                                                                       \\\n  return f == & i->LNAME;                                               \\\n}                                                                       \\\n                                                                        \\\nstatic inline ETYPE*                                                    \\\nLTYPE ## _next (ETYPE *f)                                               \\\n{                                                                       \\\n  return LTYPE ## _entry (f->LNAME.next);                               \\\n}                                                                       \\\n                                                                        \\\nstatic inline usize_t                                                   \\\nLTYPE ## _length (LTYPE *l)                                             \\\n{                                                                       \\\n  LTYPE *p;                                                             \\\n  usize_t c = 0;                                                        \\\n                                                                        \\\n  for (p = l->next; p != l; p = p->next)                                \\\n    {                                                                   \\\n      c += 1;                                                           \\\n    }                                                                   \\\n                                                                        \\\n  return c;                                                             \\\n}                                                                       \\\n                                                                        \\\ntypedef int unused_ ## LTYPE\n\n#endif\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-lzma.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n/* Note: The use of the _easy_ decoder means we're not calling the\n * xd3_stream malloc hooks.  TODO(jmacd) Fix if anyone cares. */\n\n#ifndef _XDELTA3_LZMA_H_\n#define _XDELTA3_LZMA_H_\n\n#include <lzma.h>\n\ntypedef struct _xd3_lzma_stream xd3_lzma_stream;\n\nstruct _xd3_lzma_stream {\n  lzma_stream lzma;\n  lzma_options_lzma options;\n  lzma_filter filters[2];\n};\n\nstatic xd3_sec_stream* \nxd3_lzma_alloc (xd3_stream *stream)\n{\n  return (xd3_sec_stream*) xd3_alloc (stream, sizeof (xd3_lzma_stream), 1);\n}\n\nstatic void\nxd3_lzma_destroy (xd3_stream *stream, xd3_sec_stream *sec_stream)\n{\n  xd3_lzma_stream *ls = (xd3_lzma_stream*) sec_stream;\n  lzma_end (&ls->lzma);\n  xd3_free (stream, ls);\n}\n\nstatic int\nxd3_lzma_init (xd3_stream *stream, xd3_lzma_stream *sec, int is_encode)\n{\n  int ret;\n\n  memset (&sec->lzma, 0, sizeof(sec->lzma));\n\n  if (is_encode)\n    {\n      uint32_t preset = \n\t(stream->flags & XD3_COMPLEVEL_MASK) >> XD3_COMPLEVEL_SHIFT;\n\n      if (lzma_lzma_preset(&sec->options, preset)) \n\t{\n\t  stream->msg = \"invalid lzma preset\";\n\t  return XD3_INVALID;\n\t}\n\n      sec->filters[0].id = LZMA_FILTER_LZMA2;\n      sec->filters[0].options = &sec->options;\n      sec->filters[1].id = LZMA_VLI_UNKNOWN;\n\n      ret = lzma_stream_encoder (&sec->lzma, &sec->filters[0], LZMA_CHECK_NONE);\n    }\n  else \n    {\n      ret = lzma_stream_decoder (&sec->lzma, UINT64_MAX, LZMA_TELL_NO_CHECK);\n    }\n  \n  if (ret != LZMA_OK)\n    {\n      stream->msg = \"lzma stream init failed\";\n      return XD3_INTERNAL;\n    }\n\n  return 0;\n}\n\nstatic int xd3_decode_lzma (xd3_stream *stream, xd3_lzma_stream *sec,\n\t\t     const uint8_t **input_pos,\n\t\t     const uint8_t  *const input_end,\n\t\t     uint8_t       **output_pos,\n\t\t     const uint8_t  *const output_end)\n{\n  uint8_t *output = *output_pos;\n  const uint8_t *input = *input_pos;\n  size_t avail_in = input_end - input;\n  size_t avail_out = output_end - output;\n\n  sec->lzma.avail_in = avail_in;\n  sec->lzma.next_in = input;\n  sec->lzma.avail_out = avail_out;\n  sec->lzma.next_out = output;\n  \n  while (1) \n    {\n      int lret = lzma_code (&sec->lzma, LZMA_RUN);\n\n      switch (lret)\n\t{\n\tcase LZMA_NO_CHECK: \n\tcase LZMA_OK:\n\t  if (sec->lzma.avail_out == 0) \n\t    {\n\t      (*output_pos) = sec->lzma.next_out;\n\t      (*input_pos) = sec->lzma.next_in;\n\t      return 0;\n\t    }\n\t  break;\n\n\tdefault:\n\t  stream->msg = \"lzma decoding error\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n}\n\n#if XD3_ENCODER\n\nstatic int xd3_encode_lzma (xd3_stream *stream, \n\t\t     xd3_lzma_stream *sec, \n\t\t     xd3_output   *input,\n\t\t     xd3_output   *output,\n\t\t     xd3_sec_cfg  *cfg)\n\n{\n  lzma_action action = LZMA_RUN;\n\n  cfg->inefficient = 1;  /* Can't skip windows */\n  sec->lzma.next_in = NULL;\n  sec->lzma.avail_in = 0;\n  sec->lzma.next_out = (output->base + output->next);\n  sec->lzma.avail_out = (output->avail - output->next);\n\n  while (1)\n    {\n      int lret;\n\t  size_t nwrite;\n      if (sec->lzma.avail_in == 0 && input != NULL)\n\t{\n\t  sec->lzma.avail_in = input->next;\n\t  sec->lzma.next_in = input->base;\n\t  \n\t  if ((input = input->next_page) == NULL)\n\t    {\n\t      action = LZMA_SYNC_FLUSH;\n\t    }\n\t}\n\n      lret = lzma_code (&sec->lzma, action);\n\n      nwrite = (output->avail - output->next) - sec->lzma.avail_out;\n\n      if (nwrite != 0) \n\t{\n\t  output->next += nwrite;\n\n\t  if (output->next == output->avail)\n\t    {\n\t      if ((output = xd3_alloc_output (stream, output)) == NULL)\n\t\t{\n\t\t  return ENOMEM;\n\t\t}\n\t      \n\t      sec->lzma.next_out = output->base;\n\t      sec->lzma.avail_out = output->avail;\n\t    }\n\t}\n\n      switch (lret)\n\t{\n\tcase LZMA_OK:\n\t  break;\n\n\tcase LZMA_STREAM_END:\n\t  return 0;\n\n\tdefault:\n\t  stream->msg = \"lzma encoding error\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n\n  return 0;\n}\n\n#endif /* XD3_ENCODER */\n\n#endif /* _XDELTA3_LZMA_H_ */\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-main.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n/* This is all the extra stuff you need for convenience to users in a\n * command line application.  It contains these major components:\n *\n * 1. VCDIFF tools 2. external compression support (this is\n * POSIX-specific).  3. a general read/write loop that handles all of\n * the Xdelta decode/encode/VCDIFF-print functions 4. command-line\n * interpreter 5. an Xdelta application header which stores default\n * filename, external compression settings 6. output/error printing\n * 7. basic file support and OS interface\n */\n\n/* TODO list: 1. do exact gzip-like filename, stdout handling.  make a\n * .vcdiff extension, refuse to encode to stdout without -cf, etc.\n * 2. Allow the user to add a comment string to the app header without\n * disturbing the default behavior.\n */\n\n/* On error handling and printing:\n *\n * The xdelta library sets stream->msg to indicate what condition\n * caused an internal failure, but many failures originate here and\n * are printed here.  The return convention is 0 for success, as\n * throughout Xdelta code, but special attention is required here for\n * the operating system calls with different error handling.  See the\n * main_file_* routines.  All errors in this file have a message\n * printed at the time of occurance.  Since some of these calls occur\n * within calls to the library, the error may end up being printed\n * again with a more general error message.\n */\n\n/*********************************************************************/\n\n#include <limits.h>\n\n#ifndef XD3_POSIX\n#define XD3_POSIX 0\n#endif\n#ifndef XD3_STDIO\n#define XD3_STDIO 0\n#endif\n#ifndef XD3_WIN32\n#define XD3_WIN32 0\n#endif\n#ifndef NOT_MAIN\n#define NOT_MAIN 0\n#endif\n\n/* Combines xd3_strerror() and strerror() */\nconst char* xd3_mainerror(int err_num);\n\n#include \"xdelta3-internal.h\"\n\nint\nxsnprintf_func (char *str, size_t n, const char *fmt, ...)\n{\n  va_list a;\n  int ret;\n  va_start (a, fmt);\n  ret = vsnprintf_func (str, n, fmt, a);\n  va_end (a);\n  if (ret < 0)\n    {\n      ret = n;\n    }\n  return ret;\n}\n\n/* Handle externally-compressed inputs. */\n#ifndef EXTERNAL_COMPRESSION\n#define EXTERNAL_COMPRESSION 1\n#endif\n\n#define PRINTHDR_SPECIAL -4378291\n\n/* The number of soft-config variables.  */\n#define XD3_SOFTCFG_VARCNT 7\n\n/* this is used as in XPR(NT XD3_LIB_ERRMSG (stream, ret)) to print an\n * error message from the library. */\n#define XD3_LIB_ERRMSG(stream, ret) \"%s: %s\\n\", \\\n    xd3_errstring (stream), xd3_mainerror (ret)\n\n#if XD3_POSIX\n#include <unistd.h> /* close, read, write... */\n#include <sys/types.h>\n#include <fcntl.h>\n#endif\n\n#ifndef _WIN32\n#include <unistd.h> /* lots */\n#include <sys/time.h> /* gettimeofday() */\n#include <sys/stat.h> /* stat() and fstat() */\n#else\n#if defined(_MSC_VER)\n#define strtoll _strtoi64\n#endif\n#include <sys/types.h>\n#include <sys/stat.h>\n#ifndef WIFEXITED\n#   define WIFEXITED(stat)  (((*((int *) &(stat))) & 0xff) == 0)\n#endif\n#ifndef WEXITSTATUS\n#   define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff)\n#endif\n#ifndef S_ISREG\n//#   ifdef S_IFREG\n//#       define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)\n//#   else\n#       define S_ISREG(m) 1\n//#   endif\n#endif /* !S_ISREG */\n\n// For standard input/output handles\nstatic STARTUPINFO winStartupInfo;\n#endif\n\n/**********************************************************************\n ENUMS and TYPES\n *********************************************************************/\n\n/* These flags (mainly pertaining to main_read() operations) are set\n * in the main_file->flags variable.  All are related to with external\n * decompression support.\n *\n * RD_FIRST causes the external decompression check when the input is\n * first read.\n *\n * RD_NONEXTERNAL disables external decompression for reading a\n * compressed input, in the case of Xdelta inputs.  Note: Xdelta is\n * supported as an external compression type, which makes is the\n * reason for this flag.  An example to justify this is: to create a\n * delta between two files that are VCDIFF-compressed.  Two external\n * Xdelta decoders are run to supply decompressed source and target\n * inputs to the Xdelta encoder. */\ntypedef enum\n{\n  RD_FIRST       = (1 << 0),\n  RD_NONEXTERNAL = (1 << 1),\n  RD_DECOMPSET   = (1 << 2),\n  RD_MAININPUT   = (1 << 3),\n} xd3_read_flags;\n\n/* Main commands.  For example, CMD_PRINTHDR is the \"xdelta printhdr\"\n * command. */\ntypedef enum\n{\n  CMD_NONE = 0,\n  CMD_PRINTHDR,\n  CMD_PRINTHDRS,\n  CMD_PRINTDELTA,\n  CMD_RECODE,\n  CMD_MERGE_ARG,\n  CMD_MERGE,\n#if XD3_ENCODER\n  CMD_ENCODE,\n#endif\n  CMD_DECODE,\n  CMD_TEST,\n  CMD_CONFIG,\n} xd3_cmd;\n\n#if XD3_ENCODER\n#define CMD_DEFAULT CMD_ENCODE\n#define IS_ENCODE(cmd) (cmd == CMD_ENCODE)\n#else\n#define CMD_DEFAULT CMD_DECODE\n#define IS_ENCODE(cmd) (0)\n#endif\n\ntypedef struct _main_merge       main_merge;\ntypedef struct _main_merge_list  main_merge_list;\n\n/* Various strings and magic values used to detect and call external\n * compression.  See below for examples. */\nstruct _main_extcomp\n{\n  const char    *recomp_cmdname;\n  const char    *recomp_options;\n\n  const char    *decomp_cmdname;\n  const char    *decomp_options;\n\n  const char    *ident;\n  const char    *magic;\n  usize_t        magic_size;\n  int            flags;\n};\n\n/* Merge state: */\n\nstruct _main_merge_list\n{\n  main_merge_list  *next;\n  main_merge_list  *prev;\n};\n\nstruct _main_merge\n{\n  const char *filename;\n\n  main_merge_list  link;\n};\n\nXD3_MAKELIST(main_merge_list,main_merge,link);\n\n/* TODO: really need to put options in a struct so that internal\n * callers can easily reset state. */\n\n#define DEFAULT_VERBOSE 0\n\n/* Program options: various command line flags and options. */\nstatic int         option_stdout             = 0;\nstatic int         option_force              = 0;\nstatic int         option_verbose            = DEFAULT_VERBOSE;\nstatic int         option_quiet              = 0;\nstatic int         option_use_appheader      = 1;\nstatic uint8_t*    option_appheader          = NULL;\nstatic int         option_use_secondary      = 1;\nstatic const char* option_secondary          = NULL;\nstatic int         option_use_checksum       = 1;\nstatic const char* option_smatch_config      = NULL;\nstatic int         option_no_compress        = 0;\nstatic int         option_no_output          = 0; /* do not write output */\nstatic const char *option_source_filename    = NULL;\n\nstatic int         option_level              = XD3_DEFAULT_LEVEL;\nstatic usize_t     option_iopt_size          = XD3_DEFAULT_IOPT_SIZE;\nstatic usize_t     option_winsize            = XD3_DEFAULT_WINSIZE;\n\n/* option_srcwinsz is restricted to [16kB, 2GB] when usize_t is 32 bits. */\nstatic xoff_t      option_srcwinsz           = XD3_DEFAULT_SRCWINSZ;\nstatic usize_t     option_sprevsz            = XD3_DEFAULT_SPREVSZ;\n\n/* These variables are supressed to avoid their use w/o support.  main() warns\n * appropriately when external compression is not enabled. */\n#if EXTERNAL_COMPRESSION\nstatic int         num_subprocs = 0;\nstatic int         option_force2             = 0;\nstatic int         option_decompress_inputs  = 1;\nstatic int         option_recompress_outputs = 1;\n#endif\n\n/* This is for comparing \"printdelta\" output without attention to\n * copy-instruction modes. */\n#if VCDIFF_TOOLS\nstatic int option_print_cpymode = 1; /* Note: see reset_defaults(). */\n#endif\n\n/* Static variables */\nIF_DEBUG(static int main_mallocs = 0;)\n\nstatic char*           program_name = NULL;\nstatic uint8_t*        appheader_used = NULL;\nstatic uint8_t*        main_bdata = NULL;\nstatic usize_t         main_bsize = 0;\n\n/* Hacks for VCDIFF tools, recode command. */\nstatic int allow_fake_source = 0;\n\n/* recode_stream is used by both recode/merge for reading vcdiff inputs */\nstatic xd3_stream *recode_stream = NULL;\n\n/* merge_stream is used by merge commands for storing the source encoding */\nstatic xd3_stream *merge_stream = NULL;\n\n/* This array of compressor types is compiled even if EXTERNAL_COMPRESSION is\n * false just so the program knows the mapping of IDENT->NAME. */\nstatic main_extcomp extcomp_types[] =\n{\n  { \"bzip2\",    \"-c\",   \"bzip2\",      \"-dc\",   \"B\", \"BZh\",          3, 0 },\n  { \"gzip\",     \"-c\",   \"gzip\",       \"-dc\",   \"G\", \"\\037\\213\",     2, 0 },\n  { \"compress\", \"-c\",   \"uncompress\", \"-c\",    \"Z\", \"\\037\\235\",     2, 0 },\n\n  /* Xz is lzma with a magic number http://tukaani.org/xz/format.html */\n  { \"xz\", \"-c\", \"xz\", \"-dc\", \"Y\", \"\\xfd\\x37\\x7a\\x58\\x5a\\x00\", 2, 0 },\n};\n\nstatic int main_input (xd3_cmd cmd, main_file *ifile,\n                       main_file *ofile, main_file *sfile);\nstatic void main_get_appheader (xd3_stream *stream, main_file *ifile,\n\t\t\t\tmain_file *output, main_file *sfile);\n\nstatic int main_getblk_func (xd3_stream *stream,\n\t\t\t     xd3_source *source,\n\t\t\t     xoff_t      blkno);\nstatic int main_file_seek (main_file *xfile, xoff_t pos);\nstatic int main_read_primary_input (main_file   *file,\n\t\t\t\t    uint8_t     *buf,\n\t\t\t\t    size_t       size,\n\t\t\t\t    size_t      *nread);\n\nstatic const char* main_format_bcnt (xoff_t r, shortbuf *buf);\nstatic int main_help (void);\n\n#if XD3_ENCODER\nstatic int xd3_merge_input_output (xd3_stream *stream,\n\t\t\t\t   xd3_whole_state *source);\n#endif\n\n/* The code in xdelta3-blk.h is essentially part of this unit, see\n * comments there. */\n#include \"xdelta3-blkcache.h\"\n\nstatic void (*xprintf_message_func)(const char*msg) = NULL;\n\nvoid\nxprintf (const char *fmt, ...)\n{\n  char buf[1000];\n  va_list a;\n  int size;\n  va_start (a, fmt);\n  size = vsnprintf_func (buf, 1000, fmt, a);\n  va_end (a);\n  if (size < 0)\n    {\n      size = sizeof(buf) - 1;\n      buf[size] = 0;\n    }\n  if (xprintf_message_func != NULL) {\n    xprintf_message_func(buf);\n  } else {\n    size_t ignore = fwrite(buf, 1, size, stderr);\n    (void) ignore;\n  }\n}\n\nstatic int\nmain_version (void)\n{\n  /* $Format: \"  XPR(NTR \\\"Xdelta version $Xdelta3Version$, Copyright (C) Joshua MacDonald\\\\n\\\");\" $ */\n  XPR(NTR \"Xdelta version 3.1.1, Copyright (C) Joshua MacDonald\\n\");\n  XPR(NTR \"Xdelta comes with ABSOLUTELY NO WARRANTY.\\n\");\n  XPR(NTR \"Licensed under the Apache License, Version 2.0\\n\");\n  XPR(NTR \"See \\\"LICENSE\\\" for details.\\n\");\n  return EXIT_SUCCESS;\n}\n\nstatic int\nmain_config (void)\n{\n  main_version ();\n\n  XPR(NTR \"EXTERNAL_COMPRESSION=%d\\n\", EXTERNAL_COMPRESSION);\n  XPR(NTR \"REGRESSION_TEST=%d\\n\", REGRESSION_TEST);\n  XPR(NTR \"SECONDARY_DJW=%d\\n\", SECONDARY_DJW);\n  XPR(NTR \"SECONDARY_FGK=%d\\n\", SECONDARY_FGK);\n  XPR(NTR \"SECONDARY_LZMA=%d\\n\", SECONDARY_LZMA);\n  XPR(NTR \"UNALIGNED_OK=%d\\n\", UNALIGNED_OK);\n  XPR(NTR \"VCDIFF_TOOLS=%d\\n\", VCDIFF_TOOLS);\n  XPR(NTR \"XD3_ALLOCSIZE=%d\\n\", XD3_ALLOCSIZE);\n  XPR(NTR \"XD3_DEBUG=%d\\n\", XD3_DEBUG);\n  XPR(NTR \"XD3_ENCODER=%d\\n\", XD3_ENCODER);\n  XPR(NTR \"XD3_POSIX=%d\\n\", XD3_POSIX);\n  XPR(NTR \"XD3_STDIO=%d\\n\", XD3_STDIO);\n  XPR(NTR \"XD3_WIN32=%d\\n\", XD3_WIN32);\n  XPR(NTR \"XD3_USE_LARGEFILE64=%d\\n\", XD3_USE_LARGEFILE64);\n  XPR(NTR \"XD3_USE_LARGESIZET=%d\\n\", XD3_USE_LARGESIZET);\n  XPR(NTR \"XD3_DEFAULT_LEVEL=%d\\n\", XD3_DEFAULT_LEVEL);\n  XPR(NTR \"XD3_DEFAULT_IOPT_SIZE=%d\\n\", XD3_DEFAULT_IOPT_SIZE);\n  XPR(NTR \"XD3_DEFAULT_SPREVSZ=%d\\n\", XD3_DEFAULT_SPREVSZ);\n  XPR(NTR \"XD3_DEFAULT_SRCWINSZ=%d\\n\", XD3_DEFAULT_SRCWINSZ);\n  XPR(NTR \"XD3_DEFAULT_WINSIZE=%d\\n\", XD3_DEFAULT_WINSIZE);\n  XPR(NTR \"XD3_HARDMAXWINSIZE=%d\\n\", XD3_HARDMAXWINSIZE);\n  XPR(NTR \"sizeof(void*)=%d\\n\", (int)sizeof(void*));\n  XPR(NTR \"sizeof(int)=%d\\n\", (int)sizeof(int));\n  XPR(NTR \"sizeof(long)=%d\\n\", (int)sizeof(long));\n  XPR(NTR \"sizeof(long long)=%d\\n\", (int)sizeof(long long));\n  XPR(NTR \"sizeof(unsigned long long)=%d\\n\", (int)sizeof(unsigned long long));\n  XPR(NTR \"sizeof(size_t)=%d\\n\", (int)sizeof(size_t));\n  XPR(NTR \"sizeof(uint32_t)=%d\\n\", (int)sizeof(uint32_t));\n  XPR(NTR \"sizeof(uint64_t)=%d\\n\", (int)sizeof(uint64_t));\n  XPR(NTR \"sizeof(usize_t)=%d\\n\", (int)sizeof(usize_t));\n  XPR(NTR \"sizeof(xoff_t)=%d\\n\", (int)sizeof(xoff_t));\n\n  return EXIT_SUCCESS;\n}\n\nstatic void\nreset_defaults(void)\n{\n  option_stdout = 0;\n  option_force = 0;\n  option_verbose = DEFAULT_VERBOSE;\n  option_quiet = 0;\n  option_appheader = NULL;\n  option_use_secondary = 1;\n  option_secondary = NULL;\n  option_smatch_config = NULL;\n  option_no_compress = 0;\n  option_no_output = 0;\n  option_source_filename = NULL;\n  program_name = NULL;\n  appheader_used = NULL;\n  main_bdata = NULL;\n  main_bsize = 0;\n  allow_fake_source = 0;\n  option_smatch_config = NULL;\n\n  main_lru_reset();\n\n  option_use_appheader = 1;\n  option_use_checksum = 1;\n#if EXTERNAL_COMPRESSION\n  option_force2 = 0;\n  option_decompress_inputs  = 1;\n  option_recompress_outputs = 1;\n  num_subprocs = 0;\n#endif\n#if VCDIFF_TOOLS\n  option_print_cpymode = 1;\n#endif\n  option_level = XD3_DEFAULT_LEVEL;\n  option_iopt_size = XD3_DEFAULT_IOPT_SIZE;\n  option_winsize = XD3_DEFAULT_WINSIZE;\n  option_srcwinsz = XD3_DEFAULT_SRCWINSZ;\n  option_sprevsz = XD3_DEFAULT_SPREVSZ;\n}\n\nstatic void*\nmain_malloc1 (size_t size)\n{\n  void* r = malloc (size);\n  if (r == NULL) { XPR(NT \"malloc: %s\\n\", xd3_mainerror (ENOMEM)); }\n  return r;\n}\n\nvoid* main_bufalloc (size_t size) {\n#if XD3_WIN32\n  return VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n#else\n  return main_malloc1(size);\n#endif\n}\n\nvoid*\nmain_malloc (size_t size)\n{\n  void *r = main_malloc1 (size);\n  if (r) { IF_DEBUG (main_mallocs += 1); }\n  return r;\n}\n\nstatic void*\nmain_alloc (void   *opaque,\n\t    size_t  items,\n\t    usize_t  size)\n{\n  return main_malloc1 (items * size);\n}\n\nstatic void\nmain_free1 (void *opaque, void *ptr)\n{\n  free (ptr);\n}\n\nvoid\nmain_free (void *ptr)\n{\n  if (ptr)\n    {\n      IF_DEBUG (main_mallocs -= 1);\n      main_free1 (NULL, ptr);\n      IF_DEBUG (XD3_ASSERT(main_mallocs >= 0));\n    }\n}\n\nvoid main_buffree (void *ptr) {\n#if XD3_WIN32\n  VirtualFree(ptr, 0, MEM_RELEASE);\n#else\n  main_free1(NULL, ptr);\n#endif\n}\n\n/* This ensures that (ret = errno) always indicates failure, in case errno was\n * accidentally not set.  If this prints there's a bug somewhere. */\nstatic int\nget_errno (void)\n{\n#ifndef _WIN32\n  if (errno == 0)\n    {\n      XPR(NT \"you found a bug: expected errno != 0\\n\");\n      errno = XD3_INTERNAL;\n    }\n  return errno;\n#else\n  DWORD err_num = GetLastError();\n  if (err_num == NO_ERROR)\n    {\n      err_num = XD3_INTERNAL;\n    }\n  return err_num;\n#endif\n}\n\nconst char*\nxd3_mainerror(int err_num) {\n#ifndef _WIN32\n\tconst char* x = xd3_strerror (err_num);\n\tif (x != NULL)\n\t  {\n\t    return x;\n\t  }\n\treturn strerror(err_num);\n#else\n\tstatic char err_buf[256];\n\tconst char* x = xd3_strerror (err_num);\n\tif (x != NULL)\n\t  {\n\t    return x;\n\t  }\n\tmemset (err_buf, 0, 256);\n\tFormatMessage (FORMAT_MESSAGE_FROM_SYSTEM |\n\t\t       FORMAT_MESSAGE_IGNORE_INSERTS,\n\t\t       NULL, err_num,\n\t\t       MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\n\t\t       err_buf, 256, NULL);\n\tif (err_buf[0] != 0 && err_buf[strlen(err_buf) - 1] == '\\n')\n\t  {\n\t    err_buf[strlen(err_buf) - 1] = 0;\n\t  }\n\treturn err_buf;\n#endif\n}\n\nlong\nget_millisecs_now (void)\n{\n#ifndef _WIN32\n  struct timeval tv;\n\n  gettimeofday (& tv, NULL);\n\n  return (tv.tv_sec) * 1000L + (tv.tv_usec) / 1000;\n#else\n  SYSTEMTIME st;\n  FILETIME ft;\n  __int64 *pi = (__int64*)&ft;\n  GetLocalTime(&st);\n  SystemTimeToFileTime(&st, &ft);\n  return (long)((*pi) / 10000);\n#endif\n}\n\n/* Always >= 1 millisec, right? */\nstatic long\nget_millisecs_since (void)\n{\n  static long last = 0;\n  long now = get_millisecs_now();\n  long diff = now - last;\n  last = now;\n  return diff;\n}\n\nstatic const char*\nmain_format_bcnt (xoff_t r, shortbuf *buf)\n{\n  static const char* fmts[] = { \"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\" };\n  usize_t i;\n\n  for (i = 0; i < SIZEOF_ARRAY(fmts) - 1; i += 1)\n    {\n      xoff_t new_r;\n\n      if (r == 0)\n\t{\n\t  short_sprintf (*buf, \"0 %s\", fmts[i]);\n\t  return buf->buf;\n\t}\n\n      if (r >= 1 && r < 10)\n\t{\n\t  short_sprintf (*buf, \"%.2f %s\", (double) r, fmts[i]);\n\t  return buf->buf;\n\t}\n\n      if (r >= 10 && r < 100)\n\t{\n\t  short_sprintf (*buf, \"%.1f %s\", (double) r, fmts[i]);\n\t  return buf->buf;\n\t}\n\n      if (r >= 100 && r < 1000)\n\t{\n\t  short_sprintf (*buf, \"%\"Q\"u %s\", r, fmts[i]);\n\t  return buf->buf;\n\t}\n\n      new_r = r / 1024;\n\n      if (new_r < 10)\n\t{\n\t  short_sprintf (*buf, \"%.2f %s\", (double) r / 1024.0, fmts[i + 1]);\n\t  return buf->buf;\n\t}\n\n      if (new_r < 100)\n\t{\n\t  short_sprintf (*buf, \"%.1f %s\", (double) r / 1024.0, fmts[i + 1]);\n\t  return buf->buf;\n\t}\n\n      r = new_r;\n    }\n  XD3_ASSERT (0);\n  return \"\";\n}\n\nstatic char*\nmain_format_rate (xoff_t bytes, long millis, shortbuf *buf)\n{\n  xoff_t r = (xoff_t)(1.0 * bytes / (1.0 * millis / 1000.0));\n  static shortbuf lbuf;\n\n  main_format_bcnt (r, &lbuf);\n  short_sprintf (*buf, \"%s/s\", lbuf.buf);\n  return buf->buf;\n}\n\nstatic char*\nmain_format_millis (long millis, shortbuf *buf)\n{\n  if (millis < 1000)\n    { \n      short_sprintf (*buf, \"%lu ms\", millis); \n    }\n  else if (millis < 10000) \n    {\n      short_sprintf (*buf, \"%.1f sec\", millis / 1000.0);\n    }\n  else\n    {\n      short_sprintf (*buf, \"%lu sec\", millis / 1000L); \n    }\n  return buf->buf;\n}\n\n/* A safe version of strtol for xoff_t. */\nstatic int\nmain_strtoxoff (const char* s, xoff_t *xo, char which)\n{\n  char *e;\n  xoff_t x;\n\n  XD3_ASSERT(s && *s != 0);\n\n  {\n#if SIZEOF_XOFF_T == SIZEOF_UNSIGNED_LONG_LONG\n    unsigned long long xx = strtoull (s, &e, 0);\n    unsigned long long bad = ULLONG_MAX;\n#elif SIZEOF_XOFF_T <= SIZEOF_UNSIGNED_LONG\n    unsigned long xx = strtoul (s, &e, 0);\n    unsigned long long bad = ULONG_MAX;\n#else\n    /* Something wrong with SIZEOF_XOFF_T, SIZEOF_UNSIGNED_LONG, etc. */\n    #error Bad configure script\n#endif\n\n    if (xx == bad)\n      {\n\tXPR(NT \"-%c: negative integer: %s\\n\", which, s);\n\treturn EXIT_FAILURE;\n      }\n\n    x = xx;\n  }\n\n  if (*e != 0)\n    {\n      XPR(NT \"-%c: invalid integer: %s\\n\", which, s);\n      return EXIT_FAILURE;\n    }\n\n  (*xo) = x;\n  return 0;\n}\n\nstatic int\nmain_atoux (const char* arg, xoff_t *xo, xoff_t low,\n\t    xoff_t high, char which)\n{\n  xoff_t x;\n  int ret;\n\n  if ((ret = main_strtoxoff (arg, & x, which))) { return ret; }\n\n  if (x < low)\n    {\n      XPR(NT \"-%c: minimum value: %\"Q\"u\\n\", which, low);\n      return EXIT_FAILURE;\n    }\n  if (high != 0 && x > high)\n    {\n      XPR(NT \"-%c: maximum value: %\"Q\"u\\n\", which, high);\n      return EXIT_FAILURE;\n    }\n  (*xo) = x;\n  return 0;\n}\n\nstatic int\nmain_atou (const char* arg, usize_t *uo, usize_t low,\n\t   usize_t high, char which) \n{\n  int ret;\n  xoff_t xo;\n  if ((ret = main_atoux (arg, &xo, low, high, which)))\n    {\n      return ret;\n    }\n  *uo = (usize_t)xo;\n  return 0;\n}\n\n/******************************************************************\n FILE BASICS\n ******************************************************************/\n\n/* With all the variation in file system-call semantics, arguments,\n * return values and error-handling for the POSIX and STDIO file APIs,\n * the insides of these functions make me sick, which is why these\n * wrappers exist. */\n\n#define XOPEN_OPNAME (xfile->mode == XO_READ ? \"read\" : \"write\")\n#define XOPEN_STDIO  (xfile->mode == XO_READ ? \"rb\" : \"wb\")\n#define XOPEN_POSIX  (xfile->mode == XO_READ ? \\\n\t\t      O_RDONLY : O_WRONLY | O_CREAT | O_TRUNC)\n#define XOPEN_MODE   (xfile->mode == XO_READ ? 0 : 0666)\n\n#define XF_ERROR(op, name, ret) \\\n  do { if (!option_quiet) { XPR(NT \"file %s failed: %s: %s: %s\\n\", (op), \\\n       XOPEN_OPNAME, (name), xd3_mainerror (ret)); } } while (0)\n\n#if XD3_STDIO\n#define XFNO(f) fileno(f->file)\n#define XSTDOUT_XF(f) { (f)->file = stdout; (f)->filename = \"/dev/stdout\"; }\n#define XSTDIN_XF(f)  { (f)->file = stdin;  (f)->filename = \"/dev/stdin\"; }\n\n#elif XD3_POSIX\n#define XFNO(f) f->file\n#define XSTDOUT_XF(f) \\\n  { (f)->file = STDOUT_FILENO; (f)->filename = \"/dev/stdout\"; }\n#define XSTDIN_XF(f) \\\n  { (f)->file = STDIN_FILENO;  (f)->filename = \"/dev/stdin\"; }\n\n#elif XD3_WIN32\n#define XFNO(f) -1\n#define XSTDOUT_XF(f) { \\\n  (f)->file = GetStdHandle(STD_OUTPUT_HANDLE); \\\n  (f)->filename = \"(stdout)\"; \\\n  }\n#define XSTDIN_XF(f) { \\\n  (f)->file = GetStdHandle(STD_INPUT_HANDLE); \\\n  (f)->filename = \"(stdin)\"; \\\n  }\n#endif\n\nvoid\nmain_file_init (main_file *xfile)\n{\n  memset (xfile, 0, sizeof (*xfile));\n\n#if XD3_POSIX\n  xfile->file = -1;\n#endif\n#if XD3_WIN32\n  xfile->file = INVALID_HANDLE_VALUE;\n#endif\n}\n\nint\nmain_file_isopen (main_file *xfile)\n{\n#if XD3_STDIO\n  return xfile->file != NULL;\n\n#elif XD3_POSIX\n  return xfile->file != -1;\n\n#elif XD3_WIN32\n  return xfile->file != INVALID_HANDLE_VALUE;\n#endif\n}\n\nint\nmain_file_close (main_file *xfile)\n{\n  int ret = 0;\n\n  if (! main_file_isopen (xfile))\n    {\n      return 0;\n    }\n\n#if XD3_STDIO\n  ret = fclose (xfile->file);\n  xfile->file = NULL;\n\n#elif XD3_POSIX\n  ret = close (xfile->file);\n  xfile->file = -1;\n\n#elif XD3_WIN32\n  if (!CloseHandle(xfile->file)) {\n    ret = get_errno ();\n  }\n  xfile->file = INVALID_HANDLE_VALUE;\n#endif\n\n  if (ret != 0) { XF_ERROR (\"close\", xfile->filename, ret = get_errno ()); }\n  return ret;\n}\n\nvoid\nmain_file_cleanup (main_file *xfile)\n{\n  XD3_ASSERT (xfile != NULL);\n\n  if (main_file_isopen (xfile))\n    {\n      main_file_close (xfile);\n    }\n\n  if (xfile->snprintf_buf != NULL)\n    {\n      main_free(xfile->snprintf_buf);\n      xfile->snprintf_buf = NULL;\n    }\n\n  if (xfile->filename_copy != NULL)\n    {\n      main_free(xfile->filename_copy);\n      xfile->filename_copy = NULL;\n    }\n}\n\nint\nmain_file_open (main_file *xfile, const char* name, int mode)\n{\n  int ret = 0;\n\n  xfile->mode = mode;\n\n  XD3_ASSERT (name != NULL);\n  XD3_ASSERT (! main_file_isopen (xfile));\n  if (name[0] == 0)\n    {\n      XPR(NT \"invalid file name: empty string\\n\");\n      return XD3_INVALID;\n    }\n\n  IF_DEBUG1(DP(RINT \"[main] open source %s\\n\", name));\n\n#if XD3_STDIO\n  xfile->file = fopen (name, XOPEN_STDIO);\n\n  ret = (xfile->file == NULL) ? get_errno () : 0;\n\n#elif XD3_POSIX\n  /* TODO: Should retry this call if interrupted, similar to read/write */\n  if ((ret = open (name, XOPEN_POSIX, XOPEN_MODE)) < 0)\n    {\n      ret = get_errno ();\n    }\n  else\n    {\n      xfile->file = ret;\n      ret = 0;\n    }\n\n#elif XD3_WIN32\n  xfile->file = CreateFile(name,\n\t\t\t   (mode == XO_READ) ? GENERIC_READ : GENERIC_WRITE,\n\t\t\t   FILE_SHARE_READ,\n\t\t\t   NULL,\n\t\t\t   (mode == XO_READ) ?\n\t\t\t   OPEN_EXISTING :\n\t\t\t   (option_force ? CREATE_ALWAYS : CREATE_NEW),\n\t\t\t   FILE_ATTRIBUTE_NORMAL,\n\t\t\t   NULL);\n  if (xfile->file == INVALID_HANDLE_VALUE)\n    {\n      ret = get_errno ();\n    }\n#endif\n  if (ret) { XF_ERROR (\"open\", name, ret); }\n  else     { xfile->realname = name; xfile->nread = 0; }\n  return ret;\n}\n\nint\nmain_file_stat (main_file *xfile, xoff_t *size)\n{\n  int ret = 0;\n#if XD3_WIN32\n  if (GetFileType(xfile->file) != FILE_TYPE_DISK)\n    {\n      return -1;\n    }\n# if (_WIN32_WINNT >= 0x0500)\n  {\n    LARGE_INTEGER li;\n    if (GetFileSizeEx(xfile->file, &li) == 0)\n      {\n\treturn get_errno ();\n      }\n    *size = li.QuadPart;\n  }\n# else\n  {\n    DWORD filesize = GetFileSize(xfile->file, NULL);\n    if (filesize == INVALID_FILE_SIZE)\n      {\n\treturn get_errno ()\n      }\n    *size = filesize;\n  }\n# endif\n#else\n  struct stat sbuf;\n  if (fstat (XFNO (xfile), & sbuf) < 0)\n    {\n      ret = get_errno ();\n      return ret;\n    }\n\n  if (! S_ISREG (sbuf.st_mode))\n    {\n      return ESPIPE;\n    }\n  (*size) = sbuf.st_size;\n#endif\n  return ret;\n}\n\nint\nmain_file_exists (main_file *xfile)\n{\n  struct stat sbuf;\n  return stat (xfile->filename, & sbuf) == 0 && S_ISREG (sbuf.st_mode);\n}\n\n#if (XD3_POSIX || EXTERNAL_COMPRESSION)\n/* POSIX-generic code takes a function pointer to read() or write().\n * This calls the function repeatedly until the buffer is full or EOF.\n * The NREAD parameter is not set for write, NULL is passed.  Return\n * is signed, < 0 indicate errors, otherwise byte count. */\ntypedef int (xd3_posix_func) (int fd, uint8_t *buf, usize_t size);\n\nstatic int\nxd3_posix_io (int fd, uint8_t *buf, size_t size,\n\t      xd3_posix_func *func, size_t *nread)\n{\n  int ret;\n  size_t nproc = 0;\n\n  while (nproc < size)\n    {\n      size_t tryread = xd3_min(size - nproc, 1U << 30);\n      ssize_t result = (*func) (fd, buf + nproc, tryread);\n\n      if (result < 0)\n\t{\n\t  ret = get_errno ();\n\t  if (ret != EAGAIN && ret != EINTR)\n\t    {\n\t      return ret;\n\t    }\n\t  continue;\n\t}\n\n      if (nread != NULL && result == 0) { break; }\n\n      nproc += result;\n    }\n  if (nread != NULL) { (*nread) = nproc; }\n  return 0;\n}\n#endif\n\n#if XD3_WIN32\nstatic int\nxd3_win32_io (HANDLE file, uint8_t *buf, size_t size,\n\t      int is_read, size_t *nread)\n{\n  int ret = 0;\n  size_t nproc = 0;\n\n  while (nproc < size)\n    {\n      DWORD nproc2 = 0;  /* hmm */\n\t  DWORD nremain = size - nproc;\n      if ((is_read ?\n\t   ReadFile (file, buf + nproc, nremain, &nproc2, NULL) :\n\t   WriteFile (file, buf + nproc, nremain, &nproc2, NULL)) == 0)\n\t{\n\t  ret = get_errno();\n\t  if (ret != ERROR_HANDLE_EOF && ret != ERROR_BROKEN_PIPE)\n\t    {\n\t      return ret;\n\t    }\n\t  /* By falling through here, we'll break this loop in the\n\t   * read case in case of eof or broken pipe. */\n\t}\n\n      nproc += nproc2;\n\n      if (nread != NULL && nproc2 == 0) { break; }\n    }\n  if (nread != NULL) { (*nread) = nproc; }\n  return 0;\n}\n#endif\n\n/* POSIX is unbuffered, while STDIO is buffered.  main_file_read()\n * should always be called on blocks. */\nint\nmain_file_read (main_file  *ifile,\n\t\tuint8_t    *buf,\n\t\tsize_t      size,\n\t\tsize_t     *nread,\n\t\tconst char *msg)\n{\n  int ret = 0;\n  IF_DEBUG1(DP(RINT \"[main] read %s up to %\"Z\"u\\n\", ifile->filename, size));\n\n#if XD3_STDIO\n  size_t result;\n\n  result = fread (buf, 1, size, ifile->file);\n\n  if (result < size && ferror (ifile->file))\n    {\n      ret = get_errno ();\n    }\n  else\n    {\n      *nread = result;\n    }\n\n#elif XD3_POSIX\n  ret = xd3_posix_io (ifile->file, buf, size, (xd3_posix_func*) &read, nread);\n#elif XD3_WIN32\n  ret = xd3_win32_io (ifile->file, buf, size, 1 /* is_read */, nread);\n#endif\n\n  if (ret)\n    {\n      XPR(NT \"%s: %s: %s\\n\", msg, ifile->filename, xd3_mainerror (ret));\n    }\n  else\n    {\n      if (option_verbose > 4) { XPR(NT \"read %s: %\"Z\"u bytes\\n\",\n\t\t\t\t    ifile->filename, (*nread)); }\n      ifile->nread += (*nread);\n    }\n\n  return ret;\n}\n\nint\nmain_file_write (main_file *ofile, uint8_t *buf, usize_t size, const char *msg)\n{\n  int ret = 0;\n\n  IF_DEBUG1(DP(RINT \"[main] write %\"W\"u\\n bytes\", size));\n  \n#if XD3_STDIO\n  usize_t result;\n\n  result = fwrite (buf, 1, size, ofile->file);\n\n  if (result != size) { ret = get_errno (); }\n\n#elif XD3_POSIX\n  ret = xd3_posix_io (ofile->file, buf, size, (xd3_posix_func*) &write, NULL);\n\n#elif XD3_WIN32\n  ret = xd3_win32_io (ofile->file, buf, size, 0, NULL);\n\n#endif\n\n  if (ret)\n    {\n      XPR(NT \"%s: %s: %s\\n\", msg, ofile->filename, xd3_mainerror (ret));\n    }\n  else\n    {\n      if (option_verbose > 5) { XPR(NT \"write %s: %\"W\"u bytes\\n\",\n\t\t\t\t    ofile->filename, size); }\n      ofile->nwrite += size;\n    }\n\n  return ret;\n}\n\nstatic int\nmain_file_seek (main_file *xfile, xoff_t pos)\n{\n  int ret = 0;\n\n#if XD3_STDIO\n  if (fseek (xfile->file, pos, SEEK_SET) != 0) { ret = get_errno (); }\n\n#elif XD3_POSIX\n  if ((xoff_t) lseek (xfile->file, pos, SEEK_SET) != pos)\n    { ret = get_errno (); }\n\n#elif XD3_WIN32\n# if (_WIN32_WINNT >= 0x0500)\n  LARGE_INTEGER move, out;\n  move.QuadPart = pos;\n  if (SetFilePointerEx(xfile->file, move, &out, FILE_BEGIN) == 0)\n    {\n      ret = get_errno ();\n    }\n# else\n  if (SetFilePointer(xfile->file, (LONG)pos, NULL, FILE_BEGIN) ==\n      INVALID_SET_FILE_POINTER)\n    {\n      ret = get_errno ();\n    }\n# endif\n#endif\n\n  return ret;\n}\n\n/* This function simply writes the stream output buffer, if there is\n * any, for encode, decode and recode commands.  (The VCDIFF tools use\n * main_print_func()). */\nstatic int\nmain_write_output (xd3_stream* stream, main_file *ofile)\n{\n  int ret;\n\n  IF_DEBUG1(DP(RINT \"[main] write(%s) %\"W\"u\\n bytes\", ofile->filename, stream->avail_out));\n\n  if (option_no_output)\n    {\n      return 0;\n    }\n\n  if (stream->avail_out > 0 &&\n      (ret = main_file_write (ofile, stream->next_out,\n\t\t\t      stream->avail_out, \"write failed\")))\n    {\n      return ret;\n    }\n\n  return 0;\n}\n\nstatic int\nmain_set_secondary_flags (xd3_config *config)\n{\n  int ret;\n  if (!option_use_secondary)\n    {\n      return 0;\n    }\n  if (option_secondary == NULL)\n    {\n      /* Set a default secondary compressor if LZMA is built in, otherwise\n       * default to no secondary compressor. */\n      if (SECONDARY_LZMA)\n\t{\n\t  config->flags |= XD3_SEC_LZMA;\n\t}\n    }\n  else\n    {\n      if (strcmp (option_secondary, \"lzma\") == 0 && SECONDARY_LZMA)\n\t{\n\t  config->flags |= XD3_SEC_LZMA;\n\t}\n      else if (strcmp (option_secondary, \"fgk\") == 0 && SECONDARY_FGK)\n\t{\n\t  config->flags |= XD3_SEC_FGK;\n\t}\n      else if (strncmp (option_secondary, \"djw\", 3) == 0 && SECONDARY_DJW)\n\t{\n\t  usize_t level = XD3_DEFAULT_SECONDARY_LEVEL;\n\n\t  config->flags |= XD3_SEC_DJW;\n\n\t  if (strlen (option_secondary) > 3 &&\n\t      (ret = main_atou (option_secondary + 3,\n\t\t\t\t&level,\n\t\t\t\t0, 9, 'S')) != 0 &&\n\t      !option_quiet)\n\t    {\n\t      return XD3_INVALID;\n\t    }\n\n\t  /* XD3_SEC_NOXXXX flags disable secondary compression on\n\t   * a per-section basis.  For djw, ngroups=1 indicates\n\t   * minimum work, ngroups=0 uses default settings, which\n\t   * is > 1 groups by default. */\n\t  if (level < 1) { config->flags |= XD3_SEC_NODATA; }\n\t  if (level < 7) { config->sec_data.ngroups = 1; }\n\t  else { config->sec_data.ngroups = 0; }\n\n\t  if (level < 3) { config->flags |= XD3_SEC_NOINST; }\n\t  if (level < 8) { config->sec_inst.ngroups = 1; }\n\t  else { config->sec_inst.ngroups = 0; }\n\n\t  if (level < 5) { config->flags |= XD3_SEC_NOADDR; }\n\t  if (level < 9) { config->sec_addr.ngroups = 1; }\n\t  else { config->sec_addr.ngroups = 0; }\n\t}\n      else if (*option_secondary == 0 ||\n\t       strcmp (option_secondary, \"none\") == 0)\n\t{\n\t}\n      else \n\t{\n\t  if (!option_quiet)\n\t    {\n\t      XPR(NT \"unrecognized or not compiled secondary compressor: %s\\n\",\n\t\t  option_secondary);\n\t    }\n\t  return XD3_INVALID;\n\t}\n    }\n\n  if (option_verbose)\n    {\n      XPR(NT \"secondary compression: %s\\n\",\n\t  (config->flags | XD3_SEC_LZMA) ? \"lzma\" :\n\t  ((config->flags | XD3_SEC_FGK) ? \"fgk\" :\n\t   ((config->flags | XD3_SEC_DJW) ? \"djw\" :\n\t    \"none\")));\n    }\n\n  return 0;\n}\n\n/******************************************************************\n VCDIFF TOOLS\n *****************************************************************/\n\n#include \"xdelta3-merge.h\"\n\n#if VCDIFF_TOOLS\n\n/* The following macros let VCDIFF print using main_file_write(),\n * for example:\n *\n *   VC(UT \"trying to be portable: %d\\n\", x)VE;\n */\n#define SNPRINTF_BUFSIZE 1024\n#define VC do { if (((ret = xsnprintf_func\n#define UT (char*)xfile->snprintf_buf, SNPRINTF_BUFSIZE,\n#define VE ) >= SNPRINTF_BUFSIZE\t\t\t       \\\n  && (ret = main_print_overflow(ret)) != 0)\t\t       \\\n  || (ret = main_file_write(xfile, xfile->snprintf_buf,        \\\n\t\t\t    (usize_t)ret, \"print\")) != 0)      \\\n  { return ret; } } while (0)\n\nstatic int\nmain_print_overflow (int x)\n{\n  XPR(NT \"internal print buffer overflow: %d bytes\\n\", x);\n  return XD3_INTERNAL;\n}\n\n/* This function prints a single VCDIFF window. */\nstatic int\nmain_print_window (xd3_stream* stream, main_file *xfile)\n{\n  int ret;\n  usize_t size = 0;\n\n  VC(UT \"  Offset Code Type1 Size1  @Addr1 + Type2 Size2 @Addr2\\n\")VE;\n\n  while (stream->inst_sect.buf < stream->inst_sect.buf_max)\n    {\n      usize_t code = stream->inst_sect.buf[0];\n      const uint8_t *addr_before = stream->addr_sect.buf;\n      const uint8_t *inst_before = stream->inst_sect.buf;\n      usize_t addr_bytes;\n      usize_t inst_bytes;\n      usize_t size_before = size;\n\n      if ((ret = xd3_decode_instruction (stream)))\n\t{\n\t  XPR(NT \"instruction decode error at %\"Q\"u: %s\\n\",\n\t      stream->dec_winstart + size, stream->msg);\n\t  return ret;\n\t}\n\n      addr_bytes = (usize_t)(stream->addr_sect.buf - addr_before);\n      inst_bytes = (usize_t)(stream->inst_sect.buf - inst_before);\n\n      VC(UT \"  %06\"Q\"u %03\"W\"u  %s %6\"W\"u\", \n\t stream->dec_winstart + size,\n\t option_print_cpymode ? code : 0,\n\t xd3_rtype_to_string ((xd3_rtype) stream->dec_current1.type,\n\t\t\t      option_print_cpymode),\n\t stream->dec_current1.size)VE;\n\n      if (stream->dec_current1.type != XD3_NOOP)\n\t{\n\t  if (stream->dec_current1.type >= XD3_CPY)\n\t    {\n\t      if (stream->dec_current1.addr >= stream->dec_cpylen)\n\t\t{\n\t\t  VC(UT \" T@%-6\"W\"u\",\n\t\t     stream->dec_current1.addr - stream->dec_cpylen)VE;\n\t\t}\n\t      else\n\t\t{\n\t\t  VC(UT \" S@%-6\"Q\"u\",\n\t\t     stream->dec_cpyoff + stream->dec_current1.addr)VE;\n\t\t}\n\t    }\n\t  else\n\t    {\n\t      VC(UT \"        \")VE;\n\t    }\n\n\t  size += stream->dec_current1.size;\n\t}\n\n      if (stream->dec_current2.type != XD3_NOOP)\n\t{\n\t  VC(UT \"  %s %6\"W\"u\",\n\t     xd3_rtype_to_string ((xd3_rtype) stream->dec_current2.type,\n\t\t\t\t  option_print_cpymode),\n\t     stream->dec_current2.size)VE;\n\n\t  if (stream->dec_current2.type >= XD3_CPY)\n\t    {\n\t      if (stream->dec_current2.addr >= stream->dec_cpylen)\n\t\t{\n\t\t  VC(UT \" T@%-6\"W\"u\",\n\t\t     stream->dec_current2.addr - stream->dec_cpylen)VE;\n\t\t}\n\t      else\n\t\t{\n\t\t  VC(UT \" S@%-6\"Q\"u\",\n\t\t     stream->dec_cpyoff + stream->dec_current2.addr)VE;\n\t\t}\n\t    }\n\n\t  size += stream->dec_current2.size;\n\t}\n\n      VC(UT \"\\n\")VE;\n\n      if (option_verbose &&\n\t  addr_bytes + inst_bytes >= (size - size_before) &&\n\t  (stream->dec_current1.type >= XD3_CPY ||\n\t   stream->dec_current2.type >= XD3_CPY))\n\t{\n\t  VC(UT \"  %06\"Q\"u (inefficiency) %\"W\"u encoded as %\"W\"u bytes\\n\",\n\t     stream->dec_winstart + size_before,\n\t     size - size_before,\n\t     addr_bytes + inst_bytes)VE;\n\t}\n    }\n\n  if (stream->dec_tgtlen != size && (stream->flags & XD3_SKIP_WINDOW) == 0)\n    {\n      XPR(NT \"target window size inconsistency\");\n      return XD3_INTERNAL;\n    }\n\n  if (stream->dec_position != stream->dec_maxpos)\n    {\n      XPR(NT \"target window position inconsistency\");\n      return XD3_INTERNAL;\n    }\n\n  if (stream->addr_sect.buf != stream->addr_sect.buf_max)\n    {\n      XPR(NT \"address section inconsistency\");\n      return XD3_INTERNAL;\n    }\n\n  return 0;\n}\n\nstatic int\nmain_print_vcdiff_file (main_file *xfile, main_file *file, const char *type)\n{\n  int ret;  /* Used by above macros */\n  if (file->filename)\n    {\n      VC(UT \"XDELTA filename (%s):     %s\\n\", type,\n\t file->filename)VE;\n    }\n  if (file->compressor)\n    {\n      VC(UT \"XDELTA ext comp (%s):     %s\\n\", type,\n\t file->compressor->recomp_cmdname)VE;\n    }\n  return 0;\n}\n\n/* This function prints a VCDIFF input, mainly for debugging purposes. */\nstatic int\nmain_print_func (xd3_stream* stream, main_file *xfile)\n{\n  int ret;\n\n  if (option_no_output)\n    {\n      return 0;\n    }\n\n  if (xfile->snprintf_buf == NULL)\n    {\n      if ((xfile->snprintf_buf =\n\t   (uint8_t*)main_malloc(SNPRINTF_BUFSIZE)) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n    }\n\n  if (stream->dec_winstart == 0)\n    {\n      VC(UT \"VCDIFF version:               0\\n\")VE;\n      VC(UT \"VCDIFF header size:           %\"W\"u\\n\",\n\t stream->dec_hdrsize)VE;\n      VC(UT \"VCDIFF header indicator:      \")VE;\n      if ((stream->dec_hdr_ind & VCD_SECONDARY) != 0)\n\tVC(UT \"VCD_SECONDARY \")VE;\n      if ((stream->dec_hdr_ind & VCD_CODETABLE) != 0)\n\tVC(UT \"VCD_CODETABLE \")VE;\n      if ((stream->dec_hdr_ind & VCD_APPHEADER) != 0)\n\tVC(UT \"VCD_APPHEADER \")VE;\n      if (stream->dec_hdr_ind == 0)\n\tVC(UT \"none\")VE;\n      VC(UT \"\\n\")VE;\n\n      IF_SEC(VC(UT \"VCDIFF secondary compressor:  %s\\n\",\n\t\tstream->sec_type ? stream->sec_type->name : \"none\")VE);\n      IF_NSEC(VC(UT \"VCDIFF secondary compressor: unsupported\\n\")VE);\n\n      if (stream->dec_hdr_ind & VCD_APPHEADER)\n\t{\n\t  uint8_t *apphead;\n\t  usize_t appheadsz;\n\t  ret = xd3_get_appheader (stream, & apphead, & appheadsz);\n\n\t  if (ret == 0 && appheadsz > 0)\n\t    {\n\t      int sq = option_quiet;\n\t      main_file i, o, s;\n\t      XD3_ASSERT (apphead != NULL);\n\t      VC(UT \"VCDIFF application header:    \")VE;\n\t      if ((ret = main_file_write (xfile, apphead,\n\t\t\t\t\t  appheadsz, \"print\")) != 0)\n\t\t{ return ret; }\n\t      VC(UT \"\\n\")VE;\n\n\t      main_file_init (& i);\n\t      main_file_init (& o);\n\t      main_file_init (& s);\n\t      option_quiet = 1;\n\t      main_get_appheader (stream, &i, & o, & s);\n\t      option_quiet = sq;\n\t      if ((ret = main_print_vcdiff_file (xfile, & o, \"output\")))\n\t\t{ return ret; }\n\t      if ((ret = main_print_vcdiff_file (xfile, & s, \"source\")))\n\t\t{ return ret; }\n\t      main_file_cleanup (& i);\n\t      main_file_cleanup (& o);\n\t      main_file_cleanup (& s);\n\t    }\n\t}\n    }\n  else\n    {\n      VC(UT \"\\n\")VE;\n    }\n\n  VC(UT \"VCDIFF window number:         %\"Q\"u\\n\", stream->current_window)VE;\n  VC(UT \"VCDIFF window indicator:      \")VE;\n  if ((stream->dec_win_ind & VCD_SOURCE) != 0) VC(UT \"VCD_SOURCE \")VE;\n  if ((stream->dec_win_ind & VCD_TARGET) != 0) VC(UT \"VCD_TARGET \")VE;\n  if ((stream->dec_win_ind & VCD_ADLER32) != 0) VC(UT \"VCD_ADLER32 \")VE;\n  if (stream->dec_win_ind == 0) VC(UT \"none\")VE;\n  VC(UT \"\\n\")VE;\n\n  if ((stream->dec_win_ind & VCD_ADLER32) != 0)\n    {\n      VC(UT \"VCDIFF adler32 checksum:      %08X\\n\",\n\t stream->dec_adler32)VE;\n    }\n\n  if (stream->dec_del_ind != 0)\n    {\n      VC(UT \"VCDIFF delta indicator:       \")VE;\n      if ((stream->dec_del_ind & VCD_DATACOMP) != 0) VC(UT \"VCD_DATACOMP \")VE;\n      if ((stream->dec_del_ind & VCD_INSTCOMP) != 0) VC(UT \"VCD_INSTCOMP \")VE;\n      if ((stream->dec_del_ind & VCD_ADDRCOMP) != 0) VC(UT \"VCD_ADDRCOMP \")VE;\n      if (stream->dec_del_ind == 0) VC(UT \"none\")VE;\n      VC(UT \"\\n\")VE;\n    }\n\n  if (stream->dec_winstart != 0)\n    {\n      VC(UT \"VCDIFF window at offset:      %\"Q\"u\\n\", stream->dec_winstart)VE;\n    }\n\n  if (SRCORTGT (stream->dec_win_ind))\n    {\n      VC(UT \"VCDIFF copy window length:    %\"W\"u\\n\",\n\t stream->dec_cpylen)VE;\n      VC(UT \"VCDIFF copy window offset:    %\"Q\"u\\n\",\n\t stream->dec_cpyoff)VE;\n    }\n\n  VC(UT \"VCDIFF delta encoding length: %\"W\"u\\n\",\n     (usize_t)stream->dec_enclen)VE;\n  VC(UT \"VCDIFF target window length:  %\"W\"u\\n\",\n     (usize_t)stream->dec_tgtlen)VE;\n\n  VC(UT \"VCDIFF data section length:   %\"W\"u\\n\",\n     (usize_t)stream->data_sect.size)VE;\n  VC(UT \"VCDIFF inst section length:   %\"W\"u\\n\",\n     (usize_t)stream->inst_sect.size)VE;\n  VC(UT \"VCDIFF addr section length:   %\"W\"u\\n\",\n     (usize_t)stream->addr_sect.size)VE;\n\n  ret = 0;\n  if ((stream->flags & XD3_JUST_HDR) != 0)\n    {\n      /* Print a header -- finished! */\n      ret = PRINTHDR_SPECIAL;\n    }\n  else if ((stream->flags & XD3_SKIP_WINDOW) == 0)\n    {\n      ret = main_print_window (stream, xfile);\n    }\n\n  return ret;\n}\n\nstatic int\nmain_recode_copy (xd3_stream* stream,\n\t\t  xd3_output* output,\n\t\t  xd3_desect* input)\n{\n  int ret;\n\n  XD3_ASSERT(output != NULL);\n  XD3_ASSERT(output->next_page == NULL);\n\n  if ((ret = xd3_decode_allocate (recode_stream,\n\t\t\t\t  input->size,\n\t\t\t\t  &output->base,\n\t\t\t\t  &output->avail)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (stream, ret));\n      return ret;\n    }\n\n  memcpy (output->base,\n\t  /* Note: decoder advances buf, so get base of buffer with\n\t   * buf_max - size */\n\t  input->buf_max - input->size,\n\t  input->size);\n  output->next = input->size;\n  return 0;\n}\n\n// Re-encode one window\nstatic int\nmain_recode_func (xd3_stream* stream, main_file *ofile)\n{\n  int ret;\n  xd3_source decode_source;\n\n  XD3_ASSERT(stream->dec_state == DEC_FINISH);\n  XD3_ASSERT(recode_stream->enc_state == ENC_INIT ||\n\t     recode_stream->enc_state == ENC_INPUT);\n\n  // Copy partial decoder output to partial encoder inputs\n  if ((ret = main_recode_copy (recode_stream,\n\t\t\t       DATA_HEAD(recode_stream),\n\t\t\t       &stream->data_sect)) ||\n      (ret = main_recode_copy (recode_stream,\n\t\t\t       INST_HEAD(recode_stream),\n\t\t\t       &stream->inst_sect)) ||\n      (ret = main_recode_copy (recode_stream,\n\t\t\t       ADDR_HEAD(recode_stream),\n\t\t\t       &stream->addr_sect)))\n    {\n      return ret;\n    }\n\n  // This jumps to xd3_emit_hdr()\n  recode_stream->enc_state = ENC_FLUSH;\n  recode_stream->avail_in = stream->dec_tgtlen;\n\n  if (SRCORTGT (stream->dec_win_ind))\n    {\n      recode_stream->src = & decode_source;\n      decode_source.srclen = stream->dec_cpylen;\n      decode_source.srcbase = stream->dec_cpyoff;\n    }\n\n  if (option_use_checksum &&\n      (stream->dec_win_ind & VCD_ADLER32) != 0)\n    {\n      recode_stream->flags |= XD3_ADLER32_RECODE;\n      recode_stream->recode_adler32 = stream->dec_adler32;\n    }\n\n  if (option_use_appheader != 0 &&\n      option_appheader != NULL)\n    {\n      xd3_set_appheader (recode_stream, option_appheader,\n\t\t\t (usize_t) strlen ((char*) option_appheader));\n    }\n  else if (option_use_appheader != 0 &&\n\t   option_appheader == NULL)\n    {\n      if (stream->dec_appheader != NULL)\n\t{\n\t  xd3_set_appheader (recode_stream,\n\t\t\t     stream->dec_appheader, stream->dec_appheadsz);\n\t}\n    }\n\n  // Output loop\n  for (;;)\n    {\n      switch((ret = xd3_encode_input (recode_stream)))\n\t{\n\tcase XD3_INPUT: {\n\t  /* finished recoding one window */\n\t  stream->total_out = recode_stream->total_out;\n\t  return 0;\n\t}\n\tcase XD3_OUTPUT: {\n\t  /* main_file_write below */\n\t  break;\n\t}\n\tcase XD3_GOTHEADER:\n\tcase XD3_WINSTART:\n\tcase XD3_WINFINISH: {\n\t  /* ignore */\n\t  continue;\n\t}\n\tcase XD3_GETSRCBLK:\n\tcase 0: {\n\t    return XD3_INTERNAL;\n\t  }\n\tdefault:\n\t  return ret;\n\t}\n\n      if ((ret = main_write_output (recode_stream, ofile)))\n\t{\n\t  return ret;\n\t}\n\n      xd3_consume_output (recode_stream);\n    }\n}\n#endif /* VCDIFF_TOOLS */\n\n/*******************************************************************\n VCDIFF merging\n ******************************************************************/\n\n#if VCDIFF_TOOLS\n/* Modifies static state. */\nstatic int\nmain_init_recode_stream (void)\n{\n  int ret;\n  int stream_flags = XD3_ADLER32_NOVER | XD3_SKIP_EMIT;\n  int recode_flags;\n  xd3_config recode_config;\n\n  XD3_ASSERT (recode_stream == NULL);\n\n  if ((recode_stream = (xd3_stream*) main_malloc(sizeof(xd3_stream))) == NULL)\n    {\n      return ENOMEM;\n    }\n\n  recode_flags = (stream_flags & XD3_SEC_TYPE);\n\n  recode_config.alloc = main_alloc;\n  recode_config.freef = main_free1;\n\n  xd3_init_config(&recode_config, recode_flags);\n\n  if ((ret = main_set_secondary_flags (&recode_config)) ||\n      (ret = xd3_config_stream (recode_stream, &recode_config)) ||\n      (ret = xd3_encode_init_partial (recode_stream)) ||\n      (ret = xd3_whole_state_init (recode_stream)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (recode_stream, ret));\n      xd3_free_stream (recode_stream);\n      recode_stream = NULL;\n      return ret;\n    }\n\n  return 0;\n}\n\n/* This processes the sequence of -m arguments.  The final input\n * is processed as part of the ordinary main_input() loop. */\nstatic int\nmain_merge_arguments (main_merge_list* merges)\n{\n  int ret = 0;\n  int count = 0;\n  main_merge *merge = NULL;\n  xd3_stream merge_input;\n\n  if (main_merge_list_empty (merges))\n    {\n      return 0;\n    }\n\n  if ((ret = xd3_config_stream (& merge_input, NULL)) ||\n      (ret = xd3_whole_state_init (& merge_input)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (& merge_input, ret));\n      return ret;\n    }\n\n  merge = main_merge_list_front (merges);\n  while (!main_merge_list_end (merges, merge))\n    {\n      main_file mfile;\n      main_file_init (& mfile);\n      mfile.filename = merge->filename;\n      mfile.flags = RD_NONEXTERNAL;\n\n      if ((ret = main_file_open (& mfile, merge->filename, XO_READ)))\n        {\n          goto error;\n        }\n\n      ret = main_input (CMD_MERGE_ARG, & mfile, NULL, NULL);\n\n      if (ret == 0)\n\t{\n\t  if (count++ == 0)\n\t    {\n\t      /* The first merge source is the next merge input. */\n\t      xd3_swap_whole_state (& recode_stream->whole_target,\n\t\t\t\t    & merge_input.whole_target);\n\t    }\n\t  else\n\t    {\n\t      /* Merge the recode_stream with merge_input. */\n\t      ret = xd3_merge_input_output (recode_stream,\n\t\t\t\t\t    & merge_input.whole_target);\n\n\t      /* Save the next merge source in merge_input. */\n\t      xd3_swap_whole_state (& recode_stream->whole_target,\n\t\t\t\t    & merge_input.whole_target);\n\t    }\n\t}\n\n      main_file_cleanup (& mfile);\n\n      if (recode_stream != NULL)\n        {\n          xd3_free_stream (recode_stream);\n          main_free (recode_stream);\n          recode_stream = NULL;\n        }\n\n      if (main_bdata != NULL)\n        {\n          main_buffree (main_bdata);\n          main_bdata = NULL;\n\t  main_bsize = 0;\n        }\n\n      if (ret != 0)\n        {\n\t  goto error;\n        }\n\n      merge = main_merge_list_next (merge);\n    }\n\n  XD3_ASSERT (merge_stream == NULL);\n\n  if ((merge_stream = (xd3_stream*) main_malloc (sizeof(xd3_stream))) == NULL)\n    {\n      ret = ENOMEM;\n      goto error;\n    }\n\n  if ((ret = xd3_config_stream (merge_stream, NULL)) ||\n      (ret = xd3_whole_state_init (merge_stream)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (& merge_input, ret));\n      goto error;\n    }\n\n  xd3_swap_whole_state (& merge_stream->whole_target,\n\t\t\t& merge_input.whole_target);\n  ret = 0;\n error:\n  xd3_free_stream (& merge_input);\n  return ret;\n}\n\n/* This processes each window of the final merge input.  This routine\n * does not output, it buffers the entire delta into memory. */\nstatic int\nmain_merge_func (xd3_stream* stream, main_file *no_write)\n{\n  int ret;\n\n  if ((ret = xd3_whole_append_window (stream)))\n    {\n      return ret;\n    }\n\n  return 0;\n}\n\n\n/* This is called after all windows have been read, as a final step in\n * main_input().  This is only called for the final merge step. */\nstatic int\nmain_merge_output (xd3_stream *stream, main_file *ofile)\n{\n  int ret;\n  usize_t inst_pos = 0;\n  xoff_t output_pos = 0;\n  xd3_source recode_source;\n  usize_t window_num = 0;\n  int at_least_once = 0;\n\n  /* merge_stream is set if there were arguments.  this stream's input\n   * needs to be applied to the merge_stream source. */\n  if ((merge_stream != NULL) &&\n      (ret = xd3_merge_input_output (stream,\n\t\t\t\t     & merge_stream->whole_target)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (stream, ret));\n      return ret;\n    }\n\n  if (option_use_appheader != 0 &&\n      option_appheader != NULL)\n    {\n      xd3_set_appheader (recode_stream, option_appheader,\n\t\t\t (usize_t) strlen ((char*) option_appheader));\n    }\n\n  /* Enter the ENC_INPUT state and bypass the next_in == NULL test\n   * and (leftover) input buffering logic. */\n  XD3_ASSERT(recode_stream->enc_state == ENC_INIT);\n  recode_stream->enc_state = ENC_INPUT;\n  recode_stream->next_in = main_bdata;\n  recode_stream->flags |= XD3_FLUSH;\n\n  /* This encodes the entire target. */\n  while (inst_pos < stream->whole_target.instlen || !at_least_once)\n    {\n      xoff_t window_start = output_pos;\n      int window_srcset = 0;\n      xoff_t window_srcmin = 0;\n      xoff_t window_srcmax = 0;\n      usize_t window_pos = 0;\n      usize_t window_size;\n\n      /* at_least_once ensures that we encode at least one window,\n       * which handles the 0-byte case. */\n      at_least_once = 1;\n\n      XD3_ASSERT (recode_stream->enc_state == ENC_INPUT);\n\n      if ((ret = xd3_encode_input (recode_stream)) != XD3_WINSTART)\n\t{\n\t  XPR(NT \"invalid merge state: %s\\n\", xd3_mainerror (ret));\n\t  return XD3_INVALID;\n\t}\n\n      /* Window sizes must match from the input to the output, so that\n       * target copies are in-range (and so that checksums carry\n       * over). */\n      XD3_ASSERT (window_num < stream->whole_target.wininfolen);\n      window_size = stream->whole_target.wininfo[window_num].length;\n\n      /* Output position should also match. */\n      if (output_pos != stream->whole_target.wininfo[window_num].offset)\n\t{\n\t  XPR(NT \"internal merge error: offset mismatch\\n\");\n\t  return XD3_INVALID;\n\t}\n\n      if (option_use_checksum &&\n\t  (stream->dec_win_ind & VCD_ADLER32) != 0)\n\t{\n\t  recode_stream->flags |= XD3_ADLER32_RECODE;\n\t  recode_stream->recode_adler32 =\n\t    stream->whole_target.wininfo[window_num].adler32;\n\t}\n\n      window_num++;\n\n      if (main_bsize < window_size)\n\t{\n\t  main_buffree (main_bdata);\n\t  main_bdata = NULL;\n\t  main_bsize = 0;\n\t  if ((main_bdata = (uint8_t*)\n\t       main_bufalloc (window_size)) == NULL)\n\t    {\n\t      return ENOMEM;\n\t    }\n\t  main_bsize = window_size;\n\t}\n\n      /* This encodes a single target window. */\n      while (window_pos < window_size &&\n\t     inst_pos < stream->whole_target.instlen)\n\t{\n\t  xd3_winst *inst = &stream->whole_target.inst[inst_pos];\n\t  usize_t take = xd3_min(inst->size, window_size - window_pos);\n\t  xoff_t addr;\n\n\t  switch (inst->type)\n\t    {\n\t    case XD3_RUN:\n\t      if ((ret = xd3_emit_run (recode_stream, window_pos, take,\n\t\t\t\t       &stream->whole_target.adds[inst->addr])))\n\t\t{\n\t\t  return ret;\n\t\t}\n\t      break;\n\n\t    case XD3_ADD:\n\t      /* Adds are implicit, put them into the input buffer. */\n\t      memcpy (main_bdata + window_pos,\n\t\t      stream->whole_target.adds + inst->addr, take);\n\t      break;\n\n\t    default: /* XD3_COPY + copy mode */\n\t      if (inst->mode != 0)\n\t\t{\n\t\t  if (window_srcset) {\n\t\t    window_srcmin = xd3_min (window_srcmin, inst->addr);\n\t\t    window_srcmax = xd3_max (window_srcmax, inst->addr + take);\n\t\t  } else {\n\t\t    window_srcset = 1;\n\t\t    window_srcmin = inst->addr;\n\t\t    window_srcmax = inst->addr + take;\n\t\t  }\n\t\t  addr = inst->addr;\n\t\t}\n\t      else\n\t\t{\n\t\t  XD3_ASSERT (inst->addr >= window_start);\n\t\t  addr = inst->addr - window_start;\n\t\t}\n\t      IF_DEBUG2 ({\n\t\t  XPR(NTR \"[merge copy] winpos %\"W\"u take %\"W\"u \"\n\t\t      \"addr %\"Q\"u mode %u\\n\",\n\t\t      window_pos, take, addr, inst->mode);\n\t\t});\n\t      if ((ret = xd3_found_match (recode_stream, window_pos, take,\n\t\t\t\t\t  addr, inst->mode != 0)))\n\t\t{\n\t\t  return ret;\n\t\t}\n\t      break;\n\t    }\n\n\t  window_pos += take;\n\t  output_pos += take;\n\n\t  if (take == inst->size)\n\t    {\n\t      inst_pos += 1;\n\t    }\n\t  else\n\t    {\n\t      /* Modify the instruction for the next pass. */\n\t      if (inst->type != XD3_RUN)\n\t\t{\n\t\t  inst->addr += take;\n\t\t}\n\t      inst->size -= take;\n\t    }\n\t}\n\n      xd3_avail_input (recode_stream, main_bdata, window_pos);\n\n      recode_stream->enc_state = ENC_INSTR;\n\n      if (window_srcset) {\n\trecode_stream->srcwin_decided = 1;\n\trecode_stream->src = &recode_source;\n\trecode_source.srclen = (usize_t)(window_srcmax - window_srcmin);\n\trecode_source.srcbase = window_srcmin;\n\trecode_stream->taroff = recode_source.srclen;\n\n\tXD3_ASSERT (recode_source.srclen != 0);\n      } else {\n\trecode_stream->srcwin_decided = 0;\n\trecode_stream->src = NULL;\n\trecode_stream->taroff = 0;\n      }\n\n      for (;;)\n\t{\n\t  switch ((ret = xd3_encode_input (recode_stream)))\n\t    {\n\t    case XD3_INPUT: {\n\t      goto done_window;\n\t    }\n\t    case XD3_OUTPUT: {\n\t      /* main_file_write below */\n\t      break;\n\t    }\n\t    case XD3_GOTHEADER:\n\t    case XD3_WINSTART:\n\t    case XD3_WINFINISH: {\n\t      /* ignore */\n\t      continue;\n\t    }\n\t    case XD3_GETSRCBLK:\n\t    case 0: {\n\t      return XD3_INTERNAL;\n\t    }\n\t    default:\n\t      return ret;\n\t    }\n\n\t  if ((ret = main_write_output(recode_stream, ofile)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  xd3_consume_output (recode_stream);\n\t}\n    done_window:\n      (void) 0;\n    }\n\n  return 0;\n}\n#endif\n\n/*******************************************************************\n Input decompression, output recompression\n ******************************************************************/\n\n#if EXTERNAL_COMPRESSION\n/* This is tricky POSIX-specific code with lots of fork(), pipe(),\n * dup(), waitpid(), and exec() business.  Most of this code\n * originated in PRCS1, which did automatic package-file\n * decompression.  It works with both XD3_POSIX and XD3_STDIO file\n * disciplines.\n *\n * To automatically detect compressed inputs requires a child process\n * to reconstruct the input stream, which was advanced in order to\n * detect compression, because it may not be seekable.  In other\n * words, the main program reads part of the input stream, and if it\n * detects a compressed input it then forks a pipe copier process,\n * which copies the first-read block out of the main-program's memory,\n * then streams the remaining compressed input into the\n * input-decompression pipe.\n */\n\n#include <signal.h>\n#include <unistd.h>\n#include <sys/stat.h>\n#include <sys/wait.h>\n\n/* Remember which pipe FD is which. */\n#define PIPE_READ_FD  0\n#define PIPE_WRITE_FD 1\n#define MAX_SUBPROCS  4  /* max(source + copier + output,\n\t\t\t        source + copier + input + copier). */\nstatic pid_t ext_subprocs[MAX_SUBPROCS];\n\n/* Like write(), applies to a fd instead of a main_file, for the pipe\n * copier subprocess.  Does not print an error, to facilitate ignoring\n * trailing garbage, see main_pipe_copier(). */\nstatic int\nmain_pipe_write (int outfd, uint8_t *exist_buf, usize_t remain)\n{\n  int ret;\n\n  if ((ret = xd3_posix_io (outfd, exist_buf, remain,\n\t\t\t   (xd3_posix_func*) &write, NULL)))\n    {\n      return ret;\n    }\n\n  return 0;\n}\n\n/* A simple error-reporting waitpid interface. */\nstatic int\nmain_waitpid_check(pid_t pid)\n{\n  int status;\n  int ret = 0;\n\n  if (waitpid (pid, & status, 0) < 0)\n    {\n      ret = get_errno ();\n      XPR(NT \"external compression [pid %d] wait: %s\\n\",\n\t  pid, xd3_mainerror (ret));\n    }\n  else if (! WIFEXITED (status))\n    {\n      // SIGPIPE will be delivered to the child process whenever it\n      // writes data after this process closes the pipe, \n      // happens if xdelta does not require access to the entire \n      // source file.  Considered normal.\n      if (! WIFSIGNALED (status) || WTERMSIG (status) != SIGPIPE) \n\t{\n\t  ret = ECHILD;\n\t  XPR(NT \"external compression [pid %d] signal %d\\n\", pid, \n\t      WIFSIGNALED (status) ? WTERMSIG (status) : WSTOPSIG (status));\n\t}\n      else if (option_verbose)\n\t{\n\t  XPR(NT \"external compression sigpipe\\n\");\n\t}\n    }\n  else if (WEXITSTATUS (status) != 0)\n    {\n      ret = ECHILD;\n      if (option_verbose > 1)\n\t{\n\t  /* Presumably, the error was printed by the subprocess. */\n\t  XPR(NT \"external compression [pid %d] exit %d\\n\",\n\t      pid, WEXITSTATUS (status));\n\t}\n    }\n\n  return ret;\n}\n\n/* Wait for any existing child processes to check for abnormal exit. */\nstatic int\nmain_external_compression_finish (void)\n{\n  int i;\n  int ret;\n\n  for (i = 0; i < num_subprocs; i += 1)\n    {\n      if (! ext_subprocs[i]) { continue; }\n\n      if ((ret = main_waitpid_check (ext_subprocs[i])))\n\t{\n\t  return ret;\n\t}\n\n      ext_subprocs[i] = 0;\n    }\n\n  return 0;\n}\n\n/* Kills any outstanding compression process. */\nstatic void\nmain_external_compression_cleanup (void)\n{\n  int i;\n\n  for (i = 0; i < num_subprocs; i += 1)\n    {\n      if (! ext_subprocs[i]) { continue; }\n\n      kill (ext_subprocs[i], SIGTERM);\n\n      ext_subprocs[i] = 0;\n    }\n}\n\n/* This runs as a forked process of main_input_decompress_setup() to\n * copy input to the decompression process.  First, the available\n * input is copied out of the existing buffer, then the buffer is\n * reused to continue reading from the compressed input file. */\nstatic int\nmain_pipe_copier (uint8_t     *pipe_buf,\n\t\t  usize_t      pipe_bufsize,\n\t\t  size_t       nread,\n\t\t  main_file   *ifile,\n\t\t  int          outfd)\n{\n  int ret;\n  xoff_t skipped = 0;\n\n  /* Prevent SIGPIPE signals, allow EPIPE return values instead.  This\n   * is safe to comment-out, except that the -F flag will not work\n   * properly (the parent would need to treat WTERMSIG(status) ==\n   * SIGPIPE). */\n  struct sigaction sa;\n  sa.sa_handler = SIG_IGN;\n  sigaction (SIGPIPE, &sa, NULL);\n\n  for (;;)\n    {\n      /* force_drain will be set when option_force and EPIPE cause us\n       * to skip data.  This is reset each time through the loop, so\n       * the break condition below works. */\n      int force_drain = 0;\n      if (nread > 0 && (ret = main_pipe_write (outfd, pipe_buf, nread)))\n\t{\n\t  if (ret == EPIPE)\n\t    {\n\t      /* This causes the loop to continue reading until nread\n\t       * == 0. */\n\t      skipped += nread;\n\t      force_drain = 1;\n\t    }\n\t  else\n\t    {\n\t      XPR(NT \"pipe write failed: %s\\n\", xd3_mainerror (ret));\n\t      return ret;\n\t    }\n\t}\n\n      if (nread < pipe_bufsize && !force_drain)\n\t{\n\t  break;\n\t}\n\n      if ((ret = main_file_read (ifile, pipe_buf, pipe_bufsize,\n\t\t\t\t & nread, \"pipe read failed\")) < 0)\n\t{\n\t  return ret;\n\t}\n    }\n\n  if (option_verbose && skipped != 0)\n    {\n      XPR(NT \"skipping %\"Q\"u bytes in %s\\n\",\n\t  skipped, ifile->filename);\n    }\n  return 0;\n}\n\n/* This function is called after we have read some amount of data from\n * the input file and detected a compressed input.  Here we start a\n * decompression subprocess by forking twice.  The first process runs\n * the decompression command, the second process copies data to the\n * input of the first. */\nstatic int\nmain_input_decompress_setup (const main_extcomp   *decomp,\n\t\t\t     main_file            *ifile,\n\t\t\t     uint8_t              *input_buf,\n\t\t\t     usize_t               input_bufsize,\n\t\t\t     uint8_t              *pipe_buf,\n\t\t\t     usize_t               pipe_bufsize,\n\t\t\t     usize_t               pipe_avail,\n\t\t\t     size_t               *nread)\n{\n  /* The two pipes: input and output file descriptors. */\n  int outpipefd[2], inpipefd[2];\n  int input_fd = -1;  /* The resulting input_fd (output of decompression). */\n  pid_t decomp_id, copier_id;  /* The two subprocs. */\n  int ret;\n\n  outpipefd[0] = outpipefd[1] = -1;\n  inpipefd[0]  = inpipefd[1]  = -1;\n\n  if (pipe (outpipefd) || pipe (inpipefd))\n    {\n      XPR(NT \"pipe failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n  if ((decomp_id = fork ()) < 0)\n    {\n      XPR(NT \"fork failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n  /* The first child runs the decompression process: */\n  if (decomp_id == 0)\n    {\n      if (option_verbose > 2)\n\t{\n\t  XPR(NT \"external decompression pid %d\\n\", getpid ());\n\t}\n\n      /* Setup pipes: write to the outpipe, read from the inpipe. */\n      if (dup2 (outpipefd[PIPE_WRITE_FD], STDOUT_FILENO) < 0 ||\n\t  dup2 (inpipefd[PIPE_READ_FD], STDIN_FILENO) < 0 ||\n\t  close (outpipefd[PIPE_READ_FD]) ||\n\t  close (outpipefd[PIPE_WRITE_FD]) ||\n\t  close (inpipefd[PIPE_READ_FD]) ||\n\t  close (inpipefd[PIPE_WRITE_FD]) ||\n\t  execlp (decomp->decomp_cmdname, decomp->decomp_cmdname,\n\t\t  decomp->decomp_options,\n\t\t  option_force2 ? \"-f\" : NULL,\n\t\t  NULL))\n\t{\n\t  XPR(NT \"child process %s failed to execute: %s\\n\",\n\t      decomp->decomp_cmdname, xd3_mainerror (get_errno ()));\n\t}\n\n      _exit (127);\n    }\n\n  XD3_ASSERT(num_subprocs < MAX_SUBPROCS);\n  ext_subprocs[num_subprocs++] = decomp_id;\n\n  if ((copier_id = fork ()) < 0)\n    {\n      XPR(NT \"fork failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n  /* The second child runs the copier process: */\n  if (copier_id == 0)\n    {\n      int exitval = 0;\n\n      if (option_verbose > 2)\n\t{\n\t  XPR(NT \"child pipe-copier pid %d\\n\", getpid ());\n\t}\n\n      if (close (inpipefd[PIPE_READ_FD]) ||\n\t  close (outpipefd[PIPE_READ_FD]) ||\n\t  close (outpipefd[PIPE_WRITE_FD]) ||\n\t  main_pipe_copier (pipe_buf, pipe_bufsize, pipe_avail,\n\t\t\t    ifile, inpipefd[PIPE_WRITE_FD]) ||\n\t  close (inpipefd[PIPE_WRITE_FD]))\n\t{\n\t  XPR(NT \"child copier process failed: %s\\n\",\n\t      xd3_mainerror (get_errno ()));\n\t  exitval = 1;\n\t}\n\n      _exit (exitval);\n    }\n\n  XD3_ASSERT(num_subprocs < MAX_SUBPROCS);\n  ext_subprocs[num_subprocs++] = copier_id;\n\n  /* The parent closes both pipes after duplicating the output of\n   * compression. */\n  input_fd = dup (outpipefd[PIPE_READ_FD]);\n\n  if (input_fd < 0 ||\n      main_file_close (ifile) ||\n      close (outpipefd[PIPE_READ_FD]) ||\n      close (outpipefd[PIPE_WRITE_FD]) ||\n      close (inpipefd[PIPE_READ_FD]) ||\n      close (inpipefd[PIPE_WRITE_FD]))\n    {\n      XPR(NT \"dup/close failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n#if XD3_STDIO\n  /* Note: fdopen() acquires the fd, closes it when finished. */\n  if ((ifile->file = fdopen (input_fd, \"r\")) == NULL)\n    {\n      XPR(NT \"fdopen failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n#elif XD3_POSIX\n  ifile->file = input_fd;\n#endif\n\n  ifile->compressor = decomp;\n\n  /* Now the input file is decompressed. */\n  return main_file_read (ifile, input_buf, input_bufsize,\n\t\t\t nread, \"input decompression failed\");\n\n pipe_cleanup:\n  close (input_fd);\n  close (outpipefd[PIPE_READ_FD]);\n  close (outpipefd[PIPE_WRITE_FD]);\n  close (inpipefd[PIPE_READ_FD]);\n  close (inpipefd[PIPE_WRITE_FD]);\n  return ret;\n}\n\n\n/* This routine is called when the first buffer of input data is read\n * by the main program (unless input decompression is disabled by\n * command-line option).  If it recognizes the magic number of a known\n * input type it invokes decompression.\n *\n * Skips decompression if the decompression type or the file type is\n * RD_NONEXTERNAL.\n *\n * Behaves exactly like main_file_read, otherwise.\n *\n * This function uses a separate buffer to read the first small block\n * of input.  If a compressed input is detected, the separate buffer\n * is passed to the pipe copier.  This avoids using the same size\n * buffer in both cases. */\nstatic int\nmain_secondary_decompress_check (main_file  *file,\n\t\t\t\t uint8_t    *input_buf,\n\t\t\t\t size_t      input_size,\n\t\t\t\t size_t     *nread)\n{\n  int ret;\n  usize_t i;\n  usize_t try_read = xd3_min (input_size, XD3_ALLOCSIZE);\n  size_t  check_nread = 0;\n  uint8_t check_buf[XD3_ALLOCSIZE];  /* TODO: heap allocate */\n  const main_extcomp *decompressor = NULL;\n\n  if ((ret = main_file_read (file, check_buf,\n\t\t\t     try_read,\n\t\t\t     & check_nread, \"input read failed\")))\n    {\n      return ret;\n    }\n\n  if (file->flags & RD_DECOMPSET)\n    {\n      /* This allows the application header to override the magic\n       * number, for whatever reason. */\n      decompressor = file->compressor;\n    }\n  else\n    {\n      for (i = 0; i < SIZEOF_ARRAY (extcomp_types); i += 1)\n\t{\n\t  const main_extcomp *decomp = & extcomp_types[i];\n\n\t  if (check_nread > decomp->magic_size)\n\t    {\n\t      /* The following expr checks if we are trying to read a\n\t       * VCDIFF input, in which case do not treat it as\n\t       * \"secondary\" decompression. */\n\t      int skip_this_type = (decomp->flags & RD_NONEXTERNAL) &&\n  \t                           (file->flags & RD_NONEXTERNAL);\n\n\t      if (skip_this_type)\n\t\t{\n\t\t  continue;\n\t\t}\n\n\t      if (memcmp (check_buf, decomp->magic, decomp->magic_size) == 0)\n\t\t{\n\t\t  decompressor = decomp;\n\t\t  break;\n\t\t}\n\t    }\n\t}\n    }\n\n  if (decompressor != NULL)\n    {\n      if (! option_quiet)\n\t{\n\t  XPR(NT \"externally compressed input: %s %s%s < %s\\n\",\n\t      decompressor->decomp_cmdname,\n\t      decompressor->decomp_options,\n\t      (option_force2 ? \" -f\" : \"\"),\n\t      file->filename);\n\t  if (file->flags & RD_MAININPUT)\n\t    {\n\t      XPR(NT\n  \"WARNING: the encoder is automatically decompressing the input file;\\n\");\n\t      XPR(NT\n  \"WARNING: the decoder will automatically recompress the output file;\\n\");\n\t      XPR(NT\n  \"WARNING: this may result in different compressed data and checksums\\n\");\n\t      XPR(NT\n  \"WARNING: despite being identical data; if this is an issue, use -D\\n\");\n\t      XPR(NT\n  \"WARNING: to avoid decompression and/or use -R to avoid recompression\\n\");\n\t      XPR(NT\n  \"WARNING: and/or manually decompress the input file; if you know the\\n\");\n\t      XPR(NT\n  \"WARNING: compression settings that will produce identical output\\n\");\n\t      XPR(NT\n  \"WARNING: you may set those flags using the environment (e.g., GZIP=-9)\\n\");\n\t    }\n\t}\n\n      file->size_known = 0;\n      return main_input_decompress_setup (decompressor, file,\n\t\t\t\t\t  input_buf, input_size,\n\t\t\t\t\t  check_buf, XD3_ALLOCSIZE,\n\t\t\t\t\t  check_nread, nread);\n    }\n\n  /* Now read the rest of the input block. */\n  (*nread) = 0;\n\n  if (check_nread == try_read)\n    {\n      ret = main_file_read (file,\n\t\t\t    input_buf + try_read,\n\t\t\t    input_size - try_read,\n\t\t\t    nread,\n\t\t\t    \"input read failed\");\n    }\n\n  memcpy (input_buf, check_buf, check_nread);\n\n  (*nread) += check_nread;\n\n  return 0;\n}\n\n/* Initiate re-compression of the output stream.  This is easier than\n * input decompression because we know beforehand that the stream will\n * be compressed, whereas the input has already been read when we\n * decide it should be decompressed.  Thus, it only requires one\n * subprocess and one pipe. */\nstatic int\nmain_recompress_output (main_file *ofile)\n{\n  pid_t recomp_id;  /* One subproc. */\n  int   pipefd[2];  /* One pipe. */\n  int   output_fd = -1;\n  int   ret;\n  const main_extcomp *recomp = ofile->compressor;\n\n  pipefd[0] = pipefd[1] = -1;\n\n  if (pipe (pipefd))\n    {\n      XPR(NT \"pipe failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n  if ((recomp_id = fork ()) < 0)\n    {\n      XPR(NT \"fork failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n  /* The child runs the recompression process: */\n  if (recomp_id == 0)\n    {\n      if (option_verbose > 2)\n\t{\n\t  XPR(NT \"external recompression pid %d\\n\", getpid ());\n\t}\n\n      /* Setup pipes: write to the output file, read from the pipe. */\n      if (dup2 (XFNO (ofile), STDOUT_FILENO) < 0 ||\n\t  dup2 (pipefd[PIPE_READ_FD], STDIN_FILENO) < 0 ||\n\t  close (pipefd[PIPE_READ_FD]) ||\n\t  close (pipefd[PIPE_WRITE_FD]) ||\n\t  execlp (recomp->recomp_cmdname, recomp->recomp_cmdname,\n\t\t  recomp->recomp_options,\n\t\t  option_force2 ? \"-f\" : NULL,\n\t\t  NULL))\n\t{\n\t  XPR(NT \"child process %s failed to execute: %s\\n\",\n\t      recomp->recomp_cmdname, xd3_mainerror (get_errno ()));\n\t}\n\n      _exit (127);\n    }\n\n  XD3_ASSERT(num_subprocs < MAX_SUBPROCS);\n  ext_subprocs[num_subprocs++] = recomp_id;\n\n  /* The parent closes both pipes after duplicating the output-fd for\n   * writing to the compression pipe. */\n  output_fd = dup (pipefd[PIPE_WRITE_FD]);\n\n  if (output_fd < 0 ||\n      main_file_close (ofile) ||\n      close (pipefd[PIPE_READ_FD]) ||\n      close (pipefd[PIPE_WRITE_FD]))\n    {\n      XPR(NT \"close failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n#if XD3_STDIO\n  /* Note: fdopen() acquires the fd, closes it when finished. */\n  if ((ofile->file = fdopen (output_fd, \"w\")) == NULL)\n    {\n      XPR(NT \"fdopen failed: %s\\n\", xd3_mainerror (ret = get_errno ()));\n      goto pipe_cleanup;\n    }\n\n#elif XD3_POSIX\n  ofile->file = output_fd;\n#endif\n\n  /* Now the output file will be compressed. */\n  return 0;\n\n pipe_cleanup:\n  close (output_fd);\n  close (pipefd[PIPE_READ_FD]);\n  close (pipefd[PIPE_WRITE_FD]);\n  return ret;\n}\n#endif /* EXTERNAL_COMPRESSION */\n\n/* Identify the compressor that was used based on its ident string,\n * which is passed in the application header. */\nstatic const main_extcomp*\nmain_ident_compressor (const char *ident)\n{\n  usize_t i;\n\n  for (i = 0; i < SIZEOF_ARRAY (extcomp_types); i += 1)\n    {\n      if (strcmp (extcomp_types[i].ident, ident) == 0)\n\t{\n\t  return & extcomp_types[i];\n\t}\n    }\n\n  return NULL;\n}\n\n/* Return the main_extcomp record to use for this identifier, if possible. */\nstatic const main_extcomp*\nmain_get_compressor (const char *ident)\n{\n  const main_extcomp *ext = main_ident_compressor (ident);\n\n  if (ext == NULL)\n    {\n      if (! option_quiet)\n\t{\n\t  XPR(NT \"warning: cannot recompress output: \"\n\t\t   \"unrecognized external compression ID: %s\\n\", ident);\n\t}\n      return NULL;\n    }\n  else if (! EXTERNAL_COMPRESSION)\n    {\n      if (! option_quiet)\n\t{\n\t  XPR(NT \"warning: external support not compiled: \"\n\t\t   \"original input was compressed: %s\\n\", ext->recomp_cmdname);\n\t}\n      return NULL;\n    }\n  else\n    {\n      return ext;\n    }\n}\n\n/*********************************************************************\n APPLICATION HEADER\n *******************************************************************/\n\n#if XD3_ENCODER\nstatic const char*\nmain_apphead_string (const char* x)\n{\n  const char *y;\n\n  if (x == NULL) { return \"\"; }\n\n  if (strcmp (x, \"/dev/stdin\") == 0 ||\n      strcmp (x, \"/dev/stdout\") == 0 ||\n      strcmp (x, \"/dev/stderr\") == 0) { return \"-\"; }\n\n  // TODO: this is not portable\n  return (y = strrchr (x, '/')) == NULL ? x : y + 1;\n}\n\nstatic int\nmain_set_appheader (xd3_stream *stream, main_file *input, main_file *sfile)\n{\n  /* The user may disable the application header.  Once the appheader\n   * is set, this disables setting it again. */\n  if (appheader_used || ! option_use_appheader) { return 0; }\n\n  /* The user may specify the application header, otherwise format the\n     default header. */\n  if (option_appheader)\n    {\n      appheader_used = option_appheader;\n    }\n  else\n    {\n      const char *iname;\n      const char *icomp;\n      const char *sname;\n      const char *scomp;\n      usize_t len;\n\n      iname = main_apphead_string (input->filename);\n      icomp = (input->compressor == NULL) ? \"\" : input->compressor->ident;\n      len = (usize_t) strlen (iname) + (usize_t) strlen (icomp) + 2;\n\n      if (sfile->filename != NULL)\n\t{\n\t  sname = main_apphead_string (sfile->filename);\n\t  scomp = (sfile->compressor == NULL) ? \"\" : sfile->compressor->ident;\n\t  len += (usize_t) strlen (sname) + (usize_t) strlen (scomp) + 2;\n\t}\n      else\n\t{\n\t  sname = scomp = \"\";\n\t}\n\n      if ((appheader_used = (uint8_t*) main_malloc (len)) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n\n      if (sfile->filename == NULL)\n\t{\n\t  snprintf_func ((char*)appheader_used, len, \"%s/%s\", iname, icomp);\n\t}\n      else\n\t{\n\t  snprintf_func ((char*)appheader_used, len, \"%s/%s/%s/%s\",\n\t\t    iname, icomp, sname, scomp);\n\t}\n    }\n\n  xd3_set_appheader (stream, appheader_used,\n\t\t     (usize_t) strlen ((char*)appheader_used));\n\n  return 0;\n}\n#endif\n\nstatic void\nmain_get_appheader_params (main_file *file, char **parsed,\n\t\t\t   int output, const char *type,\n\t\t\t   main_file *other)\n{\n  /* Set the filename if it was not specified.  If output, option_stdout (-c)\n   * overrides. */\n  if (file->filename == NULL &&\n      ! (output && option_stdout) &&\n      strcmp (parsed[0], \"-\") != 0)\n    {\n      file->filename = parsed[0];\n\n      if (other->filename != NULL) {\n\t/* Take directory from the other file, if it has one. */\n\t/* TODO: This results in nonsense names like /dev/foo.tar.gz\n\t * and probably the filename-default logic interferes with\n\t * multi-file operation and the standard file extension?\n\t * Possibly the name header is bad, should be off by default.\n\t * Possibly we just want to remember external/compression\n\t * settings. */\n\tconst char *last_slash = strrchr(other->filename, '/');\n\n\tif (last_slash != NULL) {\n\t  usize_t dlen = (usize_t) (last_slash - other->filename);\n\n\t  XD3_ASSERT(file->filename_copy == NULL);\n\t  file->filename_copy =\n\t    (char*) main_malloc(dlen + 2 + (usize_t) strlen(file->filename));\n\n\t  strncpy(file->filename_copy, other->filename, dlen);\n\t  file->filename_copy[dlen] = '/';\n\t  strcpy(file->filename_copy + dlen + 1, parsed[0]);\n\n\t  file->filename = file->filename_copy;\n\t}\n      }\n\n      if (! option_quiet)\n\t{\n\t  XPR(NT \"using default %s filename: %s\\n\", type, file->filename);\n\t}\n    }\n\n  /* Set the compressor, initiate de/recompression later. */\n  if (file->compressor == NULL && *parsed[1] != 0)\n    {\n      file->flags |= RD_DECOMPSET;\n      file->compressor = main_get_compressor (parsed[1]);\n    }\n}\n\nstatic void\nmain_get_appheader (xd3_stream *stream, main_file *ifile,\n\t\t    main_file *output, main_file *sfile)\n{\n  uint8_t *apphead;\n  usize_t appheadsz;\n  int ret;\n\n  /* The user may disable the application header.  Once the appheader\n   * is set, this disables setting it again. */\n  if (! option_use_appheader) { return; }\n\n  ret = xd3_get_appheader (stream, & apphead, & appheadsz);\n\n  /* Ignore failure, it only means we haven't received a header yet. */\n  if (ret != 0) { return; }\n\n  if (appheadsz > 0)\n    {\n      char *start = (char*)apphead;\n      char *slash;\n      int   place = 0;\n      const int kMaxArgs = 4;\n      char *parsed[4];\n\n      memset (parsed, 0, sizeof (parsed));\n\n      while ((slash = strchr (start, '/')) != NULL && place < (kMaxArgs-1))\n\t{\n\t  *slash = 0;\n\t  parsed[place++] = start;\n\t  start = slash + 1;\n\t}\n\n      parsed[place++] = start;\n\n      /* First take the output parameters. */\n      if (place == 2 || place == 4)\n\t{\n\t  main_get_appheader_params (output, parsed, 1, \"output\", ifile);\n\t}\n\n      /* Then take the source parameters. */\n      if (place == 4)\n\t{\n\t  main_get_appheader_params (sfile, parsed+2, 0, \"source\", ifile);\n\t}\n    }\n\n  option_use_appheader = 0;\n  return;\n}\n\n/*********************************************************************\n Main I/O routines\n **********************************************************************/\n\n/* This function acts like the above except it may also try to\n * recognize a compressed input (source or target) when the first\n * buffer of data is read.  The EXTERNAL_COMPRESSION code is called to\n * search for magic numbers. */\nstatic int\nmain_read_primary_input (main_file   *file,\n\t\t\t uint8_t     *buf,\n\t\t\t size_t       size,\n\t\t\t size_t      *nread)\n{\n#if EXTERNAL_COMPRESSION\n  if (option_decompress_inputs && file->flags & RD_FIRST)\n    {\n      file->flags &= ~RD_FIRST;\n      return main_secondary_decompress_check (file, buf, size, nread);\n    }\n#endif\n\n  return main_file_read (file, buf, size, nread, \"input read failed\");\n}\n\n/* Open the main output file, sets a default file name, initiate\n * recompression.  This function is expected to fprint any error\n * messages. */\nstatic int\nmain_open_output (xd3_stream *stream, main_file *ofile)\n{\n  int ret;\n\n  if (option_no_output)\n    {\n      return 0;\n    }\n\n  if (ofile->filename == NULL)\n    {\n      XSTDOUT_XF (ofile);\n\n      if (option_verbose > 1)\n\t{\n\t  XPR(NT \"using standard output: %s\\n\", ofile->filename);\n\t}\n    }\n  else\n    {\n      /* Stat the file to check for overwrite. */\n      if (option_force == 0 && main_file_exists (ofile))\n\t{\n\t  if (!option_quiet)\n\t    {\n\t      XPR(NT \"to overwrite output file specify -f: %s\\n\",\n\t\t  ofile->filename);\n\t    }\n\t  return EEXIST;\n\t}\n\n      if ((ret = main_file_open (ofile, ofile->filename, XO_WRITE)))\n\t{\n\t  return ret;\n\t}\n\n      if (option_verbose > 1) { XPR(NT \"output %s\\n\", ofile->filename); }\n    }\n\n#if EXTERNAL_COMPRESSION\n  /* Do output recompression. */\n  if (ofile->compressor != NULL && option_recompress_outputs == 1)\n    {\n      if (! option_quiet)\n\t{\n\t  XPR(NT \"externally compressed output: %s %s%s > %s\\n\",\n\t      ofile->compressor->recomp_cmdname,\n\t      ofile->compressor->recomp_options,\n\t      (option_force2 ? \" -f\" : \"\"),\n\t      ofile->filename);\n\t}\n\n      if ((ret = main_recompress_output (ofile)))\n\t{\n\t  return ret;\n\t}\n    }\n#endif\n\n  return 0;\n}\n\nstatic usize_t\nmain_get_winsize (main_file *ifile) {\n  xoff_t file_size = 0;\n  usize_t size = option_winsize;\n  static shortbuf iszbuf;\n\n  if (main_file_stat (ifile, &file_size) == 0)\n    {\n      size = (usize_t) xd3_min (file_size, (xoff_t) size);\n    }\n\n  size = xd3_max (size, XD3_ALLOCSIZE);\n\n  if (option_verbose > 1)\n    {\n      XPR(NT \"input %s window size %s\\n\",\n\t  ifile->filename,\n\t  main_format_bcnt (size, &iszbuf));\n    }\n\n  return size;\n}\n\n/*********************************************************************\n Main routines\n ********************************************************************/\n\n/* This is a generic input function.  It calls the xd3_encode_input or\n * xd3_decode_input functions and makes calls to the various input\n * handling routines above, which coordinate external decompression.\n */\nstatic int\nmain_input (xd3_cmd     cmd,\n\t    main_file   *ifile,\n\t    main_file   *ofile,\n\t    main_file   *sfile)\n{\n  int        ret;\n  xd3_stream stream;\n  size_t     nread = 0;\n  usize_t    winsize;\n  int        stream_flags = 0;\n  xd3_config config;\n  xd3_source source;\n  xoff_t     last_total_in = 0;\n  xoff_t     last_total_out = 0;\n  long       start_time;\n  int        stdout_only = 0;\n  int (*input_func) (xd3_stream*);\n  int (*output_func) (xd3_stream*, main_file *);\n\n  memset (& stream, 0, sizeof (stream));\n  memset (& source, 0, sizeof (source));\n  memset (& config, 0, sizeof (config));\n\n  config.alloc = main_alloc;\n  config.freef = main_free1;\n\n  config.iopt_size = option_iopt_size;\n  config.sprevsz = option_sprevsz;\n\n  do_src_fifo = 0;\n\n  start_time = get_millisecs_now ();\n\n  if (option_use_checksum) { stream_flags |= XD3_ADLER32; }\n\n  /* main_input setup. */\n  switch ((int) cmd)\n    {\n#if VCDIFF_TOOLS\n           if (1) { case CMD_PRINTHDR:   stream_flags |= XD3_JUST_HDR; }\n      else if (1) { case CMD_PRINTHDRS:  stream_flags |= XD3_SKIP_WINDOW; }\n      else        { case CMD_PRINTDELTA: stream_flags |= XD3_SKIP_EMIT; }\n      ifile->flags |= RD_NONEXTERNAL;\n      input_func    = xd3_decode_input;\n      output_func   = main_print_func;\n      stream_flags |= XD3_ADLER32_NOVER;\n      stdout_only   = 1;\n      break;\n\n    case CMD_RECODE:\n    case CMD_MERGE:\n    case CMD_MERGE_ARG:\n      /* No source will be read */\n      stream_flags |= XD3_ADLER32_NOVER | XD3_SKIP_EMIT;\n      ifile->flags |= RD_NONEXTERNAL;\n      input_func = xd3_decode_input;\n\n      if ((ret = main_init_recode_stream ()))\n        {\n\t  return EXIT_FAILURE;\n        }\n\n      if (cmd == CMD_RECODE) { output_func = main_recode_func; }\n      else                   { output_func = main_merge_func; }\n      break;\n#endif /* VCDIFF_TOOLS */\n\n#if XD3_ENCODER\n    case CMD_ENCODE:\n      do_src_fifo = 1;\n      input_func  = xd3_encode_input;\n      output_func = main_write_output;\n\n      if (option_no_compress)      { stream_flags |= XD3_NOCOMPRESS; }\n      if (option_smatch_config)\n\t{\n\t  const char *s = option_smatch_config;\n\t  char *e;\n\t  long values[XD3_SOFTCFG_VARCNT];\n\t  int got;\n\n\t  config.smatch_cfg = XD3_SMATCH_SOFT;\n\n\t  for (got = 0; got < XD3_SOFTCFG_VARCNT; got += 1, s = e + 1)\n\t    {\n\t      values[got] = strtol (s, &e, 10);\n\n\t      if ((values[got] < 0) ||\n\t\t  (e == s) ||\n\t\t  (got < XD3_SOFTCFG_VARCNT-1 && *e == 0) ||\n\t\t  (got == XD3_SOFTCFG_VARCNT-1 && *e != 0))\n\t\t{\n\t\t  XPR(NT \"invalid string match specifier (-C) %d: %s\\n\",\n\t\t      got, s);\n\t\t  return EXIT_FAILURE;\n\t\t}\n\t    }\n\n\t  config.smatcher_soft.large_look    = values[0];\n\t  config.smatcher_soft.large_step    = values[1];\n\t  config.smatcher_soft.small_look    = values[2];\n\t  config.smatcher_soft.small_chain   = values[3];\n\t  config.smatcher_soft.small_lchain  = values[4];\n\t  config.smatcher_soft.max_lazy      = values[5];\n\t  config.smatcher_soft.long_enough   = values[6];\n\t}\n      else\n\t{\n\t  if (option_verbose > 2)\n\t    {\n\t      XPR(NT \"compression level: %d\\n\", option_level);\n\t    }\n\t  if (option_level == 0)\n\t    {\n\t      stream_flags |= XD3_NOCOMPRESS;\n\t      config.smatch_cfg = XD3_SMATCH_FASTEST;\n\t    }\n\t  else if (option_level == 1)\n\t    { config.smatch_cfg = XD3_SMATCH_FASTEST; }\n\t  else if (option_level == 2)\n\t    { config.smatch_cfg = XD3_SMATCH_FASTER; }\n\t  else if (option_level <= 5)\n\t    { config.smatch_cfg = XD3_SMATCH_FAST; }\n\t  else if (option_level == 6)\n\t    { config.smatch_cfg = XD3_SMATCH_DEFAULT; }\n\t  else\n\t    { config.smatch_cfg = XD3_SMATCH_SLOW; }\n\t}\n      break;\n#endif\n    case CMD_DECODE:\n      if (option_use_checksum == 0) { stream_flags |= XD3_ADLER32_NOVER; }\n      ifile->flags |= RD_NONEXTERNAL;\n      input_func    = xd3_decode_input;\n      output_func   = main_write_output;\n      break;\n    default:\n      XPR(NT \"internal error\\n\");\n      return EXIT_FAILURE;\n    }\n\n  main_bsize = winsize = main_get_winsize (ifile);\n\n  if ((main_bdata = (uint8_t*) main_bufalloc (winsize)) == NULL)\n    {\n      return EXIT_FAILURE;\n    }\n\n  config.winsize = winsize;\n  config.getblk = main_getblk_func;\n  config.flags = stream_flags;\n\n  if ((ret = main_set_secondary_flags (&config)) ||\n      (ret = xd3_config_stream (& stream, & config)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (& stream, ret));\n      return EXIT_FAILURE;\n    }\n\n#if VCDIFF_TOOLS\n  if ((cmd == CMD_MERGE || cmd == CMD_MERGE_ARG) &&\n      (ret = xd3_whole_state_init (& stream)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (& stream, ret));\n      return EXIT_FAILURE;\n    }\n#endif\n\n  if (cmd != CMD_DECODE)\n    {\n      /* When not decoding, set source now.  The decoder delays this\n       * step until XD3_GOTHEADER. */\n      if (sfile && sfile->filename != NULL)\n\t{\n\t  if ((ret = main_set_source (& stream, cmd, sfile, & source)))\n\t    {\n\t      return EXIT_FAILURE;\n\t    }\n\n\t  XD3_ASSERT(stream.src != NULL);\n\t}\n    }\n\n  if (cmd == CMD_PRINTHDR ||\n      cmd == CMD_PRINTHDRS ||\n      cmd == CMD_PRINTDELTA ||\n      cmd == CMD_RECODE)\n    {\n      if (sfile->filename == NULL)\n\t{\n\t  allow_fake_source = 1;\n\t  sfile->filename = \"<placeholder>\";\n\t  main_set_source (& stream, cmd, sfile, & source);\n\t}\n    }\n\n  /* This times each window. */\n  get_millisecs_since ();\n\n  /* Main input loop. */\n  do\n    {\n      xoff_t input_offset;\n      xoff_t input_remain;\n      usize_t try_read;\n\n      input_offset = ifile->nread;\n\n      input_remain = XOFF_T_MAX - input_offset;\n\n      try_read = (usize_t) xd3_min ((xoff_t) config.winsize, input_remain);\n\n      if ((ret = main_read_primary_input (ifile, main_bdata,\n\t\t\t\t\t  try_read, & nread)))\n\t{\n\t  return EXIT_FAILURE;\n\t}\n\n      /* If we've reached EOF tell the stream to flush. */\n      if (nread < try_read)\n\t{\n\t  stream.flags |= XD3_FLUSH;\n\t}\n\n#if XD3_ENCODER\n      /* After the first main_read_primary_input completes, we know\n       * all the information needed to encode the application\n       * header. */\n      if (cmd == CMD_ENCODE &&\n\t  (ret = main_set_appheader (& stream, ifile, sfile)))\n\t{\n\t  return EXIT_FAILURE;\n\t}\n#endif\n      xd3_avail_input (& stream, main_bdata, nread);\n\n      /* If we read zero bytes after encoding at least one window... */\n      if (nread == 0 && stream.current_window > 0) {\n\tbreak;\n      }\n\n    again:\n      ret = input_func (& stream);\n\n      switch (ret)\n\t{\n\tcase XD3_INPUT:\n\t  continue;\n\n\tcase XD3_GOTHEADER:\n\t  {\n\t    XD3_ASSERT (stream.current_window == 0);\n\n\t    /* Need to process the appheader as soon as possible.  It may\n\t     * contain a suggested default filename/decompression routine for\n\t     * the ofile, and it may contain default/decompression routine for\n\t     * the sources. */\n\t    if (cmd == CMD_DECODE)\n\t      {\n\t\t/* May need to set the sfile->filename if none was given. */\n\t\tmain_get_appheader (& stream, ifile, ofile, sfile);\n\n\t\t/* Now open the source file. */\n\t\t  if ((sfile->filename != NULL) &&\n\t\t      (ret = main_set_source (& stream, cmd, sfile, & source)))\n\t\t  {\n\t\t    return EXIT_FAILURE;\n\t\t  }\n\t      }\n\t  }\n\t/* FALLTHROUGH */\n\tcase XD3_WINSTART:\n\t  {\n\t    /* e.g., set or unset XD3_SKIP_WINDOW. */\n\t    goto again;\n\t  }\n\n\tcase XD3_OUTPUT:\n\t  {\n\t    /* Defer opening the output file until the stream produces its\n\t     * first output for both encoder and decoder, this way we\n\t     * delay long enough for the decoder to receive the\n\t     * application header.  (Or longer if there are skipped\n\t     * windows, but I can't think of any reason not to delay\n\t     * open.) */\n\t    if (ofile != NULL &&\n\t\t! main_file_isopen (ofile) &&\n\t\t(ret = main_open_output (& stream, ofile)) != 0)\n\t      {\n\t\treturn EXIT_FAILURE;\n\t      }\n\n\t    if ((ret = output_func (& stream, ofile)) &&\n\t\t(ret != PRINTHDR_SPECIAL))\n\t      {\n\t\treturn EXIT_FAILURE;\n\t      }\n\n\t    if (ret == PRINTHDR_SPECIAL)\n\t      {\n\t\txd3_abort_stream (& stream);\n\t\tret = EXIT_SUCCESS;\n\t\tgoto done;\n\t      }\n\n\t    ret = 0;\n\n\t    xd3_consume_output (& stream);\n\t    goto again;\n\t  }\n\n\tcase XD3_WINFINISH:\n\t  {\n\t    if (IS_ENCODE (cmd) || cmd == CMD_DECODE || cmd == CMD_RECODE)\n\t      {\n\t\tif (! option_quiet && IS_ENCODE (cmd) &&\n\t\t    main_file_isopen (sfile))\n\t\t  {\n\t\t    /* Warn when no source copies are found */\n\t\t    if (option_verbose && ! xd3_encoder_used_source (& stream))\n\t\t      {\n\t\t\tXPR(NT \"warning: input window %\"Q\"u..%\"Q\"u has \"\n\t\t\t    \"no source copies\\n\",\n\t\t\t    stream.current_window * winsize,\n\t\t\t    (stream.current_window+1) * winsize);\n\t\t\tXD3_ASSERT (stream.src != NULL);\n\t\t      }\n\n\t\t    /* Limited i-buffer size affects source copies\n\t\t     * when the sourcewin is decided early. */\n\t\t    if (option_verbose > 1 &&\n\t\t\tstream.srcwin_decided_early &&\n\t\t\tstream.i_slots_used > stream.iopt_size)\n\t\t      {\n\t\t\tXPR(NT \"warning: input position %\"Q\"u overflowed \"\n\t\t\t    \"instruction buffer, needed %\"W\"u (vs. %\"W\"u), \"\n\t\t\t    \"consider changing -I\\n\",\n\t\t\t    stream.current_window * winsize,\n\t\t\t    stream.i_slots_used, stream.iopt_size);\n\t\t      }\n\t\t  }\n\n\t\tif (option_verbose)\n\t\t  {\n\t\t    shortbuf rrateavg, wrateavg, tm;\n\t\t    shortbuf rdb, wdb;\n\t\t    shortbuf trdb, twdb;\n\t\t    shortbuf srcpos;\n\t\t    long millis = get_millisecs_since ();\n\t\t    usize_t this_read = (usize_t)(stream.total_in -\n\t\t\t\t\t\t  last_total_in);\n\t\t    usize_t this_write = (usize_t)(stream.total_out -\n\t\t\t\t\t\t   last_total_out);\n\t\t    last_total_in = stream.total_in;\n\t\t    last_total_out = stream.total_out;\n\n\t\t    if (option_verbose > 1)\n\t\t      {\n\t\t\tXPR(NT \"%\"Q\"u: in %s (%s): out %s (%s): \"\n\t\t\t    \"total in %s: out %s: %s: srcpos %s\\n\",\n\t\t\t    stream.current_window,\n\t\t\t    main_format_bcnt (this_read, &rdb),\n\t\t\t    main_format_rate (this_read, millis, &rrateavg),\n\t\t\t    main_format_bcnt (this_write, &wdb),\n\t\t\t    main_format_rate (this_write, millis, &wrateavg),\n\t\t\t    main_format_bcnt (stream.total_in, &trdb),\n\t\t\t    main_format_bcnt (stream.total_out, &twdb),\n\t\t\t    main_format_millis (millis, &tm),\n\t\t\t    main_format_bcnt (stream.srcwin_cksum_pos, &srcpos));\n\t\t      }\n\t\t    else\n\t\t      {\n\t\t\tXPR(NT \"%\"Q\"u: in %s: out %s: total in %s: \"\n\t\t\t    \"out %s: %s\\n\",\n \t\t\t    stream.current_window,\n\t\t\t    main_format_bcnt (this_read, &rdb),\n\t\t\t    main_format_bcnt (this_write, &wdb),\n\t\t\t    main_format_bcnt (stream.total_in, &trdb),\n\t\t\t    main_format_bcnt (stream.total_out, &twdb),\n\t\t\t    main_format_millis (millis, &tm));\n\t\t      }\n\t\t  }\n\t      }\n\t    goto again;\n\t  }\n\n\tdefault:\n\t  /* input_func() error */\n\t  XPR(NT XD3_LIB_ERRMSG (& stream, ret));\n\t  if (! option_quiet && ret == XD3_INVALID_INPUT &&\n\t      sfile != NULL && sfile->filename != NULL)\n\t    {\n\t      XPR(NT \"normally this indicates that the source file is incorrect\\n\");\n\t      XPR(NT \"please verify the source file with sha1sum or equivalent\\n\");\n\t    }\n\t  return EXIT_FAILURE;\n\t}\n    }\n  while (nread == config.winsize);\ndone:\n  /* Close the inputs. (ifile must be open, sfile may be open) */\n  main_file_close (ifile);\n  if (sfile != NULL)\n    {\n      main_file_close (sfile);\n    }\n\n#if VCDIFF_TOOLS\n  if (cmd == CMD_MERGE &&\n      (ret = main_merge_output (& stream, ofile)))\n    {\n      return EXIT_FAILURE;\n    }\n\n  if (cmd == CMD_MERGE_ARG)\n    {\n      xd3_swap_whole_state (& stream.whole_target,\n\t\t\t    & recode_stream->whole_target);\n    }\n#endif /* VCDIFF_TOOLS */\n\n  /* If output file is not open yet because of delayed-open, it means\n   * we never encountered a window in the delta, but it could have had\n   * a VCDIFF header?  TODO: solve this elsewhere.  For now, it prints\n   * \"nothing to output\" below, but the check doesn't happen in case\n   * of option_no_output.  */\n  if (! option_no_output && ofile != NULL)\n    {\n      if (!stdout_only && ! main_file_isopen (ofile))\n\t{\n\t  XPR(NT \"nothing to output: %s\\n\", ifile->filename);\n\t  return EXIT_FAILURE;\n\t}\n\n      /* Have to close the output before calling\n       * main_external_compression_finish, or else it hangs. */\n      if (main_file_close (ofile) != 0)\n\t{\n\t  return EXIT_FAILURE;\n\t}\n    }\n\n#if EXTERNAL_COMPRESSION\n  if ((ret = main_external_compression_finish ()))\n    {\n      XPR(NT \"external compression commands failed\\n\");\n      return EXIT_FAILURE;\n    }\n#endif\n\n  if ((ret = xd3_close_stream (& stream)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (& stream, ret));\n      return EXIT_FAILURE;\n    }\n\n#if XD3_ENCODER\n  if (option_verbose > 1 && cmd == CMD_ENCODE)\n    {\n      XPR(NT \"scanner configuration: %s\\n\", stream.smatcher.name);\n      XPR(NT \"target hash table size: %\"W\"u\\n\", stream.small_hash.size);\n      if (sfile != NULL && sfile->filename != NULL)\n\t{\n\t  XPR(NT \"source hash table size: %\"W\"u\\n\", stream.large_hash.size);\n\t}\n    }\n\n  if (option_verbose > 2 && cmd == CMD_ENCODE)\n    {\n      XPR(NT \"source copies: %\"Q\"u (%\"Q\"u bytes)\\n\",\n\t  stream.n_scpy, stream.l_scpy);\n      XPR(NT \"target copies: %\"Q\"u (%\"Q\"u bytes)\\n\",\n\t  stream.n_tcpy, stream.l_tcpy);\n      XPR(NT \"adds: %\"Q\"u (%\"Q\"u bytes)\\n\", stream.n_add, stream.l_add);\n      XPR(NT \"runs: %\"Q\"u (%\"Q\"u bytes)\\n\", stream.n_run, stream.l_run);\n    }\n#endif\n\n  xd3_free_stream (& stream);\n\n  if (option_verbose)\n    {\n      shortbuf tm;\n      long end_time = get_millisecs_now ();\n      xoff_t nwrite = ofile != NULL ? ofile->nwrite : 0;\n\n      XPR(NT \"finished in %s; input %\"Q\"u output %\"Q\"u bytes (%0.2f%%)\\n\",\n\t  main_format_millis (end_time - start_time, &tm),\n\t  ifile->nread, nwrite, 100.0 * nwrite / ifile->nread);\n    }\n\n  return EXIT_SUCCESS;\n}\n\n/* free memory before exit, reset single-use variables. */\nstatic void\nmain_cleanup (void)\n{\n  if (appheader_used != NULL &&\n      appheader_used != option_appheader)\n    {\n      main_free (appheader_used);\n      appheader_used = NULL;\n    }\n\n  main_buffree (main_bdata);\n  main_bdata = NULL;\n  main_bsize = 0;\n\n  main_lru_cleanup();\n\n  if (recode_stream != NULL)\n    {\n      xd3_free_stream (recode_stream);\n      main_free (recode_stream);\n      recode_stream = NULL;\n    }\n\n  if (merge_stream != NULL)\n    {\n      xd3_free_stream (merge_stream);\n      main_free (merge_stream);\n      merge_stream = NULL;\n    }\n\n  XD3_ASSERT (main_mallocs == 0);\n}\n\nstatic void\nsetup_environment (int argc,\n\t\t   char **argv,\n\t\t   int *argc_out,\n\t\t   char ***argv_out,\n\t\t   char ***argv_free,\n\t\t   char **env_free)\n{\n  int n, i, i0;\n  char *p, *v = getenv(\"XDELTA\");\n  if (v == NULL) {\n    (*argc_out) = argc;\n    (*argv_out) = argv;\n    (*argv_free) = NULL;\n    (*env_free) = NULL;\n    return;\n  }\n\n  (*env_free) = (char*) main_malloc((usize_t) strlen(v) + 1);\n  strcpy(*env_free, v);\n\n  /* Space needed for extra args, at least # of spaces */\n  n = argc + 1;\n  for (p = *env_free; *p != 0; ) {\n    if (*p++ == ' ') {\n      n++;\n    }\n  }\n\n  (*argv_free) = (char**) main_malloc(sizeof(char*) * (n + 1));\n  (*argv_out) = (*argv_free);\n  (*argv_out)[0] = argv[0];\n  (*argv_out)[n] = NULL;\n\n  i = 1;\n  for (p = *env_free; *p != 0; ) {\n    (*argv_out)[i++] = p;\n    while (*p != ' ' && *p != 0) {\n      p++;\n    }\n    while (*p == ' ') {\n      *p++ = 0;\n    }\n  }\n\n  for (i0 = 1; i0 < argc; i0++) {\n    (*argv_out)[i++] = argv[i0];\n  }\n\n  /* Counting spaces is an upper bound, argv stays NULL terminated. */\n  (*argc_out) = i;\n  while (i <= n) {\n    (*argv_out)[i++] = NULL;\n  }\n}\n\n#if PYTHON_MODULE || SWIG_MODULE || NOT_MAIN\nint xd3_main_cmdline (int argc, char **argv)\n#else\nint main (int argc, char **argv)\n#endif\n{\n  static const char *flags =\n    \"0123456789cdefhnqvDFJNORVs:m:B:C:E:I:L:O:M:P:W:A::S::\";\n  xd3_cmd cmd;\n  main_file ifile;\n  main_file ofile;\n  main_file sfile;\n  main_merge_list merge_order;\n  main_merge *merge;\n  int my_optind;\n  const char *my_optarg;\n  const char *my_optstr;\n  const char *sfilename;\n  int env_argc;\n  char **env_argv;\n  char **free_argv;  /* malloc() in setup_environment() */\n  char *free_value;  /* malloc() in setup_environment() */\n  int ret;\n\n#ifdef _WIN32\n  GetStartupInfo(&winStartupInfo);\n  setvbuf(stderr, NULL, _IONBF, 0);  /* Do not buffer stderr */\n#endif\n\n  main_file_init (& ifile);\n  main_file_init (& ofile);\n  main_file_init (& sfile);\n  main_merge_list_init (& merge_order);\n\n  reset_defaults();\n\n  free_argv = NULL;\n  free_value = NULL;\n  setup_environment(argc, argv, &env_argc, &env_argv,\n\t\t    &free_argv, &free_value);\n  cmd = CMD_NONE;\n  sfilename = NULL;\n  my_optind = 1;\n  argv = env_argv;\n  argc = env_argc;\n  program_name = env_argv[0];\n\n takearg:\n  my_optarg = NULL;\n  my_optstr = argv[my_optind];\n\n  /* This doesn't use getopt() because it makes trouble for -P & python which\n   * reenter main() and thus care about freeing all memory.  I never had much\n   * trust for getopt anyway, it's too opaque.  This implements a fairly\n   * standard non-long-option getopt with support for named operations (e.g.,\n   * \"xdelta3 [encode|decode|printhdr...] < in > out\"). */\n  if (my_optstr)\n    {\n      if (*my_optstr == '-')    { my_optstr += 1; }\n      else if (cmd == CMD_NONE) { goto nonflag; }\n      else                      { my_optstr = NULL; }\n    }\n  while (my_optstr)\n    {\n      const char *s;\n      my_optarg = NULL;\n      if ((ret = *my_optstr++) == 0) { my_optind += 1; goto takearg; }\n\n      /* Option handling: first check for one ':' following the option in\n       * flags, then check for two.  The syntax allows:\n       *\n       * 1. -Afoo                   defines optarg=\"foo\"\n       * 2. -A foo                  defines optarg=\"foo\"\n       * 3. -A \"\"                   defines optarg=\"\" (allows empty-string)\n       * 4. -A [EOA or -moreargs]   error (mandatory case)\n       * 5. -A [EOA -moreargs]      defines optarg=NULL (optional case)\n       * 6. -A=foo                  defines optarg=\"foo\"\n       * 7. -A=                     defines optarg=\"\" (mandatory case)\n       * 8. -A=                     defines optarg=NULL (optional case)\n       *\n       * See tests in test_command_line_arguments().\n       */\n      s = strchr (flags, ret);\n      if (s && s[1] && s[1] == ':')\n\t{\n\t  int option = s[2] && s[2] == ':';\n\n\t  /* Case 1, set optarg to the remaining characters. */\n\t  my_optarg = my_optstr;\n\t  my_optstr = \"\";\n\n\t  /* Case 2-5 */\n\t  if (*my_optarg == 0)\n\t    {\n\t      /* Condition 4-5 */\n\t      int have_arg = (my_optind < (argc - 1) &&\n\t\t\t      *argv[my_optind+1] != '-');\n\n\t      if (! have_arg)\n\t\t{\n\t\t  if (! option)\n\t\t  {\n\t\t    /* Case 4 */\n\t\t    XPR(NT \"-%c: requires an argument\\n\", ret);\n\t\t    ret = EXIT_FAILURE;\n\t\t    goto cleanup;\n\t\t  }\n\t\t  /* Case 5. */\n\t\t  my_optarg = NULL;\n\t\t}\n\t      else\n\t\t{\n\t\t  /* Case 2-3. */\n\t\t  my_optarg = argv[++my_optind];\n\t\t}\n\t    }\n\t  /* Case 6-8. */\n\t  else if (*my_optarg == '=')\n\t    {\n\t      /* Remove the = in all cases. */\n\t      my_optarg += 1;\n\n\t      if (option && *my_optarg == 0)\n\t\t{\n\t\t  /* Case 8. */\n\t\t  my_optarg = NULL;\n\t\t}\n\t    }\n\t}\n\n      switch (ret)\n\t{\n\t/* case: if no '-' was found, maybe check for a command name. */\n\tnonflag:\n\t       if (strcmp (my_optstr, \"decode\") == 0) { cmd = CMD_DECODE; }\n\t  else if (strcmp (my_optstr, \"encode\") == 0)\n\t    {\n#if XD3_ENCODER\n\t      cmd = CMD_ENCODE;\n#else\n\t      XPR(NT \"encoder support not compiled\\n\");\n\t      return EXIT_FAILURE;\n#endif\n\t    }\n\t  else if (strcmp (my_optstr, \"config\") == 0) { cmd = CMD_CONFIG; }\n#if REGRESSION_TEST\n\t  else if (strcmp (my_optstr, \"test\") == 0) { cmd = CMD_TEST; }\n#endif\n#if VCDIFF_TOOLS\n\t  else if (strcmp (my_optstr, \"printhdr\") == 0) { cmd = CMD_PRINTHDR; }\n\t  else if (strcmp (my_optstr, \"printhdrs\") == 0)\n\t    { cmd = CMD_PRINTHDRS; }\n\t  else if (strcmp (my_optstr, \"printdelta\") == 0)\n\t    { cmd = CMD_PRINTDELTA; }\n\t  else if (strcmp (my_optstr, \"recode\") == 0) { cmd = CMD_RECODE; }\n\t  else if (strcmp (my_optstr, \"merge\") == 0) { cmd = CMD_MERGE; }\n#endif\n\n\t  /* If no option was found and still no command, let the default\n\t   * command be encode.  The remaining args are treated as\n\t   * filenames. */\n\t  if (cmd == CMD_NONE)\n\t    {\n\t      cmd = CMD_DEFAULT;\n\t      my_optstr = NULL;\n\t      break;\n\t    }\n\t  else\n\t    {\n\t      /* But if we find a command name, continue the getopt loop. */\n\t      my_optind += 1;\n\t      goto takearg;\n\t    }\n\n\t  /* gzip-like options */\n\tcase '0': case '1': case '2': case '3': case '4':\n\tcase '5': case '6': case '7': case '8': case '9':\n\t  option_level = ret - '0';\n\t  break;\n\tcase 'f': option_force = 1; break;\n\tcase 'F':\n#if EXTERNAL_COMPRESSION\n\t  option_force2 = 1;\n#else\n\t  XPR(NT \"warning: -F option ignored, \"\n\t      \"external compression support was not compiled\\n\");\n\t  break;\n#endif\n\tcase 'v': option_verbose += 1; option_quiet = 0; break;\n\tcase 'q': option_quiet = 1; option_verbose = 0; break;\n\tcase 'c': option_stdout = 1; break;\n\tcase 'd':\n\t  if (cmd == CMD_NONE) { cmd = CMD_DECODE; }\n\t  else { ret = main_help (); goto exit; }\n\t  break;\n\tcase 'e':\n#if XD3_ENCODER\n\t  if (cmd == CMD_NONE) { cmd = CMD_ENCODE; }\n\t  else { ret = main_help (); goto exit; }\n\t  break;\n#else\n\t  XPR(NT \"encoder support not compiled\\n\");\n\t  return EXIT_FAILURE;\n#endif\n\n\tcase 'n': option_use_checksum = 0; break;\n\tcase 'N': option_no_compress = 1; break;\n\tcase 'C': option_smatch_config = my_optarg; break;\n\tcase 'J': option_no_output = 1; break;\n\tcase 'S': if (my_optarg == NULL)\n\t    {\n\t      option_use_secondary = 0;\n\t      option_secondary = NULL;\n\t    }\n\t  else\n\t    {\n\t      option_use_secondary = 1;\n\t      option_secondary = my_optarg;\n\t    }\n\t  break;\n\tcase 'A': if (my_optarg == NULL) { option_use_appheader = 0; }\n\t          else { option_appheader = (uint8_t*) my_optarg; } break;\n\tcase 'B': {\n\t  xoff_t bsize;\n\t  if ((ret = main_atoux (my_optarg, & bsize,\n\t\t\t\t XD3_MINSRCWINSZ, XD3_MAXSRCWINSZ, 'B')))\n\t    {\n\t      goto exit;\n\t    }\n\t  option_srcwinsz = bsize;\n\t  break;\n\t}\n\tcase 'I':\n\t  if ((ret = main_atou (my_optarg, & option_iopt_size, 0,\n\t\t\t\t0, 'I')))\n\t    {\n\t      goto exit;\n\t    }\n\t  break;\n\tcase 'P':\n\t  if ((ret = main_atou (my_optarg, & option_sprevsz, 0,\n\t\t\t\t0, 'P')))\n\t    {\n\t      goto exit;\n\t    }\n\t  break;\n\tcase 'W':\n\t  if ((ret = main_atou (my_optarg, & option_winsize, XD3_ALLOCSIZE,\n\t\t\t\tXD3_HARDMAXWINSIZE, 'W')))\n\t  {\n\t    goto exit;\n\t  }\n\t  break;\n\tcase 'D':\n#if EXTERNAL_COMPRESSION == 0\n\t  if (option_verbose > 0)\n\t    {\n\t      XPR(NT \"warning: -D option ignored, \"\n\t\t  \"external compression support was not compiled\\n\");\n\t    }\n#else\n\t  option_decompress_inputs  = 0;\n#endif\n\t  break;\n\tcase 'R':\n#if EXTERNAL_COMPRESSION == 0\n\t  if (option_verbose > 0)\n\t    {\n\t      XPR(NT \"warning: -R option ignored, \"\n\t\t  \"external compression support was not compiled\\n\");\n\t    }\n#else\n\t  option_recompress_outputs = 0;\n#endif\n\t  break;\n\tcase 's':\n\t  if (sfilename != NULL)\n\t    {\n\t      XPR(NT \"specify only one source file\\n\");\n\t      goto cleanup;\n\t    }\n\n\t  sfilename = my_optarg;\n\t  break;\n\tcase 'm':\n\t  if ((merge = (main_merge*)\n\t       main_malloc (sizeof (main_merge))) == NULL)\n\t    {\n\t      goto cleanup;\n\t    }\n\t  main_merge_list_push_back (& merge_order, merge);\n\t  merge->filename = my_optarg;\n\t  break;\n\tcase 'V':\n\t  ret = main_version (); goto exit;\n\tdefault:\n\t  ret = main_help (); goto exit;\n\t}\n    }\n\n  option_source_filename = sfilename;\n\n  /* In case there were no arguments, set the default command. */\n  if (cmd == CMD_NONE) { cmd = CMD_DEFAULT; }\n\n  argc -= my_optind;\n  argv += my_optind;\n\n  /* There may be up to two more arguments. */\n  if (argc > 2)\n    {\n      XPR(NT \"too many filenames: %s ...\\n\", argv[2]);\n      goto cleanup;\n    }\n\n  ifile.flags    = RD_FIRST | RD_MAININPUT;\n  sfile.flags    = RD_FIRST;\n  sfile.filename = option_source_filename;\n\n  /* The infile takes the next argument, if there is one.  But if not, infile\n   * is set to stdin. */\n  if (argc > 0)\n    {\n      ifile.filename = argv[0];\n\n      if ((ret = main_file_open (& ifile, ifile.filename, XO_READ)))\n\t{\n\t  goto cleanup;\n\t}\n    }\n  else\n    {\n      XSTDIN_XF (& ifile);\n    }\n\n  /* The ofile takes the following argument, if there is one.  But if not, it\n   * is left NULL until the application header is processed.  It will be set\n   * in main_open_output. */\n  if (argc > 1)\n    {\n      /* Check for conflicting arguments. */\n      if (option_stdout && ! option_quiet)\n\t{\n\t  XPR(NT \"warning: -c option overrides output filename: %s\\n\",\n\t      argv[1]);\n\t}\n\n      if (! option_stdout) { ofile.filename = argv[1]; }\n    }\n\n#if VCDIFF_TOOLS\n  if (cmd == CMD_MERGE &&\n      (ret = main_merge_arguments (&merge_order)))\n    {\n      goto cleanup;\n    }\n#endif /* VCDIFF_TOOLS */\n\n  switch (cmd)\n    {\n    case CMD_PRINTHDR:\n    case CMD_PRINTHDRS:\n    case CMD_PRINTDELTA:\n#if XD3_ENCODER\n    case CMD_ENCODE:\n    case CMD_RECODE:\n    case CMD_MERGE:\n#endif\n    case CMD_DECODE:\n      ret = main_input (cmd, & ifile, & ofile, & sfile);\n      break;\n\n#if REGRESSION_TEST\n    case CMD_TEST:\n      main_config ();\n      ret = xd3_selftest ();\n      break;\n#endif\n\n    case CMD_CONFIG:\n      ret = main_config ();\n      break;\n\n    default:\n      ret = main_help ();\n      break;\n    }\n\n  if (0)\n    {\n    cleanup:\n      ret = EXIT_FAILURE;\n    exit:\n      (void)0;\n    }\n\n#if EXTERNAL_COMPRESSION\n  main_external_compression_cleanup ();\n#endif\n\n  main_file_cleanup (& ifile);\n  main_file_cleanup (& ofile);\n  main_file_cleanup (& sfile);\n\n  while (! main_merge_list_empty (& merge_order))\n    {\n      merge = main_merge_list_pop_front (& merge_order);\n      main_free (merge);\n    }\n\n  main_free (free_argv);\n  main_free (free_value);\n\n  main_cleanup ();\n\n  fflush (stdout);\n  fflush (stderr);\n  return ret;\n}\n\nstatic int\nmain_help (void)\n{\n  main_version();\n\n  /* Note: update wiki when command-line features change */\n  XPR(NTR \"usage: xdelta3 [command/options] [input [output]]\\n\");\n  XPR(NTR \"make patch:\\n\");\n  XPR(NTR \"\\n\");\n  XPR(NTR \"  xdelta3.exe -e -s old_file new_file delta_file\\n\");\n  XPR(NTR \"\\n\");\n  XPR(NTR \"apply patch:\\n\");\n  XPR(NTR \"\\n\");\n  XPR(NTR \"  xdelta3.exe -d -s old_file delta_file decoded_new_file\\n\");\n  XPR(NTR \"\\n\");\n  XPR(NTR \"special command names:\\n\");\n  XPR(NTR \"    config      prints xdelta3 configuration\\n\");\n  XPR(NTR \"    decode      decompress the input\\n\");\n  XPR(NTR \"    encode      compress the input%s\\n\",\n     XD3_ENCODER ? \"\" : \" [Not compiled]\");\n#if REGRESSION_TEST\n  XPR(NTR \"    test        run the builtin tests\\n\");\n#endif\n#if VCDIFF_TOOLS\n  XPR(NTR \"special commands for VCDIFF inputs:\\n\");\n  XPR(NTR \"    printdelta  print information about the entire delta\\n\");\n  XPR(NTR \"    printhdr    print information about the first window\\n\");\n  XPR(NTR \"    printhdrs   print information about all windows\\n\");\n  XPR(NTR \"    recode      encode with new application/secondary settings\\n\");\n  XPR(NTR \"    merge       merge VCDIFF inputs (see below)\\n\");\n#endif\n  XPR(NTR \"merge patches:\\n\");\n  XPR(NTR \"\\n\");\n  XPR(NTR \"  xdelta3 merge -m 1.vcdiff -m 2.vcdiff 3.vcdiff merged.vcdiff\\n\");\n  XPR(NTR \"\\n\");\n  XPR(NTR \"standard options:\\n\");\n  XPR(NTR \"   -0 .. -9     compression level\\n\");\n  XPR(NTR \"   -c           use stdout\\n\");\n  XPR(NTR \"   -d           decompress\\n\");\n  XPR(NTR \"   -e           compress%s\\n\",\n     XD3_ENCODER ? \"\" : \" [Not compiled]\");\n  XPR(NTR \"   -f           force (overwrite, ignore trailing garbage)\\n\");\n#if EXTERNAL_COMPRESSION\n  XPR(NTR \"   -F           force the external-compression subprocess\\n\");\n#endif\n  XPR(NTR \"   -h           show help\\n\");\n  XPR(NTR \"   -q           be quiet\\n\");\n  XPR(NTR \"   -v           be verbose (max 2)\\n\");\n  XPR(NTR \"   -V           show version\\n\");\n\n  XPR(NTR \"memory options:\\n\");\n  XPR(NTR \"   -B bytes     source window size\\n\");\n  XPR(NTR \"   -W bytes     input window size\\n\");\n  XPR(NTR \"   -P size      compression duplicates window\\n\");\n  XPR(NTR \"   -I size      instruction buffer size (0 = unlimited)\\n\");\n\n  XPR(NTR \"compression options:\\n\");\n  XPR(NTR \"   -s source    source file to copy from (if any)\\n\");\n  XPR(NTR \"   -S [lzma|djw|fgk] enable/disable secondary compression\\n\");\n  XPR(NTR \"   -N           disable small string-matching compression\\n\");\n  XPR(NTR \"   -D           disable external decompression (encode/decode)\\n\");\n  XPR(NTR \"   -R           disable external recompression (decode)\\n\");\n  XPR(NTR \"   -n           disable checksum (encode/decode)\\n\");\n  XPR(NTR \"   -C           soft config (encode, undocumented)\\n\");\n  XPR(NTR \"   -A [apphead] disable/provide application header (encode)\\n\");\n  XPR(NTR \"   -J           disable output (check/compute only)\\n\");\n  XPR(NTR \"   -m           arguments for \\\"merge\\\"\\n\");\n\n  XPR(NTR \"the XDELTA environment variable may contain extra args:\\n\");\n  XPR(NTR \"   XDELTA=\\\"-s source-x.y.tar.gz\\\" \\\\\\n\");\n  XPR(NTR \"   tar --use-compress-program=xdelta3 \\\\\\n\");\n  XPR(NTR \"       -cf target-x.z.tar.gz.vcdiff target-x.y\\n\");\n  return EXIT_FAILURE;\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-merge.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#ifndef _XDELTA3_MERGE_H_\n#define _XDELTA3_MERGE_H_\n\nint xd3_merge_inputs (xd3_stream *stream, \n\t\t      xd3_whole_state *source,\n\t\t      xd3_whole_state *input);\n\nstatic int\nxd3_whole_state_init (xd3_stream *stream)\n{\n  XD3_ASSERT (stream->whole_target.adds == NULL);\n  XD3_ASSERT (stream->whole_target.inst == NULL);\n  XD3_ASSERT (stream->whole_target.wininfo == NULL);\n  XD3_ASSERT (stream->whole_target.length == 0);\n\n  stream->whole_target.adds_alloc = XD3_ALLOCSIZE;\n  stream->whole_target.inst_alloc = XD3_ALLOCSIZE;\n  stream->whole_target.wininfo_alloc = XD3_ALLOCSIZE;\n\n  if ((stream->whole_target.adds = (uint8_t*) \n       xd3_alloc (stream, stream->whole_target.adds_alloc, 1)) == NULL ||\n      (stream->whole_target.inst = (xd3_winst*) \n       xd3_alloc (stream, stream->whole_target.inst_alloc, 1)) == NULL ||\n      (stream->whole_target.wininfo = (xd3_wininfo*) \n       xd3_alloc (stream, stream->whole_target.wininfo_alloc, 1)) == NULL)\n    {\n      return ENOMEM;\n    }\n  return 0;\n}\n\nstatic void\nxd3_swap_whole_state (xd3_whole_state *a, \n\t\t      xd3_whole_state *b)\n{\n  xd3_whole_state tmp;\n  XD3_ASSERT (a->inst != NULL && a->adds != NULL);\n  XD3_ASSERT (b->inst != NULL && b->adds != NULL);\n  XD3_ASSERT (b->wininfo != NULL && b->wininfo != NULL);\n  memcpy (&tmp, a, sizeof (xd3_whole_state));\n  memcpy (a, b, sizeof (xd3_whole_state));\n  memcpy (b, &tmp, sizeof (xd3_whole_state));\n}\n\nstatic int\nxd3_realloc_buffer (xd3_stream *stream,\n                    usize_t current_units,\n                    usize_t unit_size,\n                    usize_t new_units,\n                    usize_t *alloc_size,\n                    void **alloc_ptr)\n{\n  usize_t needed;\n  usize_t new_alloc;\n  usize_t cur_size;\n  uint8_t *new_buf;\n\n  needed = (current_units + new_units) * unit_size;\n\n  if (needed <= *alloc_size)\n    {\n      return 0;\n    }\n\n  cur_size = current_units * unit_size;\n  new_alloc = xd3_round_blksize (needed * 2, XD3_ALLOCSIZE);\n\n  if ((new_buf = (uint8_t*) xd3_alloc (stream, new_alloc, 1)) == NULL)\n    {\n      return ENOMEM;\n    }\n\n  if (cur_size != 0)\n    {\n      memcpy (new_buf, *alloc_ptr, cur_size);\n    }\n\n  if (*alloc_ptr != NULL)\n    {\n      xd3_free (stream, *alloc_ptr);\n    }\n\n  *alloc_size = new_alloc;\n  *alloc_ptr = new_buf;\n\n  return 0;\n}\n\n/* allocate one new output instruction */\nstatic int\nxd3_whole_alloc_winst (xd3_stream *stream,\n\t\t       xd3_winst **winstp)\n{\n  int ret;\n\n  if ((ret = xd3_realloc_buffer (stream, \n\t\t\t\t stream->whole_target.instlen, \n\t\t\t\t sizeof (xd3_winst), \n\t\t\t\t 1, \n\t\t\t\t & stream->whole_target.inst_alloc, \n\t\t\t\t (void**) & stream->whole_target.inst))) \n    { \n      return ret; \n    }\n\n  *winstp = &stream->whole_target.inst[stream->whole_target.instlen++];\n\n  return 0;\n}\n\nstatic int\nxd3_whole_alloc_adds (xd3_stream *stream,\n\t\t      usize_t count)\n{\n  return xd3_realloc_buffer (stream,\n\t\t\t     stream->whole_target.addslen,\n\t\t\t     1,\n\t\t\t     count,\n\t\t\t     & stream->whole_target.adds_alloc,\n\t\t\t     (void**) & stream->whole_target.adds);\n}\n\nstatic int\nxd3_whole_alloc_wininfo (xd3_stream *stream,\n\t\t\t xd3_wininfo **wininfop)\n{\n  int ret;\n\n  if ((ret = xd3_realloc_buffer (stream, \n\t\t\t\t stream->whole_target.wininfolen, \n\t\t\t\t sizeof (xd3_wininfo),\n\t\t\t\t 1,\n\t\t\t\t & stream->whole_target.wininfo_alloc, \n\t\t\t\t (void**) & stream->whole_target.wininfo))) \n    { \n      return ret; \n    }\n\n  *wininfop = &stream->whole_target.wininfo[stream->whole_target.wininfolen++];\n\n  return 0;\n}\n\nstatic int\nxd3_whole_append_inst (xd3_stream *stream,\n                       xd3_hinst *inst)\n{\n  int ret;\n  xd3_winst *winst;\n\n  if ((ret = xd3_whole_alloc_winst (stream, &winst)))\n    {\n      return ret;\n    }\n\n  winst->type = inst->type;\n  winst->mode = 0;\n  winst->size = inst->size;\n  winst->position = stream->whole_target.length;\n  stream->whole_target.length += inst->size;\n\n  if (((inst->type == XD3_ADD) || (inst->type == XD3_RUN)) &&\n      (ret = xd3_whole_alloc_adds (stream, \n\t\t\t\t   (inst->type == XD3_RUN ? 1 : inst->size))))\n    {\n      return ret;\n    }\n\n  switch (inst->type)\n    {\n    case XD3_RUN:\n      winst->addr = stream->whole_target.addslen;\n      stream->whole_target.adds[stream->whole_target.addslen++] =\n        *stream->data_sect.buf++;\n      break;\n\n    case XD3_ADD:\n      winst->addr = stream->whole_target.addslen;\n      memcpy (stream->whole_target.adds + stream->whole_target.addslen,\n              stream->data_sect.buf,\n              inst->size);\n      stream->data_sect.buf += inst->size;\n      stream->whole_target.addslen += inst->size;\n      break;\n\n    default:\n      if (inst->addr < stream->dec_cpylen)\n\t{\n\t  winst->mode = SRCORTGT (stream->dec_win_ind);\n\t  winst->addr = stream->dec_cpyoff + inst->addr;\n\t}\n      else\n\t{\n\t  winst->addr = (stream->dec_winstart + \n\t\t\t inst->addr - \n\t\t\t stream->dec_cpylen);\n\t}\n      break;\n    }\n\n  return 0;\n}\n\nint\nxd3_whole_append_window (xd3_stream *stream)\n{\n  int ret;\n  xd3_wininfo *wininfo;\n\n  if ((ret = xd3_whole_alloc_wininfo (stream, &wininfo))) { return ret; }\n\n  wininfo->length = stream->dec_tgtlen;\n  wininfo->offset = stream->dec_winstart;\n  wininfo->adler32 = stream->dec_adler32;\n\n  while (stream->inst_sect.buf < stream->inst_sect.buf_max)\n    {\n      if ((ret = xd3_decode_instruction (stream)))\n\t{\n\t  return ret;\n\t}\n\n      if ((stream->dec_current1.type != XD3_NOOP) &&\n          (ret = xd3_whole_append_inst (stream,\n\t\t\t\t\t& stream->dec_current1)))\n\t{\n\t  return ret;\n\t}\n\n      if ((stream->dec_current2.type != XD3_NOOP) &&\n\t  (ret = xd3_whole_append_inst (stream,\n\t\t\t\t\t& stream->dec_current2)))\n\t{\n\t  return ret;\n\t}\n    }\n\n  return 0;\n}\n\n/* xd3_merge_input_output applies *source to *stream, returns the\n * result in stream. */\nstatic int xd3_merge_input_output (xd3_stream *stream,\n\t\t\t\t   xd3_whole_state *source)\n{\n  int ret;\n  xd3_stream tmp_stream;\n  memset (& tmp_stream, 0, sizeof (tmp_stream));\n  if ((ret = xd3_config_stream (& tmp_stream, NULL)) ||\n      (ret = xd3_whole_state_init (& tmp_stream)) ||\n      (ret = xd3_merge_inputs (& tmp_stream, \n\t\t\t       source,\n\t\t\t       & stream->whole_target)))\n    {\n      XPR(NT XD3_LIB_ERRMSG (&tmp_stream, ret));\n      return ret;\n    }\n\n  /* the output is in tmp_stream.whole_state, swap into input */\n  xd3_swap_whole_state (& stream->whole_target,\n\t\t\t& tmp_stream.whole_target);\n  /* total allocation counts are preserved */\n  xd3_free_stream (& tmp_stream);\n  return 0;\n}\n\nstatic int\nxd3_merge_run (xd3_stream *stream,\n\t       xd3_whole_state *target,\n\t       xd3_winst *iinst)\n{\n  int ret;\n  xd3_winst *oinst;\n\n  if ((ret = xd3_whole_alloc_winst (stream, &oinst)) ||\n      (ret = xd3_whole_alloc_adds (stream, 1)))\n    {\n      return ret;\n    }\n\n  oinst->type = iinst->type;\n  oinst->mode = iinst->mode;\n  oinst->size = iinst->size;\n  oinst->addr = stream->whole_target.addslen;\n\n  XD3_ASSERT (stream->whole_target.length == iinst->position);\n  oinst->position = stream->whole_target.length;\n  stream->whole_target.length += iinst->size;\n\n  stream->whole_target.adds[stream->whole_target.addslen++] = \n    target->adds[iinst->addr];\n\n  return 0;\n}\n\nstatic int\nxd3_merge_add (xd3_stream *stream,\n\t       xd3_whole_state *target,\n\t       xd3_winst *iinst)\n{\n  int ret;\n  xd3_winst *oinst;\n\n  if ((ret = xd3_whole_alloc_winst (stream, &oinst)) ||\n      (ret = xd3_whole_alloc_adds (stream, iinst->size)))\n    {\n      return ret;\n    }\n\n  oinst->type = iinst->type;\n  oinst->mode = iinst->mode;\n  oinst->size = iinst->size;\n  oinst->addr = stream->whole_target.addslen;\n\n  XD3_ASSERT (stream->whole_target.length == iinst->position);\n  oinst->position = stream->whole_target.length;\n  stream->whole_target.length += iinst->size;\n\n  memcpy(stream->whole_target.adds + stream->whole_target.addslen,\n\t target->adds + iinst->addr,\n\t iinst->size);\n\n  stream->whole_target.addslen += iinst->size;\n\n  return 0;\n}\n\nstatic int\nxd3_merge_target_copy (xd3_stream *stream,\n\t\t       xd3_winst *iinst)\n{\n  int ret;\n  xd3_winst *oinst;\n\n  if ((ret = xd3_whole_alloc_winst (stream, &oinst)))\n    {\n      return ret;\n    }\n\n  XD3_ASSERT (stream->whole_target.length == iinst->position);\n\n  memcpy (oinst, iinst, sizeof (*oinst));\n  return 0;\n}\n\nstatic int\nxd3_merge_find_position (xd3_stream *stream,\n\t\t\t xd3_whole_state *source,\n\t\t\t xoff_t address,\n\t\t\t usize_t *inst_num)\n{\n  usize_t low;\n  usize_t high;\n\n  if (address >= source->length)\n    {\n      stream->msg = \"Invalid copy offset in merge\";\n      return XD3_INVALID_INPUT;\n    }\n\n  low = 0;\n  high = source->instlen;\n\n  while (low != high)\n    {\n      xoff_t mid_lpos;\n      xoff_t mid_hpos;\n      usize_t mid = low + (high - low) / 2;\n      mid_lpos = source->inst[mid].position;\n\n      if (address < mid_lpos)\n\t{\n\t  high = mid;\n\t  continue;\n\t}\n      \n      mid_hpos = mid_lpos + source->inst[mid].size;\n\n      if (address >= mid_hpos)\n\t{\n\t  low = mid + 1;\n\t  continue;\n\t}\n\n      *inst_num = mid;\n      return 0;\n    }\n\n  stream->msg = \"Internal error in merge\";\n  return XD3_INTERNAL;\n}\n\nstatic int\nxd3_merge_source_copy (xd3_stream *stream,\n\t\t       xd3_whole_state *source,\n\t\t       const xd3_winst *iinst_orig)\n{\n  int ret;\n  xd3_winst iinst;\n  usize_t sinst_num;\n\n  memcpy (& iinst, iinst_orig, sizeof (iinst));\n\n  XD3_ASSERT (iinst.mode == VCD_SOURCE);\n\n  if ((ret = xd3_merge_find_position (stream, source, \n\t\t\t\t      iinst.addr, &sinst_num)))\n    {\n      return ret;\n    }\n\n  while (iinst.size > 0)\n    {\n      xd3_winst *sinst;\n      xd3_winst *minst;\n      usize_t sinst_offset;\n      usize_t sinst_left;\n      usize_t this_take;\n\n      XD3_ASSERT (sinst_num < source->instlen);\n\n      sinst = &source->inst[sinst_num];\n\n      XD3_ASSERT (iinst.addr >= sinst->position);\n\n      sinst_offset = (usize_t)(iinst.addr - sinst->position);\n\n      XD3_ASSERT (sinst->size > sinst_offset);\n\n      sinst_left = sinst->size - sinst_offset;\n      this_take = xd3_min (iinst.size, sinst_left);\n\n      XD3_ASSERT (this_take > 0);\n\n      if ((ret = xd3_whole_alloc_winst (stream, &minst)))\n\t{\n\t  return ret;\n\t}\n\n      minst->size = this_take;\n      minst->type = sinst->type;\n      minst->position = iinst.position;\n      minst->mode = 0;\n\n      switch (sinst->type)\n\t{\n\tcase XD3_RUN:\n\t  if ((ret = xd3_whole_alloc_adds (stream, 1)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  minst->addr = stream->whole_target.addslen;\n\t  stream->whole_target.adds[stream->whole_target.addslen++] = \n\t    source->adds[sinst->addr];\n\t  break;\n\tcase XD3_ADD:\n\t  if ((ret = xd3_whole_alloc_adds (stream, this_take)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  minst->addr = stream->whole_target.addslen;\n\t  memcpy(stream->whole_target.adds + stream->whole_target.addslen,\n\t\t source->adds + sinst->addr + sinst_offset,\n\t\t this_take);\n\t  stream->whole_target.addslen += this_take;\n\t  break;\n\tdefault:\n\t  if (sinst->mode != 0)\n\t    {\n\t      minst->mode = sinst->mode;\n\t      minst->addr = sinst->addr + sinst_offset;\n\t    }\n\t  else\n\t    {\n\t      // Note: A better implementation will construct the\n\t      // mapping of output ranges, starting from the input\n\t      // range, applying deltas in forward order, using an\n\t      // interval tree.  This code uses recursion to construct\n\t      // each copied range, recursively (using binary search\n\t      // in xd3_merge_find_position).\n\t      //\n\t      // TODO: This code can cause stack overflow. Fix as\n\t      // described above.\n\t      xd3_winst tinst;\n\t      tinst.type = XD3_CPY;\n\t      tinst.mode = iinst.mode;\n\t      tinst.addr = sinst->addr + sinst_offset;\n\t      tinst.size = this_take;\n\t      tinst.position = iinst.position;\n\n\t      // The instruction allocated in this frame will not be used.\n\t      stream->whole_target.instlen -= 1;\n\n\t      if ((ret = xd3_merge_source_copy (stream, source, &tinst)))\n\t\t{ \n\t\t  return ret;\n\t\t}\n\t    }\n\t  break;\n\t}\n\n      iinst.position += this_take;\n      iinst.addr += this_take;\n      iinst.size -= this_take;\n      sinst_num += 1;\n    }\n\n  return 0;\n}\n\n/* xd3_merge_inputs() applies *input to *source, returns its result in\n * stream. */\nint xd3_merge_inputs (xd3_stream *stream, \n\t\t      xd3_whole_state *source,\n\t\t      xd3_whole_state *input)\n{\n  int ret = 0;\n  usize_t i;\n  size_t input_i;\n\n  for (i = 0; i < input->wininfolen; ++i) {\n    xd3_wininfo *copyinfo;\n\n    if ((ret = xd3_whole_alloc_wininfo (stream, &copyinfo))) { return ret; }\n\n    *copyinfo = input->wininfo[i];\n  }\n\n  /* iterate over each instruction. */\n  for (input_i = 0; ret == 0 && input_i < input->instlen; ++input_i)\n    {\n      xd3_winst *iinst = &input->inst[input_i];\n\n      switch (iinst->type)\n\t{\n\tcase XD3_RUN:\n\t  ret = xd3_merge_run (stream, input, iinst);\n\t  break;\n\tcase XD3_ADD:\n\t  ret = xd3_merge_add (stream, input, iinst);\n\t  break;\n\tdefault:\n\t  if (iinst->mode == 0)\n\t    {\n\t      ret = xd3_merge_target_copy (stream, iinst);\n\t    }\n\t  else if (iinst->mode == VCD_TARGET)\n\t    {\n\t      ret = XD3_INVALID_INPUT;\n\t    }\n\t  else\n\t    {\n\t      ret = xd3_merge_source_copy (stream, source, iinst);\n\t    }\n\n\t  /* The whole_target.length is not updated in the xd3_merge*copy\n\t   * routine because of recursion in xd3_merge_source_copy. */\n\t  stream->whole_target.length += iinst->size;\n\t  break;\n\t}\n    }\n  \n  return ret;\n}\n\n#endif\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-second.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n#ifndef _XDELTA3_SECOND_H_\n#define _XDELTA3_SECOND_H_\n\nstatic inline void xd3_bit_state_encode_init (bit_state *bits)\n{\n  bits->cur_byte = 0;\n  bits->cur_mask = 1;\n}\n\nstatic inline int xd3_decode_bits (xd3_stream     *stream,\n\t\t\t\t   bit_state      *bits,\n\t\t\t\t   const uint8_t **input,\n\t\t\t\t   const uint8_t  *input_max,\n\t\t\t\t   usize_t         nbits,\n\t\t\t\t   usize_t        *valuep)\n{\n  usize_t value = 0;\n  usize_t vmask = 1 << nbits;\n\n  if (bits->cur_mask == 0x100) { goto next_byte; }\n\n  for (;;)\n    {\n      do\n\t{\n\t  vmask >>= 1;\n\n\t  if (bits->cur_byte & bits->cur_mask)\n\t    {\n\t      value |= vmask;\n\t    }\n\n\t  bits->cur_mask <<= 1;\n\n\t  if (vmask == 1) { goto done; }\n\t}\n      while (bits->cur_mask != 0x100);\n\n    next_byte:\n\n      if (*input == input_max)\n\t{\n\t  stream->msg = \"secondary decoder end of input\";\n\t  return XD3_INTERNAL;\n\t}\n\n      bits->cur_byte = *(*input)++;\n      bits->cur_mask = 1;\n    }\n\n done:\n\n  IF_DEBUG2 (DP(RINT \"(d) %\"W\"u \", value));\n\n  (*valuep) = value;\n  return 0;\n}\n\n#if REGRESSION_TEST\n/* There may be extra bits at the end of secondary decompression, this macro\n * checks for non-zero bits.  This is overly strict, but helps pass the\n * single-bit-error regression test. */\nstatic int\nxd3_test_clean_bits (xd3_stream *stream, bit_state *bits)\n{\n  for (; bits->cur_mask != 0x100; bits->cur_mask <<= 1)\n    {\n      if (bits->cur_byte & bits->cur_mask)\n\t{\n\t  stream->msg = \"secondary decoder garbage\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n\n  return 0;\n}\n#endif\n\nstatic int\nxd3_get_secondary (xd3_stream *stream, xd3_sec_stream **sec_streamp, \n\t\t   int is_encode)\n{\n  if (*sec_streamp == NULL)\n    {\n      int ret;\n\n      if ((*sec_streamp = stream->sec_type->alloc (stream)) == NULL)\n\t{\n\t  stream->msg = \"error initializing secondary stream\";\n\t  return XD3_INVALID;\n\t}\n\n      if ((ret = stream->sec_type->init (stream, *sec_streamp, is_encode)) != 0)\n\t{\n\t  return ret;\n\t}\n    }\n\n  return 0;\n}\n\nstatic int\nxd3_decode_secondary (xd3_stream      *stream,\n\t\t      xd3_desect      *sect,\n\t\t      xd3_sec_stream **sec_streamp)\n{\n  usize_t dec_size;\n  uint8_t *out_used;\n  int ret;\n\n  if ((ret = xd3_get_secondary (stream, sec_streamp, 0)) != 0)\n    {\n      return ret;\n    }\n\n  /* Decode the size, allocate the buffer. */\n  if ((ret = xd3_read_size (stream, & sect->buf,\n\t\t\t    sect->buf_max, & dec_size)) ||\n      (ret = xd3_decode_allocate (stream, dec_size,\n\t\t\t\t  & sect->copied2, & sect->alloc2)))\n    {\n      return ret;\n    }\n\n  if (dec_size == 0)\n    {\n      stream->msg = \"secondary decoder invalid output size\";\n      return XD3_INVALID_INPUT;\n    }\n\n  out_used = sect->copied2;\n\n  if ((ret = stream->sec_type->decode (stream, *sec_streamp,\n\t\t\t\t       & sect->buf, sect->buf_max,\n\t\t\t\t       & out_used, out_used + dec_size)))\n    {\n      return ret;\n    }\n\n  if (sect->buf != sect->buf_max)\n    {\n      stream->msg = \"secondary decoder finished with unused input\";\n      return XD3_INTERNAL;\n    }\n\n  if (out_used != sect->copied2 + dec_size)\n    {\n      stream->msg = \"secondary decoder short output\";\n      return XD3_INTERNAL;\n    }\n\n  sect->buf = sect->copied2;\n  sect->buf_max = sect->copied2 + dec_size;\n  sect->size = dec_size;\n\n  return 0;\n}\n\n#if XD3_ENCODER\nstatic inline int xd3_encode_bit (xd3_stream      *stream,\n\t\t\t\t  xd3_output     **output,\n\t\t\t\t  bit_state       *bits,\n\t\t\t\t  usize_t          bit)\n{\n  int ret;\n\n  if (bit)\n    {\n      bits->cur_byte |= bits->cur_mask;\n    }\n\n  /* OPT: Might help to buffer more than 8 bits at once. */\n  if (bits->cur_mask == 0x80)\n    {\n      if ((ret = xd3_emit_byte (stream, output, bits->cur_byte)) != 0)\n\t{\n\t  return ret;\n\t}\n\n      bits->cur_mask = 1;\n      bits->cur_byte = 0;\n    }\n  else\n    {\n      bits->cur_mask <<= 1;\n    }\n\n  return 0;\n}\n\nstatic inline int xd3_flush_bits (xd3_stream      *stream,\n\t\t\t\t  xd3_output     **output,\n\t\t\t\t  bit_state       *bits)\n{\n  return (bits->cur_mask == 1) ? 0 :\n    xd3_emit_byte (stream, output, bits->cur_byte);\n}\n\nstatic inline int xd3_encode_bits (xd3_stream      *stream,\n\t\t\t\t   xd3_output     **output,\n\t\t\t\t   bit_state       *bits,\n\t\t\t\t   usize_t           nbits,\n\t\t\t\t   usize_t           value)\n{\n  int ret;\n  usize_t mask = 1 << nbits;\n\n  XD3_ASSERT (nbits > 0);\n  XD3_ASSERT (nbits < sizeof (usize_t) * 8);\n  XD3_ASSERT (value < mask);\n\n  do\n    {\n      mask >>= 1;\n\n      if ((ret = xd3_encode_bit (stream, output, bits, value & mask)))\n\t{\n\t  return ret;\n\t}\n    }\n  while (mask != 1);\n\n  IF_DEBUG2 (DP(RINT \"(e) %\"W\"u \", value));\n\n  return 0;\n}\n\nstatic int\nxd3_encode_secondary (xd3_stream      *stream,\n\t\t      xd3_output     **head,\n\t\t      xd3_output     **tail,\n\t\t      xd3_sec_stream **sec_streamp,\n\t\t      xd3_sec_cfg     *cfg,\n\t\t      int             *did_it)\n{\n  xd3_output     *tmp_head;\n  xd3_output     *tmp_tail;\n\n  usize_t comp_size;\n  usize_t orig_size;\n\n  int ret;\n\n  orig_size = xd3_sizeof_output (*head);\n\n  if (orig_size < SECONDARY_MIN_INPUT) { return 0; }\n\n  if ((ret = xd3_get_secondary (stream, sec_streamp, 1)) != 0)\n    {\n      return ret;\n    }\n\n  tmp_head = xd3_alloc_output (stream, NULL);\n\n  /* Encode the size, encode the data.  Encoding the size makes it\n   * simpler, but is a little gross.  Should not need the entire\n   * section in contiguous memory, but it is much easier this way. */\n  if ((ret = xd3_emit_size (stream, & tmp_head, orig_size)) ||\n      (ret = stream->sec_type->encode (stream, *sec_streamp, *head,\n\t\t\t\t       tmp_head, cfg)))\n    {\n      goto getout;\n    }\n\n  /* If the secondary compressor determines it's no good, it returns\n   * XD3_NOSECOND. */\n\n  /* Setup tmp_tail, comp_size */\n  tmp_tail  = tmp_head;\n  comp_size = tmp_head->next;\n\n  while (tmp_tail->next_page != NULL)\n    {\n      tmp_tail = tmp_tail->next_page;\n      comp_size += tmp_tail->next;\n    }\n\n  XD3_ASSERT (comp_size == xd3_sizeof_output (tmp_head));\n  XD3_ASSERT (tmp_tail != NULL);\n\n  if (comp_size < (orig_size - SECONDARY_MIN_SAVINGS) || cfg->inefficient)\n    {\n      if (comp_size < orig_size)\n\t{\n\t  IF_DEBUG1(DP(RINT \"[encode_secondary] saved %\"W\"u bytes: %\"W\"u -> %\"W\"u (%0.2f%%)\\n\",\n\t\t       orig_size - comp_size, orig_size, comp_size,\n\t\t       100.0 * (double) comp_size / (double) orig_size));\n\t}\n\n      xd3_free_output (stream, *head);\n\n      *head = tmp_head;\n      *tail = tmp_tail;\n      *did_it = 1;\n    }\n  else\n    {\n    getout:\n      if (ret == XD3_NOSECOND) { ret = 0; }\n      xd3_free_output (stream, tmp_head);\n    }\n\n  return ret;\n}\n#endif /* XD3_ENCODER */\n#endif /* _XDELTA3_SECOND_H_ */\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3-test.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\nstatic const uint32_t TEST_SEED1 = 5489UL;\n#define MT_LEN 624\n#define MT_IA 397\nstatic const uint32_t UPPER_MASK = 0x80000000;\nstatic const uint32_t LOWER_MASK = 0x7FFFFFFF;\nstatic const uint32_t MATRIX_A = 0x9908B0DF;\n\n#ifndef SHELL_TESTS\n#define SHELL_TESTS 1\n#endif\n\ntypedef struct mtrand mtrand;\n\nstruct mtrand {\n  int mt_index_;\n  uint32_t mt_buffer_[MT_LEN];\n};\n\nint test_compare_files (const char* tgt, const char *rec);\nvoid mt_init(mtrand *mt, uint32_t seed);\nuint32_t mt_random (mtrand *mt);\nint test_setup (void);\n\n/* The Mersenne Twister code used herein is code to Michael Brundage.  Thanks!\n * http://www.qbrundage.com/michaelb/pubs/essays/random_number_generation.html\n */\nvoid mt_init(mtrand *mt, uint32_t seed) {\n  int i;\n  mt->mt_buffer_[0] = seed;\n  mt->mt_index_ = MT_LEN;\n  for (i = 1; i < MT_LEN; i++) {\n    /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */\n    /* In the previous versions, MSBs of the seed affect   */\n    /* only MSBs of the array mt[].                        */\n    /* 2002/01/09 modified by Makoto Matsumoto             */\n    mt->mt_buffer_[i] =\n\t(1812433253UL * (mt->mt_buffer_[i-1] ^\n\t\t\t (mt->mt_buffer_[i-1] >> 30)) + i);\n  }\n}\n\nuint32_t mt_random (mtrand *mt) {\n  uint32_t y;\n  unsigned long mag01[2];\n  mag01[0] = 0;\n  mag01[1] = MATRIX_A;\n\n  if (mt->mt_index_ >= MT_LEN) {\n    int kk;\n\n    for (kk = 0; kk < MT_LEN - MT_IA; kk++) {\n      y = (mt->mt_buffer_[kk] & UPPER_MASK) |\n\t(mt->mt_buffer_[kk + 1] & LOWER_MASK);\n      mt->mt_buffer_[kk] = mt->mt_buffer_[kk + MT_IA] ^\n\t(y >> 1) ^ mag01[y & 0x1UL];\n    }\n    for (;kk < MT_LEN - 1; kk++) {\n      y = (mt->mt_buffer_[kk] & UPPER_MASK) |\n\t(mt->mt_buffer_[kk + 1] & LOWER_MASK);\n      mt->mt_buffer_[kk] = mt->mt_buffer_[kk + (MT_IA - MT_LEN)] ^\n\t(y >> 1) ^ mag01[y & 0x1UL];\n    }\n    y = (mt->mt_buffer_[MT_LEN - 1] & UPPER_MASK) |\n      (mt->mt_buffer_[0] & LOWER_MASK);\n    mt->mt_buffer_[MT_LEN - 1] = mt->mt_buffer_[MT_IA - 1] ^\n      (y >> 1) ^ mag01[y & 0x1UL];\n    mt->mt_index_ = 0;\n  }\n\n  y = mt->mt_buffer_[mt->mt_index_++];\n\n  y ^= (y >> 11);\n  y ^= (y << 7) & 0x9d2c5680UL;\n  y ^= (y << 15) & 0xefc60000UL;\n  y ^= (y >> 18);\n\n  return y;\n}\n\nstatic mtrand static_mtrand;\n\n#include <math.h>\n\nstatic uint32_t\nmt_exp_rand (uint32_t mean, uint32_t max_value)\n{\n  double mean_d = mean;\n  double erand  = log (1.0 / (mt_random (&static_mtrand) /\n\t\t\t      (double)UINT32_MAX));\n  uint32_t x = (uint32_t) (mean_d * erand + 0.5);\n\n  return xd3_min (x, max_value);\n}\n\n#if SHELL_TESTS\n#include <sys/wait.h>\n#endif\n\n#define MSG_IS(x) (stream->msg != NULL && strcmp ((x), stream->msg) == 0)\n\nstatic const usize_t TWO_MEGS_AND_DELTA = (3 << 20);\nstatic const usize_t ADDR_CACHE_ROUNDS = 10000;\n\nstatic const usize_t TEST_FILE_MEAN   = 16384;\nstatic const double TEST_ADD_MEAN     = 128;\nstatic const double TEST_ADD_MAX      = 512;\nstatic const double TEST_ADD_RATIO    = 0.1;\nstatic const double TEST_EPSILON      = 0.25;\n\n#define TESTBUFSIZE (1024 * 16)\n\n#define TESTFILESIZE (1024)\n\nstatic char   TEST_TARGET_FILE[TESTFILESIZE];\nstatic char   TEST_SOURCE_FILE[TESTFILESIZE];\nstatic char   TEST_DELTA_FILE[TESTFILESIZE];\nstatic char   TEST_RECON_FILE[TESTFILESIZE];\nstatic char   TEST_RECON2_FILE[TESTFILESIZE];\nstatic char   TEST_COPY_FILE[TESTFILESIZE];\nstatic char   TEST_NOPERM_FILE[TESTFILESIZE];\n\n#define CHECK(cond)\t\t\t\t\t\t\\\n  if (!(cond)) {\t\t\t\t\t\t\\\n    XPR(NT __FILE__\":%d: check failure: \" #cond, __LINE__);\t\\\n    abort(); }\n\n#if SHELL_TESTS\n/* Use a fixed soft config so that test values are fixed.  See also\n * test_compress_text(). */\nstatic const char* test_softcfg_str = \"-C9,3,4,8,2,36,70\";\n#endif\n\n/***********************************************************************\n TEST HELPERS\n ***********************************************************************/\n\nstatic void DOT (void) { XPR(NTR \".\"); }\nstatic int do_cmd (xd3_stream *stream, const char *buf)\n{\n  int ret;\n  if ((ret = system (buf)) != 0)\n    {\n      if (WIFEXITED (ret))\n\t{\n\t  stream->msg = \"command exited non-zero\";\n\t  IF_DEBUG1 (XPR(NT \"command was: %s\\n\", buf));\n\t}\n      else\n\t{\n\t  stream->msg = \"abnormal command termination\";\n\t}\n      return ret;\n    }\n  return 0;\n}\n\nstatic int do_fail (xd3_stream *stream, const char *buf)\n{\n  int ret;\n  ret = system (buf);\n  if (! WIFEXITED (ret) || WEXITSTATUS (ret) != 1)\n    {\n      stream->msg = \"command should have not succeeded\";\n      XPR(NT \"command was %s\\n\", buf);\n      return XD3_INTERNAL;\n    }\n  return 0;\n}\n\n/* Test that the exponential distribution actually produces its mean. */\nstatic int\ntest_random_numbers (xd3_stream *stream, int ignore)\n{\n  usize_t i;\n  usize_t sum = 0;\n  usize_t mean = 50;\n  usize_t n_rounds = 1000000;\n  double average, error;\n  double allowed_error = 0.1;\n\n  mt_init (& static_mtrand, 0x9f73f7fe);\n\n  for (i = 0; i < n_rounds; i += 1)\n    {\n      sum += mt_exp_rand (mean, UINT32_MAX);\n    }\n\n  average = (double) sum / (double) n_rounds;\n  error   = average - (double) mean;\n\n  if (error < allowed_error && error > -allowed_error)\n    {\n      return 0;\n    }\n\n  /*XPR(NT \"error is %f\\n\", error);*/\n  stream->msg = \"random distribution looks broken\";\n  return XD3_INTERNAL;\n}\n\nstatic int\ntest_printf_xoff (xd3_stream *stream, int ignore)\n{\n  char buf[64];\n  xoff_t x = XOFF_T_MAX;\n  snprintf_func (buf, sizeof(buf), \"%\"Q\"u\", x);\n  const char *expect = XD3_USE_LARGEFILE64 ?\n    \"18446744073709551615\" : \"4294967295\";\n  if (strcmp (buf, expect) == 0) {\n    return 0;\n  }\n  return XD3_INTERNAL;\n}\n\nstatic void\ntest_unlink (char* file)\n{\n  int ret;\n  if (file != NULL && *file != 0 &&\n      (ret = unlink (file)) != 0 && errno != ENOENT)\n    {\n      XPR(NT \"unlink %s failed: %s\\n\", file, strerror(ret));\n    }\n}\n\nstatic void\ntest_cleanup (void)\n{\n#if 1\n  test_unlink (TEST_TARGET_FILE);\n  test_unlink (TEST_SOURCE_FILE);\n  test_unlink (TEST_DELTA_FILE);\n  test_unlink (TEST_RECON_FILE);\n  test_unlink (TEST_RECON2_FILE);\n  test_unlink (TEST_COPY_FILE);\n  test_unlink (TEST_NOPERM_FILE);\n#endif\n}\n\nint test_setup (void)\n{\n  static int x = 0;\n  pid_t pid = getpid();\n  x++;\n\n  test_cleanup();\n\n  snprintf_func (TEST_TARGET_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.target.%d\", pid, x);\n  snprintf_func (TEST_SOURCE_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.source.%d\", pid, x);\n  snprintf_func (TEST_DELTA_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.delta.%d\", pid, x);\n  snprintf_func (TEST_RECON_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.recon.%d\", pid, x);\n  snprintf_func (TEST_RECON2_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.recon2.%d\", pid, x);\n  snprintf_func (TEST_COPY_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.copy.%d\", pid, x);\n  snprintf_func (TEST_NOPERM_FILE, TESTFILESIZE,\n\t\t \"/tmp/xdtest.%d.noperm.%d\", pid, x);\n\n  test_cleanup();\n  return 0;\n}\n\nstatic int\ntest_make_inputs (xd3_stream *stream, xoff_t *ss_out, xoff_t *ts_out)\n{\n  usize_t ts = (mt_random (&static_mtrand) % TEST_FILE_MEAN) +\n    TEST_FILE_MEAN / 2;\n  usize_t ss = (mt_random (&static_mtrand) % TEST_FILE_MEAN) +\n    TEST_FILE_MEAN / 2;\n  uint8_t *buf = (uint8_t*) malloc (ts + ss), *sbuf = buf, *tbuf = buf + ss;\n  usize_t sadd = 0, sadd_max = (usize_t)(ss * TEST_ADD_RATIO);\n  FILE  *tf = NULL, *sf = NULL;\n  usize_t i, j;\n  int ret;\n\n  if (buf == NULL) { return ENOMEM; }\n\n  if ((tf = fopen (TEST_TARGET_FILE, \"w\")) == NULL ||\n      (ss_out != NULL && (sf = fopen (TEST_SOURCE_FILE, \"w\")) == NULL))\n    {\n      stream->msg = \"write failed\";\n      ret = get_errno ();\n      goto failure;\n    }\n\n  if (ss_out != NULL)\n    {\n      for (i = 0; i < ss; )\n\t{\n\t  sbuf[i++] = (uint8_t) mt_random (&static_mtrand);\n\t}\n    }\n\n  /* Then modify the data to produce copies, everything not copied is\n   * an add.  The following logic produces the TEST_ADD_RATIO.  The\n   * variable SADD contains the number of adds so far, which should\n   * not exceed SADD_MAX. */\n\n  /* XPR(NT \"ss = %u ts = %u\\n\", ss, ts); */\n  for (i = 0; i < ts; )\n    {\n      usize_t left = ts - i;\n      usize_t next = mt_exp_rand ((uint32_t) TEST_ADD_MEAN,\n\t\t\t\t  (uint32_t) TEST_ADD_MAX);\n      usize_t add_left = sadd_max - sadd;\n      double add_prob = (left == 0) ? 0 : (add_left / (double) left);\n      int do_copy;\n\n      next = xd3_min (left, next);\n      do_copy = (next > add_left ||\n\t\t (mt_random (&static_mtrand) / \\\n\t\t  (double)USIZE_T_MAX) >= add_prob);\n\n      if (ss_out == NULL)\n\t{\n\t  do_copy &= (i > 0);\n\t}\n      else\n\t{\n\t  do_copy &= (ss - next) > 0;\n\t}\n\n      if (do_copy)\n\t{\n\t  /* Copy */\n\t  size_t offset = mt_random (&static_mtrand) % ((ss_out == NULL) ?\n\t\t\t\t\t\t\ti :\n\t\t\t\t\t\t\t(ss - next));\n\t  /* XPR(NT \"[%u] copy %u at %u \", i, next, offset); */\n\n\t  for (j = 0; j < next; j += 1)\n\t    {\n\t      char c = ((ss_out == NULL) ? tbuf : sbuf)[offset + j];\n\t      /* XPR(NT \"%x%x\", (c >> 4) & 0xf, c & 0xf); */\n\t      tbuf[i++] = c;\n\t    }\n\t  /* XPR(NT \"\\n\"); */\n\t}\n      else\n\t{\n\t  /* Add */\n\t  /* XPR(NT \"[%u] add %u \", i, next); */\n\t  for (j = 0; j < next; j += 1)\n\t    {\n\t      char c = (char) mt_random (&static_mtrand);\n\t      /* XPR(NT \"%x%x\", (c >> 4) & 0xf, c & 0xf); */\n\t      tbuf[i++] = c;\n\t    }\n\t  /* XPR(NT \"\\n\"); */\n\t  sadd += next;\n\t}\n    }\n\n  /* XPR(NT \"sadd = %u max = %u\\n\", sadd, sadd_max); */\n\n  if ((fwrite (tbuf, 1, ts, tf) != ts) ||\n      (ss_out != NULL && (fwrite (sbuf, 1, ss, sf) != ss)))\n    {\n      stream->msg = \"write failed\";\n      ret = get_errno ();\n      goto failure;\n    }\n\n  if ((ret = fclose (tf)) || (ss_out != NULL && (ret = fclose (sf))))\n    {\n      stream->msg = \"close failed\";\n      ret = get_errno ();\n      goto failure;\n    }\n\n  if (ts_out) { (*ts_out) = ts; }\n  if (ss_out) { (*ss_out) = ss; }\n\n failure:\n  free (buf);\n  return ret;\n}\n\nint\ntest_compare_files (const char* tgt, const char *rec)\n{\n  FILE *orig, *recons;\n  static uint8_t obuf[TESTBUFSIZE], rbuf[TESTBUFSIZE];\n  xoff_t offset = 0;\n  size_t i;\n  size_t oc, rc;\n  xoff_t diffs = 0;\n\n  if ((orig = fopen (tgt, \"r\")) == NULL)\n    {\n      XPR(NT \"open %s failed\\n\", tgt);\n      return get_errno ();\n    }\n\n  if ((recons = fopen (rec, \"r\")) == NULL)\n    {\n      XPR(NT \"open %s failed\\n\", rec);\n      return get_errno ();\n    }\n\n  for (;;)\n    {\n      oc = fread (obuf, 1, TESTBUFSIZE, orig);\n      rc = fread (rbuf, 1, TESTBUFSIZE, recons);\n\n      if (oc != rc)\n\t{\n\t  return XD3_INTERNAL;\n\t}\n\n      if (oc == 0)\n\t{\n\t  break;\n\t}\n\n      for (i = 0; i < oc; i += 1)\n\t{\n\t  if (obuf[i] != rbuf[i])\n \t    {\n\t      XPR(NT \"byte %u (read %u @ %\"Q\"u) %d != %d\\n\",\n\t\t  (int)i, (int)oc, offset, obuf[i], rbuf[i]);\n\t      diffs++;\n\t      return XD3_INTERNAL;\n\t    }\n\t}\n\n      offset += oc;\n    }\n\n    fclose (orig);\n    fclose (recons);\n    if (diffs != 0)\n      {\n\treturn XD3_INTERNAL;\n      }\n    return 0;\n}\n\nstatic int\ntest_copy_to (const char *from, const char *to)\n{\n  char buf[TESTBUFSIZE];\n  int ret;\n\n  snprintf_func (buf, TESTBUFSIZE, \"cp -f %s %s\", from, to);\n\n  if ((ret = system (buf)) != 0)\n    {\n      return XD3_INTERNAL;\n    }\n\n  return 0;\n}\n\nstatic int\ntest_save_copy (const char *origname)\n{\n  return test_copy_to(origname, TEST_COPY_FILE);\n}\n\nstatic int\ntest_file_size (const char* file, xoff_t *size)\n{\n  struct stat sbuf;\n  int ret;\n  (*size) = 0;\n\n  if (stat (file, & sbuf) < 0)\n    {\n      ret = get_errno ();\n      XPR(NT \"stat failed: %s: %s\\n\", file, strerror (ret));\n      return ret;\n    }\n\n  if (! S_ISREG (sbuf.st_mode))\n    {\n      ret = XD3_INTERNAL;\n      XPR(NT \"not a regular file: %s: %s\\n\", file, strerror (ret));\n      return ret;\n    }\n\n  (*size) = sbuf.st_size;\n  return 0;\n}\n\n/***********************************************************************\n READ OFFSET\n ***********************************************************************/\n\n/* Common test for read_integer errors: encodes a 64-bit value and\n * then attempts to read as a 32-bit value.  If TRUNC is non-zero,\n * attempts to get errors by shortening the input, otherwise it should\n * overflow.  Expects XD3_INTERNAL and MSG. */\nstatic int\ntest_read_integer_error (xd3_stream *stream, usize_t trunto, const char *msg)\n{\n  uint64_t eval = 1ULL << 34;\n  uint32_t rval;\n  xd3_output *buf = NULL;\n  const uint8_t *max;\n  const uint8_t *inp;\n  int ret;\n\n  buf = xd3_alloc_output (stream, buf);\n\n  if ((ret = xd3_emit_uint64_t (stream, & buf, eval)))\n    {\n      goto fail;\n    }\n\n again:\n\n  inp = buf->base;\n  max = buf->base + buf->next - trunto;\n\n  if ((ret = xd3_read_uint32_t (stream, & inp, max, & rval)) !=\n      XD3_INVALID_INPUT ||\n      !MSG_IS (msg))\n    {\n      ret = XD3_INTERNAL;\n    }\n  else if (trunto && trunto < buf->next)\n    {\n      trunto += 1;\n      goto again;\n    }\n  else\n    {\n      ret = 0;\n    }\n\n fail:\n  xd3_free_output (stream, buf);\n  return ret;\n}\n\n/* Test integer overflow using the above routine. */\nstatic int\ntest_decode_integer_overflow (xd3_stream *stream, int unused)\n{\n  return test_read_integer_error (stream, 0, \"overflow in read_intger\");\n}\n\n/* Test integer EOI using the above routine. */\nstatic int\ntest_decode_integer_end_of_input (xd3_stream *stream, int unused)\n{\n  return test_read_integer_error (stream, 1, \"end-of-input in read_integer\");\n}\n\n/* Test that emit_integer/decode_integer/sizeof_integer/read_integer\n * work on correct inputs.  Tests powers of (2^7), plus or minus, up\n * to the maximum value. */\n#define TEST_ENCODE_DECODE_INTEGER(TYPE,ONE,MAX) \\\n  xd3_output *rbuf = NULL; \\\n  xd3_output *dbuf = NULL; \\\n  TYPE values[64]; \\\n  usize_t nvalues = 0; \\\n  usize_t i; \\\n  int ret = 0; \\\n \\\n  for (i = 0; i < (sizeof (TYPE) * 8); i += 7) \\\n    { \\\n      values[nvalues++] = (ONE << i) - ONE; \\\n      values[nvalues++] = (ONE << i); \\\n      values[nvalues++] = (ONE << i) + ONE; \\\n    } \\\n \\\n  values[nvalues++] = MAX-ONE; \\\n  values[nvalues++] = MAX; \\\n \\\n  rbuf = xd3_alloc_output (stream, rbuf); \\\n  dbuf = xd3_alloc_output (stream, dbuf); \\\n \\\n  for (i = 0; i < nvalues; i += 1) \\\n    { \\\n      const uint8_t *max; \\\n      const uint8_t *inp; \\\n      TYPE val;\t\t\t\\\n \\\n      DOT (); \\\n      rbuf->next = 0; \\\n \\\n      if ((ret = xd3_emit_ ## TYPE (stream, & rbuf, values[i])) || \\\n\t  (ret = xd3_emit_ ## TYPE (stream, & dbuf, values[i]))) \\\n\t{ \\\n\t  goto fail; \\\n\t} \\\n \\\n      inp = rbuf->base; \\\n      max = rbuf->base + rbuf->next; \\\n \\\n      if (rbuf->next != xd3_sizeof_ ## TYPE (values[i])) \\\n\t{ \\\n\t  ret = XD3_INTERNAL; \\\n\t  goto fail; \\\n\t} \\\n \\\n      if ((ret = xd3_read_ ## TYPE (stream, & inp, max, & val))) \\\n\t{ \\\n\t  goto fail; \\\n\t} \\\n \\\n      if (val != values[i]) \\\n\t{ \\\n\t  ret = XD3_INTERNAL; \\\n\t  goto fail; \\\n\t} \\\n \\\n      DOT (); \\\n    } \\\n \\\n  stream->next_in  = dbuf->base; \\\n  stream->avail_in = dbuf->next; \\\n \\\n  for (i = 0; i < nvalues; i += 1) \\\n    { \\\n      TYPE val; \\\n \\\n      if ((ret = xd3_decode_ ## TYPE (stream, & val))) \\\n        { \\\n          goto fail; \\\n        } \\\n \\\n      if (val != values[i]) \\\n        { \\\n          ret = XD3_INTERNAL; \\\n          goto fail; \\\n        } \\\n    } \\\n \\\n  if (stream->avail_in != 0) \\\n    { \\\n      ret = XD3_INTERNAL; \\\n      goto fail; \\\n    } \\\n \\\n fail: \\\n  xd3_free_output (stream, rbuf); \\\n  xd3_free_output (stream, dbuf); \\\n \\\n  return ret\n\nstatic int\ntest_encode_decode_uint32_t (xd3_stream *stream, int unused)\n{\n  TEST_ENCODE_DECODE_INTEGER(uint32_t,1U,UINT32_MAX);\n}\n\nstatic int\ntest_encode_decode_uint64_t (xd3_stream *stream, int unused)\n{\n  TEST_ENCODE_DECODE_INTEGER(uint64_t,1ULL,UINT64_MAX);\n}\n\nstatic int\ntest_usize_t_overflow (xd3_stream *stream, int unused)\n{\n  if (USIZE_T_OVERFLOW (USIZE_T_MAX, 0)) { goto fail; }\n  if (USIZE_T_OVERFLOW (0, USIZE_T_MAX)) { goto fail; }\n  if (USIZE_T_OVERFLOW (USIZE_T_MAX / 2, USIZE_T_MAX / 2)) { goto fail; }\n  if (USIZE_T_OVERFLOW (USIZE_T_MAX / 2, USIZE_T_MAX / 2 + 1)) { goto fail; }\n\n  if (! USIZE_T_OVERFLOW (USIZE_T_MAX, 1)) { goto fail; }\n  if (! USIZE_T_OVERFLOW (1, USIZE_T_MAX)) { goto fail; }\n  if (! USIZE_T_OVERFLOW (USIZE_T_MAX / 2 + 1, USIZE_T_MAX / 2 + 1)) { goto fail; }\n\n  return 0;\n\n fail:\n  stream->msg = \"incorrect overflow computation\";\n  return XD3_INTERNAL;\n}\n\nstatic int\ntest_forward_match (xd3_stream *stream, int unused)\n{\n  usize_t i;\n  uint8_t buf1[256], buf2[256];\n\n  memset(buf1, 0, 256);\n  memset(buf2, 0, 256);\n\n  for (i = 0; i < 256; i++)\n    {\n      CHECK(xd3_forward_match(buf1, buf2, i) == i);\n    }\n\n  for (i = 0; i < 255; i++)\n    {\n      buf2[i] = 1;\n      CHECK(xd3_forward_match(buf1, buf2, 256) == i);\n      buf2[i] = 0;\n    }\n\n  return 0;\n}\n\n/***********************************************************************\n Address cache\n ***********************************************************************/\n\nstatic int\ntest_address_cache (xd3_stream *stream, int unused)\n{\n  int ret;\n  usize_t i;\n  usize_t offset;\n  usize_t *addrs;\n  uint8_t *big_buf, *buf_max;\n  const uint8_t *buf;\n  xd3_output *outp;\n  uint8_t *modes;\n  int mode_counts[16];\n\n  stream->acache.s_near = stream->code_table_desc->near_modes;\n  stream->acache.s_same = stream->code_table_desc->same_modes;\n\n  if ((ret = xd3_encode_init_partial (stream))) { return ret; }\n\n  addrs = (usize_t*) xd3_alloc (stream, sizeof (usize_t), ADDR_CACHE_ROUNDS);\n  modes = (uint8_t*) xd3_alloc (stream, sizeof (uint8_t), ADDR_CACHE_ROUNDS);\n\n  memset (mode_counts, 0, sizeof (mode_counts));\n  memset (modes, 0, ADDR_CACHE_ROUNDS);\n\n  addrs[0] = 0;\n\n  mt_init (& static_mtrand, 0x9f73f7fc);\n\n  /* First pass: encode addresses */\n  xd3_init_cache (& stream->acache);\n\n  for (offset = 1; offset < ADDR_CACHE_ROUNDS; offset += 1)\n    {\n      double p;\n      usize_t addr;\n      usize_t prev_i;\n      usize_t nearby;\n\n      p         = (mt_random (&static_mtrand) / (double)UINT32_MAX);\n      prev_i    = mt_random (&static_mtrand) % offset;\n      nearby    = (mt_random (&static_mtrand) % 256) % offset;\n      nearby    = xd3_max (1U, nearby);\n\n      if (p < 0.1)      { addr = addrs[offset-nearby]; }\n      else if (p < 0.4) { addr = xd3_min (addrs[prev_i] + nearby, offset-1); }\n      else              { addr = prev_i; }\n\n      if ((ret = xd3_encode_address (stream, addr, offset, & modes[offset]))) { return ret; }\n\n      addrs[offset] = addr;\n      mode_counts[modes[offset]] += 1;\n    }\n\n  /* Copy addresses into a contiguous buffer. */\n  big_buf = (uint8_t*) xd3_alloc (stream, xd3_sizeof_output (ADDR_HEAD (stream)), 1);\n\n  for (offset = 0, outp = ADDR_HEAD (stream); outp != NULL; offset += outp->next, outp = outp->next_page)\n    {\n      memcpy (big_buf + offset, outp->base, outp->next);\n    }\n\n  buf_max = big_buf + offset;\n  buf     = big_buf;\n\n  /* Second pass: decode addresses */\n  xd3_init_cache (& stream->acache);\n\n  for (offset = 1; offset < ADDR_CACHE_ROUNDS; offset += 1)\n    {\n      usize_t addr;\n\n      if ((ret = xd3_decode_address (stream, offset, modes[offset], \n\t\t\t\t     & buf, buf_max, & addr))) \n\t{ \n\t  return ret; \n\t}\n\n      if (addr != addrs[offset])\n\t{\n\t  stream->msg = \"incorrect decoded address\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n\n  /* Check that every byte, mode was used. */\n  if (buf != buf_max)\n    {\n      stream->msg = \"address bytes not used\";\n      return XD3_INTERNAL;\n    }\n\n  for (i = 0; i < (2 + stream->acache.s_same + stream->acache.s_near); i += 1)\n    {\n      if (mode_counts[i] == 0)\n\t{\n\t  stream->msg = \"address mode not used\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n\n  xd3_free (stream, modes);\n  xd3_free (stream, addrs);\n  xd3_free (stream, big_buf);\n\n  return 0;\n}\n\n/***********************************************************************\n Encode and decode with single bit error\n ***********************************************************************/\n\n/* It compresses from 256 to around 185 bytes.\n * Avoids matching addresses that are a single-bit difference.\n * Avoids matching address 0. */\nstatic const uint8_t test_text[] =\n\"this is a story\\n\"\n\"abouttttttttttt\\n\"\n\"- his is a stor\\n\"\n\"- about nothing \"\n\" all. boutique -\"\n\"his story is a -\"\n\"about           \"\n\"what happens all\"\n\" the time what -\"\n\"am I ttttttt the\"\n\" person said, so\"\n\" what, per son -\"\n\" gory story is -\"\n\" about nothing -\"\n\"tttttt to test -\"\n\"his sto nothing\";\n\nstatic const uint8_t test_apphead[] = \"header test\";\n\nstatic int\ntest_compress_text (xd3_stream  *stream,\n\t\t    uint8_t     *encoded,\n\t\t    usize_t     *encoded_size)\n{\n  int ret;\n  xd3_config cfg;\n  int oflags = stream->flags;\n  int flags = stream->flags | XD3_FLUSH;\n\n  xd3_free_stream (stream);\n  xd3_init_config (& cfg, flags);\n\n  /* This configuration is fixed so that the \"expected non-error\" the counts in\n   * decompress_single_bit_errors are too.  See test_coftcfg_str. */\n  cfg.smatch_cfg = XD3_SMATCH_SOFT;\n  cfg.smatcher_soft.name = \"test\";\n  cfg.smatcher_soft.large_look = 64; /* no source, not used */\n  cfg.smatcher_soft.large_step = 64; /* no source, not used */\n  cfg.smatcher_soft.small_look = 4;\n  cfg.smatcher_soft.small_chain = 128;\n  cfg.smatcher_soft.small_lchain = 16;\n  cfg.smatcher_soft.max_lazy = 8;\n  cfg.smatcher_soft.long_enough = 128;\n\n  xd3_config_stream (stream, & cfg);\n\n  (*encoded_size) = 0;\n\n  xd3_set_appheader (stream, test_apphead,\n\t\t     (usize_t) strlen ((char*) test_apphead));\n\n  if ((ret = xd3_encode_stream (stream, test_text, sizeof (test_text),\n\t\t\t\tencoded, encoded_size, 4*sizeof (test_text)))) { goto fail; }\n\n  if ((ret = xd3_close_stream (stream))) { goto fail; }\n\n fail:\n  xd3_free_stream (stream);\n  xd3_init_config (& cfg, oflags);\n  xd3_config_stream (stream, & cfg);\n  return ret;\n}\n\nstatic int\ntest_decompress_text (xd3_stream *stream, uint8_t *enc, usize_t enc_size, usize_t test_desize)\n{\n  xd3_config cfg;\n  char decoded[sizeof (test_text)];\n  uint8_t *apphead;\n  usize_t apphead_size;\n  usize_t decoded_size;\n  const char *msg;\n  int  ret;\n  usize_t pos = 0;\n  int flags = stream->flags;\n  usize_t take;\n\n input:\n  /* Test decoding test_desize input bytes at a time */\n  take = xd3_min (enc_size - pos, test_desize);\n  CHECK(take > 0);\n\n  xd3_avail_input (stream, enc + pos, take);\n again:\n  ret = xd3_decode_input (stream);\n\n  pos += take;\n  take = 0;\n\n  switch (ret)\n    {\n    case XD3_OUTPUT:\n      break;\n    case XD3_WINSTART:\n    case XD3_GOTHEADER:\n      goto again;\n    case XD3_INPUT:\n      if (pos < enc_size) { goto input; }\n      /* else fallthrough */\n    case XD3_WINFINISH:\n    default:\n      goto fail;\n    }\n\n  CHECK(ret == XD3_OUTPUT);\n  CHECK(pos == enc_size);\n\n  if (stream->avail_out != sizeof (test_text))\n    {\n      stream->msg = \"incorrect output size\";\n      ret = XD3_INTERNAL;\n      goto fail;\n    }\n\n  decoded_size = stream->avail_out;\n  memcpy (decoded, stream->next_out, stream->avail_out);\n\n  xd3_consume_output (stream);\n\n  if ((ret = xd3_get_appheader (stream, & apphead, & apphead_size))) { goto fail; }\n\n  if (apphead_size != strlen ((char*) test_apphead) ||\n      memcmp (apphead, test_apphead, strlen ((char*) test_apphead)) != 0)\n    {\n      stream->msg = \"incorrect appheader\";\n      ret = XD3_INTERNAL;\n      goto fail;\n    }\n\n  if ((ret = xd3_decode_input (stream)) != XD3_WINFINISH ||\n      (ret = xd3_close_stream (stream)) != 0)\n    {\n      goto fail;\n    }\n\n  if (decoded_size != sizeof (test_text) ||\n      memcmp (decoded, test_text, sizeof (test_text)) != 0)\n    {\n      stream->msg = \"incorrect output text\";\n      ret = EIO;\n    }\n\n fail:\n  msg = stream->msg;\n  xd3_free_stream (stream);\n  xd3_init_config (& cfg, flags);\n  xd3_config_stream (stream, & cfg);\n  stream->msg = msg;\n\n  return ret;\n}\n\nstatic int\ntest_decompress_single_bit_error (xd3_stream *stream, int expected_non_failures)\n{\n  int ret;\n  usize_t i;\n  uint8_t encoded[4*sizeof (test_text)]; /* make room for alt code table */\n  usize_t  encoded_size;\n  int non_failures = 0;\n  int cksum = (stream->flags & XD3_ADLER32) != 0;\n\n//#define DEBUG_TEST_FAILURES\n#ifndef DEBUG_TEST_FAILURES\n#define TEST_FAILURES()\n#else\n  /* For checking non-failure cases by hand, enable this macro and run\n   * xdelta printdelta with print_cpymode disabled.  Every non-failure\n   * should change a copy address mode, which doesn't cause a failure\n   * because the address cache starts out with all zeros.\n\n    ./xdelta3 test\n    for i in test_text.xz.*; do ./xdelta3 printdelta $i > $i.out;\n    diff $i.out test_text.xz.0.out; done\n\n   */\n  system (\"rm -rf test_text.*\");\n  {\n    char buf[TESTBUFSIZE];\n    FILE *f;\n    snprintf_func (buf, TESTBUFSIZE, \"test_text\");\n    f = fopen (buf, \"w\");\n    fwrite (test_text,1,sizeof (test_text),f);\n    fclose (f);\n  }\n#define TEST_FAILURES()                                         \\\n  do {                                                          \\\n    char buf[TESTBUFSIZE];      \t\t\t\t\\\n    FILE *f;                                                    \\\n    snprintf_func (buf, TESTBUFSIZE, \"test_text.xz.%d\", non_failures);\t\\\n    f = fopen (buf, \"w\");                                       \\\n    fwrite (encoded,1,encoded_size,f);                          \\\n    fclose (f);                                                 \\\n  } while (0)\n#endif\n\n  stream->sec_data.inefficient = 1;\n  stream->sec_inst.inefficient = 1;\n  stream->sec_addr.inefficient = 1;\n\n  /* Encode text, test correct input */\n  if ((ret = test_compress_text (stream, encoded, & encoded_size)))\n    {\n      /*stream->msg = \"without error: encode failure\";*/\n      return ret;\n    }\n\n  if ((ret = test_decompress_text (stream, encoded, encoded_size,\n\t\t\t\t   sizeof (test_text) / 4)))\n    {\n      /*stream->msg = \"without error: decode failure\";*/\n      return ret;\n    }\n\n  TEST_FAILURES();\n\n  for (i = 0; i < encoded_size*8; i += 1)\n    {\n      /* Single bit error. */\n      encoded[i/8] ^= 1 << (i%8);\n\n      if ((ret = test_decompress_text (stream, encoded,\n\t\t\t\t       encoded_size, sizeof (test_text))) == 0)\n\t{\n\t  non_failures += 1;\n#ifdef DEBUG_TEST_FAILURES\n\t  XPR(NT \"%u[%u] non-failure %u\\n\", i/8, i%8, non_failures);\n#endif\n\t  TEST_FAILURES();\n\t}\n      else\n\t{\n\t  /*XPR(NT \"%u[%u] failure: %s\\n\", i/8, i%8, stream->msg);*/\n\t}\n\n      /* decompress_text returns EIO when the final memcmp() fails, but that\n       * should never happen with checksumming on. */\n      if (cksum && ret == EIO)\n\t{\n\t  /*XPR(NT \"%u[%u] cksum mismatch\\n\", i/8, i%8);*/\n\t  stream->msg = \"checksum mismatch\";\n\t  return XD3_INTERNAL;\n\t}\n\n      /* Undo single bit error. */\n      encoded[i/8] ^= 1 << (i%8);\n    }\n\n  /* Test correct input again */\n  if ((ret = test_decompress_text (stream, encoded, encoded_size, 1)))\n    {\n      /*stream->msg = \"without error: decode failure\";*/\n      return ret;\n    }\n\n  /* Check expected non-failures */\n  if (non_failures > expected_non_failures)\n    {\n      XPR(NT \"non-failures %u > expected %u\",\n\t non_failures, expected_non_failures);\n      stream->msg = \"incorrect\";\n      return XD3_INTERNAL;\n    }\n\n  DOT ();\n\n  return 0;\n}\n\n/***********************************************************************\n Secondary compression tests\n ***********************************************************************/\n\n#if SECONDARY_ANY\ntypedef int (*sec_dist_func) (xd3_stream *stream, xd3_output *data);\n\nstatic int sec_dist_func1 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func2 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func3 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func4 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func5 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func6 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func7 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func8 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func9 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func10 (xd3_stream *stream, xd3_output *data);\nstatic int sec_dist_func11 (xd3_stream *stream, xd3_output *data);\n\nstatic sec_dist_func sec_dists[] =\n{\n  sec_dist_func1,\n  sec_dist_func2,\n  sec_dist_func3,\n  sec_dist_func4,\n  sec_dist_func5,\n  sec_dist_func6,\n  sec_dist_func7,\n  sec_dist_func8,\n  sec_dist_func9,\n  sec_dist_func10,\n  sec_dist_func11,\n};\n\n/* Test ditsribution: 100 bytes of the same character (13). */\nstatic int\nsec_dist_func1 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret;\n  for (i = 0; i < 100; i += 1)\n    {\n      if ((ret = xd3_emit_byte (stream, & data, 13))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test ditsribution: uniform covering half the alphabet. */\nstatic int\nsec_dist_func2 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret;\n  for (i = 0; i < ALPHABET_SIZE; i += 1)\n    {\n      if ((ret = xd3_emit_byte (stream, & data, i%(ALPHABET_SIZE/2)))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test ditsribution: uniform covering the entire alphabet. */\nstatic int\nsec_dist_func3 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret;\n  for (i = 0; i < ALPHABET_SIZE; i += 1)\n    {\n      if ((ret = xd3_emit_byte (stream, & data, i%ALPHABET_SIZE))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test distribution: An exponential distribution covering half the alphabet */\nstatic int\nsec_dist_func4 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret, x;\n  for (i = 0; i < ALPHABET_SIZE*20; i += 1)\n    {\n      x = mt_exp_rand (10, ALPHABET_SIZE/2);\n      if ((ret = xd3_emit_byte (stream, & data, x))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test distribution: An exponential distribution covering the entire alphabet */\nstatic int\nsec_dist_func5 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret, x;\n  for (i = 0; i < ALPHABET_SIZE*20; i += 1)\n    {\n      x = mt_exp_rand (10, ALPHABET_SIZE-1);\n      if ((ret = xd3_emit_byte (stream, & data, x))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test distribution: An uniform random distribution covering half the alphabet */\nstatic int\nsec_dist_func6 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret, x;\n  for (i = 0; i < ALPHABET_SIZE*20; i += 1)\n    {\n      x = mt_random (&static_mtrand) % (ALPHABET_SIZE/2);\n      if ((ret = xd3_emit_byte (stream, & data, x))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test distribution: An uniform random distribution covering the entire alphabet */\nstatic int\nsec_dist_func7 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret, x;\n  for (i = 0; i < ALPHABET_SIZE*200; i += 1)\n    {\n      x = mt_random (&static_mtrand) % ALPHABET_SIZE;\n      if ((ret = xd3_emit_byte (stream, & data, x))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test distribution: A small number of frequent characters, difficult\n * to divide into many groups */\nstatic int\nsec_dist_func8 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret;\n  for (i = 0; i < ALPHABET_SIZE*5; i += 1)\n    {\n      if ((ret = xd3_emit_byte (stream, & data, 0))) { return ret; }\n      if ((ret = xd3_emit_byte (stream, & data, 64))) { return ret; }\n      if ((ret = xd3_emit_byte (stream, & data, 128))) { return ret; }\n      if ((ret = xd3_emit_byte (stream, & data, 255))) { return ret; }\n    }\n  return 0;\n}\n\n/* Test distribution: One that causes many FGK block promotions (found a bug) */\nstatic int\nsec_dist_func9 (xd3_stream *stream, xd3_output *data)\n{\n  int i, ret;\n\n  int ramp   = 0;\n  int rcount = 0;\n  int prom   = 0;\n  int pcount = 0;\n\n  /* 200 was long enough to trigger it--only when stricter checking\n   * that counted all blocks was turned on, but it seems I deleted\n   * this code. (missing fgk_free_block on line 398). */\n  for (i = 0; i < ALPHABET_SIZE*200; i += 1)\n    {\n    repeat:\n      if (ramp < ALPHABET_SIZE)\n\t{\n\t  /* Initially Nth symbol has (N+1) frequency */\n\t  if (rcount <= ramp)\n\t    {\n\t      rcount += 1;\n\t      if ((ret = xd3_emit_byte (stream, & data, ramp))) { return ret; }\n\t      continue;\n\t    }\n\n\t  ramp   += 1;\n\t  rcount  = 0;\n\t  goto repeat;\n\t}\n\n      /* Thereafter, promote least freq to max freq */\n      if (pcount == ALPHABET_SIZE)\n\t{\n\t  pcount = 0;\n\t  prom   = (prom + 1) % ALPHABET_SIZE;\n\t}\n\n      pcount += 1;\n      if ((ret = xd3_emit_byte (stream, & data, prom))) { return ret; }\n    }\n\n  return 0;\n}\n\n/* Test distribution: freq[i] == i*i, creates a 21-bit code length, fixed in 3.0r. */\nstatic int\nsec_dist_func10 (xd3_stream *stream, xd3_output *data)\n{\n  int i, j, ret;\n  for (i = 0; i < ALPHABET_SIZE; i += 1)\n    {\n      for (j = 0; j <= (i*i); j += 1)\n\t{\n\t  if ((ret = xd3_emit_byte (stream, & data, i))) { return ret; }\n\t}\n    }\n  return 0;\n}\n\n/* Test distribution: fibonacci */\nstatic int\nsec_dist_func11 (xd3_stream *stream, xd3_output *data)\n{\n  int sum0 = 0;\n  int sum1 = 1;\n  int i, j, ret;\n  for (i = 0; i < 33; ++i)\n    {\n      for (j = 0; j < (sum0 + sum1); ++j)\n\t{\n\t  if ((ret = xd3_emit_byte (stream, & data, i))) { return ret; }\n\t}\n      sum0 = sum1;\n      sum1 = j;\n    }\n  return 0;\n}\n\nstatic int\ntest_secondary_decode (xd3_stream         *stream,\n\t\t       const xd3_sec_type *sec,\n\t\t       usize_t              input_size,\n\t\t       usize_t              compress_size,\n\t\t       const uint8_t      *dec_input,\n\t\t       const uint8_t      *dec_correct,\n\t\t       uint8_t            *dec_output)\n{\n  int ret;\n  xd3_sec_stream *dec_stream;\n  const uint8_t *dec_input_used, *dec_input_end;\n  uint8_t *dec_output_used, *dec_output_end;\n\n  if ((dec_stream = sec->alloc (stream)) == NULL) { return ENOMEM; }\n\n  if ((ret = sec->init (stream, dec_stream, 0)) != 0) { goto fail; }\n\n  dec_input_used = dec_input;\n  dec_input_end  = dec_input + compress_size;\n\n  dec_output_used = dec_output;\n  dec_output_end  = dec_output + input_size;\n\n  if ((ret = sec->decode (stream, dec_stream,\n\t\t\t  & dec_input_used, dec_input_end,\n\t\t\t  & dec_output_used, dec_output_end)))\n    {\n      goto fail;\n    }\n\n  if (dec_input_used != dec_input_end)\n    {\n      stream->msg = \"unused input\";\n      ret = XD3_INTERNAL;\n      goto fail;\n    }\n\n  if (dec_output_used != dec_output_end)\n    {\n      stream->msg = \"unfinished output\";\n      ret = XD3_INTERNAL;\n      goto fail;\n    }\n\n  if (memcmp (dec_output, dec_correct, input_size) != 0)\n    {\n      stream->msg = \"incorrect output\";\n      ret = XD3_INTERNAL;\n      goto fail;\n    }\n\n fail:\n  sec->destroy (stream, dec_stream);\n  return ret;\n}\n\nstatic int\ntest_secondary (xd3_stream *stream, const xd3_sec_type *sec, usize_t groups)\n{\n  usize_t test_i;\n  int ret;\n  xd3_output *in_head, *out_head, *p;\n  usize_t p_off, input_size, compress_size;\n  uint8_t *dec_input = NULL, *dec_output = NULL, *dec_correct = NULL;\n  xd3_sec_stream *enc_stream;\n  xd3_sec_cfg cfg;\n\n  memset (& cfg, 0, sizeof (cfg));\n\n  cfg.inefficient = 1;\n\n  for (cfg.ngroups = 1; cfg.ngroups <= groups; cfg.ngroups += 1)\n    {\n      XPR(NTR \"\\n...\");\n      for (test_i = 0; test_i < SIZEOF_ARRAY (sec_dists); test_i += 1)\n\t{\n\t  mt_init (& static_mtrand, 0x9f73f7fc);\n\n\t  in_head  = xd3_alloc_output (stream, NULL);\n\t  out_head = xd3_alloc_output (stream, NULL);\n\t  enc_stream = sec->alloc (stream);\n\t  dec_input = NULL;\n\t  dec_output = NULL;\n\t  dec_correct = NULL;\n\n\t  if (in_head == NULL || out_head == NULL || enc_stream == NULL)\n\t    {\n\t      goto nomem;\n\t    }\n\n\t  if ((ret = sec_dists[test_i] (stream, in_head))) { goto fail; }\n\n\t  if ((ret = sec->init (stream, enc_stream, 1)) != 0) { goto fail; }\n\n\t  /* Encode data */\n\t  if ((ret = sec->encode (stream, enc_stream,\n\t\t\t\t  in_head, out_head, & cfg)))\n\t    {\n\t      XPR(NT \"test %\"W\"u: encode: %s\", test_i, stream->msg);\n\t      goto fail;\n\t    }\n\n\t  /* Calculate sizes, allocate contiguous arrays for decoding */\n\t  input_size    = xd3_sizeof_output (in_head);\n\t  compress_size = xd3_sizeof_output (out_head);\n\n\t  XPR(NTR \"%.3f\", 8.0 * (double) compress_size / (double) input_size);\n\n\t  if ((dec_input   = (uint8_t*) xd3_alloc (stream, compress_size, 1)) == NULL ||\n\t      (dec_output  = (uint8_t*) xd3_alloc (stream, input_size, 1)) == NULL ||\n\t      (dec_correct = (uint8_t*) xd3_alloc (stream, input_size, 1)) == NULL)\n\t    {\n\t      goto nomem;\n\t    }\n\n\t  /* Fill the compressed data array */\n\t  for (p_off = 0, p = out_head; p != NULL;\n\t       p_off += p->next, p = p->next_page)\n\t    {\n\t      memcpy (dec_input + p_off, p->base, p->next);\n\t    }\n\n\t  CHECK(p_off == compress_size);\n\n\t  /* Fill the input data array */\n\t  for (p_off = 0, p = in_head; p != NULL;\n\t       p_off += p->next, p = p->next_page)\n\t    {\n\t      memcpy (dec_correct + p_off, p->base, p->next);\n\t    }\n\n\t  CHECK(p_off == input_size);\n\n\t  if ((ret = test_secondary_decode (stream, sec, input_size,\n\t\t\t\t\t    compress_size, dec_input,\n\t\t\t\t\t    dec_correct, dec_output)))\n\t    {\n\t      XPR(NT \"test %\"W\"u: decode: %s\", test_i, stream->msg);\n\t      goto fail;\n\t    }\n\n\t  /* Single-bit error test, only cover the first 10 bytes.\n\t   * Some non-failures are expected in the Huffman case:\n\t   * Changing the clclen array, for example, may not harm the\n\t   * decoding.  Really looking for faults here. */\n\t  {\n\t    int i;\n\t    int bytes = xd3_min (compress_size, 10U);\n\t    for (i = 0; i < bytes * 8; i += 1)\n\t      {\n\t\tdec_input[i/8] ^= 1 << (i%8);\n\n\t\tif ((ret = test_secondary_decode (stream, sec, input_size,\n\t\t\t\t\t\t  compress_size, dec_input,\n\t\t\t\t\t\t  dec_correct, dec_output))\n\t\t    == 0)\n\t\t  {\n\t\t    /*XPR(NT \"test %u: decode single-bit [%u/%u]\n\t\t      error non-failure\", test_i, i/8, i%8);*/\n\t\t  }\n\n\t\tdec_input[i/8] ^= 1 << (i%8);\n\n\t\tif ((i % (2*bytes)) == (2*bytes)-1)\n\t\t  {\n\t\t    DOT ();\n\t\t  }\n\t      }\n\t    ret = 0;\n\t  }\n\n\t  if (0) { nomem: ret = ENOMEM; }\n\n\tfail:\n\t  sec->destroy (stream, enc_stream);\n\t  xd3_free_output (stream, in_head);\n\t  xd3_free_output (stream, out_head);\n\t  xd3_free (stream, dec_input);\n\t  xd3_free (stream, dec_output);\n\t  xd3_free (stream, dec_correct);\n\n\t  if (ret != 0) { return ret; }\n\t}\n    }\n\n  return 0;\n}\n\nIF_FGK (static int test_secondary_fgk  (xd3_stream *stream, usize_t gp)\n\t{ return test_secondary (stream, & fgk_sec_type, gp); })\nIF_DJW (static int test_secondary_huff (xd3_stream *stream, usize_t gp)\n\t{ return test_secondary (stream, & djw_sec_type, gp); })\nIF_LZMA (static int test_secondary_lzma (xd3_stream *stream, usize_t gp)\n\t{ return test_secondary (stream, & lzma_sec_type, gp); })\n\n#endif  /* SECONDARY_ANY */\n\n/***********************************************************************\n TEST INSTRUCTION TABLE\n ***********************************************************************/\n\n/* Test that xd3_choose_instruction() does the right thing for its code\n * table. */\nstatic int\ntest_choose_instruction (xd3_stream *stream, int ignore)\n{\n  int i;\n\n  stream->code_table = (*stream->code_table_func) ();\n\n  for (i = 0; i < 256; i += 1)\n    {\n      const xd3_dinst *d = stream->code_table + i;\n      xd3_rinst prev, inst;\n\n      CHECK(d->type1 > 0);\n\n      memset (& prev, 0, sizeof (prev));\n      memset (& inst, 0, sizeof (inst));\n\n      if (d->type2 == 0)\n\t{\n\t  inst.type = d->type1;\n\n\t  if ((inst.size = d->size1) == 0)\n\t    {\n\t      inst.size = TESTBUFSIZE;\n\t    }\n\n\t  XD3_CHOOSE_INSTRUCTION (stream, NULL, & inst);\n\n\t  if (inst.code2 != 0 || inst.code1 != i)\n\t    {\n\t      stream->msg = \"wrong single instruction\";\n\t      return XD3_INTERNAL;\n\t    }\n\t}\n      else\n\t{\n\t  prev.type = d->type1;\n\t  prev.size = d->size1;\n\t  inst.type = d->type2;\n\t  inst.size = d->size2;\n\n\t  XD3_CHOOSE_INSTRUCTION (stream, & prev, & inst);\n\n\t  if (prev.code2 != i)\n\t    {\n\t      stream->msg = \"wrong double instruction\";\n\t      return XD3_INTERNAL;\n\t    }\n\t}\n    }\n\n  return 0;\n}\n\nstatic int\ntest_checksum_step (xd3_stream *stream, int ignore)\n{\n  const int bufsize = 128;\n  uint8_t buf[128];\n  for (int i = 0; i < bufsize; i++)\n    {\n      buf[i] = mt_random (&static_mtrand) & 0xff;\n    }\n\n  for (usize_t cksize = 4; cksize <= 32; cksize += 3)\n    {\n      xd3_hash_cfg h1;\n      usize_t x;\n      int ret;\n\n      if ((ret = xd3_size_hashtable (stream, XD3_ALLOCSIZE, cksize, &h1)) != 0)\n\t{\n\t  return ret;\n\t}\n\n      x = xd3_large_cksum (&h1, buf, cksize);\n      for (usize_t pos = 0; pos <= (bufsize - cksize); pos++)\n\t{\n\t  usize_t y = xd3_large_cksum (&h1, buf + pos, cksize);\n\t  if (x != y)\n\t    {\n\t      stream->msg = \"checksum != incremental checksum\";\n\t      return XD3_INTERNAL;\n\t    }\n\t  x = xd3_large_cksum_update (&h1, x, buf + pos, cksize);\n\t}\n\n      xd3_free (stream, h1.powers);\n    }\n\n  return 0;\n}\n\n/***********************************************************************\n 64BIT STREAMING\n ***********************************************************************/\n\n/* This test encodes and decodes a series of 1 megabyte windows, each\n * containing a long run of zeros along with a single xoff_t size\n * record to indicate the sequence. */\nstatic int\ntest_streaming (xd3_stream *in_stream, uint8_t *encbuf, uint8_t *decbuf, uint8_t *delbuf, usize_t megs)\n{\n  xd3_stream estream, dstream;\n  int ret;\n  usize_t i, delsize, decsize;\n  xd3_config cfg;\n  xd3_init_config (& cfg, in_stream->flags);\n  cfg.flags |= XD3_COMPLEVEL_6;\n\n  if ((ret = xd3_config_stream (& estream, & cfg)) ||\n      (ret = xd3_config_stream (& dstream, & cfg)))\n    {\n      goto fail;\n    }\n\n  for (i = 0; i < megs; i += 1)\n    {\n      ((usize_t*) encbuf)[0] = i;\n\n      if ((i % 200) == 199) { DOT (); }\n\n      if ((ret = xd3_process_stream (1, & estream, xd3_encode_input, 0,\n\t\t\t\t     encbuf, 1 << 20,\n\t\t\t\t     delbuf, & delsize, 1 << 20)))\n\t{\n\t  in_stream->msg = estream.msg;\n\t  goto fail;\n\t}\n\n      if ((ret = xd3_process_stream (0, & dstream, xd3_decode_input, 0,\n\t\t\t\t     delbuf, delsize,\n\t\t\t\t     decbuf, & decsize, 1 << 20)))\n\t{\n\t  in_stream->msg = dstream.msg;\n\t  goto fail;\n\t}\n\n      if (decsize != 1 << 20 ||\n\t  memcmp (encbuf, decbuf, 1 << 20) != 0)\n\t{\n\t  in_stream->msg = \"wrong result\";\n\t  ret = XD3_INTERNAL;\n\t  goto fail;\n\t}\n    }\n\n  if ((ret = xd3_close_stream (& estream)) ||\n      (ret = xd3_close_stream (& dstream)))\n    {\n      goto fail;\n    }\n\n fail:\n  xd3_free_stream (& estream);\n  xd3_free_stream (& dstream);\n  return ret;\n}\n\n/* Run tests of data streaming of over and around 4GB of data. */\nstatic int\ntest_compressed_stream_overflow (xd3_stream *stream, int ignore)\n{\n  int ret;\n  int i;\n  uint8_t *buf;\n\n  if ((buf = (uint8_t*) malloc (TWO_MEGS_AND_DELTA)) == NULL) { return ENOMEM; }\n\n  memset (buf, 0, TWO_MEGS_AND_DELTA);\n  for (i = 0; i < (2 << 20); i += 256)\n    {\n      int j;\n      int off = mt_random(& static_mtrand) % 10;\n      for (j = 0; j < 256; j++)\n\t{\n\t  buf[i + j] = j + off;\n\t}\n    }\n\n  /* Test overflow of a 32-bit file offset. */\n  if (SIZEOF_XOFF_T == 4)\n    {\n      ret = test_streaming (stream, buf, buf + (1 << 20), buf + (2 << 20), (1 << 12) + 1);\n\n      if (ret == XD3_INVALID_INPUT && MSG_IS (\"decoder file offset overflow\"))\n\t{\n\t  ret = 0;\n\t}\n      else\n\t{\n          XPR(NT XD3_LIB_ERRMSG (stream, ret));\n\t  stream->msg = \"expected overflow condition\";\n\t  ret = XD3_INTERNAL;\n\t  goto fail;\n\t}\n    }\n\n  /* Test transfer of exactly 32bits worth of data. */\n  if ((ret = test_streaming (stream,\n\t\t\t     buf,\n\t\t\t     buf + (1 << 20),\n\t\t\t     buf + (2 << 20),\n\t\t\t     1 << 12)))\n    {\n      goto fail;\n    }\n fail:\n  free (buf);\n  return ret;\n}\n\n/***********************************************************************\n COMMAND LINE\n ***********************************************************************/\n\n#if SHELL_TESTS\n\n/* For each pair of command templates in the array below, test that\n * encoding and decoding commands work.  Also check for the expected\n * size delta, which should be approximately TEST_ADD_RATIO times the\n * file size created by test_make_inputs.  Due to differences in the\n * application header, it is suppressed (-A) so that all delta files\n * are the same. */\nstatic int\ntest_command_line_arguments (xd3_stream *stream, int ignore)\n{\n  int i, ret;\n\n  static const char* cmdpairs[] =\n  {\n    /* standard input, output */\n    \"%s %s -A < %s > %s\", \"%s -d < %s > %s\",\n    \"%s %s -A -e < %s > %s\", \"%s -d < %s > %s\",\n    \"%s %s -A= encode < %s > %s\", \"%s decode < %s > %s\",\n    \"%s %s -A -q encode < %s > %s\", \"%s -qdq < %s > %s\",\n\n    /* file input, standard output */\n    \"%s %s -A= %s > %s\", \"%s -d %s > %s\",\n    \"%s %s -A -e %s > %s\", \"%s -d %s > %s\",\n    \"%s %s encode -A= %s > %s\", \"%s decode %s > %s\",\n\n    /* file input, output */\n    \"%s %s -A= %s %s\", \"%s -d %s %s\",\n    \"%s %s -A -e %s %s\", \"%s -d %s %s\",\n    \"%s %s -A= encode %s %s\", \"%s decode %s %s\",\n\n    /* option placement */\n    \"%s %s -A -f %s %s\", \"%s -f -d %s %s\",\n    \"%s %s -e -A= %s %s\", \"%s -d -f %s %s\",\n    \"%s %s -f encode -A= %s %s\", \"%s -f decode -f %s %s\",\n  };\n\n  char ecmd[TESTBUFSIZE], dcmd[TESTBUFSIZE];\n  int pairs = SIZEOF_ARRAY (cmdpairs) / 2;\n  xoff_t tsize;\n  xoff_t dsize;\n  double ratio;\n\n  mt_init (& static_mtrand, 0x9f73f7fc);\n\n  for (i = 0; i < pairs; i += 1)\n    {\n      test_setup ();\n      if ((ret = test_make_inputs (stream, NULL, & tsize))) { return ret; }\n\n      snprintf_func (ecmd, TESTBUFSIZE, cmdpairs[2*i], program_name,\n\t       test_softcfg_str, TEST_TARGET_FILE, TEST_DELTA_FILE);\n      snprintf_func (dcmd, TESTBUFSIZE, cmdpairs[2*i+1], program_name,\n\t       TEST_DELTA_FILE, TEST_RECON_FILE);\n\n      /* Encode and decode. */\n      if ((ret = system (ecmd)) != 0)\n\t{\n\t  XPR(NT \"encode command: %s\\n\", ecmd);\n\t  stream->msg = \"encode cmd failed\";\n\t  return XD3_INTERNAL;\n\t}\n\n      if ((ret = system (dcmd)) != 0)\n\t{\n\t  XPR(NT \"decode command: %s\\n\", dcmd);\n\t  stream->msg = \"decode cmd failed\";\n\t  return XD3_INTERNAL;\n\t}\n\n      /* Compare the target file. */\n      if ((ret = test_compare_files (TEST_TARGET_FILE, TEST_RECON_FILE)))\n\t{\n\t  return ret;\n\t}\n\n      if ((ret = test_file_size (TEST_DELTA_FILE, & dsize)))\n\t{\n\t  return ret;\n\t}\n\n      ratio = (double) dsize / (double) tsize;\n\n      /* Check that it is not too small, not too large. */\n      if (ratio >= TEST_ADD_RATIO + TEST_EPSILON)\n\t{\n\t  XPR(NT \"test encode with size ratio %.4f, \"\n\t     \"expected < %.4f (%\"Q\"u, %\"Q\"u)\\n\",\n\t    ratio, TEST_ADD_RATIO + TEST_EPSILON, dsize, tsize);\n\t  stream->msg = \"strange encoding\";\n\t  return XD3_INTERNAL;\n\t}\n\n      if (ratio <= TEST_ADD_RATIO * (1.0 - 2 * TEST_EPSILON))\n\t{\n\t  XPR(NT \"test encode with size ratio %.4f, \"\n\t     \"expected > %.4f\\n\",\n\t    ratio, TEST_ADD_RATIO - TEST_EPSILON);\n\t  stream->msg = \"strange encoding\";\n\t  return XD3_INTERNAL;\n\t}\n\n      /* Also check that test_compare_files works.  The delta and original should\n       * not be identical. */\n      if ((ret = test_compare_files (TEST_DELTA_FILE,\n\t\t\t\tTEST_TARGET_FILE)) == 0)\n\t{\n\t  stream->msg = \"broken test_compare_files\";\n\t  return XD3_INTERNAL;\n\t}\n\n      test_cleanup ();\n      DOT ();\n    }\n\n  return 0;\n}\n\nstatic int\ncheck_vcdiff_header (xd3_stream *stream,\n\t\t     const char *input,\n\t\t     const char *line_start,\n\t\t     const char *matches,\n\t\t     int yes_or_no)\n{\n  int ret;\n  char vcmd[TESTBUFSIZE], gcmd[TESTBUFSIZE];\n\n  snprintf_func (vcmd, TESTBUFSIZE, \"%s printhdr -f %s %s\",\n\t    program_name, input, TEST_RECON2_FILE);\n\n  if ((ret = system (vcmd)) != 0)\n    {\n      XPR(NT \"printhdr command: %s\\n\", vcmd);\n      stream->msg = \"printhdr cmd failed\";\n      return XD3_INTERNAL;\n    }\n\n  snprintf_func (gcmd, TESTBUFSIZE, \"grep \\\"%s.*%s.*\\\" %s > /dev/null\",\n\t    line_start, matches, TEST_RECON2_FILE);\n\n  if (yes_or_no)\n    {\n      if ((ret = do_cmd (stream, gcmd)))\n\t{\n\t  XPR(NT \"%s\\n\", gcmd);\n\t  return ret;\n\t}\n    }\n  else\n    {\n      if ((ret = do_fail (stream, gcmd)))\n\t{\n\t  XPR(NT \"%s\\n\", gcmd);\n\t  return ret;\n\t}\n    }\n\n  return 0;\n}\n\nstatic int\ntest_recode_command2 (xd3_stream *stream, int has_source,\n\t\t      int variant, int change)\n{\n  int has_adler32 = (variant & 0x1) != 0;\n  int has_apphead = (variant & 0x2) != 0;\n  int has_secondary = (variant & 0x4) != 0;\n\n  int change_adler32 = (change & 0x1) != 0;\n  int change_apphead = (change & 0x2) != 0;\n  int change_secondary = (change & 0x4) != 0;\n\n  int recoded_adler32 = change_adler32 ? !has_adler32 : has_adler32;\n  int recoded_apphead = change_apphead ? !has_apphead : has_apphead;\n  int recoded_secondary = change_secondary ? !has_secondary : has_secondary;\n\n  char ecmd[TESTBUFSIZE], recmd[TESTBUFSIZE], dcmd[TESTBUFSIZE];\n  xoff_t tsize, ssize;\n  int ret;\n\n  test_setup ();\n\n  if ((ret = test_make_inputs (stream, has_source ? & ssize : NULL, & tsize)))\n    {\n      return ret;\n    }\n\n  /* First encode */\n  snprintf_func (ecmd, TESTBUFSIZE, \"%s %s -f %s %s %s %s %s %s %s\",\n\t    program_name, test_softcfg_str,\n\t    has_adler32 ? \"\" : \"-n \",\n\t    has_apphead ? \"-A=encode_apphead \" : \"-A= \",\n\t    has_secondary ? \"-S djw \" : \"-S none \",\n\t    has_source ? \"-s \" : \"\",\n\t    has_source ? TEST_SOURCE_FILE : \"\",\n\t    TEST_TARGET_FILE,\n\t    TEST_DELTA_FILE);\n\n  if ((ret = system (ecmd)) != 0)\n    {\n      XPR(NT \"encode command: %s\\n\", ecmd);\n      stream->msg = \"encode cmd failed\";\n      return XD3_INTERNAL;\n    }\n\n  /* Now recode */\n  snprintf_func (recmd, TESTBUFSIZE,\n\t    \"%s recode %s -f %s %s %s %s %s\", program_name, test_softcfg_str,\n\t    recoded_adler32 ? \"\" : \"-n \",\n\t    !change_apphead ? \"\" :\n\t        (recoded_apphead ? \"-A=recode_apphead \" : \"-A= \"),\n\t    recoded_secondary ? \"-S djw \" : \"-S= \",\n\t    TEST_DELTA_FILE,\n\t    TEST_COPY_FILE);\n\n  if ((ret = system (recmd)) != 0)\n    {\n      XPR(NT \"recode command: %s\\n\", recmd);\n      stream->msg = \"recode cmd failed\";\n      return XD3_INTERNAL;\n    }\n\n  /* Check recode changes. */\n\n  if ((ret = check_vcdiff_header (stream,\n\t\t\t\t  TEST_COPY_FILE,\n\t\t\t\t  \"VCDIFF window indicator\",\n\t\t\t\t  \"VCD_SOURCE\",\n\t\t\t\t  has_source))) { return ret; }\n\n  if ((ret = check_vcdiff_header (stream,\n\t\t\t\t  TEST_COPY_FILE,\n\t\t\t\t  \"VCDIFF header indicator\",\n\t\t\t\t  \"VCD_SECONDARY\",\n\t\t\t\t  recoded_secondary))) { return ret; }\n\n  if ((ret = check_vcdiff_header (stream,\n\t\t\t\t  TEST_COPY_FILE,\n\t\t\t\t  \"VCDIFF window indicator\",\n\t\t\t\t  \"VCD_ADLER32\",\n\t\t\t\t  /* Recode can't generate an adler32\n\t\t\t\t   * checksum, it can only preserve it or\n\t\t\t\t   * remove it. */\n\t\t\t\t  has_adler32 && recoded_adler32)))\n    {\n      return ret;\n    }\n\n  if (!change_apphead)\n    {\n      if ((ret = check_vcdiff_header (stream,\n\t\t\t\t      TEST_COPY_FILE,\n\t\t\t\t      \"VCDIFF header indicator\",\n\t\t\t\t      \"VCD_APPHEADER\",\n\t\t\t\t      has_apphead)))\n\t{\n\t  return ret;\n\t}\n      if ((ret = check_vcdiff_header (stream,\n\t\t\t\t      TEST_COPY_FILE,\n\t\t\t\t      \"VCDIFF application header\",\n\t\t\t\t      \"encode_apphead\",\n\t\t\t\t      has_apphead)))\n\t{\n\t  return ret;\n\t}\n    }\n  else\n    {\n      if ((ret = check_vcdiff_header (stream,\n\t\t\t\t      TEST_COPY_FILE,\n\t\t\t\t      \"VCDIFF header indicator\",\n\t\t\t\t      \"VCD_APPHEADER\",\n\t\t\t\t      recoded_apphead)))\n\t{\n\t  return ret;\n\t}\n      if (recoded_apphead &&\n\t  (ret = check_vcdiff_header (stream,\n\t\t\t\t      TEST_COPY_FILE,\n\t\t\t\t      \"VCDIFF application header\",\n\t\t\t\t      \"recode_apphead\",\n\t\t\t\t      1)))\n\t{\n\t  return ret;\n\t}\n    }\n\n  /* Now decode */\n  snprintf_func (dcmd, TESTBUFSIZE, \"%s -fd %s %s %s %s \", program_name,\n\t    has_source ? \"-s \" : \"\",\n\t    has_source ? TEST_SOURCE_FILE : \"\",\n\t    TEST_COPY_FILE,\n\t    TEST_RECON_FILE);\n\n  if ((ret = system (dcmd)) != 0)\n    {\n      XPR(NT \"decode command: %s\\n\", dcmd);\n      stream->msg = \"decode cmd failed\";\n      return XD3_INTERNAL;\n    }\n\n  /* Now compare. */\n  if ((ret = test_compare_files (TEST_TARGET_FILE, TEST_RECON_FILE)))\n    {\n      return ret;\n    }\n  test_cleanup ();\n\n  return 0;\n}\n\nstatic int\ntest_recode_command (xd3_stream *stream, int ignore)\n{\n  /* Things to test:\n   * - with and without a source file (recode does not change)\n   *\n   * (recode may or may not change -- 8 variations)\n   * - with and without adler32\n   * - with and without app header\n   * - with and without secondary\n   */\n  int has_source;\n  int variant;\n  int change;\n  int ret;\n\n  for (has_source = 0; has_source < 2; has_source++)\n    {\n      for (variant = 0; variant < 8; variant++)\n\t{\n\t  for (change = 0; change < 8; change++)\n\t    {\n\t      if ((ret = test_recode_command2 (stream, has_source,\n\t\t\t\t\t       variant, change)))\n\t\t{\n\t\t  return ret;\n\t\t}\n\t    }\n\t  DOT ();\n\t}\n    }\n\n  return 0;\n}\n\n#if SECONDARY_LZMA\nstatic int test_secondary_lzma_default (xd3_stream *stream, int ignore)\n{\n  char ecmd[TESTBUFSIZE];\n  int ret;\n\n  test_setup ();\n\n  if ((ret = test_make_inputs (stream, NULL, NULL)))\n    {\n      return ret;\n    }\n\n  /* First encode */\n  snprintf_func (ecmd, TESTBUFSIZE, \"%s -e %s %s\",\n\t\t program_name,\n\t\t TEST_TARGET_FILE,\n\t\t TEST_DELTA_FILE);\n\n  if ((ret = system (ecmd)) != 0)\n    {\n      return XD3_INTERNAL;\n    }\n\n  if ((ret = check_vcdiff_header (stream,\n\t\t\t\t  TEST_DELTA_FILE,\n\t\t\t\t  \"VCDIFF secondary compressor\",\n\t\t\t\t  \"lzma\",\n\t\t\t\t  1)))\n    {\n      return ret;\n    }\n\n  test_cleanup ();\n  return 0;\n}\n\n#endif  /* SECONDARY_LZMA */\n#endif  /* SHELL_TESTS */\n\n/***********************************************************************\n EXTERNAL I/O DECOMPRESSION/RECOMPRESSION\n ***********************************************************************/\n\n#if EXTERNAL_COMPRESSION\n/* This performs one step of the test_externally_compressed_io\n * function described below.  It builds a pipe containing both Xdelta\n * and external compression/decompression that should not modify the\n * data passing through. */\nstatic int\ntest_compressed_pipe (xd3_stream *stream, main_extcomp *ext, char* buf,\n\t\t      const char* comp_options, const char* decomp_options,\n\t\t      int do_ext_recomp, const char* msg)\n{\n  int ret;\n  char decomp_buf[TESTBUFSIZE];\n\n  if (do_ext_recomp)\n    {\n      snprintf_func (decomp_buf, TESTBUFSIZE,\n\t\t\" | %s %s\", ext->decomp_cmdname, ext->decomp_options);\n    }\n  else\n    {\n      decomp_buf[0] = 0;\n    }\n\n  snprintf_func (buf, TESTBUFSIZE, \"%s %s < %s | %s %s | %s %s%s > %s\",\n\t   ext->recomp_cmdname, ext->recomp_options,\n\t   TEST_TARGET_FILE,\n\t   program_name, comp_options,\n\t   program_name, decomp_options,\n\t   decomp_buf,\n\t   TEST_RECON_FILE);\n\n  if ((ret = system (buf)) != 0)\n    {\n      stream->msg = msg;\n      return XD3_INTERNAL;\n    }\n\n  if ((ret = test_compare_files (TEST_TARGET_FILE, TEST_RECON_FILE)))\n    {\n      return XD3_INTERNAL;\n    }\n\n  DOT ();\n  return 0;\n}\n\n/* We want to test that a pipe such as:\n *\n * --> | gzip -cf | xdelta3 -cf | xdelta3 -dcf | gzip -dcf | -->\n *\n * is transparent, i.e., does not modify the stream of data.  However,\n * we also want to verify that at the center the data is properly\n * compressed, i.e., that we do not just have a re-compressed gzip\n * format, that we have an VCDIFF format.  We do this in two steps.\n * First test the above pipe, then test with suppressed output\n * recompression (-D).  The result should be the original input:\n *\n * --> | gzip -cf | xdelta3 -cf | xdelta3 -Ddcf | -->\n *\n * Finally we want to test that -D also disables input decompression:\n *\n * --> | gzip -cf | xdelta3 -Dcf | xdelta3 -Ddcf | gzip -dcf | -->\n */\nstatic int\ntest_externally_compressed_io (xd3_stream *stream, int ignore)\n{\n  usize_t i;\n  int ret;\n  char buf[TESTBUFSIZE];\n\n  mt_init (& static_mtrand, 0x9f73f7fc);\n\n  if ((ret = test_make_inputs (stream, NULL, NULL))) { return ret; }\n\n  for (i = 0; i < SIZEOF_ARRAY (extcomp_types); i += 1)\n    {\n      main_extcomp *ext = & extcomp_types[i];\n\n      /* Test for the existence of the external command first, if not skip. */\n      snprintf_func (buf, TESTBUFSIZE, \"%s %s < /dev/null > /dev/null\", ext->recomp_cmdname, ext->recomp_options);\n\n      if ((ret = system (buf)) != 0)\n\t{\n\t  XPR(NT \"%s=0\", ext->recomp_cmdname);\n\t  continue;\n\t}\n\n      if ((ret = test_compressed_pipe (stream, ext, buf, \"-cfq\", \"-dcfq\", 1,\n\t\t\t\t       \"compression failed: identity pipe\")) ||\n\t  (ret = test_compressed_pipe (stream, ext, buf, \"-cfq\", \"-Rdcfq\", 0,\n\t\t\t\t       \"compression failed: without recompression\")) ||\n\t  (ret = test_compressed_pipe (stream, ext, buf, \"-Dcfq\", \"-Rdcfq\", 1,\n\t\t\t\t       \"compression failed: without decompression\")))\n\t{\n\t  return ret;\n\t}\n    }\n\n  return 0;\n}\n\n/* This tests the proper functioning of external decompression for\n * source files.  The source and target files are identical and\n * compressed by gzip.  Decoding such a delta with recompression\n * disbaled (-R) should produce the original, uncompressed\n * source/target file.  Then it checks with output recompression\n * enabled--in this case the output should be a compressed copy of the\n * original source/target file.  Then it checks that encoding with\n * decompression disabled works--the compressed files are identical\n * and decoding them should always produce a compressed output,\n * regardless of -R since the encoded delta file had decompression\n * disabled..\n */\nstatic int\ntest_source_decompression (xd3_stream *stream, int ignore)\n{\n  int ret;\n  char buf[TESTBUFSIZE];\n  const main_extcomp *ext;\n  xoff_t dsize;\n\n  mt_init (& static_mtrand, 0x9f73f7fc);\n\n  test_setup ();\n  if ((ret = test_make_inputs (stream, NULL, NULL))) { return ret; }\n\n  /* Use gzip. */\n  if ((ext = main_get_compressor (\"G\")) == NULL)\n    {\n      XPR(NT \"skipped\");\n      return 0;\n    }\n\n  /* Save an uncompressed copy. */\n  if ((ret = test_save_copy (TEST_TARGET_FILE))) { return ret; }\n\n  /* Compress the source. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -1 %s < %s > %s\", ext->recomp_cmdname,\n\t   ext->recomp_options, TEST_COPY_FILE, TEST_SOURCE_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  /* Compress the target. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -9 %s < %s > %s\", ext->recomp_cmdname,\n\t   ext->recomp_options, TEST_COPY_FILE, TEST_TARGET_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Now the two identical files are compressed.  Delta-encode the target,\n   * with decompression. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -e -vfq -s%s %s %s\", program_name, TEST_SOURCE_FILE,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Check that the compressed file is small (b/c inputs are\n   * identical). */\n  if ((ret = test_file_size (TEST_DELTA_FILE, & dsize))) { return ret; }\n  /* Deltas for identical files should be very small. */\n  if (dsize > 200)\n    {\n      XPR(NT \"external compression did not happen\\n\");\n      stream->msg = \"external compression did not happen\";\n      return XD3_INTERNAL;\n    }\n\n  /* Decode the delta file with recompression disabled, should get an\n   * uncompressed file out. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -v -dq -R -s%s %s %s\", program_name,\n\t   TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  if ((ret = test_compare_files (TEST_COPY_FILE,\n\t\t\t    TEST_RECON_FILE))) { return ret; }\n\n  /* Decode the delta file with recompression, should get a compressed file\n   * out.  But we can't compare compressed files directly. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -v -dqf -s%s %s %s\", program_name,\n\t   TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  snprintf_func (buf, TESTBUFSIZE, \"%s %s < %s > %s\", ext->decomp_cmdname, ext->decomp_options,\n\t   TEST_RECON_FILE, TEST_RECON2_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  if ((ret = test_compare_files (TEST_COPY_FILE,\n\t\t\t    TEST_RECON2_FILE))) { return ret; }\n\n  /* Encode with decompression disabled */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -e -D -vfq -s%s %s %s\", program_name,\n\t   TEST_SOURCE_FILE, TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Decode the delta file with decompression disabled, should get the\n   * identical compressed file out. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -d -D -vfq -s%s %s %s\", program_name,\n\t   TEST_SOURCE_FILE, TEST_DELTA_FILE, TEST_RECON_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  if ((ret = test_compare_files (TEST_TARGET_FILE,\n\t\t\t    TEST_RECON_FILE))) { return ret; }\n\n  test_cleanup();\n  return 0;\n}\n#endif\n\n/***********************************************************************\n FORCE, STDOUT\n ***********************************************************************/\n\n/* This tests that output will not overwrite an existing file unless\n * -f was specified.  The test is for encoding (the same code handles\n * it for decoding). */\nstatic int\ntest_force_behavior (xd3_stream *stream, int ignore)\n{\n  int ret;\n  char buf[TESTBUFSIZE];\n\n  /* Create empty target file */\n  test_setup ();\n  snprintf_func (buf, TESTBUFSIZE, \"cp /dev/null %s\", TEST_TARGET_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Encode to delta file */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -e %s %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Encode again, should fail. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -q -e %s %s \", program_name,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_fail (stream, buf))) { return ret; }\n\n  /* Force it, should succeed. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -f -e %s %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  test_cleanup();\n  return 0;\n}\n\n/* This checks the proper operation of the -c flag.  When specified\n * the default output becomes stdout, otherwise the input must be\n * provided (encode) or it may be defaulted (decode w/ app header). */\nstatic int\ntest_stdout_behavior (xd3_stream *stream, int ignore)\n{\n  int ret;\n  char buf[TESTBUFSIZE];\n\n  test_setup();\n  snprintf_func (buf, TESTBUFSIZE, \"cp /dev/null %s\", TEST_TARGET_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Without -c, encode writes to delta file */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -e %s %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* With -c, encode writes to stdout */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -e -c %s > %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Without -c, decode writes to target file name, but it fails because the\n   * file exists. */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -q -d %s \", program_name, TEST_DELTA_FILE);\n  if ((ret = do_fail (stream, buf))) { return ret; }\n\n  /* With -c, decode writes to stdout */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -d -c %s > /dev/null\", program_name, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  test_cleanup();\n\n  return 0;\n}\n\n/* This tests that the no-output flag (-J) works. */\nstatic int\ntest_no_output (xd3_stream *stream, int ignore)\n{\n  int ret;\n  char buf[TESTBUFSIZE];\n\n  test_setup ();\n\n  snprintf_func (buf, TESTBUFSIZE, \"touch %s && chmod 0000 %s\",\n\t   TEST_NOPERM_FILE, TEST_NOPERM_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  if ((ret = test_make_inputs (stream, NULL, NULL))) { return ret; }\n\n  /* Try no_output encode w/out unwritable output file */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -q -f -e %s %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_NOPERM_FILE);\n  if ((ret = do_fail (stream, buf))) { return ret; }\n  snprintf_func (buf, TESTBUFSIZE, \"%s -J -e %s %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_NOPERM_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  /* Now really write the delta to test decode no-output */\n  snprintf_func (buf, TESTBUFSIZE, \"%s -e %s %s\", program_name,\n\t   TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  snprintf_func (buf, TESTBUFSIZE, \"%s -q -f -d %s %s\", program_name,\n\t   TEST_DELTA_FILE, TEST_NOPERM_FILE);\n  if ((ret = do_fail (stream, buf))) { return ret; }\n  snprintf_func (buf, TESTBUFSIZE, \"%s -J -d %s %s\", program_name,\n\t   TEST_DELTA_FILE, TEST_NOPERM_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  test_cleanup ();\n  return 0;\n}\n\n/* This tests that the default appheader works */\nstatic int\ntest_appheader (xd3_stream *stream, int ignore)\n{\n  int i;\n  int ret;\n  char buf[TESTBUFSIZE];\n  char bogus[TESTBUFSIZE];\n  xoff_t ssize, tsize;\n  test_setup ();\n\n  if ((ret = test_make_inputs (stream, &ssize, &tsize))) { return ret; }\n\n  snprintf_func (buf, TESTBUFSIZE, \"%s -q -f -e -s %s %s %s\", program_name,\n\t\t TEST_SOURCE_FILE, TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  if ((ret = test_copy_to (program_name, TEST_RECON2_FILE))) { return ret; }\n\n  snprintf_func (buf, TESTBUFSIZE, \"chmod 0700 %s\", TEST_RECON2_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  if ((ret = test_save_copy (TEST_TARGET_FILE))) { return ret; }\n  if ((ret = test_copy_to (TEST_SOURCE_FILE, TEST_TARGET_FILE))) { return ret; }\n\n  if ((ret = test_compare_files (TEST_TARGET_FILE, TEST_COPY_FILE)) == 0)\n    {\n      return XD3_INVALID;  // I.e., files are different!\n    }\n\n  // Test that the target file is restored.\n  snprintf_func (buf, TESTBUFSIZE, \"(cd /tmp && %s -q -f -d %s)\",\n\t\t TEST_RECON2_FILE,\n\t\t TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n\n  if ((ret = test_compare_files (TEST_TARGET_FILE, TEST_COPY_FILE)) != 0)\n    {\n      return ret;\n    }\n\n  // Test a malicious string w/ entries > 4 in the appheader by having\n  // the encoder write it:\n  for (i = 0; i < TESTBUFSIZE / 4; ++i)\n    {\n      bogus[2*i] = 'G';\n      bogus[2*i+1] = '/';\n    }\n  bogus[TESTBUFSIZE/2-1] = 0;\n\n  snprintf_func (buf, TESTBUFSIZE, \n\t\t \"%s -q -f -A=%s -e -s %s %s %s\", program_name, bogus,\n\t\t TEST_SOURCE_FILE, TEST_TARGET_FILE, TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf))) { return ret; }\n  // Then read it:\n  snprintf_func (buf, TESTBUFSIZE, \"(cd /tmp && %s -q -f -d %s)\",\n\t\t TEST_RECON2_FILE,\n\t\t TEST_DELTA_FILE);\n  if ((ret = do_cmd (stream, buf)) == 0) \n    { \n      return XD3_INVALID;  // Impossible\n    }\n  if (!WIFEXITED(ret))\n    {\n      return XD3_INVALID;  // Must have crashed!\n    }\n\n  test_cleanup ();\n  return 0;\n}\n\n/***********************************************************************\n Source identical optimization\n ***********************************************************************/\n\n/* Computing a delta should be fastest when the two inputs are\n * identical, this checks it.  The library is called to compute a\n * delta between a 10000 byte file, 1000 byte winsize, 500 byte source\n * blocksize.  The same buffer is used for both source and target. */\nstatic int\ntest_identical_behavior (xd3_stream *stream, int ignore)\n{\n#define IDB_TGTSZ 10000  /* Not a power of two b/c of hard-coded expectations below. */\n#define IDB_BLKSZ 512\n#define IDB_WINSZ 1000\n#define IDB_DELSZ 1000\n#define IDB_WINCNT (IDB_TGTSZ / IDB_WINSZ)\n\n  int ret, i;\n  uint8_t buf[IDB_TGTSZ];\n  uint8_t del[IDB_DELSZ];\n  uint8_t rec[IDB_TGTSZ];\n  xd3_source source;\n  int nextencwin = 0;\n  int winstarts = 0, winfinishes = 0;\n  usize_t delpos = 0, recsize;\n  xd3_config config;\n  memset(&source, 0, sizeof(source));\n\n  for (i = 0; i < IDB_TGTSZ; i += 1)\n    {\n      buf[i] = (uint8_t) mt_random (&static_mtrand);\n    }\n\n  stream->winsize = IDB_WINSZ;\n\n  source.blksize  = IDB_BLKSZ;\n  source.name     = \"\";\n  source.curblk   = NULL;\n  source.curblkno = 0;\n\n  if ((ret = xd3_set_source (stream, & source))) { goto fail; }\n\n  /* Compute an delta between identical source and targets. */\n  for (;;)\n    {\n      ret = xd3_encode_input (stream);\n\n      if (ret == XD3_INPUT)\n\t{\n\t  xd3_avail_input (stream, buf + (IDB_WINSZ * nextencwin), IDB_WINSZ);\n\t  nextencwin += 1;\n\t  continue;\n\t}\n\n      if (ret == XD3_GETSRCBLK)\n\t{\n\t  source.curblkno = source.getblkno;\n\t  source.onblk    = IDB_BLKSZ;\n\t  source.curblk   = buf + source.getblkno * IDB_BLKSZ;\n\t  continue;\n\t}\n\n      if (ret == XD3_WINSTART)\n\t{\n\t  winstarts++;\n\t  continue;\n\t}\n      if (ret == XD3_WINFINISH)\n\t{\n\t  winfinishes++;\n\t  if (winfinishes == IDB_WINCNT)\n\t    {\n\t      break;\n\t    }\n\t  continue;\n\t}\n\n      if (ret != XD3_OUTPUT) { goto fail; }\n\n      CHECK(delpos + stream->avail_out <= IDB_DELSZ);\n\n      memcpy (del + delpos, stream->next_out, stream->avail_out);\n\n      delpos += stream->avail_out;\n\n      xd3_consume_output (stream);\n    }\n\n  CHECK(winfinishes == IDB_WINCNT);\n  CHECK(winstarts == IDB_WINCNT);\n  CHECK(nextencwin == IDB_WINCNT);\n\n  /* Reset. */\n  memset(&source, 0, sizeof(source));\n  source.blksize  = IDB_TGTSZ;\n  source.onblk    = IDB_TGTSZ;\n  source.curblk   = buf;\n  source.curblkno = 0;\n\n  if ((ret = xd3_close_stream (stream))) { goto fail; }\n  xd3_free_stream (stream);\n  xd3_init_config (& config, 0);\n  if ((ret = xd3_config_stream (stream, & config))) { goto fail; }\n  if ((ret = xd3_set_source_and_size (stream, & source, IDB_TGTSZ))) { goto fail; }\n\n  /* Decode. */\n  if ((ret = xd3_decode_stream (stream, del, delpos, rec, & recsize, IDB_TGTSZ))) { goto fail; }\n\n  /* Check result size and data. */\n  if (recsize != IDB_TGTSZ) { stream->msg = \"wrong size reconstruction\"; goto fail; }\n  if (memcmp (rec, buf, IDB_TGTSZ) != 0) { stream->msg = \"wrong data reconstruction\"; goto fail; }\n\n  /* Check that there was one copy per window. */\n  IF_DEBUG (if (stream->n_scpy != IDB_WINCNT ||\n\t\tstream->n_add != 0 ||\n\t\tstream->n_run != 0) { stream->msg = \"wrong copy count\"; goto fail; });\n\n  /* Check that no checksums were computed because the initial match\n     was presumed. */\n  IF_DEBUG (if (stream->large_ckcnt != 0) { stream->msg = \"wrong checksum behavior\"; goto fail; });\n\n  ret = 0;\n fail:\n  return ret;\n}\n\n/***********************************************************************\n String matching test\n ***********************************************************************/\n\n/* Check particular matching behaviors by calling\n * xd3_string_match_soft directly with specific arguments. */\ntypedef struct _string_match_test string_match_test;\n\ntypedef enum\n{\n  SM_NONE    = 0,\n  SM_LAZY    = (1 << 1),\n} string_match_flags;\n\nstruct _string_match_test\n{\n  const char *input;\n  int         flags;\n  const char *result;\n};\n\nstatic const string_match_test match_tests[] =\n{\n  /* nothing */\n  { \"1234567890\", SM_NONE, \"\" },\n\n  /* basic run, copy */\n  { \"11111111112323232323\", SM_NONE, \"R0/10 C12/8@10\" },\n\n  /* no run smaller than MIN_RUN=8 */\n  { \"1111111\",  SM_NONE, \"C1/6@0\" },\n  { \"11111111\", SM_NONE, \"R0/8\" },\n\n  /* simple promotion: the third copy address depends on promotion */\n  { \"ABCDEF_ABCDEF^ABCDEF\", SM_NONE,    \"C7/6@0 C14/6@7\" },\n  /* { \"ABCDEF_ABCDEF^ABCDEF\", SM_PROMOTE, \"C7/6@0 C14/6@0\" }, forgotten */\n\n  /* simple lazy: there is a better copy starting with \"23 X\" than \"123 \" */\n  { \"123 23 XYZ 123 XYZ\", SM_NONE, \"C11/4@0\" },\n  { \"123 23 XYZ 123 XYZ\", SM_LAZY, \"C11/4@0 C12/6@4\" },\n\n  /* trylazy: no lazy matches unless there are at least two characters beyond\n   * the first match */\n  { \"2123_121212\",   SM_LAZY, \"C7/4@5\" },\n  { \"2123_1212123\",  SM_LAZY, \"C7/4@5\" },\n  { \"2123_1212123_\", SM_LAZY, \"C7/4@5 C8/5@0\" },\n\n  /* trylazy: no lazy matches if the copy is >= MAXLAZY=10 */\n  { \"2123_121212123_\",   SM_LAZY, \"C7/6@5 C10/5@0\" },\n  { \"2123_12121212123_\", SM_LAZY, \"C7/8@5 C12/5@0\" },\n  { \"2123_1212121212123_\", SM_LAZY, \"C7/10@5\" },\n\n  /* lazy run: check a run overlapped by a longer copy */\n  { \"11111112 111111112 1\", SM_LAZY, \"C1/6@0 R9/8 C10/10@0\" },\n\n  /* lazy match: match_length,run_l >= min_match tests, shouldn't get any\n   * copies within the run, no run within the copy */\n  { \"^________^________  \", SM_LAZY, \"R1/8 C9/9@0\" },\n\n  /* chain depth: it only goes back 10. this checks that the 10th match hits\n   * and the 11th misses. */\n  { \"1234 1234_1234-1234=1234+1234[1234]1234{1234}1234<1234 \", SM_NONE,\n    \"C5/4@0 C10/4@5 C15/4@10 C20/4@15 C25/4@20 C30/4@25 C35/4@30 C40/4@35 C45/4@40 C50/5@0\" },\n  { \"1234 1234_1234-1234=1234+1234[1234]1234{1234}1234<1234>1234 \", SM_NONE,\n    \"C5/4@0 C10/4@5 C15/4@10 C20/4@15 C25/4@20 C30/4@25 C35/4@30 C40/4@35 C45/4@40 C50/4@45 C55/4@50\" },\n\n  /* ssmatch test */\n  { \"ABCDE___ABCDE*** BCDE***\", SM_NONE, \"C8/5@0 C17/4@1\" },\n  /*{ \"ABCDE___ABCDE*** BCDE***\", SM_SSMATCH, \"C8/5@0 C17/7@9\" }, forgotten */\n};\n\nstatic int\ntest_string_matching (xd3_stream *stream, int ignore)\n{\n  usize_t i;\n  int ret;\n  xd3_config config;\n  char rbuf[TESTBUFSIZE];\n\n  for (i = 0; i < SIZEOF_ARRAY (match_tests); i += 1)\n    {\n      const string_match_test *test = & match_tests[i];\n      char *rptr = rbuf;\n      usize_t len = (usize_t) strlen (test->input);\n\n      xd3_free_stream (stream);\n      xd3_init_config (& config, 0);\n\n      config.smatch_cfg   = XD3_SMATCH_SOFT;\n      config.smatcher_soft.large_look   = 4;\n      config.smatcher_soft.large_step   = 4;\n      config.smatcher_soft.small_look   = 4;\n      config.smatcher_soft.small_chain  = 10;\n      config.smatcher_soft.small_lchain = 10;\n      config.smatcher_soft.max_lazy     = (test->flags & SM_LAZY) ? 10 : 0;\n      config.smatcher_soft.long_enough  = 10;\n\n      if ((ret = xd3_config_stream (stream, & config))) { return ret; }\n      if ((ret = xd3_encode_init_full (stream))) { return ret; }\n\n      xd3_avail_input (stream, (uint8_t*)test->input, len);\n\n      if ((ret = stream->smatcher.string_match (stream))) { return ret; }\n\n      *rptr = 0;\n      while (! xd3_rlist_empty (& stream->iopt_used))\n\t{\n\t  xd3_rinst *inst = xd3_rlist_pop_front (& stream->iopt_used);\n\n\t  switch (inst->type)\n\t    {\n\t    case XD3_RUN: *rptr++ = 'R'; break;\n\t    case XD3_CPY: *rptr++ = 'C'; break;\n\t    default: CHECK(0);\n\t    }\n\n\t  snprintf_func (rptr, rbuf+TESTBUFSIZE-rptr, \"%\"W\"u/%\"W\"u\",\n\t\t\t inst->pos, inst->size);\n\t  rptr += strlen (rptr);\n\n\t  if (inst->type == XD3_CPY)\n\t    {\n\t      *rptr++ = '@';\n\t      snprintf_func (rptr, rbuf+TESTBUFSIZE-rptr, \"%\"Q\"u\", inst->addr);\n\t      rptr += strlen (rptr);\n\t    }\n\n\t  *rptr++ = ' ';\n\n\t  xd3_rlist_push_back (& stream->iopt_free, inst);\n\t}\n\n      if (rptr != rbuf)\n\t{\n\t  rptr -= 1; *rptr = 0;\n\t}\n\n      if (strcmp (rbuf, test->result) != 0)\n\t{\n\t  XPR(NT \"test %\"W\"u: expected %s: got %s\", i, test->result, rbuf);\n\t  stream->msg = \"wrong result\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n\n  return 0;\n}\n\n/*\n * This is a test for many overlapping instructions. It must be a lazy\n * matcher.\n */\nstatic int\ntest_iopt_flush_instructions (xd3_stream *stream, int ignore)\n{\n  int ret, i;\n  usize_t tpos = 0;\n  usize_t delta_size, recon_size;\n  xd3_config config;\n  uint8_t target[TESTBUFSIZE];\n  uint8_t delta[TESTBUFSIZE];\n  uint8_t recon[TESTBUFSIZE];\n\n  xd3_free_stream (stream);\n  xd3_init_config (& config, 0);\n\n  config.smatch_cfg    = XD3_SMATCH_SOFT;\n  config.smatcher_soft.large_look    = 16;\n  config.smatcher_soft.large_step    = 16;\n  config.smatcher_soft.small_look    = 4;\n  config.smatcher_soft.small_chain   = 128;\n  config.smatcher_soft.small_lchain  = 16;\n  config.smatcher_soft.max_lazy      = 8;\n  config.smatcher_soft.long_enough   = 128;\n\n  if ((ret = xd3_config_stream (stream, & config))) { return ret; }\n\n  for (i = 1; i < 250; i++)\n    {\n      target[tpos++] = i;\n      target[tpos++] = i+1;\n      target[tpos++] = i+2;\n      target[tpos++] = i+3;\n      target[tpos++] = 0;\n    }\n  for (i = 1; i < 253; i++)\n    {\n      target[tpos++] = i;\n    }\n\n  if ((ret = xd3_encode_stream (stream, target, tpos,\n\t\t\t\t    delta, & delta_size, sizeof (delta))))\n    {\n      return ret;\n    }\n\n  xd3_free_stream(stream);\n  if ((ret = xd3_config_stream (stream, & config))) { return ret; }\n\n  if ((ret = xd3_decode_stream (stream, delta, delta_size,\n\t\t\t\trecon, & recon_size, sizeof (recon))))\n    {\n      return ret;\n    }\n\n  CHECK(tpos == recon_size);\n  CHECK(memcmp(target, recon, recon_size) == 0);\n\n  return 0;\n}\n\n/*\n * This tests the 32/64bit ambiguity for source-window matching.\n */\n#if !XD3_USE_LARGESIZET\nstatic int\ntest_source_cksum_offset (xd3_stream *stream, int ignore)\n {\n  xd3_source source;\n\n  // Inputs are:\n  struct {\n    xoff_t   cpos;   // stream->srcwin_cksum_pos;\n    xoff_t   ipos;   // stream->total_in;\n    xoff_t   size;   // stream->src->size;\n\n    usize_t  input;  // input  32-bit offset\n    xoff_t   output; // output 64-bit offset\n\n  } cksum_test[] = {\n    // If cpos is <= 2^32\n    { 1, 1, 1, 1, 1 },\n\n#if XD3_USE_LARGEFILE64\n//    cpos            ipos            size            input         output\n//    0x____xxxxxULL, 0x____xxxxxULL, 0x____xxxxxULL, 0x___xxxxxUL, 0x____xxxxxULL\n    { 0x100100000ULL, 0x100000000ULL, 0x100200000ULL, 0x00000000UL, 0x100000000ULL },\n    { 0x100100000ULL, 0x100000000ULL, 0x100200000ULL, 0xF0000000UL, 0x0F0000000ULL },\n\n    { 0x100200000ULL, 0x100100000ULL, 0x100200000ULL, 0x00300000UL, 0x000300000ULL },\n\n    { 25771983104ULL, 25770000000ULL, 26414808769ULL, 2139216707UL, 23614053187ULL },\n\n#endif\n\n    { 0, 0, 0, 0, 0 },\n  }, *test_ptr;\n\n  stream->src = &source;\n\n  for (test_ptr = cksum_test; test_ptr->cpos; test_ptr++) {\n    xoff_t r;\n    stream->srcwin_cksum_pos = test_ptr->cpos;\n    stream->total_in = test_ptr->ipos;\n\n    r = xd3_source_cksum_offset(stream, test_ptr->input);\n    CHECK(r == test_ptr->output);\n  }\n  return 0;\n}\n#endif /* !XD3_USE_LARGESIZET */\n\nstatic int\ntest_in_memory (xd3_stream *stream, int ignore)\n{\n  // test_text is 256 bytes\n  uint8_t ibuf[sizeof(test_text)];\n  uint8_t dbuf[sizeof(test_text)];\n  uint8_t obuf[sizeof(test_text)];\n  usize_t size = sizeof(test_text);\n  usize_t dsize, osize;\n  int r1, r2;\n  int eflags = SECONDARY_DJW ? XD3_SEC_DJW : 0;\n\n  memcpy(ibuf, test_text, size);\n  memset(ibuf + 128, 0, 16);\n\n  r1 = xd3_encode_memory(ibuf, size,\n\t\t\t test_text, size,\n\t\t\t dbuf, &dsize, size, eflags);\n\n  r2 = xd3_decode_memory(dbuf, dsize,\n\t\t\t test_text, size,\n\t\t\t obuf, &osize, size, 0);\n\n  if (r1 != 0 || r2 != 0 || dsize >= (size/2) || dsize < 1 ||\n      osize != size) {\n    stream->msg = \"encode/decode size error\";\n    return XD3_INTERNAL;\n  }\n\n  if (memcmp(obuf, ibuf, size) != 0) {\n    stream->msg = \"encode/decode data error\";\n    return XD3_INTERNAL;\n  }\n\n  return 0;\n}\n\n/***********************************************************************\n TEST MAIN\n ***********************************************************************/\n\nint xd3_selftest (void)\n{\n#define DO_TEST(fn,flags,arg)                                         \\\n  do {                                                                \\\n    xd3_stream stream;                                                \\\n    xd3_config config;                                                \\\n    xd3_init_config (& config, flags);                                \\\n    XPR(NT \"testing \" #fn \"%s...\",                          \\\n             flags ? (\" (\" #flags \")\") : \"\");                         \\\n    if ((ret = xd3_config_stream (& stream, & config) == 0) &&        \\\n        (ret = test_ ## fn (& stream, arg)) == 0) {                   \\\n      XPR(NTR \" success\\n\");                                          \\\n    } else {                                                          \\\n      XPR(NTR \" failed: %s: %s\\n\", xd3_errstring (& stream),          \\\n               xd3_mainerror (ret)); }                                \\\n    xd3_free_stream (& stream);                                       \\\n    if (ret != 0) { goto failure; }                                   \\\n  } while (0)\n\n  int ret;\n  DO_TEST (random_numbers, 0, 0);\n  DO_TEST (printf_xoff, 0, 0);\n\n  DO_TEST (decode_integer_end_of_input, 0, 0);\n  DO_TEST (decode_integer_overflow, 0, 0);\n  DO_TEST (encode_decode_uint32_t, 0, 0);\n  DO_TEST (encode_decode_uint64_t, 0, 0);\n  DO_TEST (usize_t_overflow, 0, 0);\n  DO_TEST (checksum_step, 0, 0);\n  DO_TEST (forward_match, 0, 0);\n  DO_TEST (address_cache, 0, 0);\n\n  DO_TEST (string_matching, 0, 0);\n  DO_TEST (choose_instruction, 0, 0);\n  DO_TEST (identical_behavior, 0, 0);\n  DO_TEST (in_memory, 0, 0);\n\n  DO_TEST (iopt_flush_instructions, 0, 0);\n#if !XD3_USE_LARGESIZET\n  DO_TEST (source_cksum_offset, 0, 0);\n#endif\n\n  DO_TEST (decompress_single_bit_error, 0, 3);\n  DO_TEST (decompress_single_bit_error, XD3_ADLER32, 3);\n\n  IF_LZMA (DO_TEST (decompress_single_bit_error, XD3_SEC_LZMA, 54));\n  IF_FGK (DO_TEST (decompress_single_bit_error, XD3_SEC_FGK, 3));\n  IF_DJW (DO_TEST (decompress_single_bit_error, XD3_SEC_DJW, 8));\n\n#if SHELL_TESTS\n  DO_TEST (force_behavior, 0, 0);\n  DO_TEST (stdout_behavior, 0, 0);\n  DO_TEST (no_output, 0, 0);\n  DO_TEST (appheader, 0, 0);\n  DO_TEST (command_line_arguments, 0, 0);\n\n#if EXTERNAL_COMPRESSION\n  DO_TEST (source_decompression, 0, 0);\n  DO_TEST (externally_compressed_io, 0, 0);\n#endif\n\n  DO_TEST (recode_command, 0, 0);\n  IF_LZMA (DO_TEST (secondary_lzma_default, 0, 0));\n#endif\n\n  IF_LZMA (DO_TEST (secondary_lzma, 0, 1));\n  IF_DJW (DO_TEST (secondary_huff, 0, DJW_MAX_GROUPS));\n  IF_FGK (DO_TEST (secondary_fgk, 0, 1));\n\n  DO_TEST (compressed_stream_overflow, 0, 0);\n  IF_LZMA (DO_TEST (compressed_stream_overflow, XD3_SEC_LZMA, 0));\n\nfailure:\n  test_cleanup ();\n  return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;\n#undef DO_TEST\n}\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.1",
    "content": ".TH XDELTA3 \"1\" \"August 2009\" \"Xdelta3\"\n.SH NAME\nxdelta3 \\- VCDIFF (RFC 3284) binary diff tool\n.SH SYNOPSIS\n.B xdelta3 \n.RI [ command ]\n.RI [ options ] \n.RI [ input \n.RI [ output ]]\n.SH DESCRIPTION\n.B xdelta3\nis a binary diff tool that uses the VCDIFF (RFC 3284) format and compression.\n.SH COMMANDS\n.TP\n.BI config\nprints xdelta3 configuration\n.TP\n.BI decode\ndecompress the input, also set by -d\n.TP\n.BI encode\ncompress the input, also set by -e (default)\n.TP\n.BI test\nrun the builtin tests\n.TP\n.BI printdelta\nprint information about the entire delta\n.TP\n.BI printhdr\nprint information about the first window\n.TP\n.BI printhdrs\nprint information about all windows\n.TP\n.BI recode\nencode with new application/secondary settings\n\n.SH OPTIONS\nstandard options:\n.TP\n.BI \"\\-0 .. \\-9\"\ncompression level\n.TP\n.BI \"\\-c\"\nuse stdout\n.TP\n.BI \"\\-d\"\ndecompress\n.TP\n.BI \\-e\ncompress\n.TP\n.BI \\-f\nforce overwrite\n.TP\n.BI \\-h\nshow help\n.TP\n.BI \\-q\nbe quiet\n.TP\n.BI \\-v\nbe verbose (max 2)\n.TP\n.BI \\-V\nshow version\n\n.TP\nmemory options:\n.TP\n.BI \\-B \n.RI bytes\nsource window size\n.TP\n.BI \\-W \n.RI bytes\ninput window size\n.TP\n.BI \\-P \n.RI size\ncompression duplicates window\n.TP\n.BI \\-I \n.RI size\ninstruction buffer size (0 = unlimited)\n\n.TP\ncompression options:\n.TP\n.BI \\-s\n.RI source\nsource file to copy from (if any)\n.TP\n.BI \"\\-S \" [djw|fgk]\nenable/disable secondary compression\n.TP\n.BI \\-N\ndisable small string-matching compression\n.TP\n.BI \\-D\ndisable external decompression (encode/decode)\n.TP\n.BI \\-R\ndisable external recompression (decode)\n.TP\n.BI \\-n\ndisable checksum (encode/decode)\n.TP\n.BI \\-C \nsoft config (encode, undocumented)\n.TP\n.BI \"\\-A \" [apphead]\ndisable/provide application header (encode)\n.TP\n.BI \\-J\ndisable output (check/compute only)\n.TP\n.BI \\-T\nuse alternate code table (test)\n\n.SH NOTES\nThe \n.B XDELTA\nenvironment variable may contain extra args:\n\n.RS\nXDELTA=\"-s source-x.y.tar.gz\" \\\\\n.br\ntar --use-compress-program=xdelta3 -cf \\\\\n.br\ntarget-x.z.tar.gz.vcdiff target-x.y/\n\n.SH EXAMPLES\n\nCompress the differences between SOURCE and TARGET, yielding OUT, \nusing \"djw\" secondary compression:\n\nxdelta3 -S djw -s SOURCE TARGET OUT\n\nDo the same, using standard input and output:\n\nxdelta3 -S djw -s SOURCE < TARGET > OUT\n\nTo decompress OUT, using SOURCE, yielding TARGET:\n\nxdelta3 -d -s SOURCE OUT TARGET\n\n.SH AUTHOR\nxdelta3 was written by Josh MacDonald <josh.macdonald@gmail.com>.\n.PP\nThis manual page was written by Leo 'costela' Antunes <costela@debian.org>\nfor the Debian project (but may be used by others).\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.c",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n   -------------------------------------------------------------------\n\n\t\t\t       Xdelta 3\n\n   The goal of this library is to to implement both the (stand-alone)\n   data-compression and delta-compression aspects of VCDIFF encoding, and\n   to support a programming interface that works like Zlib\n   (http://www.gzip.org/zlib.html). See RFC3284: The VCDIFF Generic\n   Differencing and Compression Data Format.\n\n   VCDIFF is a unified encoding that combines data-compression and\n   delta-encoding (\"differencing\").\n\n   VCDIFF has a detailed byte-code instruction set with many features.\n   The instruction format supports an immediate size operand for small\n   COPYs and ADDs (e.g., under 18 bytes).  There are also instruction\n   \"modes\", which are used to compress COPY addresses by using two\n   address caches.  An instruction mode refers to slots in the NEAR\n   and SAME caches for recent addresses.  NEAR remembers the\n   previous 4 (by default) COPY addresses, and SAME catches\n   frequent re-uses of the same address using a 3-way (by default)\n   256-entry associative cache of [ADDR mod 256], the encoded byte.\n   A hit in the NEAR/SAME cache requires 0/1 ADDR bytes.\n\n   VCDIFF has a default instruction table, but an alternate\n   instruction tables may themselves be be delta-compressed and\n   included in the encoding header.  This allows even more freedom.\n   There are 9 instruction modes in the default code table, 4 near, 3\n   same, VCD_SELF (absolute encoding) and VCD_HERE (relative to the\n   current position).\n\n   ----------------------------------------------------------------------\n\n  \t\t\t      Algorithms\n\n   Aside from the details of encoding and decoding, there are a bunch\n   of algorithms needed.\n\n   1. STRING-MATCH.  A two-level fingerprinting approach is used.  A\n   single loop computes the two checksums -- small and large -- at\n   successive offsets in the TARGET file.  The large checksum is more\n   accurate and is used to discover SOURCE matches, which are\n   potentially very long.  The small checksum is used to discover\n   copies within the TARGET.  Small matching, which is more expensive,\n   usually dominates the large STRING-MATCH costs in this code - the\n   more exhaustive the search, the better the results.  Either of the\n   two string-matching mechanisms may be disabled.\n\n   2. INSTRUCTION SELECTION.  The IOPT buffer here represents a queue\n   used to store overlapping copy instructions.  There are two possible\n   optimizations that go beyond a greedy search.  Both of these fall\n   into the category of \"non-greedy matching\" optimizations.\n\n   The first optimization stems from backward SOURCE-COPY matching.\n   When a new SOURCE-COPY instruction covers a previous instruction in\n   the target completely, it is erased from the queue.  Randal Burns\n   originally analyzed these algorithms and did a lot of related work\n   (\\cite the 1.5-pass algorithm).\n\n   The second optimization comes by the encoding of common very-small\n   COPY and ADD instructions, for which there are special DOUBLE-code\n   instructions, which code two instructions in a single byte.\n\n   The cost of bad instruction-selection overhead is relatively high\n   for data-compression, relative to delta-compression, so this second\n   optimization is fairly important.  With \"lazy\" matching (the name\n   used in Zlib for a similar optimization), the string-match\n   algorithm searches after a match for potential overlapping copy\n   instructions.  In Xdelta and by default, VCDIFF, the minimum match\n   size is 4 bytes, whereas Zlib searches with a 3-byte minimum.  This\n   feature, combined with double instructions, provides a nice\n   challenge.  Search in this file for \"black magic\", a heuristic.\n\n   3. STREAM ALIGNMENT.  Stream alignment is needed to compress large\n   inputs in constant space.  See xd3_srcwin_move_point().\n\n   4. WINDOW SELECTION.  When the IOPT buffer flushes, in the first call\n   to xd3_iopt_finish_encoding containing any kind of copy instruction,\n   the parameters of the source window must be decided: the offset into\n   the source and the length of the window.  Since the IOPT buffer is\n   finite, the program may be forced to fix these values before knowing\n   the best offset/length.\n\n   5. SECONDARY COMPRESSION.  VCDIFF supports a secondary encoding to\n   be applied to the individual sections of the data format, which are\n   ADDRess, INSTruction, and DATA.  Several secondary compressor\n   variations are implemented here, although none is standardized yet.\n\n   One is an adaptive huffman algorithm -- the FGK algorithm (Faller,\n   Gallager, and Knuth, 1985).  This compressor is extremely slow.\n\n   The other is a simple static Huffman routine, which is the base\n   case of a semi-adaptive scheme published by D.J. Wheeler and first\n   widely used in bzip2 (by Julian Seward).  This is a very\n   interesting algorithm, originally published in nearly cryptic form\n   by D.J. Wheeler. !!!NOTE!!! Because these are not standardized,\n   secondary compression remains off by default.\n   ftp://ftp.cl.cam.ac.uk/users/djw3/bred3.{c,ps}\n   --------------------------------------------------------------------\n\n\t\t\t    Other Features\n\n   1. USER CONVENIENCE\n\n   For user convenience, it is essential to recognize Gzip-compressed\n   files and automatically Gzip-decompress them prior to\n   delta-compression (or else no delta-compression will be achieved\n   unless the user manually decompresses the inputs).  The compressed\n   represention competes with Xdelta, and this must be hidden from the\n   command-line user interface.  The Xdelta-1.x encoding was simple, not\n   compressed itself, so Xdelta-1.x uses Zlib internally to compress the\n   representation.\n\n   This implementation supports external compression, which implements\n   the necessary fork() and pipe() mechanics.  There is a tricky step\n   involved to support automatic detection of a compressed input in a\n   non-seekable input.  First you read a bit of the input to detect\n   magic headers.  When a compressed format is recognized, exec() the\n   external compression program and create a second child process to\n   copy the original input stream. [Footnote: There is a difficulty\n   related to using Gzip externally. It is not possible to decompress\n   and recompress a Gzip file transparently.  If FILE.GZ had a\n   cryptographic signature, then, after: (1) Gzip-decompression, (2)\n   Xdelta-encoding, (3) Gzip-compression the signature could be\n   broken.  The only way to solve this problem is to guess at Gzip's\n   compression level or control it by other means.  I recommend that\n   specific implementations of any compression scheme store\n   information needed to exactly re-compress the input, that way\n   external compression is transparent - however, this won't happen\n   here until it has stabilized.]\n\n   2. APPLICATION-HEADER\n\n   This feature was introduced in RFC3284.  It allows any application\n   to include a header within the VCDIFF file format.  This allows\n   general inter-application data exchange with support for\n   application-specific extensions to communicate metadata.\n\n   3. VCDIFF CHECKSUM\n\n   An optional checksum value is included with each window, which can\n   be used to validate the final result.  This verifies the correct source\n   file was used for decompression as well as the obvious advantage:\n   checking the implementation (and underlying) correctness.\n\n   4. LIGHT WEIGHT\n\n   The code makes efforts to avoid copying data more than necessary.\n   The code delays many initialization tasks until the first use, it\n   optimizes for identical (perfectly matching) inputs.  It does not\n   compute any checksums until the first lookup misses.  Memory usage\n   is reduced.  String-matching is templatized (by slightly gross use\n   of CPP) to hard-code alternative compile-time defaults.  The code\n   has few outside dependencies.\n   ----------------------------------------------------------------------\n\n\t\tThe default rfc3284 instruction table:\n\t\t    (see RFC for the explanation)\n\n           TYPE      SIZE     MODE    TYPE     SIZE     MODE     INDEX\n   --------------------------------------------------------------------\n       1.  Run         0        0     Noop       0        0        0\n       2.  Add    0, [1,17]     0     Noop       0        0      [1,18]\n       3.  Copy   0, [4,18]     0     Noop       0        0     [19,34]\n       4.  Copy   0, [4,18]     1     Noop       0        0     [35,50]\n       5.  Copy   0, [4,18]     2     Noop       0        0     [51,66]\n       6.  Copy   0, [4,18]     3     Noop       0        0     [67,82]\n       7.  Copy   0, [4,18]     4     Noop       0        0     [83,98]\n       8.  Copy   0, [4,18]     5     Noop       0        0     [99,114]\n       9.  Copy   0, [4,18]     6     Noop       0        0    [115,130]\n      10.  Copy   0, [4,18]     7     Noop       0        0    [131,146]\n      11.  Copy   0, [4,18]     8     Noop       0        0    [147,162]\n      12.  Add       [1,4]      0     Copy     [4,6]      0    [163,174]\n      13.  Add       [1,4]      0     Copy     [4,6]      1    [175,186]\n      14.  Add       [1,4]      0     Copy     [4,6]      2    [187,198]\n      15.  Add       [1,4]      0     Copy     [4,6]      3    [199,210]\n      16.  Add       [1,4]      0     Copy     [4,6]      4    [211,222]\n      17.  Add       [1,4]      0     Copy     [4,6]      5    [223,234]\n      18.  Add       [1,4]      0     Copy       4        6    [235,238]\n      19.  Add       [1,4]      0     Copy       4        7    [239,242]\n      20.  Add       [1,4]      0     Copy       4        8    [243,246]\n      21.  Copy        4      [0,8]   Add        1        0    [247,255]\n   --------------------------------------------------------------------\n\n\t\t     Reading the source: Overview\n\n   This file includes itself in several passes to macro-expand certain\n   sections with variable forms.  Just read ahead, there's only a\n   little confusion.  I know this sounds ugly, but hard-coding some of\n   the string-matching parameters results in a 10-15% increase in\n   string-match performance.  The only time this hurts is when you have\n   unbalanced #if/endifs.\n\n   A single compilation unit tames the Makefile.  In short, this is to\n   allow the above-described hack without an explodingMakefile.  The\n   single compilation unit includes the core library features,\n   configurable string-match templates, optional main() command-line\n   tool, misc optional features, and a regression test.  Features are\n   controled with CPP #defines, see Makefile.am.\n\n   The initial __XDELTA3_C_HEADER_PASS__ starts first, the _INLINE_ and\n   _TEMPLATE_ sections follow.  Easy stuff first, hard stuff last.\n\n   Optional features include:\n\n     xdelta3-main.h     The command-line interface, external compression\n                        support, POSIX-specific, info & VCDIFF-debug tools.\n     xdelta3-second.h   The common secondary compression routines.\n     xdelta3-decoder.h  All decoding routines.\n     xdelta3-djw.h      The semi-adaptive huffman secondary encoder.\n     xdelta3-fgk.h      The adaptive huffman secondary encoder.\n     xdelta3-test.h     The unit test covers major algorithms,\n                        encoding and decoding.  There are single-bit\n                        error decoding tests.  There are 32/64-bit file size\n                        boundary tests.  There are command-line tests.\n                        There are compression tests.  There are external\n                        compression tests.  There are string-matching tests.\n\t\t\tThere should be more tests...\n\n   Additional headers include:\n\n     xdelta3.h          The public header file.\n     xdelta3-cfgs.h     The default settings for default, built-in\n                        encoders.  These are hard-coded at\n                        compile-time.  There is also a single\n                        soft-coded string matcher for experimenting\n                        with arbitrary values.\n     xdelta3-list.h     A cyclic list template\n\n   Misc little debug utilities:\n\n     badcopy.c          Randomly modifies an input file based on two\n                        parameters: (1) the probability that a byte in\n                        the file is replaced with a pseudo-random value,\n                        and (2) the mean change size.  Changes are\n                        generated using an expoential distribution\n                        which approximates the expected error_prob\n\t\t\tdistribution.\n   --------------------------------------------------------------------\n\n   This file itself is unusually large.  I hope to defend this layout\n   with lots of comments.  Everything in this file is related to\n   encoding and decoding.  I like it all together - the template stuff\n   is just a hack. */\n\n#ifndef __XDELTA3_C_HEADER_PASS__\n#define __XDELTA3_C_HEADER_PASS__\n\n#include \"xdelta3.h\"\n#include \"xdelta3-internal.h\"\n\n/***********************************************************************\n STATIC CONFIGURATION\n ***********************************************************************/\n\n#ifndef XD3_MAIN                  /* the main application */\n#define XD3_MAIN 0\n#endif\n\n#ifndef VCDIFF_TOOLS\n#define VCDIFF_TOOLS XD3_MAIN\n#endif\n\n#ifndef SECONDARY_FGK    /* one from the algorithm preservation department: */\n#define SECONDARY_FGK 0  /* adaptive Huffman routines */\n#endif\n\n#ifndef SECONDARY_DJW    /* semi-adaptive/static Huffman for the eventual */\n#define SECONDARY_DJW 0  /* standardization, off by default until such time. */\n#endif\n\n#ifndef SECONDARY_LZMA\n#ifdef HAVE_LZMA_H\n#define SECONDARY_LZMA 1\n#else\n#define SECONDARY_LZMA 0\n#endif\n#endif\n\n#if XD3_ENCODER\n#define IF_ENCODER(x) x\n#else\n#define IF_ENCODER(x)\n#endif\n\n/***********************************************************************/\n\n  /* header indicator bits */\n#define VCD_SECONDARY (1U << 0)  /* uses secondary compressor */\n#define VCD_CODETABLE (1U << 1)  /* supplies code table data */\n#define VCD_APPHEADER (1U << 2)  /* supplies application data */\n#define VCD_INVHDR    (~0x7U)\n\n  /* window indicator bits */\n#define VCD_SOURCE   (1U << 0)  /* copy window in source file */\n#define VCD_TARGET   (1U << 1)  /* copy window in target file */\n#define VCD_ADLER32  (1U << 2)  /* has adler32 checksum */\n#define VCD_INVWIN   (~0x7U)\n\n#define VCD_SRCORTGT (VCD_SOURCE | VCD_TARGET)\n\n  /* delta indicator bits */\n#define VCD_DATACOMP (1U << 0)\n#define VCD_INSTCOMP (1U << 1)\n#define VCD_ADDRCOMP (1U << 2)\n#define VCD_INVDEL   (~0x7U)\n\ntypedef enum {\n  VCD_DJW_ID    = 1,\n  VCD_LZMA_ID   = 2,\n  VCD_FGK_ID    = 16  /* Note: these are not standard IANA-allocated IDs! */\n} xd3_secondary_ids;\n\ntypedef enum {\n  SEC_NOFLAGS     = 0,\n\n  /* Note: SEC_COUNT_FREQS Not implemented (to eliminate 1st Huffman pass) */\n  SEC_COUNT_FREQS = (1 << 0)\n} xd3_secondary_flags;\n\ntypedef enum {\n  DATA_SECTION, /* These indicate which section to the secondary\n                 * compressor. */\n  INST_SECTION, /* The header section is not compressed, therefore not\n                 * listed here. */\n  ADDR_SECTION\n} xd3_section_type;\n\ntypedef unsigned int xd3_rtype;\n\n/***********************************************************************/\n\n#include \"xdelta3-list.h\"\n\n#if XD3_ENCODER\nXD3_MAKELIST(xd3_rlist, xd3_rinst, link);\n#endif\n\n/***********************************************************************/\n\n#define SECONDARY_MIN_SAVINGS 2  /* Secondary compression has to save\n\t\t\t\t    at least this many bytes. */\n#define SECONDARY_MIN_INPUT   10 /* Secondary compression needs at\n\t\t\t\t    least this many bytes. */\n\n#define VCDIFF_MAGIC1  0xd6  /* 1st file byte */\n#define VCDIFF_MAGIC2  0xc3  /* 2nd file byte */\n#define VCDIFF_MAGIC3  0xc4  /* 3rd file byte */\n#define VCDIFF_VERSION 0x00  /* 4th file byte */\n\n#define VCD_SELF       0     /* 1st address mode */\n#define VCD_HERE       1     /* 2nd address mode */\n\n#define SECONDARY_ANY (SECONDARY_DJW || SECONDARY_FGK || SECONDARY_LZMA)\n\n#define ALPHABET_SIZE      256  /* Used in test code--size of the secondary\n\t\t\t\t * compressor alphabet. */\n\n#define HASH_CKOFFSET      1U   /* Table entries distinguish \"no-entry\" from\n\t\t\t\t * offset 0 using this offset. */\n\n#define MAX_MATCH_SPLIT   18U   /* VCDIFF code table: 18 is the default limit\n\t\t\t\t * for direct-coded ADD sizes */\n\n#define LEAST_MATCH_INCR  0   /* The least number of bytes an overlapping\n\t\t\t       * match must beat the preceding match by.  This\n\t\t\t       * is a bias for the lazy match optimization.  A\n\t\t\t       * non-zero value means that an adjacent match\n\t\t\t       * has to be better by more than the step\n\t\t\t       * between them.  0. */\n\n#define MIN_MATCH         4U  /* VCDIFF code table: MIN_MATCH=4 */\n#define MIN_RUN           8U  /* The shortest run, if it is shorter than this\n\t\t\t       * an immediate add/copy will be just as good.\n\t\t\t       * ADD1/COPY6 = 1I+1D+1A bytes, RUN18 =\n\t\t\t       * 1I+1D+1A. */\n\n#define MAX_MODES         9  /* Maximum number of nodes used for\n\t\t\t      * compression--does not limit decompression. */\n\n#define ENC_SECTS         4  /* Number of separate output sections. */\n\n#define HDR_TAIL(s)  ((s)->enc_tails[0])\n#define DATA_TAIL(s) ((s)->enc_tails[1])\n#define INST_TAIL(s) ((s)->enc_tails[2])\n#define ADDR_TAIL(s) ((s)->enc_tails[3])\n\n#define HDR_HEAD(s)  ((s)->enc_heads[0])\n#define DATA_HEAD(s) ((s)->enc_heads[1])\n#define INST_HEAD(s) ((s)->enc_heads[2])\n#define ADDR_HEAD(s) ((s)->enc_heads[3])\n\n/* Template instances. */\n#if XD3_BUILD_SLOW\n#define IF_BUILD_SLOW(x) x\n#else\n#define IF_BUILD_SLOW(x)\n#endif\n#if XD3_BUILD_FAST\n#define IF_BUILD_FAST(x) x\n#else\n#define IF_BUILD_FAST(x)\n#endif\n#if XD3_BUILD_FASTER\n#define IF_BUILD_FASTER(x) x\n#else\n#define IF_BUILD_FASTER(x)\n#endif\n#if XD3_BUILD_FASTEST\n#define IF_BUILD_FASTEST(x) x\n#else\n#define IF_BUILD_FASTEST(x)\n#endif\n#if XD3_BUILD_SOFT\n#define IF_BUILD_SOFT(x) x\n#else\n#define IF_BUILD_SOFT(x)\n#endif\n#if XD3_BUILD_DEFAULT\n#define IF_BUILD_DEFAULT(x) x\n#else\n#define IF_BUILD_DEFAULT(x)\n#endif\n\n/* Update the run-length state */\n#define NEXTRUN(c) do { if ((c) == run_c) { run_l += 1; } \\\n  else { run_c = (c); run_l = 1; } } while (0)\n\n/* This CPP-conditional stuff can be cleaned up... */\n#if REGRESSION_TEST\n#define IF_REGRESSION(x) x\n#else\n#define IF_REGRESSION(x)\n#endif\n\n/***********************************************************************/\n\n#if XD3_ENCODER\nstatic void*       xd3_alloc0 (xd3_stream *stream,\n\t\t\t       usize_t      elts,\n\t\t\t       usize_t      size);\n\n\nstatic int         xd3_alloc_iopt (xd3_stream *stream, usize_t elts);\n\nstatic void        xd3_free_output (xd3_stream *stream,\n\t\t\t\t    xd3_output *output);\n\nstatic int         xd3_emit_double (xd3_stream *stream, xd3_rinst *first,\n\t\t\t\t    xd3_rinst *second, uint8_t code);\nstatic int         xd3_emit_single (xd3_stream *stream, xd3_rinst *single,\n\t\t\t\t    uint8_t code);\n\nstatic usize_t      xd3_sizeof_output (xd3_output *output);\nstatic void        xd3_encode_reset (xd3_stream *stream);\n\nstatic int         xd3_source_match_setup (xd3_stream *stream, xoff_t srcpos);\nstatic int         xd3_source_extend_match (xd3_stream *stream);\nstatic int         xd3_srcwin_setup (xd3_stream *stream);\nstatic usize_t     xd3_iopt_last_matched (xd3_stream *stream);\nstatic int         xd3_emit_uint32_t (xd3_stream *stream, xd3_output **output,\n\t\t\t\t      uint32_t num);\n\nstatic usize_t xd3_smatch (xd3_stream *stream,\n\t\t\t   usize_t base,\n\t\t\t   usize_t scksum,\n\t\t\t   usize_t *match_offset);\nstatic int xd3_string_match_init (xd3_stream *stream);\nstatic uint32_t xd3_scksum (uint32_t *state, const uint8_t *seg,\n\t\t\t    const usize_t ln);\nstatic usize_t xd3_comprun (const uint8_t *seg, usize_t slook, uint8_t *run_cp);\nstatic int xd3_srcwin_move_point (xd3_stream *stream,\n\t\t\t\t  usize_t *next_move_point);\n\nstatic int xd3_emit_run (xd3_stream *stream, usize_t pos,\n\t\t\t usize_t size, uint8_t *run_c);\nstatic xoff_t xd3_source_cksum_offset(xd3_stream *stream, usize_t low);\nstatic void xd3_scksum_insert (xd3_stream *stream,\n\t\t\t       usize_t inx,\n\t\t\t       usize_t scksum,\n\t\t\t       usize_t pos);\n\n\n#if XD3_DEBUG\nstatic void xd3_verify_run_state (xd3_stream    *stream,\n\t\t\t\t  const uint8_t *inp,\n\t\t\t\t  usize_t        x_run_l,\n\t\t\t\t  uint8_t       *x_run_c);\nstatic void xd3_verify_large_state (xd3_stream *stream,\n\t\t\t\t    const uint8_t *inp,\n\t\t\t\t    usize_t x_cksum);\nstatic void xd3_verify_small_state (xd3_stream    *stream,\n\t\t\t\t    const uint8_t *inp,\n\t\t\t\t    uint32_t       x_cksum);\n\n#endif /* XD3_DEBUG */\n#endif /* XD3_ENCODER */\n\nstatic int         xd3_decode_allocate (xd3_stream *stream, usize_t size,\n\t\t\t\t\tuint8_t **copied1, usize_t *alloc1);\n\nstatic void*       xd3_alloc (xd3_stream *stream, usize_t elts, usize_t size);\nstatic void        xd3_free  (xd3_stream *stream, void *ptr);\n\nconst char* xd3_strerror (int ret)\n{\n  switch (ret)\n    {\n    case XD3_INPUT: return \"XD3_INPUT\";\n    case XD3_OUTPUT: return \"XD3_OUTPUT\";\n    case XD3_GETSRCBLK: return \"XD3_GETSRCBLK\";\n    case XD3_GOTHEADER: return \"XD3_GOTHEADER\";\n    case XD3_WINSTART: return \"XD3_WINSTART\";\n    case XD3_WINFINISH: return \"XD3_WINFINISH\";\n    case XD3_TOOFARBACK: return \"XD3_TOOFARBACK\";\n    case XD3_INTERNAL: return \"XD3_INTERNAL\";\n    case XD3_INVALID: return \"XD3_INVALID\";\n    case XD3_INVALID_INPUT: return \"XD3_INVALID_INPUT\";\n    case XD3_NOSECOND: return \"XD3_NOSECOND\";\n    case XD3_UNIMPLEMENTED: return \"XD3_UNIMPLEMENTED\";\n    }\n  return NULL;\n}\n\n/***********************************************************************/\n\n#define xd3_sec_data(s) ((s)->sec_stream_d)\n#define xd3_sec_inst(s) ((s)->sec_stream_i)\n#define xd3_sec_addr(s) ((s)->sec_stream_a)\n\nstruct _xd3_sec_type\n{\n  uint8_t       id;\n  const char *name;\n  xd3_secondary_flags flags;\n\n  /* xd3_sec_stream is opaque to the generic code */\n  xd3_sec_stream* (*alloc)   (xd3_stream     *stream);\n  void            (*destroy) (xd3_stream     *stream,\n\t\t\t      xd3_sec_stream *sec);\n  int             (*init)    (xd3_stream     *stream,\n\t\t\t      xd3_sec_stream *sec_stream,\n\t\t\t      int             is_encode);\n  int             (*decode)  (xd3_stream     *stream,\n\t\t\t      xd3_sec_stream *sec_stream,\n\t\t\t      const uint8_t **input,\n\t\t\t      const uint8_t  *input_end,\n\t\t\t      uint8_t       **output,\n\t\t\t      const uint8_t  *output_end);\n#if XD3_ENCODER\n  int             (*encode)  (xd3_stream     *stream,\n\t\t\t      xd3_sec_stream *sec_stream,\n\t\t\t      xd3_output     *input,\n\t\t\t      xd3_output     *output,\n\t\t\t      xd3_sec_cfg    *cfg);\n#endif\n};\n\n#define BIT_STATE_ENCODE_INIT { 0, 1 }\n#define BIT_STATE_DECODE_INIT { 0, 0x100 }\n\ntypedef struct _bit_state bit_state;\nstruct _bit_state\n{\n  uint8_t cur_byte;\n  usize_t cur_mask;\n};\n\n#if SECONDARY_ANY == 0\n#define IF_SEC(x)\n#define IF_NSEC(x) x\n#else /* yuck */\n#define IF_SEC(x) x\n#define IF_NSEC(x)\nstatic int\nxd3_decode_secondary (xd3_stream      *stream,\n\t\t      xd3_desect      *sect,\n\t\t      xd3_sec_stream **sec_streamp);\n#if XD3_ENCODER\nstatic int\nxd3_encode_secondary (xd3_stream      *stream,\n\t\t      xd3_output     **head,\n\t\t      xd3_output     **tail,\n\t\t      xd3_sec_stream **sec_streamp,\n\t\t      xd3_sec_cfg     *cfg,\n\t\t      int             *did_it);\n#endif\n#endif /* SECONDARY_ANY */\n\n#if SECONDARY_FGK\nextern const xd3_sec_type fgk_sec_type;\n#define IF_FGK(x) x\n#define FGK_CASE(s) \\\n  s->sec_type = & fgk_sec_type; \\\n  break;\n#else\n#define IF_FGK(x)\n#define FGK_CASE(s) \\\n  s->msg = \"unavailable secondary compressor: FGK Adaptive Huffman\"; \\\n  return XD3_INTERNAL;\n#endif\n\n#if SECONDARY_DJW\nextern const xd3_sec_type djw_sec_type;\n#define IF_DJW(x) x\n#define DJW_CASE(s) \\\n  s->sec_type = & djw_sec_type; \\\n  break;\n#else\n#define IF_DJW(x)\n#define DJW_CASE(s) \\\n  s->msg = \"unavailable secondary compressor: DJW Static Huffman\"; \\\n  return XD3_INTERNAL;\n#endif\n\n#if SECONDARY_LZMA\nextern const xd3_sec_type lzma_sec_type;\n#define IF_LZMA(x) x\n#define LZMA_CASE(s) \\\n  s->sec_type = & lzma_sec_type; \\\n  break;\n#else\n#define IF_LZMA(x)\n#define LZMA_CASE(s) \\\n  s->msg = \"unavailable secondary compressor: LZMA\"; \\\n  return XD3_INTERNAL;\n#endif\n\n/***********************************************************************/\n\n#include \"xdelta3-hash.h\"\n\n/* Process template passes - this includes xdelta3.c several times. */\n#define __XDELTA3_C_TEMPLATE_PASS__\n#include \"xdelta3-cfgs.h\"\n#undef __XDELTA3_C_TEMPLATE_PASS__\n\n/* Process the inline pass. */\n#define __XDELTA3_C_INLINE_PASS__\n#include \"xdelta3.c\"\n#undef __XDELTA3_C_INLINE_PASS__\n\n/* Secondary compression */\n#if SECONDARY_ANY\n#include \"xdelta3-second.h\"\n#endif\n\n#if SECONDARY_FGK\n#include \"xdelta3-fgk.h\"\nconst xd3_sec_type fgk_sec_type =\n{\n  VCD_FGK_ID,\n  \"FGK Adaptive Huffman\",\n  SEC_NOFLAGS,\n  (xd3_sec_stream* (*)(xd3_stream*)) fgk_alloc,\n  (void (*)(xd3_stream*, xd3_sec_stream*)) fgk_destroy,\n  (int (*)(xd3_stream*, xd3_sec_stream*, int)) fgk_init,\n  (int (*)(xd3_stream*, xd3_sec_stream*, const uint8_t**, const uint8_t*,\n\t   uint8_t**, const uint8_t*)) xd3_decode_fgk,\n  IF_ENCODER((int (*)(xd3_stream*, xd3_sec_stream*, xd3_output*,\n\t\t      xd3_output*, xd3_sec_cfg*))   xd3_encode_fgk)\n};\n#endif\n\n#if SECONDARY_DJW\n#include \"xdelta3-djw.h\"\nconst xd3_sec_type djw_sec_type =\n{\n  VCD_DJW_ID,\n  \"Static Huffman\",\n  SEC_COUNT_FREQS,\n  (xd3_sec_stream* (*)(xd3_stream*)) djw_alloc,\n  (void (*)(xd3_stream*, xd3_sec_stream*)) djw_destroy,\n  (int (*)(xd3_stream*, xd3_sec_stream*, int)) djw_init,\n  (int (*)(xd3_stream*, xd3_sec_stream*, const uint8_t**, const uint8_t*,\n\t   uint8_t**, const uint8_t*)) xd3_decode_huff,\n  IF_ENCODER((int (*)(xd3_stream*, xd3_sec_stream*, xd3_output*,\n\t\t      xd3_output*, xd3_sec_cfg*))   xd3_encode_huff)\n};\n#endif\n\n#if SECONDARY_LZMA\n#include \"xdelta3-lzma.h\"\nconst xd3_sec_type lzma_sec_type =\n{\n  VCD_LZMA_ID,\n  \"lzma\",\n  SEC_NOFLAGS,\n  (xd3_sec_stream* (*)(xd3_stream*)) xd3_lzma_alloc,\n  (void (*)(xd3_stream*, xd3_sec_stream*)) xd3_lzma_destroy,\n  (int (*)(xd3_stream*, xd3_sec_stream*, int)) xd3_lzma_init,\n  (int (*)(xd3_stream*, xd3_sec_stream*, const uint8_t**, const uint8_t*,\n\t   uint8_t**, const uint8_t*)) xd3_decode_lzma,\n  IF_ENCODER((int (*)(xd3_stream*, xd3_sec_stream*, xd3_output*,\n\t\t      xd3_output*, xd3_sec_cfg*))   xd3_encode_lzma)\n};\n#endif\n\n#if XD3_MAIN || PYTHON_MODULE || SWIG_MODULE || NOT_MAIN\n#include \"xdelta3-main.h\"\n#endif\n\n#if REGRESSION_TEST\n#include \"xdelta3-test.h\"\n#endif\n\n#endif /* __XDELTA3_C_HEADER_PASS__ */\n#ifdef __XDELTA3_C_INLINE_PASS__\n\n/****************************************************************\n Instruction tables\n *****************************************************************/\n\n/* The following code implements a parametrized description of the\n * code table given above for a few reasons.  It is not necessary for\n * implementing the standard, to support compression with variable\n * tables, so an implementation is only required to know the default\n * code table to begin decompression.  (If the encoder uses an\n * alternate table, the table is included in compressed form inside\n * the VCDIFF file.)\n *\n * Before adding variable-table support there were two functions which\n * were hard-coded to the default table above.\n * xd3_compute_default_table() would create the default table by\n * filling a 256-elt array of xd3_dinst values.  The corresponding\n * function, xd3_choose_instruction(), would choose an instruction\n * based on the hard-coded parameters of the default code table.\n *\n * Notes: The parametrized code table description here only generates\n * tables of a certain regularity similar to the default table by\n * allowing to vary the distribution of single- and\n * double-instructions and change the number of near and same copy\n * modes.  More exotic tables are only possible by extending this\n * code.\n *\n * For performance reasons, both the parametrized and non-parametrized\n * versions of xd3_choose_instruction remain.  The parametrized\n * version is only needed for testing multi-table decoding support.\n * If ever multi-table encoding is required, this can be optimized by\n * compiling static functions for each table.\n */\n\n/* The XD3_CHOOSE_INSTRUCTION calls xd3_choose_instruction with the\n * table description when GENERIC_ENCODE_TABLES are in use.  The\n * IF_GENCODETBL macro enables generic-code-table specific code\n * (removed 10/2014). */\n#define XD3_CHOOSE_INSTRUCTION(stream,prev,inst) \\\n  xd3_choose_instruction (prev, inst)\n\n/* This structure maintains information needed by\n * xd3_choose_instruction to compute the code for a double instruction\n * by first indexing an array of code_table_sizes by copy mode, then\n * using (offset + (muliplier * X)) */\nstruct _xd3_code_table_sizes {\n  uint8_t cpy_max;\n  uint8_t offset;\n  uint8_t mult;\n};\n\n/* This contains a complete description of a code table. */\nstruct _xd3_code_table_desc\n{\n  /* Assumes a single RUN instruction */\n  /* Assumes that MIN_MATCH is 4 */\n\n  uint8_t add_sizes;            /* Number of immediate-size single\n\t\t\t\t   adds (default 17) */\n  uint8_t near_modes;           /* Number of near copy modes (default 4) */\n  uint8_t same_modes;           /* Number of same copy modes (default 3) */\n  uint8_t cpy_sizes;            /* Number of immediate-size single\n\t\t\t\t   copies (default 15) */\n\n  uint8_t addcopy_add_max;      /* Maximum add size for an add-copy\n\t\t\t\t   double instruction, all modes\n\t\t\t\t   (default 4) */\n  uint8_t addcopy_near_cpy_max; /* Maximum cpy size for an add-copy\n\t\t\t\t   double instruction, up through\n\t\t\t\t   VCD_NEAR modes (default 6) */\n  uint8_t addcopy_same_cpy_max; /* Maximum cpy size for an add-copy\n\t\t\t\t   double instruction, VCD_SAME modes\n\t\t\t\t   (default 4) */\n\n  uint8_t copyadd_add_max;      /* Maximum add size for a copy-add\n\t\t\t\t   double instruction, all modes\n\t\t\t\t   (default 1) */\n  uint8_t copyadd_near_cpy_max; /* Maximum cpy size for a copy-add\n\t\t\t\t   double instruction, up through\n\t\t\t\t   VCD_NEAR modes (default 4) */\n  uint8_t copyadd_same_cpy_max; /* Maximum cpy size for a copy-add\n\t\t\t\t   double instruction, VCD_SAME modes\n\t\t\t\t   (default 4) */\n\n  xd3_code_table_sizes addcopy_max_sizes[MAX_MODES];\n  xd3_code_table_sizes copyadd_max_sizes[MAX_MODES];\n};\n\n/* The rfc3284 code table is represented: */\nstatic const xd3_code_table_desc __rfc3284_code_table_desc = {\n  17, /* add sizes */\n  4,  /* near modes */\n  3,  /* same modes */\n  15, /* copy sizes */\n\n  4,  /* add-copy max add */\n  6,  /* add-copy max cpy, near */\n  4,  /* add-copy max cpy, same */\n\n  1,  /* copy-add max add */\n  4,  /* copy-add max cpy, near */\n  4,  /* copy-add max cpy, same */\n\n  /* addcopy */\n  { {6,163,3},{6,175,3},{6,187,3},{6,199,3},{6,211,3},{6,223,3},\n    {4,235,1},{4,239,1},{4,243,1} },\n  /* copyadd */\n  { {4,247,1},{4,248,1},{4,249,1},{4,250,1},{4,251,1},{4,252,1},\n    {4,253,1},{4,254,1},{4,255,1} },\n};\n\n/* Computes code table entries of TBL using the specified description. */\nstatic void\nxd3_build_code_table (const xd3_code_table_desc *desc, xd3_dinst *tbl)\n{\n  uint8_t size1, size2;\n  uint8_t mode;\n  usize_t cpy_modes = 2U + desc->near_modes + desc->same_modes;\n  xd3_dinst *d = tbl;\n\n  (d++)->type1 = XD3_RUN;\n  (d++)->type1 = XD3_ADD;\n\n  for (size1 = 1; size1 <= desc->add_sizes; size1 += 1, d += 1)\n    {\n      d->type1 = XD3_ADD;\n      d->size1 = size1;\n    }\n\n  for (mode = 0; mode < cpy_modes; mode += 1)\n    {\n      (d++)->type1 = XD3_CPY + mode;\n\n      for (size1 = MIN_MATCH; size1 < MIN_MATCH + desc->cpy_sizes;\n\t   size1 += 1, d += 1)\n\t{\n\t  d->type1 = XD3_CPY + mode;\n\t  d->size1 = size1;\n\t}\n    }\n\n  for (mode = 0; mode < cpy_modes; mode += 1)\n    {\n      for (size1 = 1; size1 <= desc->addcopy_add_max; size1 += 1)\n\t{\n\t  usize_t max = (mode < 2U + desc->near_modes) ?\n\t    desc->addcopy_near_cpy_max :\n\t    desc->addcopy_same_cpy_max;\n\n\t  for (size2 = MIN_MATCH; size2 <= max; size2 += 1, d += 1)\n\t    {\n\t      d->type1 = XD3_ADD;\n\t      d->size1 = size1;\n\t      d->type2 = XD3_CPY + mode;\n\t      d->size2 = size2;\n\t    }\n\t}\n    }\n\n  for (mode = 0; mode < cpy_modes; mode += 1)\n    {\n      usize_t max = (mode < 2U + desc->near_modes) ?\n\tdesc->copyadd_near_cpy_max :\n\tdesc->copyadd_same_cpy_max;\n\n      for (size1 = MIN_MATCH; size1 <= max; size1 += 1)\n\t{\n\t  for (size2 = 1; size2 <= desc->copyadd_add_max; size2 += 1, d += 1)\n\t    {\n\t      d->type1 = XD3_CPY + mode;\n\t      d->size1 = size1;\n\t      d->type2 = XD3_ADD;\n\t      d->size2 = size2;\n\t    }\n\t}\n    }\n\n  XD3_ASSERT (d - tbl == 256);\n}\n\n/* This function generates the static default code table. */\nstatic const xd3_dinst*\nxd3_rfc3284_code_table (void)\n{\n  static xd3_dinst __rfc3284_code_table[256];\n\n  if (__rfc3284_code_table[0].type1 != XD3_RUN)\n    {\n      xd3_build_code_table (& __rfc3284_code_table_desc, __rfc3284_code_table);\n    }\n\n  return __rfc3284_code_table;\n}\n\n#if XD3_ENCODER\n/* This version of xd3_choose_instruction is hard-coded for the default\n   table. */\nstatic void\nxd3_choose_instruction (xd3_rinst *prev, xd3_rinst *inst)\n{\n  switch (inst->type)\n    {\n    case XD3_RUN:\n      inst->code1 = 0;\n      break;\n\n    case XD3_ADD:\n      inst->code1 = 1;\n\n      if (inst->size <= 17)\n\t{\n\t  inst->code1 += inst->size;\n\n\t  if ( (inst->size == 1) &&\n\t       (prev != NULL) &&\n\t       (prev->size == 4) &&\n\t       (prev->type >= XD3_CPY) )\n\t    {\n\t      prev->code2 = 247 + (prev->type - XD3_CPY);\n\t    }\n\t}\n\n      break;\n\n    default:\n      {\n\tuint8_t mode = inst->type - XD3_CPY;\n\n\tXD3_ASSERT (inst->type >= XD3_CPY && inst->type < 12);\n\n\tinst->code1 = 19 + 16 * mode;\n\n\tif (inst->size <= 18 && inst->size >= 4)\n\t  {\n\t    inst->code1 += inst->size - 3;\n\n\t    if ( (prev != NULL) &&\n\t\t (prev->type == XD3_ADD) &&\n\t\t (prev->size <= 4) )\n\t      {\n\t\tif ( (inst->size <= 6) &&\n\t\t     (mode       <= 5) )\n\t\t  {\n\t\t    prev->code2 = (uint8_t)(163 + (mode * 12) +\n\t\t\t\t\t    (3 * (prev->size - 1)) +\n\t\t\t\t\t    (inst->size - 4));\n\t\t    XD3_ASSERT (prev->code2 <= 234);\n\t\t  }\n\t\telse if ( (inst->size == 4) &&\n\t\t\t  (mode       >= 6) )\n\t\t  {\n\t\t    prev->code2 = 235 + ((mode - 6) * 4) + (prev->size - 1);\n\n\t\t    XD3_ASSERT (prev->code2 <= 246);\n\t\t  }\n\t      }\n\t  }\n\n\tXD3_ASSERT (inst->code1 <= 162);\n      }\n      break;\n    }\n}\n#endif /* XD3_ENCODER */\n\n/***********************************************************************/\n\nstatic inline void\nxd3_swap_uint8p (uint8_t** p1, uint8_t** p2)\n{\n  uint8_t *t = (*p1);\n  (*p1) = (*p2);\n  (*p2) = t;\n}\n\nstatic inline void\nxd3_swap_usize_t (usize_t* p1, usize_t* p2)\n{\n  usize_t t = (*p1);\n  (*p1) = (*p2);\n  (*p2) = t;\n}\n\n/* It's not constant time, but it computes the log. */\nstatic int\nxd3_check_pow2 (xoff_t value, usize_t *logof)\n{\n  xoff_t x = 1;\n  usize_t nolog;\n  if (logof == NULL) {\n    logof = &nolog;\n  }\n\n  *logof = 0;\n\n  for (; x != 0; x <<= 1, *logof += 1)\n    {\n      if (x == value)\n\t{\n\t  return 0;\n\t}\n    }\n\n  return XD3_INTERNAL;\n}\n\nusize_t\nxd3_pow2_roundup (usize_t x)\n{\n  usize_t i = 1;\n  while (x > i) {\n    i <<= 1U;\n  }\n  return i;\n}\n\nstatic xoff_t\nxd3_xoff_roundup (xoff_t x)\n{\n  xoff_t i = 1;\n  while (x > i) {\n    i <<= 1U;\n  }\n  return i;\n}\n\nstatic usize_t\nxd3_round_blksize (usize_t sz, usize_t blksz)\n{\n  usize_t mod = sz & (blksz-1);\n\n  XD3_ASSERT (xd3_check_pow2 (blksz, NULL) == 0);\n\n  if (mod == 0)\n    {\n      return sz;\n    }\n\n  if (sz > USIZE_T_MAXBLKSZ)\n    {\n      return USIZE_T_MAXBLKSZ;\n    }\n\n  return sz + (blksz - mod);\n}\n\n/***********************************************************************\n Adler32 stream function: code copied from Zlib, defined in RFC1950\n ***********************************************************************/\n\n#define A32_BASE 65521L /* Largest prime smaller than 2^16 */\n#define A32_NMAX 5552   /* NMAX is the largest n such that 255n(n+1)/2\n\t\t\t   + (n+1)(BASE-1) <= 2^32-1 */\n\n#define A32_DO1(buf,i)  {s1 += buf[i]; s2 += s1;}\n#define A32_DO2(buf,i)  A32_DO1(buf,i); A32_DO1(buf,i+1);\n#define A32_DO4(buf,i)  A32_DO2(buf,i); A32_DO2(buf,i+2);\n#define A32_DO8(buf,i)  A32_DO4(buf,i); A32_DO4(buf,i+4);\n#define A32_DO16(buf)   A32_DO8(buf,0); A32_DO8(buf,8);\n\nstatic uint32_t adler32 (uint32_t adler, const uint8_t *buf, usize_t len)\n{\n    uint32_t s1 = adler & 0xffffU;\n    uint32_t s2 = (adler >> 16) & 0xffffU;\n    int k;\n\n    while (len > 0)\n      {\n        k    = (len < A32_NMAX) ? len : A32_NMAX;\n        len -= k;\n\n\twhile (k >= 16)\n\t  {\n\t    A32_DO16(buf);\n\t    buf += 16;\n            k -= 16;\n\t  }\n\n\tif (k != 0)\n\t  {\n\t    do\n\t      {\n\t\ts1 += *buf++;\n\t\ts2 += s1;\n\t      }\n\t    while (--k);\n\t  }\n\n        s1 %= A32_BASE;\n        s2 %= A32_BASE;\n    }\n\n    return (s2 << 16) | s1;\n}\n\n/***********************************************************************\n Run-length function\n ***********************************************************************/\n\n#if XD3_ENCODER\nstatic usize_t\nxd3_comprun (const uint8_t *seg, usize_t slook, uint8_t *run_cp)\n{\n  usize_t i;\n  usize_t run_l = 0;\n  uint8_t run_c = 0;\n\n  for (i = 0; i < slook; i += 1)\n    {\n      NEXTRUN(seg[i]);\n    }\n\n  (*run_cp) = run_c;\n\n  return run_l;\n}\n#endif\n\n/***********************************************************************\n Basic encoder/decoder functions\n ***********************************************************************/\n\n#if XD3_ENCODER\ninline int\nxd3_emit_byte (xd3_stream  *stream,\n\t       xd3_output **outputp,\n\t       uint8_t      code)\n{\n  xd3_output *output = (*outputp);\n\n  if (output->next == output->avail)\n    {\n      xd3_output *aoutput;\n\n      if ((aoutput = xd3_alloc_output (stream, output)) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n\n      output = (*outputp) = aoutput;\n    }\n\n  output->base[output->next++] = code;\n\n  return 0;\n}\n\ninline int\nxd3_emit_bytes (xd3_stream     *stream,\n\t\txd3_output    **outputp,\n\t\tconst uint8_t  *base,\n\t\tusize_t         size)\n{\n  xd3_output *output = (*outputp);\n\n  do\n    {\n      usize_t take;\n\n      if (output->next == output->avail)\n\t{\n\t  xd3_output *aoutput;\n\n\t  if ((aoutput = xd3_alloc_output (stream, output)) == NULL)\n\t    {\n\t      return ENOMEM;\n\t    }\n\n\t  output = (*outputp) = aoutput;\n\t}\n\n      take = xd3_min (output->avail - output->next, size);\n\n      memcpy (output->base + output->next, base, (size_t) take);\n\n      output->next += take;\n      size -= take;\n      base += take;\n    }\n  while (size > 0);\n\n  return 0;\n}\n#endif /* XD3_ENCODER */\n\n/***********************************************************************\n Address cache stuff\n ***********************************************************************/\n\nstatic int\nxd3_alloc_cache (xd3_stream *stream)\n{\n  if (stream->acache.near_array != NULL)\n    {\n      xd3_free (stream, stream->acache.near_array);\n    }\n\n  if (stream->acache.same_array != NULL)\n    {\n      xd3_free (stream, stream->acache.same_array);\n    }\n\n  if (((stream->acache.s_near > 0) &&\n       (stream->acache.near_array = (usize_t*)\n\txd3_alloc (stream, stream->acache.s_near,\n\t\t   (usize_t) sizeof (usize_t)))\n       == NULL) ||\n      ((stream->acache.s_same > 0) &&\n       (stream->acache.same_array = (usize_t*)\n\txd3_alloc (stream, stream->acache.s_same * 256,\n\t\t   (usize_t) sizeof (usize_t)))\n       == NULL))\n    {\n      return ENOMEM;\n    }\n\n  return 0;\n}\n\nvoid\nxd3_init_cache (xd3_addr_cache* acache)\n{\n  if (acache->s_near > 0)\n    {\n      memset (acache->near_array, 0, acache->s_near * sizeof (usize_t));\n      acache->next_slot = 0;\n    }\n\n  if (acache->s_same > 0)\n    {\n      memset (acache->same_array, 0, acache->s_same * 256 * sizeof (usize_t));\n    }\n}\n\nstatic void\nxd3_update_cache (xd3_addr_cache* acache, usize_t addr)\n{\n  if (acache->s_near > 0)\n    {\n      acache->near_array[acache->next_slot] = addr;\n      acache->next_slot = (acache->next_slot + 1) % acache->s_near;\n    }\n\n  if (acache->s_same > 0)\n    {\n      acache->same_array[addr % (acache->s_same*256)] = addr;\n    }\n}\n\n#if XD3_ENCODER\n/* OPT: this gets called a lot, can it be optimized? */\nstatic int\nxd3_encode_address (xd3_stream *stream,\n\t\t    usize_t addr,\n\t\t    usize_t here,\n\t\t    uint8_t* mode)\n{\n  usize_t d, bestd;\n  usize_t i, bestm;\n  int ret;\n  xd3_addr_cache* acache = & stream->acache;\n\n#define SMALLEST_INT(x) do { if (((x) & ~127U) == 0) { goto good; } } while (0)\n\n  /* Attempt to find the address mode that yields the smallest integer value\n   * for \"d\", the encoded address value, thereby minimizing the encoded size\n   * of the address. */\n  bestd = addr;\n  bestm = VCD_SELF;\n\n  XD3_ASSERT (addr < here);\n\n  SMALLEST_INT (bestd);\n\n  if ((d = here-addr) < bestd)\n    {\n      bestd = d;\n      bestm = VCD_HERE;\n\n      SMALLEST_INT (bestd);\n    }\n\n  for (i = 0; i < acache->s_near; i += 1)\n    {\n      /* Note: If we used signed computation here, we'd could compte d\n       * and then check (d >= 0 && d < bestd). */\n      if (addr >= acache->near_array[i])\n\t{\n\t  d = addr - acache->near_array[i];\n\n\t  if (d < bestd)\n\t    {\n\t      bestd = d;\n\t      bestm = i+2; /* 2 counts the VCD_SELF, VCD_HERE modes */\n\n\t      SMALLEST_INT (bestd);\n\t    }\n\t}\n    }\n\n  if (acache->s_same > 0 &&\n      acache->same_array[d = addr%(acache->s_same*256)] == addr)\n    {\n      bestd = d%256;\n      /* 2 + s_near offsets past the VCD_NEAR modes */\n      bestm = acache->s_near + 2 + d/256;\n\n      if ((ret = xd3_emit_byte (stream, & ADDR_TAIL (stream), bestd)))\n\t{\n\t  return ret;\n\t}\n    }\n  else\n    {\n    good:\n\n      if ((ret = xd3_emit_size (stream, & ADDR_TAIL (stream), bestd)))\n\t{\n\t  return ret;\n\t}\n    }\n\n  xd3_update_cache (acache, addr);\n\n  (*mode) += bestm;\n\n  return 0;\n}\n#endif\n\nstatic int\nxd3_decode_address (xd3_stream *stream, usize_t here,\n\t\t    usize_t mode, const uint8_t **inpp,\n\t\t    const uint8_t *max, usize_t *valp)\n{\n  int ret;\n  usize_t same_start = 2 + stream->acache.s_near;\n\n  if (mode < same_start)\n    {\n      if ((ret = xd3_read_size (stream, inpp, max, valp))) { return ret; }\n\n      switch (mode)\n\t{\n\tcase VCD_SELF:\n\t  break;\n\tcase VCD_HERE:\n\t  (*valp) = here - (*valp);\n\t  break;\n\tdefault:\n\t  (*valp) += stream->acache.near_array[mode - 2];\n\t  break;\n\t}\n    }\n  else\n    {\n      if (*inpp == max)\n\t{\n\t  stream->msg = \"address underflow\";\n\t  return XD3_INVALID_INPUT;\n\t}\n\n      mode -= same_start;\n\n      (*valp) = stream->acache.same_array[mode*256 + (**inpp)];\n\n      (*inpp) += 1;\n    }\n\n  xd3_update_cache (& stream->acache, *valp);\n\n  return 0;\n}\n\n/***********************************************************************\n Alloc/free\n***********************************************************************/\n\nstatic void*\n__xd3_alloc_func (void* opaque, size_t items, usize_t size)\n{\n  return malloc (items * (size_t) size);\n}\n\nstatic void\n__xd3_free_func (void* opaque, void* address)\n{\n  free (address);\n}\n\nstatic void*\nxd3_alloc (xd3_stream *stream,\n\t   usize_t      elts,\n\t   usize_t      size)\n{\n  void *a = stream->alloc (stream->opaque, elts, size);\n\n  if (a != NULL)\n    {\n      IF_DEBUG (stream->alloc_cnt += 1);\n      IF_DEBUG2 (DP(RINT \"[stream %p malloc] size %\"W\"u ptr %p\\n\",\n\t\t    (void*)stream, elts * size, a));\n    }\n  else\n    {\n      stream->msg = \"out of memory\";\n    }\n\n  return a;\n}\n\nstatic void\nxd3_free (xd3_stream *stream,\n\t  void       *ptr)\n{\n  if (ptr != NULL)\n    {\n      IF_DEBUG (stream->free_cnt += 1);\n      XD3_ASSERT (stream->free_cnt <= stream->alloc_cnt);\n      IF_DEBUG2 (DP(RINT \"[stream %p free] %p\\n\",\n\t\t    (void*)stream, ptr));\n      stream->free (stream->opaque, ptr);\n    }\n}\n\n#if XD3_ENCODER\nstatic void*\nxd3_alloc0 (xd3_stream *stream,\n\t    usize_t      elts,\n\t    usize_t      size)\n{\n  void *a = xd3_alloc (stream, elts, size);\n\n  if (a != NULL)\n    {\n      memset (a, 0, (size_t) (elts * size));\n    }\n\n  return a;\n}\n\nxd3_output*\nxd3_alloc_output (xd3_stream *stream,\n\t\t  xd3_output *old_output)\n{\n  xd3_output *output;\n  uint8_t    *base;\n\n  if (stream->enc_free != NULL)\n    {\n      output = stream->enc_free;\n      stream->enc_free = output->next_page;\n    }\n  else\n    {\n      if ((output = (xd3_output*) xd3_alloc (stream, 1,\n\t\t\t\t\t     (usize_t) sizeof (xd3_output)))\n\t  == NULL)\n\t{\n\t  return NULL;\n\t}\n\n      if ((base = (uint8_t*) xd3_alloc (stream, XD3_ALLOCSIZE,\n\t\t\t\t\tsizeof (uint8_t))) == NULL)\n\t{\n\t  xd3_free (stream, output);\n\t  return NULL;\n\t}\n\n      output->base  = base;\n      output->avail = XD3_ALLOCSIZE;\n    }\n\n  output->next = 0;\n\n  if (old_output)\n    {\n      old_output->next_page = output;\n    }\n\n  output->next_page = NULL;\n\n  return output;\n}\n\nstatic usize_t\nxd3_sizeof_output (xd3_output *output)\n{\n  usize_t s = 0;\n\n  for (; output; output = output->next_page)\n    {\n      s += output->next;\n    }\n\n  return s;\n}\n\nstatic void\nxd3_freelist_output (xd3_stream *stream,\n\t\t     xd3_output *output)\n{\n  xd3_output *tmp;\n\n  while (output)\n    {\n      tmp    = output;\n      output = output->next_page;\n\n      tmp->next = 0;\n      tmp->next_page = stream->enc_free;\n      stream->enc_free = tmp;\n    }\n}\n\nstatic void\nxd3_free_output (xd3_stream *stream,\n\t\t xd3_output *output)\n{\n  xd3_output *next;\n\n again:\n  if (output == NULL)\n    {\n      return;\n    }\n\n  next = output->next_page;\n\n  xd3_free (stream, output->base);\n  xd3_free (stream, output);\n\n  output = next;\n  goto again;\n}\n#endif /* XD3_ENCODER */\n\nvoid\nxd3_free_stream (xd3_stream *stream)\n{\n  xd3_iopt_buflist *blist = stream->iopt_alloc;\n\n  while (blist != NULL)\n    {\n      xd3_iopt_buflist *tmp = blist;\n      blist = blist->next;\n      xd3_free (stream, tmp->buffer);\n      xd3_free (stream, tmp);\n    }\n\n#if XD3_ENCODER\n  xd3_free (stream, stream->large_table);\n  xd3_free (stream, stream->small_table);\n  xd3_free (stream, stream->large_hash.powers);\n  xd3_free (stream, stream->small_hash.powers);\n  xd3_free (stream, stream->small_prev);\n\n  {\n    int i;\n    for (i = 0; i < ENC_SECTS; i += 1)\n      {\n\txd3_free_output (stream, stream->enc_heads[i]);\n      }\n    xd3_free_output (stream, stream->enc_free);\n  }\n#endif\n\n  xd3_free (stream, stream->acache.near_array);\n  xd3_free (stream, stream->acache.same_array);\n\n  xd3_free (stream, stream->inst_sect.copied1);\n  xd3_free (stream, stream->addr_sect.copied1);\n  xd3_free (stream, stream->data_sect.copied1);\n\n  if (stream->dec_lastwin != stream->dec_buffer)\n    {\n      xd3_free (stream, (uint8_t*) stream->dec_lastwin);\n    }\n  xd3_free (stream, stream->dec_buffer);\n\n  xd3_free (stream, stream->buf_in);\n  xd3_free (stream, stream->dec_appheader);\n  xd3_free (stream, stream->dec_codetbl);\n  xd3_free (stream, stream->code_table_alloc);\n\n#if SECONDARY_ANY\n  xd3_free (stream, stream->inst_sect.copied2);\n  xd3_free (stream, stream->addr_sect.copied2);\n  xd3_free (stream, stream->data_sect.copied2);\n\n  if (stream->sec_type != NULL)\n    {\n      stream->sec_type->destroy (stream, stream->sec_stream_d);\n      stream->sec_type->destroy (stream, stream->sec_stream_i);\n      stream->sec_type->destroy (stream, stream->sec_stream_a);\n    }\n#endif\n\n  xd3_free (stream, stream->whole_target.adds);\n  xd3_free (stream, stream->whole_target.inst);\n  xd3_free (stream, stream->whole_target.wininfo);\n\n  XD3_ASSERT (stream->alloc_cnt == stream->free_cnt);\n\n  memset (stream, 0, sizeof (xd3_stream));\n}\n\n#if (XD3_DEBUG > 1 || VCDIFF_TOOLS)\nstatic const char*\nxd3_rtype_to_string (xd3_rtype type, int print_mode)\n{\n  switch (type)\n    {\n    case XD3_NOOP:\n      return \"NOOP \";\n    case XD3_RUN:\n      return \"RUN  \";\n    case XD3_ADD:\n      return \"ADD  \";\n    default: break;\n    }\n  if (! print_mode)\n    {\n      return \"CPY  \";\n    }\n  switch (type)\n    {\n    case XD3_CPY + 0: return \"CPY_0\";\n    case XD3_CPY + 1: return \"CPY_1\";\n    case XD3_CPY + 2: return \"CPY_2\";\n    case XD3_CPY + 3: return \"CPY_3\";\n    case XD3_CPY + 4: return \"CPY_4\";\n    case XD3_CPY + 5: return \"CPY_5\";\n    case XD3_CPY + 6: return \"CPY_6\";\n    case XD3_CPY + 7: return \"CPY_7\";\n    case XD3_CPY + 8: return \"CPY_8\";\n    case XD3_CPY + 9: return \"CPY_9\";\n    default:          return \"CPY>9\";\n    }\n}\n#endif\n\n/****************************************************************\n Stream configuration\n ******************************************************************/\n\nint\nxd3_config_stream(xd3_stream *stream,\n\t\t  xd3_config *config)\n{\n  int ret;\n  xd3_config defcfg;\n  xd3_smatcher *smatcher = &stream->smatcher;\n\n  if (config == NULL)\n    {\n      config = & defcfg;\n      memset (config, 0, sizeof (*config));\n    }\n\n  /* Initial setup: no error checks yet */\n  memset (stream, 0, sizeof (*stream));\n\n  stream->winsize = config->winsize ? config->winsize : XD3_DEFAULT_WINSIZE;\n  stream->sprevsz = config->sprevsz ? config->sprevsz : XD3_DEFAULT_SPREVSZ;\n\n  if (config->iopt_size == 0)\n    {\n      stream->iopt_size = XD3_ALLOCSIZE / sizeof(xd3_rinst);\n      stream->iopt_unlimited = 1;\n    }\n  else\n    {\n      stream->iopt_size = config->iopt_size;\n    }\n\n  stream->getblk    = config->getblk;\n  stream->alloc     = config->alloc ? config->alloc : __xd3_alloc_func;\n  stream->free      = config->freef ? config->freef : __xd3_free_func;\n  stream->opaque    = config->opaque;\n  stream->flags     = config->flags;\n\n  /* Secondary setup. */\n  stream->sec_data  = config->sec_data;\n  stream->sec_inst  = config->sec_inst;\n  stream->sec_addr  = config->sec_addr;\n\n  stream->sec_data.data_type = DATA_SECTION;\n  stream->sec_inst.data_type = INST_SECTION;\n  stream->sec_addr.data_type = ADDR_SECTION;\n\n  /* Check static sizes. */\n  if (sizeof (usize_t) != SIZEOF_USIZE_T ||\n      sizeof (xoff_t) != SIZEOF_XOFF_T ||\n      (ret = xd3_check_pow2(XD3_ALLOCSIZE, NULL)))\n    {\n      stream->msg = \"incorrect compilation: wrong integer sizes\";\n      return XD3_INTERNAL;\n    }\n\n  /* Check/set secondary compressor. */\n  switch (stream->flags & XD3_SEC_TYPE)\n    {\n    case 0:\n      if (stream->flags & XD3_SEC_NOALL)\n\t{\n\t  stream->msg = \"XD3_SEC flags require a secondary compressor type\";\n\t  return XD3_INTERNAL;\n\t}\n      break;\n    case XD3_SEC_FGK:\n      FGK_CASE (stream);\n    case XD3_SEC_DJW:\n      DJW_CASE (stream);\n    case XD3_SEC_LZMA:\n      LZMA_CASE (stream);\n    default:\n      stream->msg = \"too many secondary compressor types set\";\n      return XD3_INTERNAL;\n    }\n\n  stream->code_table_desc = & __rfc3284_code_table_desc;\n  stream->code_table_func = xd3_rfc3284_code_table;\n\n  /* Check sprevsz */\n  if (smatcher->small_chain == 1 &&\n      smatcher->small_lchain == 1)\n    {\n      stream->sprevsz = 0;\n    }\n  else\n    {\n      if ((ret = xd3_check_pow2 (stream->sprevsz, NULL)))\n\t{\n\t  stream->msg = \"sprevsz is required to be a power of two\";\n\t  return XD3_INTERNAL;\n\t}\n\n      stream->sprevmask = stream->sprevsz - 1;\n    }\n\n  /* Default scanner settings. */\n#if XD3_ENCODER\n  switch (config->smatch_cfg)\n    {\n      IF_BUILD_SOFT(case XD3_SMATCH_SOFT:\n      {\n\t*smatcher = config->smatcher_soft;\n\tsmatcher->string_match = __smatcher_soft.string_match;\n\tsmatcher->name = __smatcher_soft.name;\n\tif (smatcher->large_look  < MIN_MATCH ||\n\t    smatcher->large_step  < 1         ||\n\t    smatcher->small_look  < MIN_MATCH)\n\t  {\n\t    stream->msg = \"invalid soft string-match config\";\n\t    return XD3_INVALID;\n\t  }\n\tbreak;\n      })\n\n      IF_BUILD_DEFAULT(case XD3_SMATCH_DEFAULT:\n\t\t    *smatcher = __smatcher_default;\n\t\t    break;)\n      IF_BUILD_SLOW(case XD3_SMATCH_SLOW:\n\t\t    *smatcher = __smatcher_slow;\n\t\t    break;)\n      IF_BUILD_FASTEST(case XD3_SMATCH_FASTEST:\n\t\t    *smatcher = __smatcher_fastest;\n\t\t    break;)\n      IF_BUILD_FASTER(case XD3_SMATCH_FASTER:\n\t\t    *smatcher = __smatcher_faster;\n\t\t    break;)\n      IF_BUILD_FAST(case XD3_SMATCH_FAST:\n\t\t    *smatcher = __smatcher_fast;\n\t\t    break;)\n    default:\n      stream->msg = \"invalid string match config type\";\n      return XD3_INTERNAL;\n    }\n\n  if (config->smatch_cfg == XD3_SMATCH_DEFAULT &&\n      (stream->flags & XD3_COMPLEVEL_MASK) != 0)\n    {\n      int level = (stream->flags & XD3_COMPLEVEL_MASK) >> XD3_COMPLEVEL_SHIFT;\n\n      switch (level)\n\t{\n\tcase 1:\n\t  IF_BUILD_FASTEST(*smatcher = __smatcher_fastest;\n\t\t\t   break;)\n\tcase 2:\n\t  IF_BUILD_FASTER(*smatcher = __smatcher_faster;\n\t\t\t   break;)\n\tcase 3: case 4: case 5:\n\t  IF_BUILD_FAST(*smatcher = __smatcher_fast;\n\t\t\tbreak;)\n\tcase 6:\n\t  IF_BUILD_DEFAULT(*smatcher = __smatcher_default;\n\t\t\t   break;)\n\tdefault:\n\t  IF_BUILD_SLOW(*smatcher = __smatcher_slow;\n\t\t\tbreak;)\n\t  IF_BUILD_DEFAULT(*smatcher = __smatcher_default;\n\t\t\t   break;)\n\t  IF_BUILD_FAST(*smatcher = __smatcher_fast;\n\t\t\tbreak;)\n\t  IF_BUILD_FASTER(*smatcher = __smatcher_faster;\n\t\t\tbreak;)\n\t  IF_BUILD_FASTEST(*smatcher = __smatcher_fastest;\n\t\t\t   break;)\n\t}\n    }\n#endif\n\n  return 0;\n}\n\n/***********************************************************\n Getblk interface\n ***********************************************************/\n\ninline\nxoff_t xd3_source_eof(const xd3_source *src)\n{\n  xoff_t r = (src->max_blkno << src->shiftby) + (xoff_t)src->onlastblk;\n  return r;\n}\n\ninline\nusize_t xd3_bytes_on_srcblk (xd3_source *src, xoff_t blkno)\n{\n  usize_t r = (blkno == src->max_blkno ?\n\t       src->onlastblk :\n\t       src->blksize);\n  return r;\n}\n\n/* This function interfaces with the client getblk function, checks\n * its results, updates max_blkno, onlastblk, eof_known. */\nstatic int\nxd3_getblk (xd3_stream *stream, xoff_t blkno)\n{\n  int ret;\n  xd3_source *source = stream->src;\n\n  if (source->curblk == NULL || blkno != source->curblkno)\n    {\n      source->getblkno = blkno;\n\n      if (stream->getblk == NULL)\n\t{\n\t  IF_DEBUG2 (DP(RINT \"[getblk] XD3_GETSRCBLK %\"Q\"u\\n\", blkno));\n\t  stream->msg = \"getblk source input\";\n\t  return XD3_GETSRCBLK;\n\t}\n\n      ret = stream->getblk (stream, source, blkno);\n      if (ret != 0)\n\t{\n\t  IF_DEBUG2 (DP(RINT \"[getblk] app error blkno %\"Q\"u: %s\\n\",\n\t\t\tblkno, xd3_strerror (ret)));\n\t  return ret;\n\t}\n\n      IF_DEBUG2 (DP(RINT \"[getblk] read source block %\"Q\"u onblk \"\n\t\t    \"%\"W\"u blksize %\"W\"u max_blkno %\"Q\"u\\n\", blkno, source->onblk,\n\t\t    source->blksize, source->max_blkno));\n    }\n\n  if (blkno > source->max_blkno)\n    {\n      source->max_blkno = blkno;\n\n      if (source->onblk == source->blksize)\n\t{\n\t  IF_DEBUG1 (DP(RINT \"[getblk] full source blkno %\"Q\"u: \"\n\t\t\t\"source length unknown %\"Q\"u\\n\",\n\t\t\tblkno,\n\t\t\txd3_source_eof (source)));\n\t}\n      else if (!source->eof_known)\n\t{\n\t  IF_DEBUG1 (DP(RINT \"[getblk] eof block has %\"W\"u bytes; \"\n\t\t\t\"source length known %\"Q\"u\\n\",\n\t\t\txd3_bytes_on_srcblk (source, blkno),\n\t\t\txd3_source_eof (source)));\n\t  source->eof_known = 1;\n\t}\n    }\n\n  XD3_ASSERT (source->curblk != NULL);\n\n  if (blkno == source->max_blkno)\n    {\n      /* In case the application sets the source as 1 block w/ a\n       * preset buffer. */\n      source->onlastblk = source->onblk;\n    }\n  return 0;\n}\n\n/***********************************************************\n Stream open/close\n ***************************************************************/\n\nint\nxd3_set_source (xd3_stream *stream,\n\t\txd3_source *src)\n{\n  usize_t shiftby;\n\n  stream->src = src;\n  src->srclen  = 0;\n  src->srcbase = 0;\n\n  /* Enforce power-of-two blocksize so that source-block number\n   * calculations are cheap. */\n  if (xd3_check_pow2 (src->blksize, &shiftby) != 0)\n    {\n      src->blksize = xd3_pow2_roundup(src->blksize);\n      xd3_check_pow2 (src->blksize, &shiftby);\n      IF_DEBUG1 (DP(RINT \"raising src_blksz to %\"W\"u\\n\", src->blksize));\n    }\n\n  src->shiftby = shiftby;\n  src->maskby = (1ULL << shiftby) - 1ULL;\n\n  if (xd3_check_pow2 (src->max_winsize, NULL) != 0)\n    {\n      src->max_winsize = xd3_xoff_roundup(src->max_winsize);\n      IF_DEBUG1 (DP(RINT \"raising src_maxsize to %\"W\"u\\n\", src->blksize));\n    }\n  src->max_winsize = xd3_max (src->max_winsize, XD3_ALLOCSIZE);\n  return 0;\n}\n\nint\nxd3_set_source_and_size (xd3_stream *stream,\n\t\t\t xd3_source *user_source,\n\t\t\t xoff_t source_size) {\n  int ret = xd3_set_source (stream, user_source);\n  if (ret == 0)\n    {\n      stream->src->eof_known = 1;\n      IF_DEBUG2 (DP(RINT \"[set source] size known %\"Q\"u\\n\",\n\t\t    source_size));\n      xd3_blksize_div(source_size,\n\t\t      stream->src,\n\t\t      &stream->src->max_blkno,\n\t\t      &stream->src->onlastblk);\n\n      IF_DEBUG1 (DP(RINT \"[set source] size known %\"Q\"u max_blkno %\"Q\"u\\n\",\n\t\t    source_size, stream->src->max_blkno));\n    }\n  return ret;\n}\n\nvoid\nxd3_abort_stream (xd3_stream *stream)\n{\n  stream->dec_state = DEC_ABORTED;\n  stream->enc_state = ENC_ABORTED;\n}\n\nint\nxd3_close_stream (xd3_stream *stream)\n{\n  if (stream->enc_state != 0 && stream->enc_state != ENC_ABORTED)\n    {\n      if (stream->buf_leftover != NULL)\n\t{\n\t  stream->msg = \"encoding is incomplete\";\n\t  return XD3_INTERNAL;\n\t}\n\n      if (stream->enc_state == ENC_POSTWIN)\n\t{\n#if XD3_ENCODER\n\t  xd3_encode_reset (stream);\n#endif\n\t  stream->current_window += 1;\n\t  stream->enc_state = ENC_INPUT;\n\t}\n\n      /* If encoding, should be ready for more input but not actually\n\t have any. */\n      if (stream->enc_state != ENC_INPUT || stream->avail_in != 0)\n\t{\n\t  stream->msg = \"encoding is incomplete\";\n\t  return XD3_INTERNAL;\n\t}\n    }\n  else\n    {\n      switch (stream->dec_state)\n\t{\n\tcase DEC_VCHEAD:\n\tcase DEC_WININD:\n\t  /* TODO: Address the zero-byte ambiguity.  Does the encoder\n\t   * emit a window or not?  If so, then catch an error here.\n\t   * If not, need another routine to say\n\t   * decode_at_least_one_if_empty. */\n\tcase DEC_ABORTED:\n\t  break;\n\tdefault:\n\t  /* If decoding, should be ready for the next window. */\n\t  stream->msg = \"eof in decode\";\n\t  return XD3_INVALID_INPUT;\n\t}\n    }\n\n  return 0;\n}\n\n/**************************************************************\n Application header\n ****************************************************************/\n\nint\nxd3_get_appheader (xd3_stream  *stream,\n\t\t   uint8_t    **data,\n\t\t   usize_t      *size)\n{\n  if (stream->dec_state < DEC_WININD)\n    {\n      stream->msg = \"application header not available\";\n      return XD3_INTERNAL;\n    }\n\n  (*data) = stream->dec_appheader;\n  (*size) = stream->dec_appheadsz;\n  return 0;\n}\n\n/**********************************************************\n Decoder stuff\n *************************************************/\n\n#include \"xdelta3-decode.h\"\n\n/****************************************************************\n Encoder stuff\n *****************************************************************/\n\n#if XD3_ENCODER\nvoid\nxd3_set_appheader (xd3_stream    *stream,\n\t\t   const uint8_t *data,\n\t\t   usize_t         size)\n{\n  stream->enc_appheader = data;\n  stream->enc_appheadsz = size;\n}\n\n#if XD3_DEBUG\nstatic int\nxd3_iopt_check (xd3_stream *stream)\n{\n  usize_t ul = xd3_rlist_length (& stream->iopt_used);\n  usize_t fl = xd3_rlist_length (& stream->iopt_free);\n\n  return (ul + fl + (stream->iout ? 1 : 0)) == stream->iopt_size;\n}\n#endif\n\nstatic xd3_rinst*\nxd3_iopt_free (xd3_stream *stream, xd3_rinst *i)\n{\n  xd3_rinst *n = xd3_rlist_remove (i);\n  xd3_rlist_push_back (& stream->iopt_free, i);\n  return n;\n}\n\nstatic void\nxd3_iopt_free_nonadd (xd3_stream *stream, xd3_rinst *i)\n{\n  if (i->type != XD3_ADD)\n    {\n      xd3_rlist_push_back (& stream->iopt_free, i);\n    }\n}\n\n/* When an instruction is ready to flush from the iopt buffer, this\n * function is called to produce an encoding.  It writes the\n * instruction plus size, address, and data to the various encoding\n * sections. */\nstatic int\nxd3_iopt_finish_encoding (xd3_stream *stream, xd3_rinst *inst)\n{\n  int ret;\n\n  /* Check for input overflow. */\n  XD3_ASSERT (inst->pos + inst->size <= stream->avail_in);\n\n  switch (inst->type)\n    {\n    case XD3_CPY:\n      {\n\t/* the address may have an offset if there is a source window. */\n\tusize_t addr;\n\txd3_source *src = stream->src;\n\n\tif (src != NULL)\n\t  {\n\t    /* If there is a source copy, the source must have its\n\t     * source window decided before we can encode.  This can\n\t     * be bad -- we have to make this decision even if no\n\t     * source matches have been found. */\n\t    if (stream->srcwin_decided == 0)\n\t      {\n\t\tif ((ret = xd3_srcwin_setup (stream))) { return ret; }\n\t      }\n\t    else\n\t      {\n\t\tstream->srcwin_decided_early = (!stream->src->eof_known ||\n\t\t\t\t\t\t(stream->srcwin_cksum_pos <\n\t\t\t\t\t\t xd3_source_eof (stream->src)));\n\t      }\n\n\t    /* xtra field indicates the copy is from the source */\n\t    if (inst->xtra)\n\t      {\n\t\tXD3_ASSERT (inst->addr >= src->srcbase);\n\t\tXD3_ASSERT (inst->addr + inst->size <=\n\t\t\t    src->srcbase + src->srclen);\n\t\taddr = inst->addr - src->srcbase;\n\t\tstream->n_scpy += 1;\n\t\tstream->l_scpy += inst->size;\n\t      }\n\t    else\n\t      {\n\t\t/* with source window: target copy address is offset\n\t\t * by taroff. */\n\t\taddr = stream->taroff + inst->addr;\n\t\tstream->n_tcpy += 1;\n\t\tstream->l_tcpy += inst->size;\n\t      }\n\t  }\n\telse\n\t  {\n\t    addr = inst->addr;\n\t    stream->n_tcpy += 1;\n\t    stream->l_tcpy += inst->size;\n\t  }\n\n\t/* Note: used to assert inst->size >= MIN_MATCH, but not true\n\t * for merge operations & identical match heuristics. */\n\t/* the \"here\" position is always offset by taroff */\n\tif ((ret = xd3_encode_address (stream, addr, inst->pos + stream->taroff,\n\t\t\t\t       & inst->type)))\n\t  {\n\t    return ret;\n\t  }\n\n\tIF_DEBUG2 ({\n\t  static int cnt;\n\t  DP(RINT \"[iopt copy:%d] pos %\"Q\"u-%\"Q\"u addr %\"Q\"u-%\"Q\"u size %\"W\"u\\n\",\n\t\t   cnt++,\n\t\t   stream->total_in + inst->pos,\n\t\t   stream->total_in + inst->pos + inst->size,\n\t\t   inst->addr, inst->addr + inst->size, inst->size);\n\t});\n\tbreak;\n      }\n    case XD3_RUN:\n      {\n\tif ((ret = xd3_emit_byte (stream, & DATA_TAIL (stream), inst->xtra))) { return ret; }\n\n\tstream->n_run += 1;\n\tstream->l_run += inst->size;\n\n\tIF_DEBUG2 ({\n\t  static int cnt;\n\t  DP(RINT \"[iopt run:%d] pos %\"Q\"u size %\"W\"u\\n\", cnt++, stream->total_in + inst->pos, inst->size);\n\t});\n\tbreak;\n      }\n    case XD3_ADD:\n      {\n\tif ((ret = xd3_emit_bytes (stream, & DATA_TAIL (stream),\n\t\t\t\t   stream->next_in + inst->pos, inst->size))) { return ret; }\n\n\tstream->n_add += 1;\n\tstream->l_add += inst->size;\n\n\tIF_DEBUG2 ({\n\t  static int cnt;\n\t  DP(RINT \"[iopt add:%d] pos %\"Q\"u size %\"W\"u\\n\", cnt++, stream->total_in + inst->pos, inst->size);\n\t});\n\n\tbreak;\n      }\n    }\n\n  /* This is the only place stream->unencoded_offset is incremented. */\n  XD3_ASSERT (stream->unencoded_offset == inst->pos);\n  stream->unencoded_offset += inst->size;\n\n  inst->code2 = 0;\n\n  XD3_CHOOSE_INSTRUCTION (stream, stream->iout, inst);\n\n  if (stream->iout != NULL)\n    {\n      if (stream->iout->code2 != 0)\n\t{\n\t  if ((ret = xd3_emit_double (stream, stream->iout, inst, \n\t\t\t\t      stream->iout->code2))) { return ret; }\n\n\t  xd3_iopt_free_nonadd (stream, stream->iout);\n\t  xd3_iopt_free_nonadd (stream, inst);\n\t  stream->iout = NULL;\n\t  return 0;\n\t}\n      else\n\t{\n\t  if ((ret = xd3_emit_single (stream, stream->iout, stream->iout->code1))) { return ret; }\n\n\t  xd3_iopt_free_nonadd (stream, stream->iout);\n\t}\n    }\n\n  stream->iout = inst;\n\n  return 0;\n}\n\n/* This possibly encodes an add instruction, iadd, which must remain\n * on the stack until the following call to\n * xd3_iopt_finish_encoding. */\nstatic int\nxd3_iopt_add (xd3_stream *stream, usize_t pos, xd3_rinst *iadd)\n{\n  int ret;\n  usize_t off = stream->unencoded_offset;\n\n  if (pos > off)\n    {\n      iadd->type = XD3_ADD;\n      iadd->pos  = off;\n      iadd->size = pos - off;\n\n      if ((ret = xd3_iopt_finish_encoding (stream, iadd))) { return ret; }\n    }\n\n  return 0;\n}\n\n/* This function calls xd3_iopt_finish_encoding to finish encoding an\n * instruction, and it may also produce an add instruction for an\n * unmatched region. */\nstatic int\nxd3_iopt_add_encoding (xd3_stream *stream, xd3_rinst *inst)\n{\n  int ret;\n  xd3_rinst iadd;\n\n  if ((ret = xd3_iopt_add (stream, inst->pos, & iadd))) { return ret; }\n\n  if ((ret = xd3_iopt_finish_encoding (stream, inst))) { return ret; }\n\n  return 0;\n}\n\n/* Generates a final add instruction to encode the remaining input. */\nstatic int\nxd3_iopt_add_finalize (xd3_stream *stream)\n{\n  int ret;\n  xd3_rinst iadd;\n\n  if ((ret = xd3_iopt_add (stream, stream->avail_in, & iadd))) { return ret; }\n\n  if (stream->iout)\n    {\n      if ((ret = xd3_emit_single (stream, stream->iout, stream->iout->code1))) { return ret; }\n\n      xd3_iopt_free_nonadd (stream, stream->iout);\n      stream->iout = NULL;\n    }\n\n  return 0;\n}\n\n/* Compact the instruction buffer by choosing the best non-overlapping\n * instructions when lazy string-matching.  There are no ADDs in the\n * iopt buffer because those are synthesized in xd3_iopt_add_encoding\n * and during xd3_iopt_add_finalize. */\nstatic int\nxd3_iopt_flush_instructions (xd3_stream *stream, int force)\n{\n  xd3_rinst *r1 = xd3_rlist_front (& stream->iopt_used);\n  xd3_rinst *r2;\n  xd3_rinst *r3;\n  usize_t r1end;\n  usize_t r2end;\n  usize_t r2off;\n  usize_t r2moff;\n  usize_t gap;\n  usize_t flushed;\n  int ret;\n\n  XD3_ASSERT (xd3_iopt_check (stream));\n\n  /* Note: once tried to skip this step if it's possible to assert\n   * there are no overlapping instructions.  Doesn't work because\n   * xd3_opt_erase leaves overlapping instructions. */\n  while (! xd3_rlist_end (& stream->iopt_used, r1) &&\n\t ! xd3_rlist_end (& stream->iopt_used, r2 = xd3_rlist_next (r1)))\n    {\n      r1end = r1->pos + r1->size;\n\n      /* If the instructions do not overlap, continue. */\n      if (r1end <= r2->pos)\n\t{\n\t  r1 = r2;\n\t  continue;\n\t}\n\n      r2end = r2->pos + r2->size;\n\n      /* The min_match adjustments prevent this. */\n      XD3_ASSERT (r2end > (r1end + LEAST_MATCH_INCR));\n\n      /* If r3 is available... */\n      if (! xd3_rlist_end (& stream->iopt_used, r3 = xd3_rlist_next (r2)))\n\t{\n\t  /* If r3 starts before r1 finishes or just about, r2 is irrelevant */\n\t  if (r3->pos <= r1end + 1)\n\t    {\n\t      xd3_iopt_free (stream, r2);\n\t      continue;\n\t    }\n\t}\n      else if (! force)\n\t{\n\t  /* Unless force, end the loop when r3 is not available. */\n\t  break;\n\t}\n\n      r2off  = r2->pos - r1->pos;\n      r2moff = r2end - r1end;\n      gap    = r2end - r1->pos;\n\n      /* If the two matches overlap almost entirely, choose the better match\n       * and discard the other.  The else branch can still create inefficient\n       * copies, e.g., a 4-byte copy that takes 4 bytes to encode, which\n       * xd3_smatch() wouldn't allow by its crude efficiency check.  However,\n       * in this case there are adjacent copies which mean the add would cost\n       * one extra byte.  Allow the inefficiency here. */\n      if (gap < 2*MIN_MATCH || r2moff <= 2 || r2off <= 2)\n\t{\n\t  /* Only one match should be used, choose the longer one. */\n\t  if (r1->size < r2->size)\n\t    {\n\t      xd3_iopt_free (stream, r1);\n\t      r1 = r2;\n\t    }\n\t  else\n\t    {\n\t      /* We are guaranteed that r1 does not overlap now, so advance past r2 */\n\t      r1 = xd3_iopt_free (stream, r2);\n\t    }\n\t  continue;\n\t}\n      else\n\t{\n\t  /* Shorten one of the instructions -- could be optimized\n\t   * based on the address cache. */\n\t  usize_t average;\n\t  usize_t newsize;\n\t  usize_t adjust1;\n\n\t  XD3_ASSERT (r1end > r2->pos && r2end > r1->pos);\n\n\t  /* Try to balance the length of both instructions, but avoid\n\t   * making both longer than MAX_MATCH_SPLIT . */\n\t  average = gap / 2;\n\t  newsize = xd3_min (MAX_MATCH_SPLIT, gap - average);\n\n\t  /* Should be possible to simplify this code. */\n\t  if (newsize > r1->size)\n\t    {\n\t      /* shorten r2 */\n\t      adjust1 = r1end - r2->pos;\n\t    }\n\t  else if (newsize > r2->size)\n\t    {\n\t      /* shorten r1 */\n\t      adjust1 = r1end - r2->pos;\n\n\t      XD3_ASSERT (r1->size > adjust1);\n\n\t      r1->size -= adjust1;\n\n\t      /* don't shorten r2 */\n\t      adjust1 = 0;\n\t    }\n\t  else\n\t    {\n\t      /* shorten r1 */\n\t      adjust1 = r1->size - newsize;\n\n\t      if (r2->pos > r1end - adjust1)\n\t\t{\n\t\t  adjust1 -= r2->pos - (r1end - adjust1);\n\t\t}\n\n\t      XD3_ASSERT (r1->size > adjust1);\n\n\t      r1->size -= adjust1;\n\n\t      /* shorten r2 */\n\t      XD3_ASSERT (r1->pos + r1->size >= r2->pos);\n\n\t      adjust1 = r1->pos + r1->size - r2->pos;\n\t    }\n\n\t  /* Fallthrough above if-else, shorten r2 */\n\t  XD3_ASSERT (r2->size > adjust1);\n\n\t  r2->size -= adjust1;\n\t  r2->pos  += adjust1;\n\t  r2->addr += adjust1;\n\n\t  XD3_ASSERT (r1->size >= MIN_MATCH);\n\t  XD3_ASSERT (r2->size >= MIN_MATCH);\n\n\t  r1 = r2;\n\t}\n    }\n\n  XD3_ASSERT (xd3_iopt_check (stream));\n\n  /* If forcing, pick instructions until the list is empty, otherwise\n   * this empties 50% of the queue. */\n  for (flushed = 0; ! xd3_rlist_empty (& stream->iopt_used); )\n    {\n      xd3_rinst *renc = xd3_rlist_pop_front (& stream->iopt_used);\n      if ((ret = xd3_iopt_add_encoding (stream, renc)))\n\t{\n\t  return ret;\n\t}\n\n      if (! force)\n\t{\n\t  if (++flushed > stream->iopt_size / 2)\n\t    {\n\t      break;\n\t    }\n\n\t  /* If there are only two instructions remaining, break,\n\t   * because they were not optimized.  This means there were\n\t   * more than 50% eliminated by the loop above. */\n \t  r1 = xd3_rlist_front (& stream->iopt_used);\n \t  if (xd3_rlist_end(& stream->iopt_used, r1) ||\n \t      xd3_rlist_end(& stream->iopt_used, r2 = xd3_rlist_next (r1)) ||\n \t      xd3_rlist_end(& stream->iopt_used, r3 = xd3_rlist_next (r2)))\n \t    {\n \t      break;\n \t    }\n\t}\n    }\n\n  XD3_ASSERT (xd3_iopt_check (stream));\n\n  XD3_ASSERT (!force || xd3_rlist_length (& stream->iopt_used) == 0);\n\n  return 0;\n}\n\nstatic int\nxd3_iopt_get_slot (xd3_stream *stream, xd3_rinst** iptr)\n{\n  xd3_rinst *i;\n  int ret;\n\n  if (xd3_rlist_empty (& stream->iopt_free))\n    {\n      if (stream->iopt_unlimited)\n\t{\n\t  usize_t elts = XD3_ALLOCSIZE / sizeof(xd3_rinst);\n\n\t  if ((ret = xd3_alloc_iopt (stream, elts)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  stream->iopt_size += elts;\n\t}\n      else\n\t{\n\t  if ((ret = xd3_iopt_flush_instructions (stream, 0))) { return ret; }\n\n\t  XD3_ASSERT (! xd3_rlist_empty (& stream->iopt_free));\n\t}\n    }\n\n  i = xd3_rlist_pop_back (& stream->iopt_free);\n\n  xd3_rlist_push_back (& stream->iopt_used, i);\n\n  (*iptr) = i;\n\n  ++stream->i_slots_used;\n\n  return 0;\n}\n\n/* A copy is about to be emitted that extends backwards to POS,\n * therefore it may completely cover some existing instructions in the\n * buffer.  If an instruction is completely covered by this new match,\n * erase it.  If the new instruction is covered by the previous one,\n * return 1 to skip it. */\nstatic void\nxd3_iopt_erase (xd3_stream *stream, usize_t pos, usize_t size)\n{\n  while (! xd3_rlist_empty (& stream->iopt_used))\n    {\n      xd3_rinst *r = xd3_rlist_back (& stream->iopt_used);\n\n      /* Verify that greedy is working.  The previous instruction\n       * should end before the new one begins. */\n      XD3_ASSERT ((stream->flags & XD3_BEGREEDY) == 0 || (r->pos + r->size <= pos));\n      /* Verify that min_match is working.  The previous instruction\n       * should end before the new one ends. */\n      XD3_ASSERT ((stream->flags & XD3_BEGREEDY) != 0 || (r->pos + r->size < pos + size));\n\n      /* See if the last instruction starts before the new\n       * instruction.  If so, there is nothing to erase. */\n      if (r->pos < pos)\n\t{\n\t  return;\n\t}\n\n      /* Otherwise, the new instruction covers the old one, delete it\n\t and repeat. */\n      xd3_rlist_remove (r);\n      xd3_rlist_push_back (& stream->iopt_free, r);\n      --stream->i_slots_used;\n    }\n}\n\n/* This function tells the last matched input position. */\nstatic usize_t\nxd3_iopt_last_matched (xd3_stream *stream)\n{\n  xd3_rinst *r;\n\n  if (xd3_rlist_empty (& stream->iopt_used))\n    {\n      return 0;\n    }\n\n  r = xd3_rlist_back (& stream->iopt_used);\n\n  return r->pos + r->size;\n}\n\n/*********************************************************\n Emit routines\n ***********************************************************/\n\nstatic int\nxd3_emit_single (xd3_stream *stream, xd3_rinst *single, uint8_t code)\n{\n  int has_size = stream->code_table[code].size1 == 0;\n  int ret;\n\n  IF_DEBUG2 (DP(RINT \"[emit1] %\"W\"u %s (%\"W\"u) code %u\\n\",\n\t\tsingle->pos,\n\t\txd3_rtype_to_string ((xd3_rtype) single->type, 0),\n\t\tsingle->size,\n\t\tcode));\n\n  if ((ret = xd3_emit_byte (stream, & INST_TAIL (stream), code)))\n    {\n      return ret;\n    }\n\n  if (has_size)\n    {\n      if ((ret = xd3_emit_size (stream, & INST_TAIL (stream), single->size)))\n        {\n          return ret;\n        }\n    }\n\n  return 0;\n}\n\nstatic int\nxd3_emit_double (xd3_stream *stream, xd3_rinst *first,\n                 xd3_rinst *second, uint8_t code)\n{\n  int ret;\n\n  /* All double instructions use fixed sizes, so all we need to do is\n   * output the instruction code, no sizes. */\n  XD3_ASSERT (stream->code_table[code].size1 != 0 &&\n\t      stream->code_table[code].size2 != 0);\n\n  if ((ret = xd3_emit_byte (stream, & INST_TAIL (stream), code)))\n    {\n      return ret;\n    }\n\n  IF_DEBUG2 (DP(RINT \"[emit2]: %\"W\"u %s (%\"W\"u) %s (%\"W\"u) code %u\\n\",\n\t\tfirst->pos,\n\t\txd3_rtype_to_string ((xd3_rtype) first->type, 0),\n\t\tfirst->size,\n\t\txd3_rtype_to_string ((xd3_rtype) second->type, 0),\n\t\tsecond->size,\n\t\tcode));\n\n  return 0;\n}\n\n/* This enters a potential run instruction into the iopt buffer.  The\n * position argument is relative to the target window. */\nstatic int\nxd3_emit_run (xd3_stream *stream, usize_t pos, usize_t size, uint8_t *run_c)\n{\n  xd3_rinst* ri;\n  int ret;\n\n  if ((ret = xd3_iopt_get_slot (stream, & ri))) { return ret; }\n\n  ri->type = XD3_RUN;\n  ri->xtra = *run_c;\n  ri->pos  = pos;\n  ri->size = size;\n\n  return 0;\n}\n\n/* This enters a potential copy instruction into the iopt buffer.  The\n * position argument is relative to the target window.. */\nint\nxd3_found_match (xd3_stream *stream, usize_t pos,\n\t\t usize_t size, xoff_t addr, int is_source)\n{\n  xd3_rinst* ri;\n  int ret;\n\n  if ((ret = xd3_iopt_get_slot (stream, & ri))) { return ret; }\n\n  ri->type = XD3_CPY;\n  ri->xtra = is_source;\n  ri->pos  = pos;\n  ri->size = size;\n  ri->addr = addr;\n\n  return 0;\n}\n\nstatic int\nxd3_emit_hdr (xd3_stream *stream)\n{\n  int  ret;\n  int  use_secondary = stream->sec_type != NULL;\n  int  use_adler32   = stream->flags & (XD3_ADLER32 | XD3_ADLER32_RECODE);\n  int  vcd_source    = xd3_encoder_used_source (stream);\n  uint8_t win_ind = 0;\n  uint8_t del_ind = 0;\n  usize_t enc_len;\n  usize_t tgt_len;\n  usize_t data_len;\n  usize_t inst_len;\n  usize_t addr_len;\n\n  if (stream->current_window == 0)\n    {\n      uint8_t hdr_ind = 0;\n      int use_appheader  = stream->enc_appheader != NULL;\n\n      if (use_secondary)  { hdr_ind |= VCD_SECONDARY; }\n      if (use_appheader)  { hdr_ind |= VCD_APPHEADER; }\n\n      if ((ret = xd3_emit_byte (stream, & HDR_TAIL (stream),\n\t\t\t\tVCDIFF_MAGIC1)) != 0 ||\n\t  (ret = xd3_emit_byte (stream, & HDR_TAIL (stream),\n\t\t\t\tVCDIFF_MAGIC2)) != 0 ||\n\t  (ret = xd3_emit_byte (stream, & HDR_TAIL (stream),\n\t\t\t\tVCDIFF_MAGIC3)) != 0 ||\n\t  (ret = xd3_emit_byte (stream, & HDR_TAIL (stream),\n\t\t\t\tVCDIFF_VERSION)) != 0 ||\n\t  (ret = xd3_emit_byte (stream, & HDR_TAIL (stream), hdr_ind)) != 0)\n\t{\n\t  return ret;\n\t}\n\n      /* Secondary compressor ID */\n#if SECONDARY_ANY\n      if (use_secondary &&\n\t  (ret = xd3_emit_byte (stream, & HDR_TAIL (stream),\n\t\t\t\tstream->sec_type->id)))\n\t{\n\t  return ret;\n\t}\n#endif\n\n      /* Application header */\n      if (use_appheader)\n\t{\n\t  if ((ret = xd3_emit_size (stream, & HDR_TAIL (stream),\n\t\t\t\t    stream->enc_appheadsz)) ||\n\t      (ret = xd3_emit_bytes (stream, & HDR_TAIL (stream),\n\t\t\t\t     stream->enc_appheader,\n\t\t\t\t     stream->enc_appheadsz)))\n\t    {\n\t      return ret;\n\t    }\n\t}\n    }\n\n  /* try to compress this window */\n#if SECONDARY_ANY\n  if (use_secondary)\n    {\n      int data_sec = 0;\n      int inst_sec = 0;\n      int addr_sec = 0;\n\n#     define ENCODE_SECONDARY_SECTION(UPPER,LOWER) \\\n             ((stream->flags & XD3_SEC_NO ## UPPER) == 0 && \\\n              (ret = xd3_encode_secondary (stream, \\\n\t\t\t\t\t   & UPPER ## _HEAD (stream), \\\n\t\t\t\t\t   & UPPER ## _TAIL (stream), \\\n\t\t\t\t\t& xd3_sec_ ## LOWER (stream), \\\n\t\t\t\t        & stream->sec_ ## LOWER, \\\n\t\t\t\t\t   & LOWER ## _sec)))\n\n      if (ENCODE_SECONDARY_SECTION (DATA, data) ||\n\t  ENCODE_SECONDARY_SECTION (INST, inst) ||\n\t  ENCODE_SECONDARY_SECTION (ADDR, addr))\n\t{\n\t  return ret;\n\t}\n\n      del_ind |= (data_sec ? VCD_DATACOMP : 0);\n      del_ind |= (inst_sec ? VCD_INSTCOMP : 0);\n      del_ind |= (addr_sec ? VCD_ADDRCOMP : 0);\n    }\n#endif\n\n  /* if (vcd_target) { win_ind |= VCD_TARGET; } */\n  if (vcd_source)  { win_ind |= VCD_SOURCE; }\n  if (use_adler32) { win_ind |= VCD_ADLER32; }\n\n  /* window indicator */\n  if ((ret = xd3_emit_byte (stream, & HDR_TAIL (stream), win_ind)))\n    {\n      return ret;\n    }\n\n  /* source window */\n  if (vcd_source)\n    {\n      /* or (vcd_target) { ... } */\n      if ((ret = xd3_emit_size (stream, & HDR_TAIL (stream),\n\t\t\t\tstream->src->srclen)) ||\n\t  (ret = xd3_emit_offset (stream, & HDR_TAIL (stream),\n\t\t\t\t  stream->src->srcbase))) { return ret; }\n    }\n\n  tgt_len  = stream->avail_in;\n  data_len = xd3_sizeof_output (DATA_HEAD (stream));\n  inst_len = xd3_sizeof_output (INST_HEAD (stream));\n  addr_len = xd3_sizeof_output (ADDR_HEAD (stream));\n\n  /* The enc_len field is a redundency for future extensions. */\n  enc_len = (1 + (xd3_sizeof_size (tgt_len) +\n\t\t  xd3_sizeof_size (data_len) +\n\t\t  xd3_sizeof_size (inst_len) +\n\t\t  xd3_sizeof_size (addr_len)) +\n\t     data_len +\n\t     inst_len +\n\t     addr_len +\n\t     (use_adler32 ? 4 : 0));\n\n  if ((ret = xd3_emit_size (stream, & HDR_TAIL (stream), enc_len)) ||\n      (ret = xd3_emit_size (stream, & HDR_TAIL (stream), tgt_len)) ||\n      (ret = xd3_emit_byte (stream, & HDR_TAIL (stream), del_ind)) ||\n      (ret = xd3_emit_size (stream, & HDR_TAIL (stream), data_len)) ||\n      (ret = xd3_emit_size (stream, & HDR_TAIL (stream), inst_len)) ||\n      (ret = xd3_emit_size (stream, & HDR_TAIL (stream), addr_len)))\n    {\n      return ret;\n    }\n\n  if (use_adler32)\n    {\n      uint8_t  send[4];\n      uint32_t a32;\n\n      if (stream->flags & XD3_ADLER32)\n\t{\n\t  a32 = adler32 (1L, stream->next_in, stream->avail_in);\n\t}\n      else\n\t{\n\t  a32 = stream->recode_adler32;\n\t}\n\n      /* Four bytes. */\n      send[0] = (uint8_t) (a32 >> 24);\n      send[1] = (uint8_t) (a32 >> 16);\n      send[2] = (uint8_t) (a32 >> 8);\n      send[3] = (uint8_t) (a32 & 0x000000FFU);\n\n      if ((ret = xd3_emit_bytes (stream, & HDR_TAIL (stream), send, 4)))\n\t{\n\t  return ret;\n\t}\n    }\n\n  return 0;\n}\n\n/****************************************************************\n Encode routines\n ****************************************************************/\n\nstatic int\nxd3_encode_buffer_leftover (xd3_stream *stream)\n{\n  usize_t take;\n  usize_t room;\n\n  /* Allocate the buffer. */\n  if (stream->buf_in == NULL &&\n      (stream->buf_in = (uint8_t*) xd3_alloc (stream, stream->winsize, 1)) == NULL)\n    {\n      return ENOMEM;\n    }\n\n  IF_DEBUG2 (DP(RINT \"[leftover] flush?=%s\\n\", (stream->flags & XD3_FLUSH) ? \"yes\" : \"no\"));\n\n  /* Take leftover input first. */\n  if (stream->buf_leftover != NULL)\n    {\n      XD3_ASSERT (stream->buf_avail == 0);\n      XD3_ASSERT (stream->buf_leftavail < stream->winsize);\n\n      IF_DEBUG2 (DP(RINT \"[leftover] previous %\"W\"u avail %\"W\"u\\n\",\n\t\t    stream->buf_leftavail, stream->avail_in));\n\n      memcpy (stream->buf_in, stream->buf_leftover, stream->buf_leftavail);\n\n      stream->buf_leftover = NULL;\n      stream->buf_avail    = stream->buf_leftavail;\n    }\n\n  /* Copy into the buffer. */\n  room = stream->winsize - stream->buf_avail;\n  take = xd3_min (room, stream->avail_in);\n\n  memcpy (stream->buf_in + stream->buf_avail, stream->next_in, take);\n\n  stream->buf_avail += take;\n\n  if (take < stream->avail_in)\n    {\n      /* Buffer is full */\n      stream->buf_leftover  = stream->next_in  + take;\n      stream->buf_leftavail = stream->avail_in - take;\n    }\n  else if ((stream->buf_avail < stream->winsize) && !(stream->flags & XD3_FLUSH))\n    {\n      /* Buffer has space */\n      IF_DEBUG2 (DP(RINT \"[leftover] emptied %\"W\"u\\n\", take));\n      return XD3_INPUT;\n    }\n\n  /* Use the buffer: */\n  IF_DEBUG2 (DP(RINT \"[leftover] take %\"W\"u remaining %\"W\"u\\n\", take, stream->buf_leftavail));\n  stream->next_in   = stream->buf_in;\n  stream->avail_in  = stream->buf_avail;\n  stream->buf_avail = 0;\n\n  return 0;\n}\n\n/* Allocates one block of xd3_rlist elements */\nstatic int\nxd3_alloc_iopt (xd3_stream *stream, usize_t elts)\n{\n  usize_t i;\n  xd3_iopt_buflist* last =\n    (xd3_iopt_buflist*) xd3_alloc (stream, sizeof (xd3_iopt_buflist), 1);\n\n  if (last == NULL ||\n      (last->buffer = (xd3_rinst*) xd3_alloc (stream, sizeof (xd3_rinst), elts)) == NULL)\n    {\n      return ENOMEM;\n    }\n\n  last->next = stream->iopt_alloc;\n  stream->iopt_alloc = last;\n\n  for (i = 0; i < elts; i += 1)\n    {\n      xd3_rlist_push_back (& stream->iopt_free, & last->buffer[i]);\n    }\n\n  return 0;\n}\n\n/* This function allocates all memory initially used by the encoder. */\nstatic int\nxd3_encode_init (xd3_stream *stream, int full_init)\n{\n  int ret;\n  int i;\n\n  if (full_init)\n    {\n      int large_comp = (stream->src != NULL);\n      int small_comp = ! (stream->flags & XD3_NOCOMPRESS);\n\n      /* Memory allocations for checksum tables are delayed until\n       * xd3_string_match_init in the first call to string_match--that way\n       * identical or short inputs require no table allocation. */\n      if (large_comp)\n\t{\n\t  /* TODO Need to check for overflow here. */\n\t  usize_t hash_values = stream->src->max_winsize /\n\t                        stream->smatcher.large_step;\n\n\t  if ((ret = xd3_size_hashtable (stream,\n\t\t\t\t\t hash_values,\n\t\t\t\t\t stream->smatcher.large_look,\n\t\t\t\t\t & stream->large_hash)))\n\t    {\n\t      return ret;\n\t    }\n\t}\n\n      if (small_comp)\n\t{\n\t  /* TODO: This is under devel: used to have min (sprevsz) here, which sort\n\t   * of makes sense, but observed fast performance w/ larger tables, which\n\t   * also sort of makes sense. @@@ */\n\t  usize_t hash_values = stream->winsize;\n\n\t  if ((ret = xd3_size_hashtable (stream,\n\t\t\t\t\t hash_values,\n\t\t\t\t\t stream->smatcher.small_look,\n\t\t\t\t\t & stream->small_hash)))\n\t    {\n\t      return ret;\n\t    }\n\t}\n    }\n\n  /* data buffers */\n  for (i = 0; i < ENC_SECTS; i += 1)\n    {\n      if ((stream->enc_heads[i] =\n\t   stream->enc_tails[i] =\n\t   xd3_alloc_output (stream, NULL)) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n    }\n\n  /* iopt buffer */\n  xd3_rlist_init (& stream->iopt_used);\n  xd3_rlist_init (& stream->iopt_free);\n\n  if (xd3_alloc_iopt (stream, stream->iopt_size) != 0) { goto fail; }\n\n  XD3_ASSERT (xd3_rlist_length (& stream->iopt_free) == stream->iopt_size);\n  XD3_ASSERT (xd3_rlist_length (& stream->iopt_used) == 0);\n\n  /* address cache, code table */\n  stream->acache.s_near = stream->code_table_desc->near_modes;\n  stream->acache.s_same = stream->code_table_desc->same_modes;\n  stream->code_table    = stream->code_table_func ();\n\n  return xd3_alloc_cache (stream);\n\n fail:\n\n  return ENOMEM;\n}\n\nint\nxd3_encode_init_full (xd3_stream *stream)\n{\n  return xd3_encode_init (stream, 1);\n}\n\nint\nxd3_encode_init_partial (xd3_stream *stream)\n{\n  return xd3_encode_init (stream, 0);\n}\n\n/* Called after the ENC_POSTOUT state, this puts the output buffers\n * back into separate lists and re-initializes some variables.  (The\n * output lists were spliced together during the ENC_FLUSH state.) */\nstatic void\nxd3_encode_reset (xd3_stream *stream)\n{\n  int i;\n  xd3_output *olist;\n\n  stream->avail_in     = 0;\n  stream->small_reset  = 1;\n  stream->i_slots_used = 0;\n\n  if (stream->src != NULL)\n    {\n      stream->src->srcbase   = 0;\n      stream->src->srclen    = 0;\n      stream->srcwin_decided = 0;\n      stream->srcwin_decided_early = 0;\n      stream->match_minaddr  = 0;\n      stream->match_maxaddr  = 0;\n      stream->taroff         = 0;\n    }\n\n  /* Reset output chains. */\n  olist = stream->enc_heads[0];\n\n  for (i = 0; i < ENC_SECTS; i += 1)\n    {\n      XD3_ASSERT (olist != NULL);\n\n      stream->enc_heads[i] = olist;\n      stream->enc_tails[i] = olist;\n      olist = olist->next_page;\n\n      stream->enc_heads[i]->next = 0;\n      stream->enc_heads[i]->next_page = NULL;\n\n      stream->enc_tails[i]->next_page = NULL;\n      stream->enc_tails[i] = stream->enc_heads[i];\n    }\n\n  xd3_freelist_output (stream, olist);\n}\n\n/* The main encoding routine. */\nint\nxd3_encode_input (xd3_stream *stream)\n{\n  int ret, i;\n\n  if (stream->dec_state != 0)\n    {\n      stream->msg = \"encoder/decoder transition\";\n      return XD3_INTERNAL;\n    }\n\n  switch (stream->enc_state)\n    {\n    case ENC_INIT:\n      /* Only reached on first time through: memory setup. */\n      if ((ret = xd3_encode_init_full (stream))) { return ret; }\n\n      stream->enc_state = ENC_INPUT;\n\n    case ENC_INPUT:\n\n      /* If there is no input yet, just return.  This checks for\n       * next_in == NULL, not avail_in == 0 since zero bytes is a\n       * valid input.  There is an assertion in xd3_avail_input() that\n       * next_in != NULL for this reason.  By returning right away we\n       * avoid creating an input buffer before the caller has supplied\n       * its first data.  It is possible for xd3_avail_input to be\n       * called both before and after the first call to\n       * xd3_encode_input(). */\n      if (stream->next_in == NULL)\n\t{\n\t  return XD3_INPUT;\n\t}\n\n    enc_flush:\n      /* See if we should buffer the input: either if there is already\n       * a leftover buffer, or if the input is short of winsize\n       * without flush.  The label at this point is reached by a goto\n       * below, when there is leftover input after postout. */\n      if ((stream->buf_leftover != NULL) ||\n\t  (stream->buf_avail != 0) ||\n\t  (stream->avail_in < stream->winsize && ! (stream->flags & XD3_FLUSH)))\n\t{\n\t  if ((ret = xd3_encode_buffer_leftover (stream))) { return ret; }\n\t}\n\n      /* Initalize the address cache before each window. */\n      xd3_init_cache (& stream->acache);\n\n      stream->input_position    = 0;\n      stream->min_match = MIN_MATCH;\n      stream->unencoded_offset = 0;\n\n      stream->enc_state = ENC_SEARCH;\n\n      IF_DEBUG2 (DP(RINT \"[WINSTART:%\"Q\"u] input bytes %\"W\"u offset %\"Q\"u\\n\",\n\t\t    stream->current_window, stream->avail_in,\n\t\t    stream->total_in));\n      return XD3_WINSTART;\n\n    case ENC_SEARCH:\n      IF_DEBUG2 (DP(RINT \"[SEARCH] match_state %d avail_in %\"W\"u %s\\n\",\n\t\t    stream->match_state, stream->avail_in,\n\t\t    stream->src ? \"source\" : \"no source\"));\n\n      /* Reentrant matching. */\n      if (stream->src != NULL)\n\t{\n\t  switch (stream->match_state)\n\t    {\n\t    case MATCH_TARGET:\n\t      /* Try matching forward at the start of the target.\n\t       * This is entered the first time through, to check for\n\t       * a perfect match, and whenever there is a source match\n\t       * that extends to the end of the previous window.  The\n\t       * match_srcpos field is initially zero and later set\n\t       * during xd3_source_extend_match. */\n\n\t      if (stream->avail_in > 0)\n\t\t{\n\t\t  /* This call can't fail because the source window is\n\t\t   * unrestricted. */\n\t\t  ret = xd3_source_match_setup (stream, stream->match_srcpos);\n\t\t  XD3_ASSERT (ret == 0);\n\t\t  stream->match_state = MATCH_FORWARD;\n\t\t}\n\t      else\n\t\t{\n\t\t  stream->match_state = MATCH_SEARCHING;\n\t\t  stream->match_fwd = 0;\n\t\t}\n\t      XD3_ASSERT (stream->match_fwd == 0);\n\n\t    case MATCH_FORWARD:\n\t    case MATCH_BACKWARD:\n\t      if (stream->avail_in != 0)\n\t\t{\n\t\t  if ((ret = xd3_source_extend_match (stream)) != 0)\n\t\t    {\n\t\t      return ret;\n\t\t    }\n\n\t\t  /* The search has to make forward progress here\n\t\t   * or else it can get stuck in a match-backward\n\t\t   * (getsrcblk) then match-forward (getsrcblk),\n\t\t   * find insufficient match length, then repeat\n\n\t\t   * exactly the same search.\n\t\t   */\n\t\t  stream->input_position += stream->match_fwd;\n\t\t}\n\n\t    case MATCH_SEARCHING:\n\t      /* Continue string matching.  (It's possible that the\n\t       * initial match continued through the entire input, in\n\t       * which case we're still in MATCH_FORWARD and should\n\t       * remain so for the next input window.) */\n\t      break;\n\t    }\n\t}\n\n      /* String matching... */\n      if (stream->avail_in != 0 &&\n\t  (ret = stream->smatcher.string_match (stream)))\n\t{\n\t  return ret;\n\t}\n\n      stream->enc_state = ENC_INSTR;\n\n    case ENC_INSTR:\n      /* Note: Jump here to encode VCDIFF deltas w/o using this\n       * string-matching code.  Merging code enters here. */\n\n      /* Flush the instrution buffer, then possibly add one more\n       * instruction, then emit the header. */\n      if ((ret = xd3_iopt_flush_instructions (stream, 1)) ||\n          (ret = xd3_iopt_add_finalize (stream)))\n\t{\n\t  return ret;\n\t}\n\n      stream->enc_state = ENC_FLUSH;\n\n    case ENC_FLUSH:\n      /* Note: main_recode_func() bypasses string-matching by setting\n       * ENC_FLUSH. */\n      if ((ret = xd3_emit_hdr (stream)))\n\t{\n\t  return ret;\n\t}\n\n      /* Begin output. */\n      stream->enc_current = HDR_HEAD (stream);\n\n      /* Chain all the outputs together.  After doing this, it looks\n       * as if there is only one section.  The other enc_heads are set\n       * to NULL to avoid freeing them more than once. */\n       for (i = 1; i < ENC_SECTS; i += 1)\n\t{\n\t  stream->enc_tails[i-1]->next_page = stream->enc_heads[i];\n\t  stream->enc_heads[i] = NULL;\n\t}\n\n    enc_output:\n\n      stream->enc_state  = ENC_POSTOUT;\n      stream->next_out   = stream->enc_current->base;\n      stream->avail_out  = stream->enc_current->next;\n      stream->total_out += stream->avail_out;\n\n      /* If there is any output in this buffer, return it, otherwise\n       * fall through to handle the next buffer or finish the window\n       * after all buffers have been output. */\n      if (stream->avail_out > 0)\n\t{\n\t  /* This is the only place xd3_encode returns XD3_OUTPUT */\n\t  return XD3_OUTPUT;\n\t}\n\n    case ENC_POSTOUT:\n\n      if (stream->avail_out != 0)\n\t{\n\t  stream->msg = \"missed call to consume output\";\n\t  return XD3_INTERNAL;\n\t}\n\n      /* Continue outputting one buffer at a time, until the next is NULL. */\n      if ((stream->enc_current = stream->enc_current->next_page) != NULL)\n\t{\n\t  goto enc_output;\n\t}\n\n      stream->total_in += stream->avail_in;\n      stream->enc_state = ENC_POSTWIN;\n\n      IF_DEBUG2 (DP(RINT \"[WINFINISH:%\"Q\"u] in=%\"Q\"u\\n\",\n\t\t    stream->current_window,\n\t\t    stream->total_in));\n      return XD3_WINFINISH;\n\n    case ENC_POSTWIN:\n\n      xd3_encode_reset (stream);\n\n      stream->current_window += 1;\n      stream->enc_state = ENC_INPUT;\n\n      /* If there is leftover input to flush, repeat. */\n      if (stream->buf_leftover != NULL)\n\t{\n\t  goto enc_flush;\n\t}\n\n      /* Ready for more input. */\n      return XD3_INPUT;\n\n    default:\n      stream->msg = \"invalid state\";\n      return XD3_INTERNAL;\n    }\n}\n#endif /* XD3_ENCODER */\n\n/*****************************************************************\n Client convenience functions\n ******************************************************************/\n\nint\nxd3_process_stream (int            is_encode,\n\t\t    xd3_stream    *stream,\n\t\t    int          (*func) (xd3_stream *),\n\t\t    int            close_stream,\n\t\t    const uint8_t *input,\n\t\t    usize_t        input_size,\n\t\t    uint8_t       *output,\n\t\t    usize_t       *output_size,\n\t\t    usize_t        output_size_max)\n{\n  usize_t ipos = 0;\n  usize_t n = xd3_min (stream->winsize, input_size);\n\n  (*output_size) = 0;\n\n  stream->flags |= XD3_FLUSH;\n\n  xd3_avail_input (stream, input + ipos, n);\n  ipos += n;\n\n  for (;;)\n    {\n      int ret;\n      switch ((ret = func (stream)))\n\t{\n\tcase XD3_OUTPUT: { /* memcpy below */ break; }\n\tcase XD3_INPUT: {\n\t  n = xd3_min(stream->winsize, input_size - ipos);\n\t  if (n == 0) \n\t    {\n\t      goto done;\n\t    }\n\t  xd3_avail_input (stream, input + ipos, n);\n\t  ipos += n;\n\t  continue;\n\t}\n\tcase XD3_GOTHEADER: { /* ignore */ continue; }\n\tcase XD3_WINSTART: { /* ignore */ continue; }\n\tcase XD3_WINFINISH: { /* ignore */ continue; }\n\tcase XD3_GETSRCBLK:\n\t  {\n\t    /* When the getblk function is NULL, it is necessary to\n\t     * provide the complete source as a single block using\n\t     * xd3_set_source_and_size, otherwise this error.  The\n\t     * library should never ask for another source block. */\n\t    stream->msg = \"library requested source block\";\n\t    return XD3_INTERNAL;\n\t  }\n\tcase 0:\n\t  {\n\t    /* xd3_encode_input/xd3_decode_input never return 0 */\n\t    stream->msg = \"invalid return: 0\";\n\t    return XD3_INTERNAL;\n\t  }\n\tdefault:\n\t  return ret;\n\t}\n\n      if (*output_size + stream->avail_out > output_size_max)\n\t{\n\t  stream->msg = \"insufficient output space\";\n\t  return ENOSPC;\n\t}\n\n      memcpy (output + *output_size, stream->next_out, stream->avail_out);\n\n      *output_size += stream->avail_out;\n\n      xd3_consume_output (stream);\n    }\n done:\n  return (close_stream == 0) ? 0 : xd3_close_stream (stream);\n}\n\nstatic int\nxd3_process_memory (int            is_encode,\n\t\t    int          (*func) (xd3_stream *),\n\t\t    const uint8_t *input,\n\t\t    usize_t        input_size,\n\t\t    const uint8_t *source,\n\t\t    usize_t        source_size,\n\t\t    uint8_t       *output,\n\t\t    usize_t       *output_size,\n\t\t    usize_t        output_size_max,\n\t\t    int            flags) {\n  xd3_stream stream;\n  xd3_config config;\n  xd3_source src;\n  int ret;\n\n  memset (& stream, 0, sizeof (stream));\n  memset (& config, 0, sizeof (config));\n\n  if (input == NULL || output == NULL) {\n    stream.msg = \"invalid input/output buffer\";\n    ret = XD3_INTERNAL;\n    goto exit;\n  }\n\n  config.flags = flags;\n\n  if (is_encode)\n    {\n      config.winsize = xd3_min(input_size, (usize_t) XD3_DEFAULT_WINSIZE);\n      config.sprevsz = xd3_pow2_roundup (config.winsize);\n    }\n\n  if ((ret = xd3_config_stream (&stream, &config)) != 0)\n    {\n      goto exit;\n    }\n\n  if (source != NULL)\n    {\n      memset (& src, 0, sizeof (src));\n\n      src.blksize = source_size;\n      src.onblk = source_size;\n      src.curblk = source;\n      src.curblkno = 0;\n      src.max_winsize = source_size;\n\n      if ((ret = xd3_set_source_and_size (&stream, &src, source_size)) != 0)\n\t{\n\t  goto exit;\n\t}\n    }\n\n  if ((ret = xd3_process_stream (is_encode,\n\t\t\t\t & stream,\n\t\t\t\t func, 1,\n\t\t\t\t input, input_size,\n\t\t\t\t output,\n\t\t\t\t output_size,\n\t\t\t\t output_size_max)) != 0)\n    {\n      goto exit;\n    }\n\n exit:\n  if (ret != 0)\n    {\n      IF_DEBUG2 (DP(RINT \"process_memory: %d: %s\\n\", ret, stream.msg));\n    }\n  xd3_free_stream(&stream);\n  return ret;\n}\n\nint\nxd3_decode_stream (xd3_stream    *stream,\n\t\t   const uint8_t *input,\n\t\t   usize_t        input_size,\n\t\t   uint8_t       *output,\n\t\t   usize_t       *output_size,\n\t\t   usize_t        output_size_max)\n{\n  return xd3_process_stream (0, stream, & xd3_decode_input, 1,\n\t\t\t     input, input_size,\n\t\t\t     output, output_size, output_size_max);\n}\n\nint\nxd3_decode_memory (const uint8_t *input,\n\t\t   usize_t        input_size,\n\t\t   const uint8_t *source,\n\t\t   usize_t        source_size,\n\t\t   uint8_t       *output,\n\t\t   usize_t       *output_size,\n\t\t   usize_t        output_size_max,\n\t\t   int            flags) {\n  return xd3_process_memory (0, & xd3_decode_input,\n\t\t\t     input, input_size,\n\t\t\t     source, source_size,\n\t\t\t     output, output_size, output_size_max,\n\t\t\t     flags);\n}\n\n\n#if XD3_ENCODER\nint\nxd3_encode_stream (xd3_stream    *stream,\n\t\t   const uint8_t *input,\n\t\t   usize_t         input_size,\n\t\t   uint8_t       *output,\n\t\t   usize_t        *output_size,\n\t\t   usize_t         output_size_max)\n{\n  return xd3_process_stream (1, stream, & xd3_encode_input, 1,\n\t\t\t     input, input_size,\n\t\t\t     output, output_size, output_size_max);\n}\n\nint\nxd3_encode_memory (const uint8_t *input,\n\t\t   usize_t        input_size,\n\t\t   const uint8_t *source,\n\t\t   usize_t        source_size,\n\t\t   uint8_t       *output,\n\t\t   usize_t        *output_size,\n\t\t   usize_t        output_size_max,\n\t\t   int            flags) {\n  return xd3_process_memory (1, & xd3_encode_input,\n\t\t\t     input, input_size,\n\t\t\t     source, source_size,\n\t\t\t     output, output_size, output_size_max,\n\t\t\t     flags);\n}\n#endif\n\n\n/*************************************************************\n String matching helpers\n *************************************************************/\n\n#if XD3_ENCODER\n/* Do the initial xd3_string_match() checksum table setup.\n * Allocations are delayed until first use to avoid allocation\n * sometimes (e.g., perfect matches, zero-length inputs). */\nstatic int\nxd3_string_match_init (xd3_stream *stream)\n{\n  const int DO_SMALL = ! (stream->flags & XD3_NOCOMPRESS);\n  const int DO_LARGE = (stream->src != NULL);\n\n  if (DO_LARGE && stream->large_table == NULL)\n    {\n      if ((stream->large_table =\n\t   (usize_t*) xd3_alloc0 (stream, stream->large_hash.size, sizeof (usize_t))) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n    }\n\n  if (DO_SMALL)\n    {\n      /* Subsequent calls can return immediately after checking reset. */\n      if (stream->small_table != NULL)\n\t{\n\t  /* The target hash table is reinitialized once per window. */\n\t  /* TODO: This would not have to be reinitialized if absolute\n\t   * offsets were being stored. */\n\t  if (stream->small_reset)\n\t    {\n\t      stream->small_reset = 0;\n\t      memset (stream->small_table, 0,\n\t\t      sizeof (usize_t) * stream->small_hash.size);\n\t    }\n\n\t  return 0;\n\t}\n\n      if ((stream->small_table =\n\t   (usize_t*) xd3_alloc0 (stream,\n\t\t\t\t  stream->small_hash.size,\n\t\t\t\t  sizeof (usize_t))) == NULL)\n\t{\n\t  return ENOMEM;\n\t}\n\n      /* If there is a previous table needed. */\n      if (stream->smatcher.small_lchain > 1 ||\n\t  stream->smatcher.small_chain > 1)\n\t{\n\t  if ((stream->small_prev =\n\t       (xd3_slist*) xd3_alloc (stream,\n\t\t\t\t       stream->sprevsz,\n\t\t\t\t       sizeof (xd3_slist))) == NULL)\n\t    {\n\t      return ENOMEM;\n\t    }\n\t}\n    }\n\n  return 0;\n}\n\n#if XD3_USE_LARGEFILE64 && !XD3_USE_LARGESIZET\n/* This function handles the 32/64bit ambiguity -- file positions are 64bit\n * but the hash table for source-offsets is 32bit. */\nstatic xoff_t\nxd3_source_cksum_offset(xd3_stream *stream, usize_t low)\n{\n  xoff_t scp = stream->srcwin_cksum_pos;\n  xoff_t s0 = scp >> 32;\n\n  usize_t sr = (usize_t) scp;\n\n  if (s0 == 0) {\n    return low;\n  }\n\n  /* This should not be >= because srcwin_cksum_pos is the next\n   * position to index. */\n  if (low > sr) {\n    return (--s0 << 32) | low;\n  }\n\n  return (s0 << 32) | low;\n}\n#else\nstatic xoff_t\nxd3_source_cksum_offset(xd3_stream *stream, usize_t low)\n{\n  return low;\n}\n#endif\n\n/* This function sets up the stream->src fields srcbase, srclen.  The\n * call is delayed until these values are needed to encode a copy\n * address.  At this point the decision has to be made. */\nstatic int\nxd3_srcwin_setup (xd3_stream *stream)\n{\n  xd3_source *src = stream->src;\n  xoff_t length, x;\n\n  /* Check the undecided state. */\n  XD3_ASSERT (src->srclen == 0 && src->srcbase == 0);\n\n  /* Avoid repeating this call. */\n  stream->srcwin_decided = 1;\n\n  /* If the stream is flushing, then the iopt buffer was able to\n   * contain the complete encoding.  If no copies were issued no\n   * source window is actually needed.  This prevents the VCDIFF\n   * header from including source base/len.  xd3_emit_hdr checks for\n   * srclen == 0. */\n  if (stream->enc_state == ENC_INSTR && stream->match_maxaddr == 0)\n    {\n      goto done;\n    }\n\n  /* Check for overflow, srclen is usize_t - this can't happen unless\n   * XD3_DEFAULT_SRCBACK and related parameters are extreme - should\n   * use smaller windows. */\n  length = stream->match_maxaddr - stream->match_minaddr;\n\n  x = USIZE_T_MAX;\n  if (length > x)\n    {\n      stream->msg = \"source window length overflow (not 64bit)\";\n      return XD3_INTERNAL;\n    }\n\n  /* If ENC_INSTR, then we know the exact source window to use because\n   * no more copies can be issued. */\n  if (stream->enc_state == ENC_INSTR)\n    {\n      src->srcbase = stream->match_minaddr;\n      src->srclen  = (usize_t) length;\n      XD3_ASSERT (src->srclen);\n      goto done;\n    }\n\n  /* Otherwise, we have to make a guess.  More copies may still be\n   * issued, but we have to decide the source window base and length\n   * now.  \n   * TODO: This may not working well in practice, more testing needed. */\n  src->srcbase = stream->match_minaddr;\n  src->srclen  = xd3_max ((usize_t) length,\n\t\t\t  stream->avail_in + (stream->avail_in >> 2));\n\n  if (src->eof_known)\n    {\n      /* Note: if the source size is known, we must reduce srclen or\n       * code that expects to pass a single block w/ getblk == NULL\n       * will not function, as the code will return GETSRCBLK asking\n       * for the second block. */\n      src->srclen = xd3_min (src->srclen, xd3_source_eof(src) - src->srcbase);\n    }\n  IF_DEBUG1 (DP(RINT \"[srcwin_setup_constrained] base %\"Q\"u len %\"W\"u\\n\",\n\t\tsrc->srcbase, src->srclen));\n\n  XD3_ASSERT (src->srclen);\n done:\n  /* Set the taroff.  This convenience variable is used even when\n     stream->src == NULL. */\n  stream->taroff = src->srclen;\n  return 0;\n}\n\n/* Sets the bounding region for a newly discovered source match, prior\n * to calling xd3_source_extend_match().  This sets the match_maxfwd,\n * match_maxback variables.  Note: srcpos is an absolute position\n * (xoff_t) but the match_maxfwd, match_maxback variables are usize_t.\n * Returns 0 if the setup succeeds, or 1 if the source position lies\n * outside an already-decided srcbase/srclen window. */\nstatic int\nxd3_source_match_setup (xd3_stream *stream, xoff_t srcpos)\n{\n  xd3_source *const src = stream->src;\n  usize_t greedy_or_not;\n\n  stream->match_maxback = 0;\n  stream->match_maxfwd  = 0;\n  stream->match_back    = 0;\n  stream->match_fwd     = 0;\n\n  /* This avoids a non-blocking endless loop caused by scanning\n   * backwards across a block boundary, only to find not enough\n   * matching bytes to beat the current min_match due to a better lazy\n   * target match: the re-entry to xd3_string_match() repeats the same\n   * long match because the input position hasn't changed.  TODO: if\n   * ever duplicates are added to the source hash table, this logic\n   * won't suffice to avoid loops.  See testing/regtest.cc's\n   * TestNonBlockingProgress test! */\n  if (srcpos != 0 && srcpos == stream->match_last_srcpos)\n    {\n      IF_DEBUG2(DP(RINT \"[match_setup] looping failure\\n\"));\n      goto bad;\n    }\n\n  /* Implement src->max_winsize, which prevents the encoder from seeking\n   * back further than the LRU cache maintaining FIFO discipline, (to\n   * avoid seeking). */\n  if (srcpos < stream->srcwin_cksum_pos &&\n      stream->srcwin_cksum_pos - srcpos > src->max_winsize)\n    {\n      IF_DEBUG2(DP(RINT \"[match_setup] rejected due to src->max_winsize \"\n\t\t   \"distance eof=%\"Q\"u srcpos=%\"Q\"u max_winsz=%\"Q\"u\\n\",\n\t\t   xd3_source_eof (src),\n\t\t   srcpos, src->max_winsize));\n      goto bad;\n    }\n\n  /* There are cases where the above test does not reject a match that\n   * will experience XD3_TOOFARBACK at the first xd3_getblk call\n   * because the input may have advanced up to one block beyond the\n   * actual EOF. */\n  IF_DEBUG2(DP(RINT \"[match_setup] %\"Q\"u srcpos %\"Q\"u, \"\n\t       \"src->max_winsize %\"Q\"u\\n\",\n\t       stream->total_in + stream->input_position,\n\t       srcpos, src->max_winsize));\n\n  /* Going backwards, the 1.5-pass algorithm allows some\n   * already-matched input may be covered by a longer source match.\n   * The greedy algorithm does not allow this.\n   * TODO: Measure this. */\n  if (stream->flags & XD3_BEGREEDY)\n    {\n      /* The greedy algorithm allows backward matching to the last\n       * matched position. */\n      greedy_or_not = xd3_iopt_last_matched (stream);\n    }\n  else\n    {\n      /* The 1.5-pass algorithm allows backward matching to go back as\n       * far as the unencoded offset, which is updated as instructions\n       * pass out of the iopt buffer.  If this (default) is chosen, it\n       * means xd3_iopt_erase may be called to eliminate instructions\n       * when a covering source match is found. */\n      greedy_or_not = stream->unencoded_offset;\n    }\n\n  /* Backward target match limit. */\n  XD3_ASSERT (stream->input_position >= greedy_or_not);\n  stream->match_maxback = stream->input_position - greedy_or_not;\n\n  /* Forward target match limit. */\n  XD3_ASSERT (stream->avail_in > stream->input_position);\n  stream->match_maxfwd = stream->avail_in - stream->input_position;\n\n  /* Now we take the source position into account.  It depends whether\n   * the srclen/srcbase have been decided yet. */\n  if (stream->srcwin_decided == 0)\n    {\n      /* Unrestricted case: the match can cover the entire source,\n       * 0--src->size.  We compare the usize_t\n       * match_maxfwd/match_maxback against the xoff_t\n       * src->size/srcpos values and take the min. */\n      /* TODO #if XD3_USE_LARGESIZET ? */\n      if (srcpos < stream->match_maxback)\n\t{\n\t  stream->match_maxback = (usize_t) srcpos;\n\t}\n\n      if (src->eof_known)\n\t{\n\t  xoff_t srcavail = xd3_source_eof (src) - srcpos;\n\n\t  if (srcavail < stream->match_maxfwd)\n\t    {\n\t      stream->match_maxfwd = (usize_t) srcavail;\n\t    }\n\t}\n\n      IF_DEBUG2(DP(RINT\n\t\t   \"[match_setup] srcpos %\"Q\"u (tgtpos %\"Q\"u) \"\n\t\t   \"unrestricted maxback %\"W\"u maxfwd %\"W\"u\\n\",\n\t\t   srcpos,\n\t\t   stream->total_in + stream->input_position,\n\t\t   stream->match_maxback,\n\t\t   stream->match_maxfwd));\n      goto good;\n    }\n\n  /* Decided some source window. */\n  XD3_ASSERT (src->srclen > 0);\n\n  /* Restricted case: fail if the srcpos lies outside the source window */\n  if ((srcpos < src->srcbase) ||\n      (srcpos > (src->srcbase + src->srclen)))\n    {\n      IF_DEBUG1(DP(RINT \"[match_setup] restricted source window failure\\n\"));\n      goto bad;\n    }\n  else\n    {\n      usize_t srcavail;\n\n      srcavail = (usize_t) (srcpos - src->srcbase);\n      if (srcavail < stream->match_maxback)\n\t{\n\t  stream->match_maxback = srcavail;\n\t}\n\n      srcavail = src->srcbase + src->srclen - srcpos;\n      if (srcavail < stream->match_maxfwd)\n\t{\n\t  stream->match_maxfwd = srcavail;\n\t}\n\n      IF_DEBUG2(DP(RINT\n\t\t   \"[match_setup] srcpos %\"Q\"u (tgtpos %\"Q\"u) \"\n\t\t   \"restricted maxback %\"W\"u maxfwd %\"W\"u\\n\",\n\t\t   srcpos,\n\t\t   stream->total_in + stream->input_position,\n\t\t   stream->match_maxback,\n\t\t   stream->match_maxfwd));\n      goto good;\n    }\n\n good:\n  stream->match_state  = MATCH_BACKWARD;\n  stream->match_srcpos = srcpos;\n  stream->match_last_srcpos = srcpos;\n  return 0;\n\n bad:\n  stream->match_state  = MATCH_SEARCHING;\n  stream->match_last_srcpos = srcpos;\n  return 1;\n}\n\nstatic inline usize_t\nxd3_forward_match(const uint8_t *s1c, const uint8_t *s2c, usize_t n)\n{\n  usize_t i = 0;\n#if UNALIGNED_OK\n  usize_t nint = n / sizeof(int);\n\n  if (nint >> 3)\n    {\n      usize_t j = 0;\n      const int *s1 = (const int*)s1c;\n      const int *s2 = (const int*)s2c;\n      usize_t nint_8 = nint - 8;\n\n      while (i <= nint_8 &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++] &&\n\t     s1[i++] == s2[j++]) { }\n\n      i = (i - 1) * sizeof(int);\n    }\n#endif\n\n  while (i < n && s1c[i] == s2c[i])\n    {\n      i++;\n    }\n  return i;\n}\n\n/* This function expands the source match backward and forward.  It is\n * reentrant, since xd3_getblk may return XD3_GETSRCBLK, so most\n * variables are kept in xd3_stream.  There are two callers of this\n * function, the string_matching routine when a checksum match is\n * discovered, and xd3_encode_input whenever a continuing (or initial)\n * match is suspected.  The two callers do different things with the\n * input_position, thus this function leaves that variable untouched.\n * If a match is taken the resulting stream->match_fwd is left\n * non-zero. */\nstatic int\nxd3_source_extend_match (xd3_stream *stream)\n{\n  int ret;\n  xd3_source *const src = stream->src;\n  xoff_t matchoff;  /* matchoff is the current right/left-boundary of\n\t\t       the source match being tested. */\n  usize_t streamoff; /* streamoff is the current right/left-boundary\n\t\t\tof the input match being tested. */\n  xoff_t tryblk;    /* tryblk, tryoff are the block, offset position\n\t\t       of matchoff */\n  usize_t tryoff;\n  usize_t tryrem;    /* tryrem is the number of matchable bytes */\n  usize_t matched;\n\n  IF_DEBUG2(DP(RINT \"[extend match] srcpos %\"Q\"u\\n\",\n\t       stream->match_srcpos));\n\n  XD3_ASSERT (src != NULL);\n\n  /* Does it make sense to compute backward match AFTER forward match? */\n  if (stream->match_state == MATCH_BACKWARD)\n    {\n      /* Note: this code is practically duplicated below, substituting\n       * match_fwd/match_back and direction. */\n      matchoff  = stream->match_srcpos - stream->match_back;\n      streamoff = stream->input_position - stream->match_back;\n      xd3_blksize_div (matchoff, src, &tryblk, &tryoff);\n\n      /* this loops backward over source blocks */\n      while (stream->match_back < stream->match_maxback)\n\t{\n\t  /* see if we're backing across a source block boundary */\n\t  if (tryoff == 0)\n\t    {\n\t      tryoff  = src->blksize;\n\t      tryblk -= 1;\n\t    }\n\n\t  if ((ret = xd3_getblk (stream, tryblk)))\n\t    {\n\t      if (ret == XD3_TOOFARBACK)\n\t\t{\n\t\t  IF_DEBUG2(DP(RINT \"[maxback] %\"Q\"u TOOFARBACK: %\"W\"u INP %\"Q\"u CKSUM %\"Q\"u\\n\",\n\t\t\t       tryblk, stream->match_back,\n\t\t\t       stream->total_in + stream->input_position,\n\t\t\t       stream->srcwin_cksum_pos));\n\n\t\t  /* the starting position is too far back. */\n\t\t  if (stream->match_back == 0)\n\t\t    {\n\t\t      XD3_ASSERT(stream->match_fwd == 0);\n\t\t      goto donefwd;\n\t\t    }\n\n\t\t  /* search went too far back, continue forward. */\n\t\t  goto doneback;\n\t\t}\n\n\t      /* could be a XD3_GETSRCBLK failure. */\n\t      return ret;\n\t    }\n\n\t  tryrem = xd3_min (tryoff, stream->match_maxback - stream->match_back);\n\n\t  IF_DEBUG2(DP(RINT \"[maxback] maxback %\"W\"u trysrc %\"Q\"u/%\"W\"u tgt %\"W\"u tryrem %\"W\"u\\n\",\n\t\t       stream->match_maxback, tryblk, tryoff, streamoff, tryrem));\n\n\t  /* TODO: This code can be optimized similar to xd3_match_forward() */\n\t  for (; tryrem != 0; tryrem -= 1, stream->match_back += 1)\n\t    {\n\t      if (src->curblk[tryoff-1] != stream->next_in[streamoff-1])\n\t\t{\n\t\t  goto doneback;\n\t\t}\n\n\t      tryoff    -= 1;\n\t      streamoff -= 1;\n\t    }\n\t}\n\n    doneback:\n      stream->match_state = MATCH_FORWARD;\n    }\n\n  XD3_ASSERT (stream->match_state == MATCH_FORWARD);\n\n  matchoff  = stream->match_srcpos + stream->match_fwd;\n  streamoff = stream->input_position + stream->match_fwd;\n  xd3_blksize_div (matchoff, src, & tryblk, & tryoff);\n\n  /* Note: practically the same code as backwards case above: same comments */\n  while (stream->match_fwd < stream->match_maxfwd)\n    {\n      if (tryoff == src->blksize)\n\t{\n\t  tryoff  = 0;\n\t  tryblk += 1;\n\t}\n\n      if ((ret = xd3_getblk (stream, tryblk)))\n\t{\n\t  if (ret == XD3_TOOFARBACK)\n\t    {\n\t      IF_DEBUG2(DP(RINT \"[maxfwd] %\"Q\"u TOOFARBACK: %\"W\"u INP %\"Q\"u CKSUM %\"Q\"u\\n\",\n\t\t\t   tryblk, stream->match_fwd,\n\t\t\t   stream->total_in + stream->input_position,\n\t\t\t   stream->srcwin_cksum_pos));\n\t      goto donefwd;\n\t    }\n\n\t  /* could be a XD3_GETSRCBLK failure. */\n\t  return ret;\n\t}\n\n      tryrem = xd3_min(stream->match_maxfwd - stream->match_fwd,\n\t\t   src->onblk - tryoff);\n\n      if (tryrem == 0)\n\t{\n\t  /* Generally, this means we have a power-of-two size source\n\t   * and we just found the end-of-file, in this case it's an\n\t   * empty block. */\n\t  XD3_ASSERT (src->onblk < src->blksize);\n\t  break;\n\t}\n\n      matched = xd3_forward_match(src->curblk + tryoff,\n\t\t\t\t  stream->next_in + streamoff,\n\t\t\t\t  tryrem);\n      tryoff += matched;\n      streamoff += matched;\n      stream->match_fwd += matched;\n\n      if (tryrem != matched)\n\t{\n\t  break;\n\t}\n    }\n\n donefwd:\n  stream->match_state = MATCH_SEARCHING;\n\n  IF_DEBUG2(DP(RINT \"[extend match] input %\"Q\"u srcpos %\"Q\"u len %\"W\"u\\n\",\n\t       stream->input_position + stream->total_in,\n\t       stream->match_srcpos,\n\t       stream->match_fwd));\n\n  /* If the match ends short of the last instruction end, we probably\n   * don't want it.  There is the possibility that a copy ends short\n   * of the last copy but also goes further back, in which case we\n   * might want it.  This code does not implement such: if so we would\n   * need more complicated xd3_iopt_erase logic. */\n  if (stream->match_fwd < stream->min_match)\n    {\n      stream->match_fwd = 0;\n    }\n  else\n    {\n      usize_t total  = stream->match_fwd + stream->match_back;\n\n      /* Correct the variables to remove match_back from the equation. */\n      usize_t target_position = stream->input_position - stream->match_back;\n      usize_t match_length   = stream->match_back      + stream->match_fwd;\n      xoff_t match_position  = stream->match_srcpos    - stream->match_back;\n      xoff_t match_end       = stream->match_srcpos    + stream->match_fwd;\n\n      /* At this point we may have to erase any iopt-buffer\n       * instructions that are fully covered by a backward-extending\n       * copy. */\n      if (stream->match_back > 0)\n\t{\n\t  xd3_iopt_erase (stream, target_position, total);\n\t}\n\n      stream->match_back = 0;\n\n      /* Update ranges.  The first source match occurs with both\n\t values set to 0. */\n      if (stream->match_maxaddr == 0 ||\n\t  match_position < stream->match_minaddr)\n\t{\n\t  stream->match_minaddr = match_position;\n\t}\n\n      if (match_end > stream->match_maxaddr)\n\t{\n\t  /* Note: per-window */\n\t  stream->match_maxaddr = match_end;\n\t}\n\n      if (match_end > stream->maxsrcaddr)\n\t{\n\t  /* Note: across windows */\n\t  stream->maxsrcaddr = match_end;\n\t}\n\n      IF_DEBUG2 ({\n\tstatic int x = 0;\n\tDP(RINT \"[source match:%d] length %\"W\"u <inp %\"Q\"u %\"Q\"u>  <src %\"Q\"u %\"Q\"u> (%s)\\n\",\n\t   x++,\n\t   match_length,\n\t   stream->total_in + target_position,\n\t   stream->total_in + target_position + match_length,\n\t   match_position,\n\t   match_position + match_length,\n\t   (stream->total_in + target_position == match_position) ? \"same\" : \"diff\");\n      });\n\n      if ((ret = xd3_found_match (stream,\n\t\t\t\t  /* decoder position */ target_position,\n\t\t\t\t  /* length */ match_length,\n\t\t\t\t  /* address */ match_position,\n\t\t\t\t  /* is_source */ 1)))\n\t{\n\t  return ret;\n\t}\n\n      /* If the match ends with the available input: */\n      if (target_position + match_length == stream->avail_in)\n\t{\n\t  /* Setup continuing match for the next window. */\n\t  stream->match_state  = MATCH_TARGET;\n\t  stream->match_srcpos = match_end;\n\t}\n    }\n\n  return 0;\n}\n\n/* Update the small hash.  Values in the small_table are offset by\n * HASH_CKOFFSET (1) to distinguish empty buckets from real offsets. */\nstatic void\nxd3_scksum_insert (xd3_stream *stream,\n\t\t   usize_t inx,\n\t\t   usize_t scksum,\n\t\t   usize_t pos)\n{\n  /* If we are maintaining previous duplicates. */\n  if (stream->small_prev)\n    {\n      usize_t    last_pos = stream->small_table[inx];\n      xd3_slist *pos_list = & stream->small_prev[pos & stream->sprevmask];\n\n      /* Note last_pos is offset by HASH_CKOFFSET. */\n      pos_list->last_pos = last_pos;\n    }\n\n  /* Enter the new position into the hash bucket. */\n  stream->small_table[inx] = pos + HASH_CKOFFSET;\n}\n\n#if XD3_DEBUG\nstatic int\nxd3_check_smatch (const uint8_t *ref0, const uint8_t *inp0,\n\t\t  const uint8_t *inp_max, usize_t cmp_len)\n{\n  usize_t i;\n\n  for (i = 0; i < cmp_len; i += 1)\n    {\n      XD3_ASSERT (ref0[i] == inp0[i]);\n    }\n\n  if (inp0 + cmp_len < inp_max)\n    {\n      XD3_ASSERT (inp0[i] != ref0[i]);\n    }\n\n  return 1;\n}\n#endif /* XD3_DEBUG */\n\n/* When the hash table indicates a possible small string match, it\n * calls this routine to find the best match.  The first matching\n * position is taken from the small_table, HASH_CKOFFSET is subtracted\n * to get the actual position.  After checking that match, if previous\n * linked lists are in use (because stream->smatcher.small_chain > 1),\n * previous matches are tested searching for the longest match.  If\n * (stream->min_match > MIN_MATCH) then a lazy match is in effect.\n */\nstatic usize_t\nxd3_smatch (xd3_stream *stream,\n\t    usize_t base,\n\t    usize_t scksum,\n\t    usize_t *match_offset)\n{\n  usize_t cmp_len;\n  usize_t match_length = 0;\n  usize_t chain = (stream->min_match == MIN_MATCH ?\n                   stream->smatcher.small_chain :\n                   stream->smatcher.small_lchain);\n  const uint8_t *inp_max = stream->next_in + stream->avail_in;\n  const uint8_t *inp;\n  const uint8_t *ref;\n\n  SMALL_HASH_DEBUG1 (stream, stream->next_in + stream->input_position);\n\n  XD3_ASSERT (stream->min_match + stream->input_position <= stream->avail_in);\n\n  base -= HASH_CKOFFSET;\n\n again:\n\n  IF_DEBUG2 (DP(RINT \"smatch at base=%\"W\"u inp=%\"W\"u cksum=%\"W\"u\\n\", base,\n                stream->input_position, scksum));\n\n  /* For small matches, we can always go to the end-of-input because\n   * the matching position must be less than the input position. */\n  XD3_ASSERT (base < stream->input_position);\n\n  ref = stream->next_in + base;\n  inp = stream->next_in + stream->input_position;\n\n  SMALL_HASH_DEBUG2 (stream, ref);\n\n  /* Expand potential match forward. */\n  while (inp < inp_max && *inp == *ref)\n    {\n      ++inp;\n      ++ref;\n    }\n\n  cmp_len = (usize_t)(inp - (stream->next_in + stream->input_position));\n\n  /* Verify correctness */\n  XD3_ASSERT (xd3_check_smatch (stream->next_in + base,\n\t\t\t\tstream->next_in + stream->input_position,\n\t\t\t\tinp_max, cmp_len));\n\n  /* Update longest match */\n  if (cmp_len > match_length)\n    {\n      ( match_length) = cmp_len;\n      (*match_offset) = base;\n\n      /* Stop if we match the entire input or have a long_enough match. */\n      if (inp == inp_max || cmp_len >= stream->smatcher.long_enough)\n\t{\n\t  goto done;\n\t}\n    }\n\n  /* If we have not reached the chain limit, see if there is another\n     previous position. */\n  while (--chain != 0)\n    {\n      /* Calculate the previous offset. */\n      usize_t prev_pos = stream->small_prev[base & stream->sprevmask].last_pos;\n      usize_t diff_pos;\n\n       if (prev_pos == 0)\n \t{\n \t  break;\n \t}\n\n      prev_pos -= HASH_CKOFFSET;\n\n      if (prev_pos > base)\n        {\n          break;\n        }\n\n      base = prev_pos;\n\n      XD3_ASSERT (stream->input_position > base);\n      diff_pos = stream->input_position - base;\n\n      /* Stop searching if we go beyond sprevsz, since those entries\n       * are for unrelated checksum entries. */\n      if (diff_pos & ~stream->sprevmask)\n        {\n          break;\n        }\n\n      goto again;\n    }\n\n done:\n  /* Crude efficiency test: if the match is very short and very far back, it's\n   * unlikely to help, but the exact calculation requires knowing the state of\n   * the address cache and adjacent instructions, which we can't do here.\n   * Rather than encode a probably inefficient copy here and check it later\n   * (which complicates the code a lot), do this:\n   */\n  if (match_length == 4 && stream->input_position - (*match_offset) >= 1<<14)\n    {\n      /* It probably takes >2 bytes to encode an address >= 2^14 from here */\n      return 0;\n    }\n  if (match_length == 5 && stream->input_position - (*match_offset) >= 1<<21)\n    {\n      /* It probably takes >3 bytes to encode an address >= 2^21 from here */\n      return 0;\n    }\n\n  /* It's unlikely that a window is large enough for the (match_length == 6 &&\n   * address >= 2^28) check */\n  return match_length;\n}\n\n#if XD3_DEBUG\nstatic void\nxd3_verify_small_state (xd3_stream    *stream,\n\t\t\tconst uint8_t *inp,\n\t\t\tuint32_t       x_cksum)\n{\n  uint32_t state;\n  uint32_t cksum = xd3_scksum (&state, inp, stream->smatcher.small_look);\n\n  XD3_ASSERT (cksum == x_cksum);\n}\n\nstatic void\nxd3_verify_large_state (xd3_stream    *stream,\n\t\t\tconst uint8_t *inp,\n\t\t\tusize_t        x_cksum)\n{\n  usize_t cksum = xd3_large_cksum (&stream->large_hash, inp, stream->smatcher.large_look);\n  XD3_ASSERT (cksum == x_cksum);\n}\nstatic void\nxd3_verify_run_state (xd3_stream    *stream,\n\t\t      const uint8_t *inp,\n\t\t      usize_t        x_run_l,\n\t\t      uint8_t       *x_run_c)\n{\n  usize_t slook = stream->smatcher.small_look;\n  uint8_t run_c;\n  usize_t run_l = xd3_comprun (inp, slook, &run_c);\n\n  XD3_ASSERT (run_l == 0 || run_c == *x_run_c);\n  XD3_ASSERT (x_run_l > slook || run_l == x_run_l);\n}\n#endif /* XD3_DEBUG */\n\n/* This function computes more source checksums to advance the window.\n * Called at every entrance to the string-match loop and each time\n * stream->input_position reaches the value returned as\n * *next_move_point.  NB: this is one of the most expensive functions\n * in this code and also the most critical for good compression.\n */\nstatic int\nxd3_srcwin_move_point (xd3_stream *stream, usize_t *next_move_point)\n{\n  /* the source file is indexed until this point */\n  xoff_t target_cksum_pos;\n  /* the absolute target file input position */\n  xoff_t absolute_input_pos;\n\n  if (stream->src->eof_known)\n    {\n      xoff_t source_size = xd3_source_eof (stream->src);\n      XD3_ASSERT(stream->srcwin_cksum_pos <= source_size);\n\n      if (stream->srcwin_cksum_pos == source_size)\n\t{\n\t  *next_move_point = USIZE_T_MAX;\n\t  return 0;\n\t}\n    }\n\n  absolute_input_pos = stream->total_in + stream->input_position;\n\n  /* Immediately read the entire window. \n   *\n   * Note: this reverses a long held policy, at this point in the\n   * code, of advancing relatively slowly as the input is read, which\n   * results in better compression for very-similar inputs, but worse\n   * compression where data is deleted near the beginning of the file.\n   * \n   * The new policy is simpler, somewhat slower and can benefit, or\n   * slightly worsen, compression performance. */\n  if (absolute_input_pos < stream->src->max_winsize / 2)\n    {\n      target_cksum_pos = stream->src->max_winsize;\n    }\n  else\n    {\n      /* TODO: The addition of 2 blocks here is arbitrary.  Do a\n       * better job of stream alignment based on observed source copy\n       * addresses, and when both input sizes are known, the\n       * difference in size. */\n      target_cksum_pos = absolute_input_pos +\n\tstream->src->max_winsize / 2 +\n\tstream->src->blksize * 2;\n      target_cksum_pos &= ~stream->src->maskby;\n    }\n\n  /* A long match may have extended past srcwin_cksum_pos.  Don't\n   * start checksumming already-matched source data. */\n  if (stream->maxsrcaddr > stream->srcwin_cksum_pos)\n    {\n      stream->srcwin_cksum_pos = stream->maxsrcaddr;\n    }\n\n  if (target_cksum_pos < stream->srcwin_cksum_pos)\n    {\n      target_cksum_pos = stream->srcwin_cksum_pos;\n    }\n\n  while (stream->srcwin_cksum_pos < target_cksum_pos &&\n\t (!stream->src->eof_known ||\n\t  stream->srcwin_cksum_pos < xd3_source_eof (stream->src)))\n    {\n      xoff_t  blkno;\n      xoff_t  blkbaseoffset;\n      usize_t blkrem;\n      ssize_t oldpos;  /* Using ssize_t because of a  */\n      ssize_t blkpos;  /* do { blkpos-- }\n\t\t\t  while (blkpos >= oldpos); */\n      int ret;\n      xd3_blksize_div (stream->srcwin_cksum_pos,\n\t\t       stream->src, &blkno, &blkrem);\n      oldpos = blkrem;\n\n      if ((ret = xd3_getblk (stream, blkno)))\n\t{\n\t  /* TOOFARBACK should never occur here, since we read forward. */\n\t  if (ret == XD3_TOOFARBACK)\n\t    {\n \t      ret = XD3_INTERNAL;\n\t    }\n\n\t  IF_DEBUG1 (DP(RINT\n\t\t\t\"[srcwin_move_point] async getblk return for %\"Q\"u: %s\\n\",\n\t\t\tblkno, xd3_strerror (ret)));\n\t  return ret;\n\t}\n\n      IF_DEBUG1 (DP(RINT\n\t\t    \"[srcwin_move_point] block %\"Q\"u T=%\"Q\"u S=%\"Q\"u L=%\"Q\"u EOF=%\"Q\"u %s\\n\",\n\t\t    blkno,\n\t\t    stream->total_in + stream->input_position,\n\t\t    stream->srcwin_cksum_pos,\n\t\t    target_cksum_pos,\n\t\t    xd3_source_eof (stream->src),\n\t\t    stream->src->eof_known ? \"known\" : \"unknown\"));\n\n      blkpos = xd3_bytes_on_srcblk (stream->src, blkno);\n\n      if (blkpos < (ssize_t) stream->smatcher.large_look)\n\t{\n\t  stream->srcwin_cksum_pos = (blkno + 1) * stream->src->blksize;\n\t  IF_DEBUG2 (DP(RINT \"[srcwin_move_point] continue (end-of-block): %\"Z\"d\\n\", blkpos));\n\t  continue;\n\t}\n\n      /* This inserts checksums for the entire block, in reverse,\n       * starting from the end of the block.  This logic does not test\n       * stream->srcwin_cksum_pos because it always advances it to the\n       * start of the next block.\n       *\n       * oldpos is the srcwin_cksum_pos within this block.  blkpos is\n       * the number of bytes available.  Each iteration inspects\n       * large_look bytes then steps back large_step bytes.  The\n       * if-stmt above ensures at least one large_look of data. */\n      blkpos -= stream->smatcher.large_look;\n      blkbaseoffset = stream->src->blksize * blkno;\n\n      do\n\t{\n\t  /* TODO: This would be significantly faster if the compiler\n\t   * knew stream->smatcher.large_look (which the template for\n\t   * xd3_string_match_* allows). */\n\t  usize_t cksum = xd3_large_cksum (&stream->large_hash, \n\t\t\t\t\t   stream->src->curblk + blkpos,\n\t\t\t\t\t   stream->smatcher.large_look);\n\t  usize_t hval = xd3_checksum_hash (& stream->large_hash, cksum);\n\n\t  stream->large_table[hval] =\n\t    (usize_t) (blkbaseoffset +\n\t\t       (xoff_t)(blkpos + HASH_CKOFFSET));\n\n\t  IF_DEBUG (stream->large_ckcnt += 1);\n\n\t  blkpos -= stream->smatcher.large_step;\n\t}\n      while (blkpos >= oldpos);\n\n      stream->srcwin_cksum_pos = (blkno + 1) * stream->src->blksize;\n    }\n\n  IF_DEBUG1 (DP(RINT\n\t\t\"[srcwin_move_point] exited loop T=%\"Q\"u \"\n\t\t\"S=%\"Q\"u EOF=%\"Q\"u %s\\n\",\n\t\tstream->total_in + stream->input_position,\n\t\tstream->srcwin_cksum_pos,\n\t\txd3_source_eof (stream->src),\n\t\tstream->src->eof_known ? \"known\" : \"unknown\"));\n\n  if (stream->src->eof_known)\n    {\n      xoff_t source_size = xd3_source_eof (stream->src);\n      if (stream->srcwin_cksum_pos >= source_size)\n\t{\n\t  /* This invariant is needed for xd3_source_cksum_offset() */\n\t  stream->srcwin_cksum_pos = source_size;\n\t  *next_move_point = USIZE_T_MAX;\n\t  IF_DEBUG1 (DP(RINT\n\t\t\t\"[srcwin_move_point] finished with source input\\n\"));\n\t  return 0;\n\t}\n    }\n\n  /* How long until this function should be called again. */\n  XD3_ASSERT(stream->srcwin_cksum_pos >= target_cksum_pos);\n\n  *next_move_point = stream->input_position +\n    stream->src->blksize -\n    ((stream->srcwin_cksum_pos - target_cksum_pos) & stream->src->maskby);\n  \n  IF_DEBUG2 (DP(RINT\n\t\t\"[srcwin_move_point] finished T=%\"Q\"u \"\n\t\t\"S=%\"Q\"u L=%\"Q\"u EOF=%\"Q\"u %s again in %\"W\"u\\n\",\n\t\tstream->total_in + stream->input_position,\n\t\tstream->srcwin_cksum_pos,\n\t\ttarget_cksum_pos,\n\t\txd3_source_eof (stream->src),\n\t\tstream->src->eof_known ? \"known\" : \"unknown\",\n\t\t*next_move_point - stream->input_position));\n\n  return 0;\n}\n\n#endif /* XD3_ENCODER */\n\n/********************************************************************\n TEMPLATE pass\n *********************************************************************/\n\n#endif /* __XDELTA3_C_INLINE_PASS__ */\n#ifdef __XDELTA3_C_TEMPLATE_PASS__\n\n#if XD3_ENCODER\n\n/********************************************************************\n Templates\n *******************************************************************/\n\n/* Template macros */\n#define XD3_TEMPLATE(x)      XD3_TEMPLATE2(x,TEMPLATE)\n#define XD3_TEMPLATE2(x,n)   XD3_TEMPLATE3(x,n)\n#define XD3_TEMPLATE3(x,n)   x ## n\n#define XD3_STRINGIFY(x)     XD3_STRINGIFY2(x)\n#define XD3_STRINGIFY2(x)    #x\n\nstatic int XD3_TEMPLATE(xd3_string_match_) (xd3_stream *stream);\n\nstatic const xd3_smatcher XD3_TEMPLATE(__smatcher_) =\n{\n  XD3_STRINGIFY(TEMPLATE),\n  XD3_TEMPLATE(xd3_string_match_),\n#if SOFTCFG == 1\n  0, 0, 0, 0, 0, 0, 0\n#else\n  LLOOK, LSTEP, SLOOK, SCHAIN, SLCHAIN, MAXLAZY, LONGENOUGH\n#endif\n};\n\nstatic int\nXD3_TEMPLATE(xd3_string_match_) (xd3_stream *stream)\n{\n  const int      DO_SMALL = ! (stream->flags & XD3_NOCOMPRESS);\n  const int      DO_LARGE = (stream->src != NULL);\n  const int      DO_RUN   = (1);\n\n  const uint8_t *inp;\n  uint32_t       scksum = 0;\n  uint32_t       scksum_state = 0;\n  usize_t        lcksum = 0;\n  usize_t        sinx;\n  usize_t        linx;\n  uint8_t        run_c;\n  usize_t        run_l;\n  int            ret;\n  usize_t        match_length;\n  usize_t        match_offset = 0;\n  usize_t        next_move_point = 0;\n\n  IF_DEBUG2(DP(RINT \"[string_match] initial entry %\"W\"u\\n\", stream->input_position));\n\n  /* If there will be no compression due to settings or short input,\n   * skip it entirely. */\n  if (! (DO_SMALL || DO_LARGE || DO_RUN) ||\n      stream->input_position + SLOOK > stream->avail_in) { goto loopnomore; }\n\n  if ((ret = xd3_string_match_init (stream))) { return ret; }\n\n  /* The restartloop label is reached when the incremental loop state\n   * needs to be reset. */\n restartloop:\n\n  IF_DEBUG2(DP(RINT \"[string_match] restartloop %\"W\"u\\n\", stream->input_position));\n\n  /* If there is not enough input remaining for any kind of match,\n     skip it. */\n  if (stream->input_position + SLOOK > stream->avail_in) { goto loopnomore; }\n\n  /* Now reset the incremental loop state: */\n\n  /* The min_match variable is updated to avoid matching the same lazy\n   * match over and over again.  For example, if you find a (small)\n   * match of length 9 at one position, you will likely find a match\n   * of length 8 at the next position. */\n  if (xd3_iopt_last_matched (stream) > stream->input_position)\n    {\n      stream->min_match = xd3_max (MIN_MATCH,\n\t\t\t\t   1 + xd3_iopt_last_matched(stream) -\n\t\t\t\t   stream->input_position);\n    }\n  else\n    {\n      stream->min_match = MIN_MATCH;\n    }\n\n  /* The current input byte. */\n  inp = stream->next_in + stream->input_position;\n\n  /* Small match state. */\n  if (DO_SMALL)\n    {\n      scksum = xd3_scksum (&scksum_state, inp, SLOOK);\n    }\n\n  /* Run state. */\n  if (DO_RUN)\n    {\n      run_l = xd3_comprun (inp, SLOOK, & run_c);\n    }\n\n  /* Large match state.  We continue the loop even after not enough\n   * bytes for LLOOK remain, so always check stream->input_position in\n   * DO_LARGE code. */\n  if (DO_LARGE && (stream->input_position + LLOOK <= stream->avail_in))\n    {\n      /* Source window: next_move_point is the point that\n       * stream->input_position must reach before computing more\n       * source checksum.  Note: this is called unconditionally\n       * the first time after reentry, subsequent calls will be\n       * avoided if next_move_point is > input_position */\n      if ((ret = xd3_srcwin_move_point (stream, & next_move_point)))\n\t{\n\t  return ret;\n\t}\n\n      lcksum = xd3_large_cksum (&stream->large_hash, inp, LLOOK);\n    }\n\n  /* TRYLAZYLEN: True if a certain length match should be followed by\n   * lazy search.  This checks that LEN is shorter than MAXLAZY and\n   * that there is enough leftover data to consider lazy matching.\n   * \"Enough\" is set to 2 since the next match will start at the next\n   * offset, it must match two extra characters. */\n#define TRYLAZYLEN(LEN,POS,MAX) ((MAXLAZY) > 0 && (LEN) < (MAXLAZY) \\\n\t\t\t\t && (POS) + (LEN) <= (MAX) - 2)\n\n  /* HANDLELAZY: This statement is called each time an instruciton is\n   * emitted (three cases).  If the instruction is large enough, the\n   * loop is restarted, otherwise lazy matching may ensue. */\n#define HANDLELAZY(mlen) \\\n  if (TRYLAZYLEN ((mlen), (stream->input_position), (stream->avail_in))) \\\n    { stream->min_match = (mlen) + LEAST_MATCH_INCR; goto updateone; } \\\n  else \\\n    { stream->input_position += (mlen); goto restartloop; }\n\n  /* Now loop over one input byte at a time until a match is found... */\n  for (;; inp += 1, stream->input_position += 1)\n    {\n      /* Now we try three kinds of string match in order of expense:\n       * run, large match, small match. */\n\n      /* Expand the start of a RUN.  The test for (run_l == SLOOK)\n       * avoids repeating this check when we pass through a run area\n       * performing lazy matching.  The run is only expanded once when\n       * the min_match is first reached.  If lazy matching is\n       * performed, the run_l variable will remain inconsistent until\n       * the first non-running input character is reached, at which\n       * time the run_l may then again grow to SLOOK. */\n      if (DO_RUN && run_l == SLOOK)\n\t{\n\t  usize_t max_len = stream->avail_in - stream->input_position;\n\n\t  IF_DEBUG (xd3_verify_run_state (stream, inp, run_l, &run_c));\n\n\t  while (run_l < max_len && inp[run_l] == run_c) { run_l += 1; }\n\n\t  /* Output a RUN instruction. */\n\t  if (run_l >= stream->min_match && run_l >= MIN_RUN)\n\t    {\n\t      if ((ret = xd3_emit_run (stream, stream->input_position,\n\t\t\t\t       run_l, &run_c))) { return ret; }\n\n\t      HANDLELAZY (run_l);\n\t    }\n\t}\n\n      /* If there is enough input remaining. */\n      if (DO_LARGE && (stream->input_position + LLOOK <= stream->avail_in))\n\t{\n\t  if ((stream->input_position >= next_move_point) &&\n\t      (ret = xd3_srcwin_move_point (stream, & next_move_point)))\n\t    {\n\t      return ret;\n\t    }\n\n\t  linx = xd3_checksum_hash (& stream->large_hash, lcksum);\n\n\t  IF_DEBUG (xd3_verify_large_state (stream, inp, lcksum));\n\n\t  if (stream->large_table[linx] != 0)\n\t    {\n\t      /* the match_setup will fail if the source window has\n\t       * been decided and the match lies outside it.\n\t       * OPT: Consider forcing a window at this point to\n\t       * permit a new source window. */\n\t      xoff_t adj_offset =\n\t\txd3_source_cksum_offset(stream,\n\t\t\t\t\tstream->large_table[linx] -\n\t\t\t\t\tHASH_CKOFFSET);\n\t      if (xd3_source_match_setup (stream, adj_offset) == 0)\n\t\t{\n\t\t  if ((ret = xd3_source_extend_match (stream)))\n\t\t    {\n\t\t      return ret;\n\t\t    }\n\n\t\t  /* Update stream position.  match_fwd is zero if no\n\t\t   * match. */\n\t\t  if (stream->match_fwd > 0)\n\t\t    {\n\t\t      HANDLELAZY (stream->match_fwd);\n\t\t    }\n\t\t}\n\t    }\n\t}\n\n      /* Small matches. */\n      if (DO_SMALL)\n\t{\n\t  sinx = xd3_checksum_hash (& stream->small_hash, scksum);\n\n\t  /* Verify incremental state in debugging mode. */\n\t  IF_DEBUG (xd3_verify_small_state (stream, inp, scksum));\n\n\t  /* Search for the longest match */\n\t  if (stream->small_table[sinx] != 0)\n\t    {\n\t      match_length = xd3_smatch (stream,\n\t\t\t\t\t stream->small_table[sinx],\n\t\t\t\t\t scksum,\n\t\t\t\t\t & match_offset);\n\t    }\n\t  else\n\t    {\n\t      match_length = 0;\n\t    }\n\n\t  /* Insert a hash for this string. */\n\t  xd3_scksum_insert (stream, sinx, scksum, stream->input_position);\n\n\t  /* Maybe output a COPY instruction */\n\t  if (match_length >= stream->min_match)\n\t    {\n\t      IF_DEBUG2 ({\n\t\tstatic int x = 0;\n\t\tDP(RINT \"[target match:%d] <inp %\"W\"u %\"W\"u>  <cpy %\"W\"u %\"W\"u> \"\n\t\t   \"(-%\"W\"d) [ %\"W\"u bytes ]\\n\",\n\t\t   x++,\n\t\t   stream->input_position,\n\t\t   stream->input_position + match_length,\n\t\t   match_offset,\n\t\t   match_offset + match_length,\n\t\t   stream->input_position - match_offset,\n\t\t   match_length);\n\t      });\n\n\t      if ((ret = xd3_found_match (stream,\n\t\t\t\t\t  /* decoder position */\n\t\t\t\t\t  stream->input_position,\n\t\t\t\t\t  /* length */ match_length,\n\t\t\t\t\t  /* address */ (xoff_t) match_offset,\n\t\t\t\t\t  /* is_source */ 0)))\n\t\t{\n\t\t  return ret;\n\t\t}\n\n\t      /* Copy instruction. */\n\t      HANDLELAZY (match_length);\n\t    }\n\t}\n\n      /* The logic above prevents excess work during lazy matching by\n       * increasing min_match to avoid smaller matches.  Each time we\n       * advance stream->input_position by one, the minimum match\n       * shortens as well.  */\n      if (stream->min_match > MIN_MATCH)\n\t{\n\t  stream->min_match -= 1;\n\t}\n\n    updateone:\n\n      /* See if there are no more incremental cksums to compute. */\n      if (stream->input_position + SLOOK == stream->avail_in)\n\t{\n\t  goto loopnomore;\n\t}\n\n      /* Compute next RUN, CKSUM */\n      if (DO_RUN)\n\t{\n\t  NEXTRUN (inp[SLOOK]);\n\t}\n\n      if (DO_SMALL)\n\t{\n\t  scksum = xd3_small_cksum_update (&scksum_state, inp, SLOOK);\n\t}\n\n      if (DO_LARGE && (stream->input_position + LLOOK < stream->avail_in))\n\t{\n\t  lcksum = xd3_large_cksum_update (&stream->large_hash, lcksum, inp, LLOOK);\n\t}\n    }\n\n loopnomore:\n  return 0;\n}\n\n#endif /* XD3_ENCODER */\n#endif /* __XDELTA3_C_TEMPLATE_PASS__ */\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.h",
    "content": "/* xdelta3 - delta compression tools and library\n   Copyright 2016 Joshua MacDonald\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n/* To learn more about Xdelta, start by reading xdelta3.c.  If you are\n * ready to use the API, continue reading here.  There are two\n * interfaces -- xd3_encode_input and xd3_decode_input -- plus a dozen\n * or so related calls.  This interface is styled after Zlib. */\n\n#ifndef _XDELTA3_H_\n#define _XDELTA3_H_\n\n#define _POSIX_SOURCE 200112L\n#define _ISOC99_SOURCE\n#define _C99_SOURCE\n\n#if HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n\n/****************************************************************/\n\n/* Default configured value of stream->winsize.  If the program\n * supplies xd3_encode_input() with data smaller than winsize the\n * stream will automatically buffer the input, otherwise the input\n * buffer is used directly.\n */\n#ifndef XD3_DEFAULT_WINSIZE\n#define XD3_DEFAULT_WINSIZE (1U << 23)\n#endif\n\n/* Default total size of the source window used in xdelta3-main.h */\n#ifndef XD3_DEFAULT_SRCWINSZ\n#define XD3_DEFAULT_SRCWINSZ (1U << 26)\n#endif\n\n/* When Xdelta requests a memory allocation for certain buffers, it\n * rounds up to units of at least this size.  The code assumes (and\n * asserts) that this is a power-of-two. */\n#ifndef XD3_ALLOCSIZE\n#define XD3_ALLOCSIZE (1U<<14)\n#endif\n\n/* The XD3_HARDMAXWINSIZE parameter is a safety mechanism to protect\n * decoders against malicious files.  The decoder will never decode a\n * window larger than this.  If the file specifies VCD_TARGET the\n * decoder may require two buffers of this size.\n *\n * 8-16MB is reasonable, probably don't need to go larger. */\n#ifndef XD3_HARDMAXWINSIZE\n#define XD3_HARDMAXWINSIZE (1U<<26)\n#endif\n/* The IOPT_SIZE value sets the size of a buffer used to batch\n * overlapping copy instructions before they are optimized by picking\n * the best non-overlapping ranges.  The larger this buffer, the\n * longer a forced xd3_srcwin_setup() decision is held off.  Setting\n * this value to 0 causes an unlimited buffer to be used. */\n#ifndef XD3_DEFAULT_IOPT_SIZE\n#define XD3_DEFAULT_IOPT_SIZE    (1U<<15)\n#endif\n\n/* The maximum distance backward to search for small matches */\n#ifndef XD3_DEFAULT_SPREVSZ\n#define XD3_DEFAULT_SPREVSZ (1U<<18)\n#endif\n\n/* The default compression level */\n#ifndef XD3_DEFAULT_LEVEL\n#define XD3_DEFAULT_LEVEL 3\n#endif\n\n#ifndef XD3_DEFAULT_SECONDARY_LEVEL\n#define XD3_DEFAULT_SECONDARY_LEVEL 6\n#endif\n\n#ifndef XD3_USE_LARGEFILE64\n#define XD3_USE_LARGEFILE64 1\n#endif\n\n/* The source window size is limited to 2GB unless\n * XD3_USE_LARGESIZET is defined to 1. */\n#ifndef XD3_USE_LARGESIZET\n#define XD3_USE_LARGESIZET 1\n#endif\n\n/* Sizes and addresses within VCDIFF windows are represented as usize_t\n *\n * For source-file offsets and total file sizes, total input and\n * output counts, the xoff_t type is used.  The decoder and encoder\n * generally check for overflow of the xoff_t size (this is tested at\n * the 32bit boundary [xdelta3-test.h]).\n */\n#ifndef _WIN32\n#define __STDC_FORMAT_MACROS\n#include <inttypes.h>\n#include <stdint.h>\n#else /* WIN32 case */\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifndef WINVER\n#if XD3_USE_LARGEFILE64\n/* 64 bit file offsets: uses GetFileSizeEx and SetFilePointerEx. */\n#define WINVER\t\t0x0500\n#define _WIN32_WINNT\t0x0500\n#else /* xoff_t is 32bit */\n/* 32 bit file offsets: uses GetFileSize and SetFilePointer. */\n#define WINVER\t\t0x0400\n#define _WIN32_WINNT\t0x0400\n#endif /* if XD3_USE_LARGEFILE64 */\n#endif /* ifndef WINVER */\n\n#include <windows.h>\n\n/* _MSV_VER is defined by Microsoft tools, not by Mingw32 */\n#ifdef _MSC_VER\ntypedef signed int     ssize_t;\ntypedef int pid_t;\n#if _MSC_VER < 1600\ntypedef unsigned char  uint8_t;\ntypedef unsigned short uint16_t;\ntypedef unsigned long  uint32_t;\ntypedef ULONGLONG      uint64_t;\n#else /* _MSC_VER >= 1600 */\n/* For MSVC10 and above */\n#include <stdint.h>\n#define inline __inline\n#endif /* _MSC_VER < 1600 */\n#else /* _MSC_VER not defined  */\n/* Mingw32 */\n#include <stdint.h>\n#endif /* _MSC_VER defined */\n\n#endif /* _WIN32 defined */\n\n/* Settings based on the size of xoff_t (32 vs 64 file offsets) */\n#if XD3_USE_LARGEFILE64\n/* xoff_t is a 64-bit type */\n#define __USE_FILE_OFFSET64 1 /* GLIBC: for 64bit fileops. */\n\n#ifndef _LARGEFILE_SOURCE\n#define _LARGEFILE_SOURCE\n#endif\n\n#ifndef _FILE_OFFSET_BITS\n#define _FILE_OFFSET_BITS 64\n#endif\n\nstatic_assert(SIZEOF_SIZE_T == sizeof(size_t), \"SIZEOF_SIZE_T not correctly set\");\nstatic_assert(SIZEOF_UNSIGNED_LONG_LONG == sizeof(unsigned long long), \"SIZEOF_UNSIGNED_LONG_LONG not correctly set\");\n\n/* Set a xoff_t typedef and the \"Q\" printf insert. */\n#if defined(_WIN32)\ntypedef uint64_t xoff_t;\n#define Q \"I64\"\n#elif SIZEOF_UNSIGNED_LONG == 8\ntypedef unsigned long xoff_t;\n#define Q \"l\"\n#elif SIZEOF_SIZE_T == 8\ntypedef size_t xoff_t;\n#define Q \"z\"\n#elif SIZEOF_UNSIGNED_LONG_LONG == 8\ntypedef unsigned long long xoff_t;\n#define Q \"ll\"\n#endif /* typedef and #define Q */\n\n#define SIZEOF_XOFF_T 8\n\n#else /* XD3_USE_LARGEFILE64 == 0 */\n\n#if SIZEOF_UNSIGNED_INT == 4\ntypedef unsigned int xoff_t;\n#elif SIZEOF_UNSIGNED_LONG == 4\ntypedef unsigned long xoff_t;\n#else\ntypedef uint32_t xoff_t;\n#endif /* xoff_t is 32 bits */\n\n#define SIZEOF_XOFF_T 4\n#define Q\n#endif /* 64 vs 32 bit xoff_t */\n\n/* Settings based on the size of usize_t (32 and 64 bit window size) */\n#if XD3_USE_LARGESIZET\n\n/* Set a usize_ttypedef and the \"W\" printf insert. */\n#if defined(_WIN32)\ntypedef uint64_t usize_t;\n#define W \"I64\"\n#elif SIZEOF_UNSIGNED_LONG == 8\ntypedef unsigned long usize_t;\n#define W \"l\"\n#elif SIZEOF_SIZE_T == 8\ntypedef size_t usize_t;\n#define W \"z\"\n#elif SIZEOF_UNSIGNED_LONG_LONG == 8\ntypedef unsigned long long usize_t;\n#define W \"ll\"\n#endif /* typedef and #define W */\n\n#define SIZEOF_USIZE_T 8\n\n#else /* XD3_USE_LARGESIZET == 0 */\n\n#if SIZEOF_UNSIGNED_INT == 4\ntypedef unsigned int usize_t;\n#elif SIZEOF_UNSIGNED_LONG == 4\ntypedef unsigned long usize_t;\n#else\ntypedef uint32_t usize_t;\n#endif /* usize_t is 32 bits */\n\n#define SIZEOF_USIZE_T 4\n#define W\n\n#endif /* 64 vs 32 bit usize_t */\n\n/* Settings based on the size of size_t (the system-provided,\n * usually-but-maybe-not an unsigned type) */\n#if SIZEOF_SIZE_T == 4\n#define Z \"z\"\n#elif SIZEOF_SIZE_T == 8\n#ifdef _WIN32\n#define Z \"I64\"\n#else /* !_WIN32 */\n#define Z \"z\"\n#endif /* Windows or not */\n#else\n#error Bad configure script\n#endif /* size_t printf flags */\n\n#define USE_UINT32 (SIZEOF_USIZE_T == 4 || \\\n\t\t    SIZEOF_XOFF_T == 4 || REGRESSION_TEST)\n#define USE_UINT64 (SIZEOF_USIZE_T == 8 || \\\n\t\t    SIZEOF_XOFF_T == 8 || REGRESSION_TEST)\n\n#ifndef UNALIGNED_OK\n#ifdef HAVE_ALIGNED_ACCESS_REQUIRED\n#define UNALIGNED_OK 0\n#else\n/* This generally includes all Windows builds. */\n#define UNALIGNED_OK 1\n#endif\n#endif\n\n/**********************************************************************/\n\n/* Whether to build the encoder, otherwise only build the decoder. */\n#ifndef XD3_ENCODER\n#define XD3_ENCODER 1\n#endif\n\n/* The code returned when main() fails, also defined in system\n   includes. */\n#ifndef EXIT_FAILURE\n#define EXIT_FAILURE 1\n#endif\n\n/* REGRESSION TEST enables the \"xdelta3 test\" command, which runs a\n   series of self-tests. */\n#ifndef REGRESSION_TEST\n#define REGRESSION_TEST 0\n#endif\n\n/* XD3_DEBUG=1 enables assertions and various statistics.  Levels > 1\n * enable some additional output only useful during development and\n * debugging. */\n#ifndef XD3_DEBUG\n#define XD3_DEBUG 0\n#endif\n\n#ifndef PYTHON_MODULE\n#define PYTHON_MODULE 0\n#endif\n\n#ifndef SWIG_MODULE\n#define SWIG_MODULE 0\n#endif\n\n#ifndef NOT_MAIN\n#define NOT_MAIN 0\n#endif\n\n/* There are three string matching functions supplied: one fast, one\n * slow (default), and one soft-configurable.  To disable any of\n * these, use the following definitions. */\n#ifndef XD3_BUILD_SLOW\n#define XD3_BUILD_SLOW 1\n#endif\n#ifndef XD3_BUILD_FAST\n#define XD3_BUILD_FAST 1\n#endif\n#ifndef XD3_BUILD_FASTER\n#define XD3_BUILD_FASTER 1\n#endif\n#ifndef XD3_BUILD_FASTEST\n#define XD3_BUILD_FASTEST 1\n#endif\n#ifndef XD3_BUILD_SOFT\n#define XD3_BUILD_SOFT 1\n#endif\n#ifndef XD3_BUILD_DEFAULT\n#define XD3_BUILD_DEFAULT 1\n#endif\n\n#if XD3_DEBUG\n#include <stdio.h>\n#endif\n\ntypedef struct _xd3_stream             xd3_stream;\ntypedef struct _xd3_source             xd3_source;\ntypedef struct _xd3_hash_cfg           xd3_hash_cfg;\ntypedef struct _xd3_smatcher           xd3_smatcher;\ntypedef struct _xd3_rinst              xd3_rinst;\ntypedef struct _xd3_dinst              xd3_dinst;\ntypedef struct _xd3_hinst              xd3_hinst;\ntypedef struct _xd3_winst              xd3_winst;\ntypedef struct _xd3_rpage              xd3_rpage;\ntypedef struct _xd3_addr_cache         xd3_addr_cache;\ntypedef struct _xd3_output             xd3_output;\ntypedef struct _xd3_desect             xd3_desect;\ntypedef struct _xd3_iopt_buflist       xd3_iopt_buflist;\ntypedef struct _xd3_rlist              xd3_rlist;\ntypedef struct _xd3_sec_type           xd3_sec_type;\ntypedef struct _xd3_sec_cfg            xd3_sec_cfg;\ntypedef struct _xd3_sec_stream         xd3_sec_stream;\ntypedef struct _xd3_config             xd3_config;\ntypedef struct _xd3_code_table_desc    xd3_code_table_desc;\ntypedef struct _xd3_code_table_sizes   xd3_code_table_sizes;\ntypedef struct _xd3_slist              xd3_slist;\ntypedef struct _xd3_whole_state        xd3_whole_state;\ntypedef struct _xd3_wininfo            xd3_wininfo;\n\n/* The stream configuration has three callbacks functions, all of\n * which may be supplied with NULL values.  If config->getblk is\n * provided as NULL, the stream returns XD3_GETSRCBLK. */\n\ntypedef void*  (xd3_alloc_func)    (void       *opaque,\n\t\t\t\t    size_t      items,\n\t\t\t\t    usize_t     size);\ntypedef void   (xd3_free_func)     (void       *opaque,\n\t\t\t\t    void       *address);\n\ntypedef int    (xd3_getblk_func)   (xd3_stream *stream,\n\t\t\t\t    xd3_source *source,\n\t\t\t\t    xoff_t      blkno);\n\ntypedef const xd3_dinst* (xd3_code_table_func) (void);\n\n\n#ifdef _WIN32\n#define vsnprintf_func _vsnprintf\n#define snprintf_func _snprintf\n#else\n#define vsnprintf_func vsnprintf\n#define snprintf_func snprintf\n#endif\n#define short_sprintf(sb,fmt,...) \\\n  snprintf_func((sb).buf,sizeof((sb).buf),fmt,__VA_ARGS__)\n\n/* Type used for short snprintf calls. */\ntypedef struct {\n  char buf[48];\n} shortbuf;\n\n#ifndef PRINTF_ATTRIBUTE\n#ifdef __GNUC__\n#define PRINTF_ATTRIBUTE(x,y) __attribute__ ((__format__ (__printf__, x, y)))\n#else\n#define PRINTF_ATTRIBUTE(x,y)\n#endif\n#endif\n\n/* Underlying xprintf() */\nint xsnprintf_func (char *str, size_t n, const char *fmt, ...)\n  PRINTF_ATTRIBUTE(3,4);\n\n/* XPR(NT \"\", ...) (used by main) prefixes an \"xdelta3: \" to the output. */\nvoid xprintf(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);\n#define XPR xprintf\n#define NT \"xdelta3: \"\n#define NTR \"\"\n/* DP(RINT ...) */\n#define DP   xprintf\n#define RINT \"\"\n\n#if XD3_DEBUG\n#define XD3_ASSERT(x)\t\t\t\t     \\\n  do {\t\t\t\t\t\t     \\\n    if (! (x)) {\t\t\t\t     \\\n      DP(RINT \"%s:%d: XD3 assertion failed: %s\\n\",   \\\n\t __FILE__, __LINE__, #x);\t\t     \\\n      abort (); } } while (0)\n#else\n#define XD3_ASSERT(x) (void)0\n#endif  /* XD3_DEBUG */\n\n#define xd3_max(x,y) ((x) < (y) ? (y) : (x))\n#define xd3_min(x,y) ((x) < (y) ? (x) : (y))\n\n/****************************************************************\n PUBLIC ENUMS\n ******************************************************************/\n\n/* These are the five ordinary status codes returned by the\n * xd3_encode_input() and xd3_decode_input() state machines. */\ntypedef enum {\n\n  /* An application must be prepared to handle these five return\n   * values from either xd3_encode_input or xd3_decode_input, except\n   * in the case of no-source compression, in which case XD3_GETSRCBLK\n   * is never returned.  More detailed comments for these are given in\n   * xd3_encode_input and xd3_decode_input comments, below. */\n  XD3_INPUT     = -17703, /* need input */\n  XD3_OUTPUT    = -17704, /* have output */\n  XD3_GETSRCBLK = -17705, /* need a block of source input (with no\n\t\t\t   * xd3_getblk function), a chance to do\n\t\t\t   * non-blocking read. */\n  XD3_GOTHEADER = -17706, /* (decode-only) after the initial VCDIFF &\n\t\t\t     first window header */\n  XD3_WINSTART  = -17707, /* notification: returned before a window is\n\t\t\t   * processed, giving a chance to\n\t\t\t   * XD3_SKIP_WINDOW or not XD3_SKIP_EMIT that\n\t\t\t   * window. */\n  XD3_WINFINISH  = -17708, /* notification: returned after\n\t\t\t      encode/decode & output for a window */\n  XD3_TOOFARBACK = -17709, /* (encoder only) may be returned by\n\t\t\t      getblk() if the block is too old */\n  XD3_INTERNAL   = -17710, /* internal error */\n  XD3_INVALID    = -17711, /* invalid config */\n  XD3_INVALID_INPUT = -17712, /* invalid input/decoder error */\n  XD3_NOSECOND    = -17713, /* when secondary compression finds no\n\t\t\t       improvement. */\n  XD3_UNIMPLEMENTED = -17714  /* currently VCD_TARGET, VCD_CODETABLE */\n} xd3_rvalues;\n\n/* special values in config->flags */\ntypedef enum\n{\n  XD3_JUST_HDR       = (1 << 1),   /* used by VCDIFF tools, see\n\t\t\t\t      xdelta3-main.h. */\n  XD3_SKIP_WINDOW    = (1 << 2),   /* used by VCDIFF tools, see\n\t\t\t\t      xdelta3-main.h. */\n  XD3_SKIP_EMIT      = (1 << 3),   /* used by VCDIFF tools, see\n\t\t\t\t      xdelta3-main.h. */\n  XD3_FLUSH          = (1 << 4),   /* flush the stream buffer to\n\t\t\t\t      prepare for\n\t\t\t\t      xd3_stream_close(). */\n\n  XD3_SEC_DJW        = (1 << 5),   /* use DJW static huffman */\n  XD3_SEC_FGK        = (1 << 6),   /* use FGK adaptive huffman */\n  XD3_SEC_LZMA       = (1 << 24),  /* use LZMA secondary */\n\n  XD3_SEC_TYPE       = (XD3_SEC_DJW | XD3_SEC_FGK | XD3_SEC_LZMA),\n\n  XD3_SEC_NODATA     = (1 << 7),   /* disable secondary compression of\n\t\t\t\t      the data section. */\n  XD3_SEC_NOINST     = (1 << 8),   /* disable secondary compression of\n\t\t\t\t      the inst section. */\n  XD3_SEC_NOADDR     = (1 << 9),   /* disable secondary compression of\n\t\t\t\t      the addr section. */\n\n  XD3_SEC_NOALL      = (XD3_SEC_NODATA | XD3_SEC_NOINST | XD3_SEC_NOADDR),\n\n  XD3_ADLER32        = (1 << 10),  /* enable checksum computation in\n\t\t\t\t      the encoder. */\n  XD3_ADLER32_NOVER  = (1 << 11),  /* disable checksum verification in\n\t\t\t\t      the decoder. */\n\n  XD3_NOCOMPRESS     = (1 << 13),  /* disable ordinary data\n\t\t\t\t    * compression feature, only search\n\t\t\t\t    * the source, not the target. */\n  XD3_BEGREEDY       = (1 << 14),  /* disable the \"1.5-pass\n\t\t\t\t    * algorithm\", instead use greedy\n\t\t\t\t    * matching.  Greedy is off by\n\t\t\t\t    * default. */\n  XD3_ADLER32_RECODE = (1 << 15),  /* used by \"recode\". */\n\n  /* 4 bits to set the compression level the same as the command-line\n   * setting -1 through -9 (-0 corresponds to the XD3_NOCOMPRESS flag,\n   * and is independent of compression level).  This is for\n   * convenience, especially with xd3_encode_memory(). */\n\n  XD3_COMPLEVEL_SHIFT = 20,  /* 20 - 23 */\n  XD3_COMPLEVEL_MASK = (0xF << XD3_COMPLEVEL_SHIFT),\n  XD3_COMPLEVEL_1 = (1 << XD3_COMPLEVEL_SHIFT),\n  XD3_COMPLEVEL_2 = (2 << XD3_COMPLEVEL_SHIFT),\n  XD3_COMPLEVEL_3 = (3 << XD3_COMPLEVEL_SHIFT),\n  XD3_COMPLEVEL_6 = (6 << XD3_COMPLEVEL_SHIFT),\n  XD3_COMPLEVEL_9 = (9 << XD3_COMPLEVEL_SHIFT)\n\n} xd3_flags;\n\n/* The values of this enumeration are set in xd3_config using the\n * smatch_cfg variable.  It can be set to default, slow, fast, etc.,\n * and soft. */\ntypedef enum\n{\n  XD3_SMATCH_DEFAULT = 0, /* Flags may contain XD3_COMPLEVEL bits,\n\t\t\t     else default. */\n  XD3_SMATCH_SLOW    = 1,\n  XD3_SMATCH_FAST    = 2,\n  XD3_SMATCH_FASTER  = 3,\n  XD3_SMATCH_FASTEST = 4,\n  XD3_SMATCH_SOFT    = 5\n} xd3_smatch_cfg;\n\n/*********************************************************************\n PRIVATE ENUMS\n**********************************************************************/\n\n/* stream->match_state is part of the xd3_encode_input state machine\n *  for source matching:\n *\n *  1. the XD3_GETSRCBLK block-read mechanism means reentrant matching\n *  2. this state spans encoder windows: a match and end-of-window\n *  will continue in the next 3. the initial target byte and source\n *  byte are a presumed match, to avoid some computation in case the\n *  inputs are identical.\n */\ntypedef enum {\n\n  MATCH_TARGET    = 0, /* in this state, attempt to match the start of\n\t\t\t* the target with the previously set source\n\t\t\t* address (initially 0). */\n  MATCH_BACKWARD  = 1, /* currently expanding a match backward in the\n\t\t\t  source/target. */\n  MATCH_FORWARD   = 2, /* currently expanding a match forward in the\n\t\t\t  source/target. */\n  MATCH_SEARCHING = 3  /* currently searching for a match. */\n\n} xd3_match_state;\n\n/* The xd3_encode_input state machine steps through these states in\n * the following order.  The matcher is reentrant and returns\n * XD3_INPUT whenever it requires more data.  After receiving\n * XD3_INPUT, if the application reads EOF it should call\n * xd3_stream_close().\n */\ntypedef enum {\n\n  ENC_INIT      = 0, /* xd3_encode_input has never been called. */\n  ENC_INPUT     = 1, /* waiting for xd3_avail_input () to be called. */\n  ENC_SEARCH    = 2, /* currently searching for matches. */\n  ENC_INSTR     = 3, /* currently formatting output. */\n  ENC_FLUSH     = 4, /* currently emitting output. */\n  ENC_POSTOUT   = 5, /* after an output section. */\n  ENC_POSTWIN   = 6, /* after all output sections. */\n  ENC_ABORTED   = 7  /* abort. */\n} xd3_encode_state;\n\n/* The xd3_decode_input state machine steps through these states in\n * the following order.  The matcher is reentrant and returns\n * XD3_INPUT whenever it requires more data.  After receiving\n * XD3_INPUT, if the application reads EOF it should call\n * xd3_stream_close().\n *\n * 0-8:   the VCDIFF header\n * 9-18:  the VCDIFF window header\n * 19-21: the three primary sections: data, inst, addr\n * 22:    producing output: returns XD3_OUTPUT, possibly XD3_GETSRCBLK,\n * 23:    return XD3_WINFINISH, set state=9 to decode more input\n */\ntypedef enum {\n\n  DEC_VCHEAD   = 0, /* VCDIFF header */\n  DEC_HDRIND   = 1, /* header indicator */\n\n  DEC_SECONDID = 2, /* secondary compressor ID */\n\n  DEC_TABLEN   = 3, /* code table length */\n  DEC_NEAR     = 4, /* code table near */\n  DEC_SAME     = 5, /* code table same */\n  DEC_TABDAT   = 6, /* code table data */\n\n  DEC_APPLEN   = 7, /* application data length */\n  DEC_APPDAT   = 8, /* application data */\n\n  DEC_WININD   = 9, /* window indicator */\n\n  DEC_CPYLEN   = 10, /* copy window length */\n  DEC_CPYOFF   = 11, /* copy window offset */\n\n  DEC_ENCLEN   = 12, /* length of delta encoding */\n  DEC_TGTLEN   = 13, /* length of target window */\n  DEC_DELIND   = 14, /* delta indicator */\n\n  DEC_DATALEN  = 15, /* length of ADD+RUN data */\n  DEC_INSTLEN  = 16, /* length of instruction data */\n  DEC_ADDRLEN  = 17, /* length of address data */\n\n  DEC_CKSUM    = 18, /* window checksum */\n\n  DEC_DATA     = 19, /* data section */\n  DEC_INST     = 20, /* instruction section */\n  DEC_ADDR     = 21, /* address section */\n\n  DEC_EMIT     = 22, /* producing data */\n\n  DEC_FINISH   = 23, /* window finished */\n\n  DEC_ABORTED  = 24  /* xd3_abort_stream */\n} xd3_decode_state;\n\n/************************************************************\n internal types\n ************************************************************/\n\n/* instruction lists used in the IOPT buffer */\nstruct _xd3_rlist\n{\n  xd3_rlist  *next;\n  xd3_rlist  *prev;\n};\n\n/* the raw encoding of an instruction used in the IOPT buffer */\nstruct _xd3_rinst\n{\n  uint8_t     type;\n  uint8_t     xtra;\n  uint8_t     code1;\n  uint8_t     code2;\n  usize_t      pos;\n  usize_t      size;\n  xoff_t      addr;\n  xd3_rlist   link;\n};\n\n/* the code-table form of an single- or double-instruction */\nstruct _xd3_dinst\n{\n  uint8_t     type1;\n  uint8_t     size1;\n  uint8_t     type2;\n  uint8_t     size2;\n};\n\n/* the decoded form of a single (half) instruction. */\nstruct _xd3_hinst\n{\n  uint8_t    type;\n  usize_t    size;\n  usize_t    addr;\n};\n\n/* the form of a whole-file instruction */\nstruct _xd3_winst\n{\n  uint8_t type;  /* RUN, ADD, COPY */\n  uint8_t mode;  /* 0, VCD_SOURCE, VCD_TARGET */\n  usize_t size;\n  xoff_t  addr;\n  xoff_t  position;  /* absolute position of this inst */\n};\n\n/* used by the encoder to buffer output in sections.  list of blocks. */\nstruct _xd3_output\n{\n  uint8_t    *base;\n  usize_t     next;\n  usize_t     avail;\n  xd3_output *next_page;\n};\n\n/* used by the decoder to buffer input in sections. */\nstruct _xd3_desect\n{\n  const uint8_t *buf;\n  const uint8_t *buf_max;\n  usize_t        size;\n  usize_t        pos;\n\n  /* used in xdelta3-decode.h */\n  uint8_t       *copied1;\n  usize_t        alloc1;\n\n  /* used in xdelta3-second.h */\n  uint8_t       *copied2;\n  usize_t        alloc2;\n};\n\n/* the VCDIFF address cache, see the RFC */\nstruct _xd3_addr_cache\n{\n  usize_t  s_near;\n  usize_t  s_same;\n  usize_t  next_slot;  /* the circular index for near */\n  usize_t *near_array; /* array of size s_near        */\n  usize_t *same_array; /* array of size s_same*256    */\n};\n\n/* the IOPT buffer list is just a list of buffers, which may be allocated\n * during encode when using an unlimited buffer. */\nstruct _xd3_iopt_buflist\n{\n  xd3_rinst *buffer;\n  xd3_iopt_buflist *next;\n};\n\n/* This is the record of a pre-compiled configuration, a subset of\n   xd3_config. */\nstruct _xd3_smatcher\n{\n  const char        *name;\n  int             (*string_match) (xd3_stream  *stream);\n  usize_t            large_look;\n  usize_t            large_step;\n  usize_t            small_look;\n  usize_t            small_chain;\n  usize_t            small_lchain;\n  usize_t            max_lazy;\n  usize_t            long_enough;\n};\n\n/* hash table size & power-of-two hash function. */\nstruct _xd3_hash_cfg\n{\n  usize_t  size;       // Number of buckets\n  usize_t  shift;\n  usize_t  mask;\n  usize_t  look;       // How wide is this checksum\n  usize_t  multiplier; // K * powers[0]\n  usize_t *powers;     // Array of [0,look) where powers[look-1] == 1\n                       // and powers[N] = powers[N+1]*K (Rabin-Karp)\n};\n\n/* the sprev list */\nstruct _xd3_slist\n{\n  usize_t     last_pos;\n};\n\n/* window info (for whole state) */\nstruct _xd3_wininfo {\n  xoff_t offset;\n  usize_t length;\n  uint32_t adler32;\n};\n\n/* whole state for, e.g., merge */\nstruct _xd3_whole_state {\n  usize_t addslen;\n  uint8_t *adds;\n  usize_t  adds_alloc;\n\n  usize_t instlen;\n  xd3_winst *inst;\n  usize_t  inst_alloc;\n\n  usize_t wininfolen;\n  xd3_wininfo *wininfo;\n  usize_t wininfo_alloc;\n\n  xoff_t length;\n};\n\n/********************************************************************\n public types\n *******************************************************************/\n\n/* Settings for the secondary compressor. */\nstruct _xd3_sec_cfg\n{\n  int                data_type;     /* Which section. (set automatically) */\n  usize_t            ngroups;       /* Number of DJW Huffman groups. */\n  usize_t            sector_size;   /* Sector size. */\n  int                inefficient;   /* If true, ignore efficiency check [avoid XD3_NOSECOND]. */\n};\n\n/* This is the user-visible stream configuration. */\nstruct _xd3_config\n{\n  usize_t             winsize;       /* The encoder window size. */\n  usize_t             sprevsz;       /* How far back small string\n\t\t\t\t\tmatching goes */\n  usize_t             iopt_size;     /* entries in the\n\t\t\t\t\tinstruction-optimizing\n\t\t\t\t\tbuffer */\n\n  xd3_getblk_func   *getblk;        /* The three callbacks. */\n  xd3_alloc_func    *alloc;\n  xd3_free_func     *freef;\n  void              *opaque;        /* Not used. */\n  uint32_t           flags;         /* stream->flags are initialized\n\t\t\t\t     * from xd3_config & never\n\t\t\t\t     * modified by the library.  Use\n\t\t\t\t     * xd3_set_flags to modify flags\n\t\t\t\t     * settings mid-stream. */\n\n  xd3_sec_cfg       sec_data;       /* Secondary compressor config: data */\n  xd3_sec_cfg       sec_inst;       /* Secondary compressor config: inst */\n  xd3_sec_cfg       sec_addr;       /* Secondary compressor config: addr */\n\n  xd3_smatch_cfg     smatch_cfg;    /* See enum: use fields below  for\n\t\t\t\t       soft config */\n  xd3_smatcher       smatcher_soft;\n};\n\n/* The primary source file object. You create one of these objects and\n * initialize the first four fields.  This library maintains the next\n * 5 fields.  The configured getblk implementation is responsible for\n * setting the final 3 fields when called (and/or when XD3_GETSRCBLK\n * is returned).\n */\nstruct _xd3_source\n{\n  /* you set */\n  usize_t             blksize;       /* block size */\n  const char         *name;          /* its name, for debug/print\n\t\t\t\t\tpurposes */\n  void               *ioh;           /* opaque handle */\n  xoff_t              max_winsize;   /* maximum visible buffer */\n\n  /* getblk sets */\n  xoff_t              curblkno;      /* current block number: client\n\t\t\t\t\tsets after getblk request */\n  usize_t             onblk;         /* number of bytes on current\n\t\t\t\t\tblock: client sets,  must be >= 0\n\t\t\t\t        and <= blksize */\n  const uint8_t      *curblk;        /* current block array: client\n\t\t\t\t\tsets after getblk request */\n\n  /* xd3 sets */\n  usize_t             srclen;        /* length of this source window */\n  xoff_t              srcbase;       /* offset of this source window\n\t\t\t\t\tin the source itself */\n  usize_t             shiftby;       /* for power-of-two blocksizes */\n  usize_t             maskby;        /* for power-of-two blocksizes */\n  xoff_t              cpyoff_blocks; /* offset of dec_cpyoff in blocks */\n  usize_t             cpyoff_blkoff; /* offset of copy window in\n\t\t\t\t\tblocks, remainder */\n  xoff_t              getblkno;      /* request block number: xd3 sets\n\t\t\t\t\tcurrent getblk request */\n\n  /* See xd3_getblk() */\n  xoff_t              max_blkno;  /* Maximum block, if eof is known,\n\t\t\t\t   * otherwise, equals frontier_blkno\n\t\t\t\t   * (initially 0). */\n  usize_t             onlastblk;  /* Number of bytes on max_blkno */\n  int                 eof_known;  /* Set to true when the first\n\t\t\t\t   * partial block is read. */\n};\n\n/* The primary xd3_stream object, used for encoding and decoding.  You\n * may access only two fields: avail_out, next_out.  Use the methods\n * above to operate on xd3_stream. */\nstruct _xd3_stream\n{\n  /* input state */\n  const uint8_t    *next_in;          /* next input byte */\n  usize_t           avail_in;         /* number of bytes available at\n\t\t\t\t\t next_in */\n  xoff_t            total_in;         /* how many bytes in */\n\n  /* output state */\n  uint8_t          *next_out;         /* next output byte */\n  usize_t           avail_out;        /* number of bytes available at\n\t\t\t\t\t next_out */\n  usize_t           space_out;        /* total out space */\n  xoff_t            current_window;   /* number of windows encoded/decoded */\n  xoff_t            total_out;        /* how many bytes out */\n\n  /* to indicate an error, xd3 sets */\n  const char       *msg;              /* last error message, NULL if\n\t\t\t\t\t no error */\n\n  /* source configuration */\n  xd3_source       *src;              /* source array */\n\n  /* encoder memory configuration */\n  usize_t           winsize;          /* suggested window size */\n  usize_t           sprevsz;          /* small string, previous window\n\t\t\t\t\t size (power of 2) */\n  usize_t           sprevmask;        /* small string, previous window\n\t\t\t\t\t size mask */\n  usize_t           iopt_size;\n  usize_t           iopt_unlimited;\n\n  /* general configuration */\n  xd3_getblk_func  *getblk;           /* set nxtblk, nxtblkno to scanblkno */\n  xd3_alloc_func   *alloc;            /* malloc function */\n  xd3_free_func    *free;             /* free function */\n  void*             opaque;           /* private data object passed to\n\t\t\t\t\t alloc, free, and getblk */\n  uint32_t          flags;            /* various options */\n\n  /* secondary compressor configuration */\n  xd3_sec_cfg       sec_data;         /* Secondary compressor config: data */\n  xd3_sec_cfg       sec_inst;         /* Secondary compressor config: inst */\n  xd3_sec_cfg       sec_addr;         /* Secondary compressor config: addr */\n\n  xd3_smatcher      smatcher;\n\n  usize_t           *large_table;      /* table of large checksums */\n  xd3_hash_cfg       large_hash;       /* large hash config */\n\n  usize_t           *small_table;      /* table of small checksums */\n  xd3_slist         *small_prev;       /* table of previous offsets,\n\t\t\t\t\t  circular linked list */\n  int                small_reset;      /* true if small table should\n\t\t\t\t\t  be reset */\n\n  xd3_hash_cfg       small_hash;       /* small hash config */\n  xd3_addr_cache     acache;           /* the vcdiff address cache */\n  xd3_encode_state   enc_state;        /* state of the encoder */\n\n  usize_t            taroff;           /* base offset of the target input */\n  usize_t            input_position;   /* current input position */\n  usize_t            min_match;        /* current minimum match\n\t\t\t\t\t  length, avoids redundent\n\t\t\t\t\t  matches */\n  usize_t            unencoded_offset; /* current input, first\n\t\t\t\t       * unencoded offset. this value\n\t\t\t\t       * is <= the first instruction's\n\t\t\t\t       * position in the iopt buffer,\n\t\t\t\t       * if there is at least one\n\t\t\t\t       * match in the buffer. */\n\n  /* SRCWIN */\n  int                srcwin_decided;    /* boolean: true if srclen and\n\t\t\t\t\t   srcbase have been\n\t\t\t\t\t   decided. */\n  int                srcwin_decided_early;  /* boolean: true if srclen\n\t\t\t\t\t       and srcbase were\n\t\t\t\t\t       decided early. */\n  xoff_t             srcwin_cksum_pos;  /* Source checksum position */\n\n  /* MATCH */\n  xd3_match_state    match_state;      /* encoder match state */\n  xoff_t             match_srcpos;     /* current match source\n\t\t\t\t\t  position relative to\n\t\t\t\t\t  srcbase */\n  xoff_t             match_last_srcpos;  /* previously attempted\n\t\t\t\t\t  * srcpos, to avoid loops. */\n  xoff_t             match_minaddr;    /* smallest matching address to\n\t\t\t\t       * set window params (reset each\n\t\t\t\t       * window xd3_encode_reset) */\n  xoff_t             match_maxaddr;    /* largest matching address to\n\t\t\t\t       * set window params (reset each\n\t\t\t\t       * window xd3_encode_reset) */\n  usize_t            match_back;       /* match extends back so far */\n  usize_t            match_maxback;    /* match extends back maximum */\n  usize_t            match_fwd;        /* match extends forward so far */\n  usize_t            match_maxfwd;     /* match extends forward maximum */\n\n  xoff_t             maxsrcaddr;      /* address of the last source\n\t\t\t\t\t match (across windows) */\n\n  uint8_t          *buf_in;           /* for saving buffered input */\n  usize_t           buf_avail;        /* amount of saved input */\n  const uint8_t    *buf_leftover;     /* leftover content of next_in\n\t\t\t\t\t (i.e., user's buffer) */\n  usize_t            buf_leftavail;    /* amount of leftover content */\n\n  xd3_output       *enc_current;      /* current output buffer */\n  xd3_output       *enc_free;         /* free output buffers */\n  xd3_output       *enc_heads[4];     /* array of encoded outputs:\n\t\t\t\t\t head of chain */\n  xd3_output       *enc_tails[4];     /* array of encoded outputs:\n\t\t\t\t\t tail of chain */\n  uint32_t          recode_adler32;   /* set the adler32 checksum\n\t\t\t\t       * during \"recode\". */\n\n  xd3_rlist         iopt_used;        /* instruction optimizing buffer */\n  xd3_rlist         iopt_free;\n  xd3_rinst        *iout;             /* next single instruction */\n  xd3_iopt_buflist *iopt_alloc;\n\n  const uint8_t    *enc_appheader;    /* application header to encode */\n  usize_t            enc_appheadsz;    /* application header size */\n\n  /* decoder stuff */\n  xd3_decode_state  dec_state;        /* current DEC_XXX value */\n  usize_t           dec_hdr_ind;      /* VCDIFF header indicator */\n  usize_t           dec_win_ind;      /* VCDIFF window indicator */\n  usize_t           dec_del_ind;      /* VCDIFF delta indicator */\n\n  uint8_t           dec_magic[4];     /* First four bytes */\n  usize_t           dec_magicbytes;   /* Magic position. */\n\n  usize_t           dec_secondid;     /* Optional secondary compressor ID. */\n\n  usize_t           dec_codetblsz;    /* Optional code table: length. */\n  uint8_t          *dec_codetbl;      /* Optional code table: storage. */\n  usize_t           dec_codetblbytes; /* Optional code table: position. */\n\n  usize_t           dec_appheadsz;    /* Optional application header:\n\t\t\t\t\t size. */\n  uint8_t          *dec_appheader;    /* Optional application header:\n\t\t\t\t\t storage */\n  usize_t           dec_appheadbytes; /* Optional application header:\n\t\t\t\t\t position. */\n\n  usize_t            dec_cksumbytes;   /* Optional checksum: position. */\n  uint8_t           dec_cksum[4];     /* Optional checksum: storage. */\n  uint32_t          dec_adler32;      /* Optional checksum: value. */\n\n  usize_t            dec_cpylen;       /* length of copy window\n\t\t\t\t\t  (VCD_SOURCE or VCD_TARGET) */\n  xoff_t             dec_cpyoff;       /* offset of copy window\n\t\t\t\t\t  (VCD_SOURCE or VCD_TARGET) */\n  usize_t            dec_enclen;       /* length of delta encoding */\n  usize_t            dec_tgtlen;       /* length of target window */\n\n#if USE_UINT64\n  uint64_t          dec_64part;       /* part of a decoded uint64_t */\n#endif\n#if USE_UINT32\n  uint32_t          dec_32part;       /* part of a decoded uint32_t */\n#endif\n\n  xoff_t            dec_winstart;     /* offset of the start of\n                                         current target window */\n  xoff_t            dec_window_count; /* == current_window + 1 in\n                                         DEC_FINISH */\n  usize_t            dec_winbytes;     /* bytes of the three sections\n                                          so far consumed */\n  usize_t            dec_hdrsize;      /* VCDIFF + app header size */\n\n  const uint8_t    *dec_tgtaddrbase;  /* Base of decoded target\n                                         addresses (addr >=\n                                         dec_cpylen). */\n  const uint8_t    *dec_cpyaddrbase;  /* Base of decoded copy\n                                         addresses (addr <\n                                         dec_cpylen). */\n\n  usize_t            dec_position;     /* current decoder position\n                                          counting the cpylen\n                                          offset */\n  usize_t            dec_maxpos;       /* maximum decoder position\n                                          counting the cpylen\n                                          offset */\n  xd3_hinst         dec_current1;     /* current instruction */\n  xd3_hinst         dec_current2;     /* current instruction */\n\n  uint8_t          *dec_buffer;       /* Decode buffer */\n  uint8_t          *dec_lastwin;      /* In case of VCD_TARGET, the\n                                         last target window. */\n  usize_t            dec_lastlen;      /* length of the last target\n                                          window */\n  xoff_t            dec_laststart;    /* offset of the start of last\n                                         target window */\n  usize_t            dec_lastspace;    /* allocated space of last\n                                          target window, for reuse */\n\n  xd3_desect        inst_sect;        /* staging area for decoding\n                                         window sections */\n  xd3_desect        addr_sect;\n  xd3_desect        data_sect;\n\n  xd3_code_table_func       *code_table_func;\n  const xd3_dinst           *code_table;\n  const xd3_code_table_desc *code_table_desc;\n  xd3_dinst                 *code_table_alloc;\n\n  /* secondary compression */\n  const xd3_sec_type *sec_type;\n  xd3_sec_stream     *sec_stream_d;\n  xd3_sec_stream     *sec_stream_i;\n  xd3_sec_stream     *sec_stream_a;\n\n  /* state for reconstructing whole files (e.g., for merge), this only\n   * supports loading USIZE_T_MAX instructions, adds, etc. */\n  xd3_whole_state     whole_target;\n\n  /* statistics */\n  xoff_t            n_scpy;\n  xoff_t            n_tcpy;\n  xoff_t            n_add;\n  xoff_t            n_run;\n\n  xoff_t            l_scpy;\n  xoff_t            l_tcpy;\n  xoff_t            l_add;\n  xoff_t            l_run;\n\n  usize_t           i_slots_used;\n\n#if XD3_DEBUG\n  usize_t            large_ckcnt;\n\n  /* memory usage */\n  usize_t            alloc_cnt;\n  usize_t            free_cnt;\n#endif\n};\n\n/**************************************************************************\n PUBLIC FUNCTIONS\n **************************************************************************/\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n\n/* This function configures an xd3_stream using the provided in-memory\n * input buffer, source buffer, output buffer, and flags.  The output\n * array must be large enough or else ENOSPC will be returned.  This\n * is the simplest in-memory encoding interface. */\nint     xd3_encode_memory (const uint8_t *input,\n\t\t\t   usize_t        input_size,\n\t\t\t   const uint8_t *source,\n\t\t\t   usize_t        source_size,\n\t\t\t   uint8_t       *output_buffer,\n\t\t\t   usize_t       *output_size,\n\t\t\t   usize_t        avail_output,\n\t\t\t   int            flags);\n\n/* The reverse of xd3_encode_memory. */\nint     xd3_decode_memory (const uint8_t *input,\n\t\t\t   usize_t        input_size,\n\t\t\t   const uint8_t *source,\n\t\t\t   usize_t        source_size,\n\t\t\t   uint8_t       *output_buf,\n\t\t\t   usize_t       *output_size,\n\t\t\t   usize_t        avail_output,\n\t\t\t   int            flags);\n\n/* This function encodes an in-memory input using a pre-configured\n * xd3_stream.  This allows the caller to set a variety of options\n * which are not available in the xd3_encode/decode_memory()\n * functions.\n *\n * The output array must be large enough to hold the output or else\n * ENOSPC is returned.  The source (if any) should be set using\n * xd3_set_source_and_size() with a single-block xd3_source.  This\n * calls the underlying non-blocking interfaces,\n * xd3_encode/decode_input(), handling the necessary input/output\n * states.  This method may be considered a reference for any\n * application using xd3_encode_input() directly.\n *\n *   xd3_stream stream;\n *   xd3_config config;\n *   xd3_source src;\n *\n *   memset (& src, 0, sizeof (src));\n *   memset (& stream, 0, sizeof (stream));\n *   memset (& config, 0, sizeof (config));\n *\n *   if (source != NULL)\n *     {\n *       src.size = source_size;\n *       src.blksize = source_size;\n *       src.curblkno = 0;\n *       src.onblk = source_size;\n *       src.curblk = source;\n *       src.max_winsize = source_size;\n *       xd3_set_source(&stream, &src);\n *     }\n *\n *   config.flags = flags;\n *   config.winsize = input_size;\n *\n *   ... set smatcher, appheader, encoding-table, compression-level, etc.\n *\n *   xd3_config_stream(&stream, &config);\n *   xd3_encode_stream(&stream, ...);\n *   xd3_free_stream(&stream);\n */\nint     xd3_encode_stream (xd3_stream    *stream,\n\t\t\t   const uint8_t *input,\n\t\t\t   usize_t         input_size,\n\t\t\t   uint8_t       *output,\n\t\t\t   usize_t        *output_size,\n\t\t\t   usize_t         avail_output);\n\n/* The reverse of xd3_encode_stream. */\nint     xd3_decode_stream (xd3_stream    *stream,\n\t\t\t   const uint8_t *input,\n\t\t\t   usize_t        input_size,\n\t\t\t   uint8_t       *output,\n\t\t\t   usize_t       *output_size,\n\t\t\t   usize_t        avail_size);\n\n/* This is the non-blocking interface.\n *\n * Handling input and output states is the same for encoding or\n * decoding using the xd3_avail_input() and xd3_consume_output()\n * routines, inlined below.\n *\n * Return values:\n *\n *   XD3_INPUT: the process requires more input: call\n *               xd3_avail_input() then repeat\n *\n *   XD3_OUTPUT: the process has more output: read stream->next_out,\n *               stream->avail_out, then call xd3_consume_output(),\n *               then repeat\n *\n *   XD3_GOTHEADER: (decoder-only) notification returned following the\n *               VCDIFF header and first window header.  the decoder\n *               may use the header to configure itself.\n *\n *   XD3_WINSTART: a general notification returned once for each\n *               window except the 0-th window, which is implied by\n *               XD3_GOTHEADER.  It is recommended to use a\n *               switch-stmt such as:\n *\n *                 ...\n *               again:\n *                 switch ((ret = xd3_decode_input (stream))) {\n *                    case XD3_GOTHEADER: {\n *                      assert(stream->current_window == 0);\n *                      stuff;\n *                    }\n *                    // fallthrough\n *                    case XD3_WINSTART: {\n *                      something(stream->current_window);\n *                      goto again;\n *                    }\n *                    ...\n *\n *   XD3_WINFINISH: a general notification, following the complete\n *               input & output of a window.  at this point,\n *               stream->total_in and stream->total_out are consistent\n *               for either encoding or decoding.\n *\n *   XD3_GETSRCBLK: If the xd3_getblk() callback is NULL, this value\n *               is returned to initiate a non-blocking source read.\n */\nint     xd3_decode_input  (xd3_stream    *stream);\nint     xd3_encode_input  (xd3_stream    *stream);\n\n/* The xd3_config structure is used to initialize a stream - all data\n * is copied into stream so config may be a temporary variable.  See\n * the [documentation] or comments on the xd3_config structure. */\nint     xd3_config_stream (xd3_stream    *stream,\n\t\t\t   xd3_config    *config);\n\n/* Since Xdelta3 doesn't open any files, xd3_close_stream is just an\n * error check that the stream is in a proper state to be closed: this\n * means the encoder is flushed and the decoder is at a window\n * boundary.  The application is responsible for freeing any of the\n * resources it supplied. */\nint     xd3_close_stream (xd3_stream    *stream);\n\n/* This arranges for closes the stream to succeed.  Does not free the\n * stream.*/\nvoid    xd3_abort_stream (xd3_stream    *stream);\n\n/* xd3_free_stream frees all memory allocated for the stream.  The\n * application is responsible for freeing any of the resources it\n * supplied. */\nvoid    xd3_free_stream   (xd3_stream    *stream);\n\n/* This function informs the encoder or decoder that source matching\n * (i.e., delta-compression) is possible.  For encoding, this should\n * be called before the first xd3_encode_input.  A NULL source is\n * ignored.  For decoding, this should be called before the first\n * window is decoded, but the appheader may be read first\n * (XD3_GOTHEADER).  After decoding the header, call xd3_set_source()\n * if you have a source file.  Note: if (stream->dec_win_ind & VCD_SOURCE)\n * is true, it means the first window expects there to be a source file.\n */\nint     xd3_set_source    (xd3_stream    *stream,\n\t\t\t   xd3_source    *source);\n\n/* If the source size is known, call this instead of xd3_set_source().\n * to avoid having stream->getblk called (and/or to avoid XD3_GETSRCBLK).\n *\n * Follow these steps:\n  xd3_source source;\n  memset(&source, 0, sizeof(source));\n  source.blksize  = size;\n  source.onblk    = size;\n  source.curblk   = buf;\n  source.curblkno = 0;\n  int ret = xd3_set_source_and_size(&stream, &source, size);\n  ...\n */\nint     xd3_set_source_and_size (xd3_stream    *stream,\n\t\t\t\t xd3_source    *source,\n\t\t\t\t xoff_t         source_size);\n\n/* This should be called before the first call to xd3_encode_input()\n * to include application-specific data in the VCDIFF header. */\nvoid    xd3_set_appheader (xd3_stream    *stream,\n\t\t\t   const uint8_t *data,\n\t\t\t   usize_t        size);\n\n/* xd3_get_appheader may be called in the decoder after XD3_GOTHEADER.\n * For convenience, the decoder always adds a single byte padding to\n * the end of the application header, which is set to zero in case the\n * application header is a string. */\nint     xd3_get_appheader (xd3_stream     *stream,\n\t\t\t   uint8_t       **data,\n\t\t\t   usize_t        *size);\n\n/* To generate a VCDIFF encoded delta with xd3_encode_init() from\n * another format, use:\n *\n *   xd3_encode_init_partial() -- initialze encoder state (w/o hash tables)\n *   xd3_init_cache() -- reset VCDIFF address cache\n *   xd3_found_match() -- to report a copy instruction\n *\n * set stream->enc_state to ENC_INSTR and call xd3_encode_input as usual.\n */\nint xd3_encode_init_partial (xd3_stream *stream);\nvoid xd3_init_cache (xd3_addr_cache* acache);\nint xd3_found_match (xd3_stream *stream,\n\t\t     usize_t pos, usize_t size,\n\t\t     xoff_t addr, int is_source);\n\n/* Gives an error string for xdelta3-speficic errors, returns NULL for\n   system errors */\nconst char* xd3_strerror (int ret);\n\n/* For convenience, zero & initialize the xd3_config structure with\n   specified flags. */\nstatic inline\nvoid    xd3_init_config (xd3_config *config,\n\t\t\t uint32_t    flags)\n{\n  memset (config, 0, sizeof (*config));\n  config->flags = flags;\n}\n\n/* This supplies some input to the stream.\n *\n * For encoding, if the input is larger than the configured window\n * size (xd3_config.winsize), the entire input will be consumed and\n * encoded anyway.  If you wish to strictly limit the window size,\n * limit the buffer passed to xd3_avail_input to the window size.\n *\n * For encoding, if the input is smaller than the configured window\n * size (xd3_config.winsize), the library will create a window-sized\n * buffer and accumulate input until a full-sized window can be\n * encoded.  XD3_INPUT will be returned.  The input must remain valid\n * until the next time xd3_encode_input() returns XD3_INPUT.\n *\n * For decoding, the input will be consumed entirely before XD3_INPUT\n * is returned again.\n */\nstatic inline\nvoid    xd3_avail_input  (xd3_stream    *stream,\n\t\t\t  const uint8_t *idata,\n\t\t\t  usize_t         isize)\n{\n  /* Even if isize is zero, the code expects a non-NULL idata.  Why?\n   * It uses this value to determine whether xd3_avail_input has ever\n   * been called.  If xd3_encode_input is called before\n   * xd3_avail_input it will return XD3_INPUT right away without\n   * allocating a stream->winsize buffer.  This is to avoid an\n   * unwanted allocation. */\n  XD3_ASSERT (idata != NULL || isize == 0);\n\n  stream->next_in  = idata;\n  stream->avail_in = isize;\n}\n\n/* This acknowledges receipt of output data, must be called after any\n * XD3_OUTPUT return. */\nstatic inline\nvoid xd3_consume_output (xd3_stream  *stream)\n{\n  stream->avail_out  = 0;\n}\n\n/* These are set for each XD3_WINFINISH return. */\nstatic inline\nint xd3_encoder_used_source (xd3_stream *stream) {\n  return stream->src != NULL && stream->src->srclen > 0;\n}\nstatic inline\nxoff_t xd3_encoder_srcbase (xd3_stream *stream) {\n  return stream->src->srcbase;\n}\nstatic inline\nusize_t xd3_encoder_srclen (xd3_stream *stream) {\n  return stream->src->srclen;\n}\n\n/* Checks for legal flag changes. */\nstatic inline\nvoid xd3_set_flags (xd3_stream *stream, uint32_t flags)\n{\n  /* The bitwise difference should contain only XD3_FLUSH or\n     XD3_SKIP_WINDOW */\n  XD3_ASSERT(((flags ^ stream->flags) & ~(XD3_FLUSH | XD3_SKIP_WINDOW)) == 0);\n  stream->flags = flags;\n}\n\n/* Gives some extra information about the latest library error, if any\n * is known. */\nstatic inline\nconst char* xd3_errstring (xd3_stream  *stream)\n{\n  return stream->msg ? stream->msg : \"\";\n}\n\n\n/* 64-bit divisions are expensive, which is why we require a\n * power-of-two source->blksize.  To relax this restriction is\n * relatively easy, see the history for xd3_blksize_div(). */\nstatic inline\nvoid xd3_blksize_div (const xoff_t offset,\n\t\t      const xd3_source *source,\n\t\t      xoff_t *blkno,\n\t\t      usize_t *blkoff) {\n  *blkno = offset >> source->shiftby;\n  *blkoff = offset & source->maskby;\n  XD3_ASSERT (*blkoff < source->blksize);\n}\n\nstatic inline\nvoid xd3_blksize_add (xoff_t *blkno,\n\t\t      usize_t *blkoff,\n\t\t      const xd3_source *source,\n\t\t      const usize_t add)\n{\n  usize_t blkdiff;\n\n  /* Does not check for overflow, checked in xdelta3-decode.h. */\n  *blkoff += add;\n  blkdiff = *blkoff >> source->shiftby;\n\n  if (blkdiff)\n    {\n      *blkno += blkdiff;\n      *blkoff &= source->maskby;\n    }\n\n  XD3_ASSERT (*blkoff < source->blksize);\n}\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif\n\n#define XD3_NOOP 0U\n#define XD3_ADD 1U\n#define  XD3_RUN 2U\n#define  XD3_CPY 3U /* XD3_CPY rtypes are represented as (XD3_CPY +\n                     * copy-mode value) */\n\n#if XD3_DEBUG\n#define IF_DEBUG(x) x\n#else\n#define IF_DEBUG(x)\n#endif\n#if XD3_DEBUG > 1\n#define IF_DEBUG1(x) x\n#else\n#define IF_DEBUG1(x)\n#endif\n#if XD3_DEBUG > 2\n#define IF_DEBUG2(x) x\n#else\n#define IF_DEBUG2(x)\n#endif\n\n#define SIZEOF_ARRAY(x) (sizeof(x) / sizeof(x[0]))\n\n#endif /* _XDELTA3_H_ */\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.i",
    "content": "%module xdelta3\n%import cstring.i\n%import argcargv.i\n%{\n#include \"xdelta3.h\"\n\nint xd3_main_cmdline (int ARGC, char **ARGV);\n%}\n\n%cstring_input_binary(const char *input, unsigned int input_size);\n%cstring_input_binary(const char *source, unsigned int source_size);\n\n%define %max_output_withsize(TYPEMAP, SIZE, MAXSIZE)\n%typemap(in) MAXSIZE (unsigned int alloc_size) {\n  $1 = alloc_size = PyInt_AsLong(obj2);\n}\n%typemap(in,numinputs=0) (TYPEMAP, SIZE) {\n}\n%typemap(check) (TYPEMAP, SIZE) {\n  // alloc_size input is #7th position in xd3_xxcode_memory()\n  $1 = malloc(alloc_size7);\n  $2 = &alloc_size7;\n}\n%typemap(argout,fragment=\"t_output_helper\") (TYPEMAP, SIZE) {\n  if (result == 0) {\n    PyObject *o;\n    // alloc_size7 now carries actual size\n    o = PyString_FromStringAndSize($1,alloc_size7);\n    $result = t_output_helper($result,o);\n  } else {\n    $result = t_output_helper($result,Py_None);\n  }\n  free($1);\n}\n%typemap(default) int flags {\n  $1 = 0;\n}\n%enddef\n\n%max_output_withsize(char *output_buf, unsigned int *output_size, unsigned int max_output);\n\nint     xd3_encode_memory (const uint8_t *input,\n\t\t\t   usize_t        input_size,\n\t\t\t   const uint8_t *source,\n\t\t\t   usize_t        source_size,\n\t\t\t   uint8_t       *output_buffer,\n\t\t\t   usize_t       *output_size,\n\t\t\t   usize_t        avail_output,\n\t\t\t   int            flags);\n\nint     xd3_decode_memory (const uint8_t *input,\n\t\t\t   usize_t        input_size,\n\t\t\t   const uint8_t *source,\n\t\t\t   usize_t        source_size,\n\t\t\t   uint8_t       *output_buf,\n\t\t\t   usize_t       *output_size,\n\t\t\t   usize_t        avail_output,\n\t\t\t   int            flags);\n\nint     xd3_main_cmdline (int ARGC, char **ARGV);\n\n/* Is this the right way? */\nenum {\n  /*XD3_JUST_HDR,*/\n  /*XD3_SKIP_WINDOW,*/\n  /*XD3_SKIP_EMIT,*/\n  /*XD3_FLUSH,*/\n  XD3_SEC_DJW,\n  XD3_SEC_FGK,\n  /*XD3_SEC_TYPE,*/\n  XD3_SEC_NODATA,\n  XD3_SEC_NOINST,\n  XD3_SEC_NOADDR,\n  /*XD3_SEC_OTHER,*/\n  XD3_ADLER32,\n  XD3_ADLER32_NOVER,\n  XD3_NOCOMPRESS,\n  XD3_BEGREEDY,\n  XD3_COMPLEVEL_SHIFT,\n  XD3_COMPLEVEL_MASK,\n  XD3_COMPLEVEL_1,\n  XD3_COMPLEVEL_3,\n  XD3_COMPLEVEL_6,\n  XD3_COMPLEVEL_9,\n};\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Itanium\">\n      <Configuration>Debug</Configuration>\n      <Platform>Itanium</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Itanium\">\n      <Configuration>Release</Configuration>\n      <Platform>Itanium</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"xdelta3-64|Itanium\">\n      <Configuration>xdelta3-64</Configuration>\n      <Platform>Itanium</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"xdelta3-64|Win32\">\n      <Configuration>xdelta3-64</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"xdelta3-64|x64\">\n      <Configuration>xdelta3-64</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"xdelta3.c\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Itanium'\">%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">/DXD3_DEBUG=0 /DXD3_USE_LARGEFILE64=1 /DREGRESSION_TEST=1 /DSECONDARY_DJW=1 /DSECONDARY_FGK=1 /DXD3_MAIN=1 /DXD3_WIN32=1 /DEXTERNAL_COMPRESSION=0 /DXD3_STDIO=0 /DXD3_POSIX=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Itanium'\">/DXD3_DEBUG=0 /DXD3_USE_LARGEFILE64=1 /DREGRESSION_TEST=1 /DSECONDARY_DJW=1 /DSECONDARY_FGK=1 /DXD3_MAIN=1 /DXD3_WIN32=1 /DEXTERNAL_COMPRESSION=0 /DXD3_STDIO=0 /DXD3_POSIX=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">/DXD3_DEBUG=0 /DXD3_USE_LARGEFILE64=1 /DREGRESSION_TEST=1 /DSECONDARY_DJW=1 /DSECONDARY_FGK=1 /DXD3_MAIN=1 /DXD3_WIN32=1 /DEXTERNAL_COMPRESSION=0 /DXD3_STDIO=0 /DXD3_POSIX=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Win32'\">/DXD3_DEBUG=0 /DXD3_USE_LARGEFILE64=1 /DREGRESSION_TEST=1 /DSECONDARY_DJW=1 /DSECONDARY_FGK=1 /DXD3_MAIN=1 /DXD3_WIN32=1 /DEXTERNAL_COMPRESSION=0 /DXD3_STDIO=0 /DXD3_POSIX=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Itanium'\">/DXD3_DEBUG=0 /DXD3_USE_LARGEFILE64=1 /DREGRESSION_TEST=1 /DSECONDARY_DJW=1 /DSECONDARY_FGK=1 /DXD3_MAIN=1 /DXD3_WIN32=1 /DEXTERNAL_COMPRESSION=0 /DXD3_STDIO=0 /DXD3_POSIX=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|x64'\">/DXD3_DEBUG=0 /DXD3_USE_LARGEFILE64=1 /DREGRESSION_TEST=1 /DSECONDARY_DJW=1 /DSECONDARY_FGK=1 /DXD3_MAIN=1 /DXD3_WIN32=1 /DEXTERNAL_COMPRESSION=0 /DXD3_STDIO=0 /DXD3_POSIX=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"xdelta3-blkcache.h\" />\n    <ClInclude Include=\"xdelta3-cfgs.h\" />\n    <ClInclude Include=\"xdelta3-decode.h\" />\n    <ClInclude Include=\"xdelta3-djw.h\" />\n    <ClInclude Include=\"xdelta3-fgk.h\" />\n    <ClInclude Include=\"xdelta3-hash.h\" />\n    <ClInclude Include=\"xdelta3-internal.h\" />\n    <ClInclude Include=\"xdelta3-list.h\" />\n    <ClInclude Include=\"xdelta3-lzma.h\" />\n    <ClInclude Include=\"xdelta3-main.h\" />\n    <ClInclude Include=\"xdelta3-merge.h\" />\n    <ClInclude Include=\"xdelta3-second.h\" />\n    <ClInclude Include=\"xdelta3-test.h\" />\n    <ClInclude Include=\"xdelta3.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{8F9D37B5-B78E-4816-BE61-AEF679DBF3BC}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>xdelta3</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v120</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Itanium'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v120</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v120</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Itanium'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v120</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v120</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Itanium'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v120</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Itanium'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Itanium'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Itanium'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Itanium'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Itanium'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(WindowsSdkDir)\\include;$(VCInstallDir)include;..\\xz\\include</IncludePath>\n    <LibraryPath>$(LibraryPath);$(VSInstallDir);$(VSInstallDir)lib\\amd64;..\\xz\\bin_x86-64</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Itanium'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;SECONDARY_LZMA=0;LZMA_API_STATIC;SIZEOF_SIZE_T=4;SIZEOF_UNSIGNED_LONG_LONG=8;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <AdditionalIncludeDirectories>../xz/include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Itanium'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;..\\..\\..\\..\\src\\xz\\bin_x86-64\\liblzma_static.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;SECONDARY_LZMA=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <AdditionalIncludeDirectories>..\\..\\..\\..\\src\\xz\\include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;..\\..\\..\\..\\src\\xz\\bin_i486\\liblzma_static.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Itanium'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;SECONDARY_LZMA=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <AdditionalIncludeDirectories>..\\..\\..\\..\\src\\xz\\include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);..\\..\\..\\..\\src\\xz\\bin_x86-64\\liblzma_static.lib</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|Itanium'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='xdelta3-64|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;XD3_MAIN=1;XD3_DEBUG=0;XD3_USE_LARGEFILE64=1;REGRESSION_TEST=1;SECONDARY_DJW=1;SECONDARY_FGK=1;XD3_WIN32=1;EXTERNAL_COMPRESSION=0;SHELL_TESTS=0;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.wxi",
    "content": "<Include>\n            <?define PRODUCT_ID=60131be5-be4d-4975-9108-dd0be735890d ?>\n            <?define PACKAGE_ID=82bf21ca-ee08-4701-ab78-37210dac82ce ?>\n            <?define COMPONENT_ID=85bc3206-05f8-41f8-b500-6ea32e5d6a8f ?>\n            <?define MANUAL_ID=07f387bc-a0c5-4af9-88db-1a84443f1fc5 ?>\n            <?define SOURCE_ID=4e1503a9-3ed1-4e06-b0c0-890462b1a4fd ?>\n</Include>\n"
  },
  {
    "path": "source-code/dependencies/xdelta3/xdelta3.wxs",
    "content": "<?xml version='1.0'?>\n<?include $(sys.SOURCEFILEDIR)\\xdelta3.wxi ?>\n\n<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>\n   <Product Id='$(var.PRODUCT_ID)'\n            Name='Xdelta 3.0u'\n            Language='1033'\n            Codepage='1252'\n            Version='3.0.1.1'\n            Manufacturer='Josh.MacDonald@Gmail.Com'>\n\n            <Package Id='$(var.PACKAGE_ID)'\n                     Keywords='Installer'\n                     Description='Xdelta 3.0u'\n                     Comments='http://xdelta.org'\n                     Manufacturer='Josh.MacDonald@Gmail.Com'\n                     InstallerVersion='300'\n                     Languages='1033'\n                     Compressed='yes' />\n\n            <Media Id='1'\n                   Cabinet='xdelta30t.cab'\n                   EmbedCab='yes' />\n\n            <Directory Id='TARGETDIR' Name='SourceDir'>\n              <Directory Id='ProgramFilesFolder' Name='PFiles'>\n                <Directory Id='Xdelta' \n                           Name='Xdelta'>\n\n            <Component Id='Main'\n                       Guid='$(var.COMPONENT_ID)'>\n              <File Id='XdeltaEXE'\n                    Name='xdelt30t'\n                    LongName='xdelta30t.exe'\n                    DiskId='1'\n                    Source='G:\\jmacd\\svn\\xdelta3\\Release\\xdelta3.exe'\n                    Vital='yes'>\n              </File>\n            </Component>\n\n            <Component Id='Readme'\n                       Guid='$(var.MANUAL_ID)'>\n              <File Id='Readme'\n                    Name='readme.txt'\n                    LongName='readme.txt'\n                    DiskId='1'\n                    Source='G:\\jmacd\\svn\\xdelta3\\readme.txt'\n                    Vital='yes'>\n                <Shortcut Id=\"startupmenuReadme\"\n                          Directory=\"ProgramMenuDir\"\n                          Name=\"readme.txt\"\n                          LongName=\"Xdelta3 readme.txt\"\n                          />\n              </File>\n            </Component>\n\n            <Component Id='Copyright'\n                       Guid='$(var.MANUAL_ID)'>\n              <File Id='Copyright'\n                    Name='COPYING'\n                    LongName='COPYING'\n                    DiskId='1'\n                    Source='G:\\jmacd\\svn\\xdelta3\\COPYING'\n                    Vital='yes'>\n                <Shortcut Id=\"startupmenuCopyright\"\n                          Directory=\"ProgramMenuDir\"\n                          Name=\"COPYING\"\n                          LongName=\"GNU Public License\"\n                          />\n              </File>\n            </Component>\n\n            <Component Id='Source'\n                       Guid='$(var.SOURCE_ID)'>\n              <File Id='Source'\n                    Name='xdelt30t.zip'\n                    LongName='xdelta3.0u.zip'\n                    DiskId='1'\n                    Source='G:\\jmacd\\svn\\xdelta3\\xdelta3.0u.zip'\n                    Vital='yes'>\n                <Shortcut Id=\"startupmenuSource\"\n                          Directory=\"ProgramMenuDir\"\n                          Name=\"xdelt30t.zip\"\n                          LongName=\"xdelta3.0u.zip\"\n                          />\n              </File>\n            </Component>\n\n                </Directory>\n              </Directory>\n\n              <Directory Id=\"ProgramMenuFolder\" Name=\"PMenu\" LongName=\"Programs\">\n\t        <Directory Id=\"ProgramMenuDir\"\n                           Name=\"xdelt30t\"\n                           LongName=\"Xdelta 3.0u\">\n                </Directory>\n              </Directory>\n\n<!--               <Merge Id='CRT' -->\n<!--                      Language='0' -->\n<!--                      DiskId='1' -->\n<!-- src='C:\\Program Files\\Common Files\\Merge Modules\\microsoft_vc80_crt_x86.msm' -->\n<!-- /> -->\n<!--               <Merge Id='CRT Policy' -->\n<!--                      Language='0' -->\n<!--                      DiskId='1' -->\n<!-- src='C:\\Program Files\\Common Files\\Merge Modules\\policy_8_0_Microsoft_VC80_CRT_x86.msm' -->\n<!-- /> -->\n            </Directory>\n\n            <Feature Id='Complete'\n                     Level='1'>\n              <ComponentRef Id='Main' />\n              <ComponentRef Id='Readme' />\n              <ComponentRef Id='Copyright' />\n              <ComponentRef Id='Source' />\n            </Feature>\n\n<!--             <Feature Id='CRT_WinSXS' Title='CRT WinSXS' Level='1'> -->\n<!--                         <MergeRef Id='CRT' /> -->\n<!--                         <MergeRef Id='CRT Policy' /> -->\n<!--             </Feature> -->\n\n            <InstallExecuteSequence>\n                        <RemoveRegistryValues/>\n                        <RemoveFiles/>\n                        <InstallFiles/>\n                        <WriteRegistryValues/>\n            </InstallExecuteSequence>\n   </Product>\n</Wix>\n"
  },
  {
    "path": "source-code/source/PD-Loader/ModuleList.h",
    "content": "#pragma once\n\n#include <vector>\n#include <algorithm>\n#include <cassert>\n#include <string>\n#include <tuple>\n\nstd::wstring GetModuleFileNameW(HMODULE hModule)\n{\n\tstatic constexpr auto INITIAL_BUFFER_SIZE = MAX_PATH;\n\tstatic constexpr auto MAX_ITERATIONS = 7;\n\tstd::wstring ret;\n\tauto bufferSize = INITIAL_BUFFER_SIZE;\n\tfor (size_t iterations = 0; iterations < MAX_ITERATIONS; ++iterations)\n\t{\n\t\tret.resize(bufferSize);\n\t\tauto charsReturned = GetModuleFileNameW(hModule, &ret[0], bufferSize);\n\t\tif (charsReturned < ret.length())\n\t\t{\n\t\t\tret.resize(charsReturned);\n\t\t\treturn ret;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbufferSize *= 2;\n\t\t}\n\t}\n\treturn L\"\";\n}\n\nauto starts_with = [](const std::wstring& big_str, const std::wstring& small_str) -> auto\n{\n\treturn big_str.compare(0, small_str.length(), small_str) == 0;\n};\n\n// Stores a list of loaded modules with their names, WITHOUT extension\nclass ModuleList\n{\npublic:\n\tenum class SearchLocation\n\t{\n\t\tAll,\n\t\tLocalOnly,\n\t\tSystemOnly,\n\t};\n\n\t// Initializes module list\n\t// Needs to be called before any calls to Get or GetAll\n\tvoid Enumerate(SearchLocation location = SearchLocation::All)\n\t{\n\t\tconstexpr size_t INITIAL_SIZE = sizeof(HMODULE) * 256;\n\t\tHMODULE* modules = static_cast<HMODULE*>(malloc(INITIAL_SIZE));\n\t\tif (modules != nullptr)\n\t\t{\n\t\t\ttypedef BOOL(WINAPI * Func)(HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);\n\n\t\t\tHMODULE hLib = LoadLibrary(TEXT(\"kernel32\"));\n\t\t\tassert(hLib != nullptr); // If this fails then everything is probably broken anyway\n\n\t\t\tFunc pEnumProcessModules = reinterpret_cast<Func>(GetProcAddress(hLib, \"K32EnumProcessModules\"));\n\t\t\tif (pEnumProcessModules == nullptr)\n\t\t\t{\n\t\t\t\t// Try psapi\n\t\t\t\tFreeLibrary(hLib);\n\t\t\t\thLib = LoadLibrary(TEXT(\"psapi\"));\n\t\t\t\tif (hLib != nullptr)\n\t\t\t\t{\n\t\t\t\t\tpEnumProcessModules = reinterpret_cast<Func>(GetProcAddress(hLib, \"EnumProcessModules\"));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pEnumProcessModules != nullptr)\n\t\t\t{\n\t\t\t\tconst HANDLE currentProcess = GetCurrentProcess();\n\t\t\t\tDWORD cbNeeded = 0;\n\t\t\t\tif (pEnumProcessModules(currentProcess, modules, INITIAL_SIZE, &cbNeeded) != 0)\n\t\t\t\t{\n\t\t\t\t\tif (cbNeeded > INITIAL_SIZE)\n\t\t\t\t\t{\n\t\t\t\t\t\tHMODULE* newModules = static_cast<HMODULE*>(realloc(modules, cbNeeded));\n\t\t\t\t\t\tif (newModules != nullptr)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodules = newModules;\n\n\t\t\t\t\t\t\tif (pEnumProcessModules(currentProcess, modules, cbNeeded, &cbNeeded) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tEnumerateInternal(modules, location, cbNeeded / sizeof(HMODULE));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tEnumerateInternal(modules, location, cbNeeded / sizeof(HMODULE));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hLib != nullptr)\n\t\t\t{\n\t\t\t\tFreeLibrary(hLib);\n\t\t\t}\n\n\t\t\tfree(modules);\n\t\t}\n\t}\n\n\t// Recreates module list\n\tvoid ReEnumerate(SearchLocation location = SearchLocation::All)\n\t{\n\t\tClear();\n\t\tEnumerate(location);\n\t}\n\n\t// Clears module list\n\tvoid Clear()\n\t{\n\t\tm_moduleList.clear();\n\t}\n\n\t// Gets handle of a loaded module with given name, NULL otherwise\n\tHMODULE Get(const wchar_t* moduleName) const\n\t{\n\t\t// If vector is empty then we're trying to call it without calling Enumerate first\n\t\tassert(m_moduleList.size() != 0);\n\n\t\tauto it = std::find_if(m_moduleList.begin(), m_moduleList.end(), [&](const auto& e) {\n\t\t\treturn _wcsicmp(moduleName, std::get<1>(e).c_str()) == 0;\n\t\t});\n\t\treturn it != m_moduleList.end() ? std::get<0>(*it) : nullptr;\n\t}\n\n\t// Gets handles to all loaded modules with given name\n\tstd::vector<HMODULE> GetAll(const wchar_t* moduleName) const\n\t{\n\t\t// If vector is empty then we're trying to call it without calling Enumerate first\n\t\tassert(m_moduleList.size() != 0);\n\n\t\tstd::vector<HMODULE> results;\n\t\tfor (auto& e : m_moduleList)\n\t\t{\n\t\t\tif (_wcsicmp(moduleName, std::get<1>(e).c_str()) == 0)\n\t\t\t{\n\t\t\t\tresults.push_back(std::get<0>(e));\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\nprivate:\n\tvoid EnumerateInternal(HMODULE* modules, SearchLocation location, size_t numModules)\n\t{\n\t\tconst auto exeModulePath = GetModuleFileNameW(NULL).substr(0, GetModuleFileNameW(NULL).find_last_of(L\"/\\\\\"));\n\n\t\tm_moduleList.reserve(numModules);\n\t\tfor (size_t i = 0; i < numModules; i++)\n\t\t{\n\t\t\t// Obtain module name, with resizing if necessary\n\t\t\tauto moduleName = GetModuleFileNameW(*modules);\n\n\t\t\tif (!moduleName.empty())\n\t\t\t{\n\t\t\t\tconst wchar_t* nameBegin = wcsrchr(moduleName.c_str(), '\\\\') + 1;\n\t\t\t\tconst wchar_t* dotPos = wcsrchr(nameBegin, '.');\n\t\t\t\tbool isLocal = starts_with(std::wstring(moduleName), exeModulePath);\n\n\t\t\t\tif ((isLocal && location != SearchLocation::SystemOnly) || (!isLocal && location != SearchLocation::LocalOnly))\n\t\t\t\t{\n\t\t\t\t\tif (dotPos != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tm_moduleList.emplace_back(*modules, std::wstring(nameBegin, dotPos), isLocal);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tm_moduleList.emplace_back(*modules, nameBegin, isLocal);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmodules++;\n\t\t}\n\t}\n\npublic: std::vector< std::tuple<HMODULE, std::wstring, bool> > m_moduleList;\n};"
  },
  {
    "path": "source-code/source/PD-Loader/PD-Loader.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{CA479467-D518-46A2-AC86-3098ADA99FE5}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>PDLoader</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n    <TargetFrameworkVersion>\n    </TargetFrameworkVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CLRSupport>false</CLRSupport>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <TargetName>dinput8</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetName>dnsapi</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_DEBUG;PDLOADER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>..\\dependencies\\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <ModuleDefinitionFile>x64.def</ModuleDefinitionFile>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;NDEBUG;PDLOADER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>..\\dependencies\\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <ModuleDefinitionFile>x64.def</ModuleDefinitionFile>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n    <Manifest>\n      <EnableDpiAwareness>\n      </EnableDpiAwareness>\n    </Manifest>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"exception.hpp\" />\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"ModuleList.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"x64.def\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/PD-Loader/PD-Loader.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"ModuleList.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"exception.hpp\">\n      <Filter>Source Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"x64.def\">\n      <Filter>Source Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/PD-Loader/dllmain.cpp",
    "content": "#include \"framework.h\"\r\n#include \"exception.hpp\"\r\n#include <VersionHelpers.h>\r\n#include <Shlwapi.h>\r\n#pragma comment(lib, \"Shlwapi.lib\")\r\n#include <filesystem>\r\n#include <fstream>\r\n#include <iostream>\r\n#pragma comment(linker,\"\\\"/manifestdependency:type='win32' \\\r\nname='Microsoft.Windows.Common-Controls' version='6.0.0.0' \\\r\nprocessorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n\r\nHMODULE hm;\r\nstd::vector<std::wstring> iniPaths;\r\n\r\nbool iequals(std::wstring_view s1, std::wstring_view s2)\r\n{\r\n\tstd::wstring str1(std::move(s1));\r\n\tstd::wstring str2(std::move(s2));\r\n\tstd::transform(str1.begin(), str1.end(), str1.begin(), [](wchar_t c) { return ::towlower(c); });\r\n\tstd::transform(str2.begin(), str2.end(), str2.begin(), [](wchar_t c) { return ::towlower(c); });\r\n\treturn (str1 == str2);\r\n}\r\n\r\nstd::wstring to_wstring(std::string_view cstr)\r\n{\r\n\tstd::string str(std::move(cstr));\r\n\tauto charsReturned = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);\r\n\tstd::wstring wstrTo(charsReturned, 0);\r\n\tMultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], charsReturned);\r\n\treturn wstrTo;\r\n}\r\n\r\nstd::wstring SHGetKnownFolderPath(REFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken)\r\n{\r\n\tstd::wstring r;\r\n\tWCHAR* szSystemPath = nullptr;\r\n\tif (SUCCEEDED(SHGetKnownFolderPath(rfid, dwFlags, hToken, &szSystemPath)))\r\n\t{\r\n\t\tr = szSystemPath;\r\n\t}\r\n\tCoTaskMemFree(szSystemPath);\r\n\treturn r;\r\n};\r\n\r\nHMODULE LoadLibraryW(const std::wstring& lpLibFileName)\r\n{\r\n\treturn LoadLibraryW(lpLibFileName.c_str());\r\n}\r\n\r\nstd::wstring GetCurrentDirectoryW()\r\n{\r\n\tstatic constexpr auto INITIAL_BUFFER_SIZE = MAX_PATH;\r\n\tstatic constexpr auto MAX_ITERATIONS = 7;\r\n\tstd::wstring ret;\r\n\tauto bufferSize = INITIAL_BUFFER_SIZE;\r\n\tfor (size_t iterations = 0; iterations < MAX_ITERATIONS; ++iterations)\r\n\t{\r\n\t\tret.resize(bufferSize);\r\n\t\tauto charsReturned = GetCurrentDirectoryW(bufferSize, &ret[0]);\r\n\t\tif (charsReturned < ret.length())\r\n\t\t{\r\n\t\t\tret.resize(charsReturned);\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tbufferSize *= 2;\r\n\t\t}\r\n\t}\r\n\treturn L\"\";\r\n}\r\n\r\nUINT GetPrivateProfileIntW(LPCWSTR lpAppName, LPCWSTR lpKeyName, INT nDefault, const std::vector<std::wstring>& fileNames)\r\n{\r\n\tfor (const auto& file : fileNames)\r\n\t{\r\n\t\tnDefault = GetPrivateProfileIntW(lpAppName, lpKeyName, nDefault, file.c_str());\r\n\t}\r\n\treturn nDefault;\r\n}\r\n\r\nstd::wstring GetSelfName()\r\n{\r\n\tconst std::wstring moduleFileName = GetModuleFileNameW(hm);\r\n\treturn moduleFileName.substr(moduleFileName.find_last_of(L\"/\\\\\") + 1);\r\n}\r\n\r\ntemplate<typename T, typename... Args>\r\nvoid GetSections(T&& h, Args... args)\r\n{\r\n\tconst std::set< std::string_view, std::less<> > s = { args... };\r\n\tsize_t dwLoadOffset = (size_t)GetModuleHandle(NULL);\r\n\tBYTE* pImageBase = reinterpret_cast<BYTE*>(dwLoadOffset);\r\n\tPIMAGE_DOS_HEADER   pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(dwLoadOffset);\r\n\tPIMAGE_NT_HEADERS   pNtHeader = reinterpret_cast<PIMAGE_NT_HEADERS>(pImageBase + pDosHeader->e_lfanew);\r\n\tPIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNtHeader);\r\n\tfor (int iSection = 0; iSection < pNtHeader->FileHeader.NumberOfSections; ++iSection, ++pSection)\r\n\t{\r\n\t\tauto pszSectionName = reinterpret_cast<const char*>(pSection->Name);\r\n\t\tif (s.find(pszSectionName) != s.end())\r\n\t\t{\r\n\t\t\tDWORD dwPhysSize = (pSection->Misc.VirtualSize + 4095) & ~4095;\r\n\t\t\tstd::forward<T>(h)(pSection, dwLoadOffset, dwPhysSize);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nenum Kernel32ExportsNames\r\n{\r\n\teGetStartupInfoA,\r\n\teGetStartupInfoW,\r\n\teGetModuleHandleA,\r\n\teGetModuleHandleW,\r\n\teGetProcAddress,\r\n\teGetShortPathNameA,\r\n\teFindNextFileA,\r\n\teFindNextFileW,\r\n\teLoadLibraryA,\r\n\teLoadLibraryW,\r\n\teFreeLibrary,\r\n\teCreateEventA,\r\n\teCreateEventW,\r\n\teGetSystemInfo,\r\n\teInterlockedCompareExchange,\r\n\teSleep,\r\n\r\n\tKernel32ExportsNamesCount\r\n};\r\n\r\nenum Kernel32ExportsData\r\n{\r\n\tIATPtr,\r\n\tProcAddress,\r\n\r\n\tKernel32ExportsDataCount\r\n};\r\n\r\nsize_t Kernel32Data[Kernel32ExportsNamesCount][Kernel32ExportsDataCount];\r\n\r\nstatic LONG OriginalLibraryLoaded = 0;\r\nvoid LoadOriginalLibrary()\r\n{\r\n\tif (_InterlockedCompareExchange(&OriginalLibraryLoaded, 1, 0) != 0) return;\r\n\r\n\tauto szSelfName = GetSelfName();\r\n\tauto szSystemPath = SHGetKnownFolderPath(FOLDERID_System, 0, nullptr) + L'\\\\' + szSelfName;\r\n\tauto szLocalPath = GetModuleFileNameW(hm); szLocalPath = szLocalPath.substr(0, szLocalPath.find_last_of(L\"/\\\\\") + 1);\r\n\r\n\tif (iequals(szSelfName, L\"dinput8.dll\")) {\r\n\t\tdinput8.LoadOriginalLibrary(LoadLibraryW(szSystemPath));\r\n\t}\r\n\telse if (iequals(szSelfName, L\"dnsapi.dll\")) {\r\n\t\tdnsapi.LoadOriginalLibrary(LoadLibraryW(szSystemPath));\r\n\t}\r\n}\r\n\r\nvoid LoadDVA(std::wstring &path, LPCWSTR dir, LPCWSTR fileName)\r\n{\r\n\tif (GetModuleHandle(path.c_str()) == NULL)\r\n\t{\r\n\t\tauto h = LoadLibraryW(path);\r\n\t\tSetCurrentDirectoryW(dir); //in case dva switched it\r\n\r\n\t\tif (h == NULL)\r\n\t\t{\r\n\t\t\tauto e = GetLastError();\r\n\t\t\tif (e != ERROR_DLL_INIT_FAILED) // in case dllmain returns false\r\n\t\t\t{\r\n\t\t\t\tstd::wstring msg = L\"Unable to load \" + std::wstring(fileName) + L\". Error: \" + std::to_wstring(e);\r\n\t\t\t\t\r\n\t\t\t\tLPVOID err_msg;\r\n\t\t\t\tif (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\r\n\t\t\t\t\tNULL, e, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPWSTR)&err_msg, 1, NULL)\r\n\t\t\t\t\t!= 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tmsg += L\"\\n\";\r\n\t\t\t\t\tmsg += (LPWSTR)err_msg;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tswitch (e)\r\n\t\t\t\t{\r\n\t\t\t\tcase 126:\r\n\t\t\t\t\tmsg.append(L\"\\n\\nIs the Microsoft Visual C++ Redistributable for Visual Studio 2019 (x64) installed?\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 998:\r\n\t\t\t\t\tmsg.append(L\"\\n\\nPossible causes:\\n- a dependency is not installed; or\\n- GPU detection failed (select the GPU Type manually/force Novidia in its Config).\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tmsg.append(L\"\\n\\nAre all dependencies installed?\");\r\n\t\t\t\t}\r\n\t\t\t\tmsg.append(L\"\\nPlease refer to the quick start guide or the wiki.\\n\\nAlso, please note that 3rd-party plugins may require additional libraries.\");\r\n\t\t\t\tMessageBoxW(0, msg.c_str(), L\"PD Loader\", MB_ICONERROR);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tauto procedure = (void(*)())GetProcAddress(h, \"InitializeDVA\");\r\n\r\n\t\t\tif (procedure != NULL)\r\n\t\t\t{\r\n\t\t\t\tprocedure();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FindFiles(WIN32_FIND_DATAW* fd)\r\n{\r\n\tauto dir = GetCurrentDirectoryW();\r\n\r\n\tHANDLE dvaFile = FindFirstFileW(L\"*.dva\", fd);\r\n\tif (dvaFile != INVALID_HANDLE_VALUE)\r\n\t{\r\n\t\tdo {\r\n\t\t\tif (!(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\r\n\t\t\t{\r\n\t\t\t\tif (fd->cFileName[0] == '.' && fd->cFileName[1] == '_') continue; // exclude macOS metadata\r\n\r\n\t\t\t\tauto pos = wcslen(fd->cFileName);\r\n\r\n\t\t\t\tif (fd->cFileName[pos - 4] == '.' &&\r\n\t\t\t\t\t(fd->cFileName[pos - 3] == 'd' || fd->cFileName[pos - 3] == 'D') &&\r\n\t\t\t\t\t(fd->cFileName[pos - 2] == 'v' || fd->cFileName[pos - 2] == 'V') &&\r\n\t\t\t\t\t(fd->cFileName[pos - 1] == 'a' || fd->cFileName[pos - 1] == 'A') &&\r\n\t\t\t\t\tGetPrivateProfileIntW(L\"plugins\", fd->cFileName, TRUE, iniPaths))\r\n\t\t\t\t{\r\n\t\t\t\t\tauto path = dir + L'\\\\' + fd->cFileName;\r\n\r\n\t\t\t\t\tLoadDVA(path, dir.c_str(), fd->cFileName);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (FindNextFileW(dvaFile, fd));\r\n\t\tFindClose(dvaFile);\r\n\t}\r\n}\r\n\r\nvoid LoadPlugins()\r\n{\r\n\tauto oldDir = GetCurrentDirectoryW(); // store the current directory\r\n\r\n\tauto szSelfPath = GetModuleFileNameW(hm).substr(0, GetModuleFileNameW(hm).find_last_of(L\"/\\\\\") + 1);\r\n\tSetCurrentDirectoryW(szSelfPath.c_str());\r\n\r\n\tauto nWantsToLoadPlugins = GetPrivateProfileIntW(L\"global\", L\"enable\", TRUE, iniPaths);\r\n\r\n\tif (nWantsToLoadPlugins)\r\n\t{\r\n\t\tif (SetCurrentDirectoryW(szSelfPath.c_str()))\r\n\t\t{\r\n\t\t\tWIN32_FIND_DATAW dh;\r\n\t\t\tHANDLE divaHook = FindFirstFileW(L\"divahook.dll\", &dh);\r\n\t\t\tif (divaHook != INVALID_HANDLE_VALUE && !(dh.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\r\n\t\t\t{\r\n\t\t\t\tprintf(\"[PD Loader] Loading divahook.dll\\n\");\r\n\t\t\t\tauto path = szSelfPath + L'\\\\' + dh.cFileName;\r\n\t\t\t\tLoadDVA(path, szSelfPath.c_str(), dh.cFileName);\r\n\t\t\t}\r\n\t\t\tif (SetCurrentDirectoryW(L\"plugins\\\\\"))\r\n\t\t\t{\r\n\t\t\t\tWIN32_FIND_DATAW fd;\r\n\t\t\t\tFindFiles(&fd);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tSetCurrentDirectoryW(oldDir.c_str()); // Reset the current directory\r\n}\r\n\r\nstatic LONG LoadedPluginsYet = 0;\r\nvoid LoadEverything()\r\n{\r\n\tif (_InterlockedCompareExchange(&LoadedPluginsYet, 1, 0) != 0) return;\r\n\r\n\tLoadOriginalLibrary();\r\n\tLoadPlugins();\r\n}\r\n\r\nstatic LONG RestoredOnce = 0;\r\nvoid LoadPluginsAndRestoreIAT(uintptr_t retaddr)\r\n{\r\n\tbool calledFromBind = false;\r\n\r\n\t//steam drm check\r\n\tGetSections([&](PIMAGE_SECTION_HEADER pSection, size_t dwLoadOffset, DWORD dwPhysSize) {\r\n\t\tauto dwStart = static_cast<uintptr_t>(dwLoadOffset + pSection->VirtualAddress);\r\n\t\tauto dwEnd = dwStart + dwPhysSize;\r\n\t\tif (retaddr >= dwStart && retaddr <= dwEnd)\r\n\t\t\tcalledFromBind = true;\r\n\t}, \".bind\");\r\n\r\n\tif (calledFromBind) return;\r\n\r\n\tif (_InterlockedCompareExchange(&RestoredOnce, 1, 0) != 0) return;\r\n\r\n\tLoadEverything();\r\n\r\n\tfor (size_t i = 0; i < Kernel32ExportsNamesCount; i++)\r\n\t{\r\n\t\tif (Kernel32Data[i][IATPtr] && Kernel32Data[i][ProcAddress])\r\n\t\t{\r\n\t\t\tauto ptr = (size_t*)Kernel32Data[i][IATPtr];\r\n\t\t\tDWORD dwProtect[2];\r\n\t\t\tVirtualProtect(ptr, sizeof(size_t), PAGE_EXECUTE_READWRITE, &dwProtect[0]);\r\n\t\t\t*ptr = Kernel32Data[i][ProcAddress];\r\n\t\t\tVirtualProtect(ptr, sizeof(size_t), dwProtect[0], &dwProtect[1]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid WINAPI CustomGetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetStartupInfoA(lpStartupInfo);\r\n}\r\n\r\nvoid WINAPI CustomGetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetStartupInfoW(lpStartupInfo);\r\n}\r\n\r\nHMODULE WINAPI CustomGetModuleHandleA(LPCSTR lpModuleName)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetModuleHandleA(lpModuleName);\r\n}\r\n\r\nHMODULE WINAPI CustomGetModuleHandleW(LPCWSTR lpModuleName)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetModuleHandleW(lpModuleName);\r\n}\r\n\r\nFARPROC WINAPI CustomGetProcAddress(HMODULE hModule, LPCSTR lpProcName)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetProcAddress(hModule, lpProcName);\r\n}\r\n\r\nDWORD WINAPI CustomGetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetShortPathNameA(lpszLongPath, lpszShortPath, cchBuffer);\r\n}\r\n\r\nBOOL WINAPI CustomFindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn FindNextFileA(hFindFile, lpFindFileData);\r\n}\r\n\r\nBOOL WINAPI CustomFindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn FindNextFileW(hFindFile, lpFindFileData);\r\n}\r\n\r\nHMODULE WINAPI CustomLoadLibraryA(LPCSTR lpLibFileName)\r\n{\r\n\tLoadOriginalLibrary();\r\n\r\n\treturn LoadLibraryA(lpLibFileName);\r\n}\r\n\r\nHMODULE WINAPI CustomLoadLibraryW(LPCWSTR lpLibFileName)\r\n{\r\n\tLoadOriginalLibrary();\r\n\r\n\treturn LoadLibraryW(lpLibFileName);\r\n}\r\n\r\nBOOL WINAPI CustomFreeLibrary(HMODULE hLibModule)\r\n{\r\n\tif (hLibModule != hm)\r\n\t\treturn FreeLibrary(hLibModule);\r\n\telse\r\n\t\treturn !NULL;\r\n}\r\n\r\nHANDLE WINAPI CustomCreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn CreateEventA(lpEventAttributes, bManualReset, bInitialState, lpName);\r\n}\r\n\r\nHANDLE WINAPI CustomCreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn CreateEventW(lpEventAttributes, bManualReset, bInitialState, lpName);\r\n}\r\n\r\nvoid WINAPI CustomGetSystemInfo(LPSYSTEM_INFO lpSystemInfo)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn GetSystemInfo(lpSystemInfo);\r\n}\r\n\r\nLONG WINAPI CustomInterlockedCompareExchange(LONG volatile* Destination, LONG ExChange, LONG Comperand)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn _InterlockedCompareExchange(Destination, ExChange, Comperand);\r\n}\r\n\r\nvoid WINAPI CustomSleep(DWORD dwMilliseconds)\r\n{\r\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\r\n\treturn Sleep(dwMilliseconds);\r\n}\r\n\r\nbool HookKernel32IAT(HMODULE mod, bool exe)\r\n{\r\n\tauto hExecutableInstance = (size_t)mod;\r\n\tIMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)(hExecutableInstance + ((IMAGE_DOS_HEADER*)hExecutableInstance)->e_lfanew);\r\n\tIMAGE_IMPORT_DESCRIPTOR* pImports = (IMAGE_IMPORT_DESCRIPTOR*)(hExecutableInstance + ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);\r\n\tsize_t                      nNumImports = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size / sizeof(IMAGE_IMPORT_DESCRIPTOR) - 1;\r\n\r\n\tif (exe)\r\n\t{\r\n\t\tKernel32Data[eGetStartupInfoA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetStartupInfoA\");\r\n\t\tKernel32Data[eGetStartupInfoW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetStartupInfoW\");\r\n\t\tKernel32Data[eGetModuleHandleA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetModuleHandleA\");\r\n\t\tKernel32Data[eGetModuleHandleW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetModuleHandleW\");\r\n\t\tKernel32Data[eGetProcAddress][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetProcAddress\");\r\n\t\tKernel32Data[eGetShortPathNameA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetShortPathNameA\");\r\n\t\tKernel32Data[eFindNextFileA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"FindNextFileA\");\r\n\t\tKernel32Data[eFindNextFileW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"FindNextFileW\");\r\n\t\tKernel32Data[eLoadLibraryA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"LoadLibraryA\");\r\n\t\tKernel32Data[eLoadLibraryW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"LoadLibraryW\");\r\n\t\tKernel32Data[eFreeLibrary][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"FreeLibrary\");\r\n\t\tKernel32Data[eCreateEventA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"CreateEventA\");\r\n\t\tKernel32Data[eCreateEventW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"CreateEventW\");\r\n\t\tKernel32Data[eGetSystemInfo][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetSystemInfo\");\r\n\t\tKernel32Data[eInterlockedCompareExchange][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"InterlockedCompareExchange\");\r\n\t\tKernel32Data[eSleep][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"Sleep\");\r\n\t}\r\n\r\n\tuint32_t matchedImports = 0;\r\n\r\n\tauto PatchIAT = [&](size_t start, size_t end, size_t exe_end)\r\n\t{\r\n\t\tfor (size_t i = 0; i < nNumImports; i++)\r\n\t\t{\r\n\t\t\tif (hExecutableInstance + (pImports + i)->FirstThunk > start && !(end && hExecutableInstance + (pImports + i)->FirstThunk > end))\r\n\t\t\t\tend = hExecutableInstance + (pImports + i)->FirstThunk;\r\n\t\t}\r\n\r\n\t\tif (!end) { end = start + 0x100; }\r\n\t\tif (end > exe_end) //for very broken exes\r\n\t\t{\r\n\t\t\tstart = hExecutableInstance;\r\n\t\t\tend = exe_end;\r\n\t\t}\r\n\r\n\t\tfor (auto i = start; i < end; i += sizeof(size_t))\r\n\t\t{\r\n\t\t\tDWORD dwProtect[2];\r\n\t\t\tVirtualProtect((size_t*)i, sizeof(size_t), PAGE_EXECUTE_READWRITE, &dwProtect[0]);\r\n\r\n\t\t\tauto ptr = *(size_t*)i;\r\n\t\t\tif (!ptr)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tif (ptr == Kernel32Data[eGetStartupInfoA][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetStartupInfoA][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetStartupInfoA;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eGetStartupInfoW][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetStartupInfoW][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetStartupInfoW;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eGetModuleHandleA][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetModuleHandleA][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetModuleHandleA;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eGetModuleHandleW][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetModuleHandleW][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetModuleHandleW;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eGetProcAddress][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetProcAddress][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetProcAddress;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eGetShortPathNameA][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetShortPathNameA][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetShortPathNameA;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eFindNextFileA][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eFindNextFileA][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomFindNextFileA;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eFindNextFileW][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eFindNextFileW][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomFindNextFileW;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eLoadLibraryA][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eLoadLibraryA][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomLoadLibraryA;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eLoadLibraryW][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eLoadLibraryW][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomLoadLibraryW;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eFreeLibrary][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eFreeLibrary][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomFreeLibrary;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eCreateEventA][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eCreateEventA][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomCreateEventA;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eCreateEventW][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eCreateEventW][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomCreateEventW;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eGetSystemInfo][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eGetSystemInfo][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomGetSystemInfo;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eInterlockedCompareExchange][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eInterlockedCompareExchange][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomInterlockedCompareExchange;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\t\t\telse if (ptr == Kernel32Data[eSleep][ProcAddress])\r\n\t\t\t{\r\n\t\t\t\tif (exe) Kernel32Data[eSleep][IATPtr] = i;\r\n\t\t\t\t*(size_t*)i = (size_t)CustomSleep;\r\n\t\t\t\tmatchedImports++;\r\n\t\t\t}\r\n\r\n\t\t\tVirtualProtect((size_t*)i, sizeof(size_t), dwProtect[0], &dwProtect[1]);\r\n\t\t}\r\n\t};\r\n\r\n\tstatic auto getSection = [](const PIMAGE_NT_HEADERS nt_headers, unsigned section) -> PIMAGE_SECTION_HEADER\r\n\t{\r\n\t\treturn reinterpret_cast<PIMAGE_SECTION_HEADER>(\r\n\t\t\t(UCHAR*)nt_headers->OptionalHeader.DataDirectory +\r\n\t\t\tnt_headers->OptionalHeader.NumberOfRvaAndSizes * sizeof(IMAGE_DATA_DIRECTORY) +\r\n\t\t\tsection * sizeof(IMAGE_SECTION_HEADER));\r\n\t};\r\n\r\n\tstatic auto getSectionEnd = [](IMAGE_NT_HEADERS* ntHeader, size_t inst) -> auto\r\n\t{\r\n\t\tauto sec = getSection(ntHeader, ntHeader->FileHeader.NumberOfSections - 1);\r\n\t\tauto secSize = max(sec->SizeOfRawData, sec->Misc.VirtualSize);\r\n\t\tauto end = inst + max(sec->PointerToRawData, sec->VirtualAddress) + secSize;\r\n\t\treturn end;\r\n\t};\r\n\r\n\tauto hExecutableInstance_end = getSectionEnd(ntHeader, hExecutableInstance);\r\n\r\n\t// Find kernel32.dll\r\n\tfor (size_t i = 0; i < nNumImports; i++)\r\n\t{\r\n\t\tif ((size_t)(hExecutableInstance + (pImports + i)->Name) < hExecutableInstance_end)\r\n\t\t{\r\n\t\t\tif (!_stricmp((const char*)(hExecutableInstance + (pImports + i)->Name), \"KERNEL32.DLL\"))\r\n\t\t\t\tPatchIAT(hExecutableInstance + (pImports + i)->FirstThunk, 0, hExecutableInstance_end);\r\n\t\t}\r\n\t}\r\n\r\n\t// Fixing ordinals\r\n\tauto szSelfName = GetSelfName();\r\n\r\n\tstatic auto PatchOrdinals = [&szSelfName](size_t hInstance)\r\n\t{\r\n\t\tIMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)(hInstance + ((IMAGE_DOS_HEADER*)hInstance)->e_lfanew);\r\n\t\tIMAGE_IMPORT_DESCRIPTOR* pImports = (IMAGE_IMPORT_DESCRIPTOR*)(hInstance + ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);\r\n\t\tsize_t                      nNumImports = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size / sizeof(IMAGE_IMPORT_DESCRIPTOR) - 1;\r\n\r\n\t\tfor (size_t i = 0; i < nNumImports; i++)\r\n\t\t{\r\n\t\t\tif ((size_t)(hInstance + (pImports + i)->Name) < getSectionEnd(ntHeader, (size_t)hInstance))\r\n\t\t\t{\r\n\t\t\t\tif (iequals(szSelfName, (to_wstring((const char*)(hInstance + (pImports + i)->Name)))))\r\n\t\t\t\t{\r\n\t\t\t\t\tPIMAGE_THUNK_DATA thunk = (PIMAGE_THUNK_DATA)(hInstance + (pImports + i)->OriginalFirstThunk);\r\n\t\t\t\t\tsize_t j = 0;\r\n\t\t\t\t\twhile (thunk->u1.Function)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tPIMAGE_IMPORT_BY_NAME import = (PIMAGE_IMPORT_BY_NAME)(hInstance + thunk->u1.AddressOfData);\r\n\t\t\t\t\t\t\tvoid** p = (void**)(hInstance + (pImports + i)->FirstThunk);\r\n\r\n\t\t\t\t\t\t\tif (iequals(szSelfName, L\"dinput8.dll\"))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tDWORD Protect;\r\n\t\t\t\t\t\t\t\tVirtualProtect(&p[j], 4, PAGE_EXECUTE_READWRITE, &Protect);\r\n\r\n\t\t\t\t\t\t\t\tif ((IMAGE_ORDINAL(thunk->u1.Ordinal)) == 1)\r\n\t\t\t\t\t\t\t\t\tp[j] = _DirectInput8Create;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t++thunk;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tModuleList dlls;\r\n\tdlls.Enumerate(ModuleList::SearchLocation::LocalOnly);\r\n\tfor (auto& e : dlls.m_moduleList)\r\n\t{\r\n\t\tPatchOrdinals((size_t)std::get<HMODULE>(e));\r\n\t}\r\n\treturn matchedImports > 0;\r\n}\r\n\r\nLONG WINAPI CustomUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo)\r\n{\r\n\t// step 1: write minidump\r\n\twchar_t\t\tmodulename[MAX_PATH];\r\n\twchar_t\t\tfilename[MAX_PATH];\r\n\twchar_t\t\ttimestamp[128];\r\n\t__time64_t\ttime;\r\n\tstruct tm\tltime;\r\n\tHANDLE\t\thFile;\r\n\tHWND\t\thWnd;\r\n\r\n\twchar_t* modulenameptr = NULL;\r\n\tif (GetModuleFileNameW(GetModuleHandle(NULL), modulename, _countof(modulename)) != 0)\r\n\t{\r\n\t\tmodulenameptr = wcsrchr(modulename, '\\\\');\r\n\t\t*modulenameptr = L'\\0';\r\n\t\tmodulenameptr += 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t*modulenameptr = L'err.err';\r\n\t}\r\n\r\n\t_time64(&time);\r\n\t_localtime64_s(&ltime, &time);\r\n\twcsftime(timestamp, _countof(timestamp), L\"%Y%m%d%H%M%S\", &ltime);\r\n\tswprintf_s(filename, L\"%s\\\\%s\\\\%s.%s.dmp\", modulename, L\"logs\", modulenameptr, timestamp);\r\n\r\n\thFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r\n\r\n\tif (hFile != INVALID_HANDLE_VALUE)\r\n\t{\r\n\t\tMINIDUMP_EXCEPTION_INFORMATION ex;\r\n\t\tmemset(&ex, 0, sizeof(ex));\r\n\t\tex.ThreadId = GetCurrentThreadId();\r\n\t\tex.ExceptionPointers = ExceptionInfo;\r\n\t\tex.ClientPointers = TRUE;\r\n\r\n\t\tif (FAILED(MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithDataSegs, &ex, NULL, NULL)))\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tCloseHandle(hFile);\r\n\t}\r\n\r\n\t// step 2: write log\r\n\t// Logs exception into buffer and writes to file\r\n\tswprintf_s(filename, L\"%s\\\\%s\\\\%s.%s.log\", modulename, L\"logs\", modulenameptr, timestamp);\r\n\thFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r\n\r\n\tif (hFile != INVALID_HANDLE_VALUE)\r\n\t{\r\n\t\tauto Log = [ExceptionInfo, hFile](char* buffer, size_t size, bool reg, bool stack, bool trace)\r\n\t\t{\r\n\t\t\tif (LogException(buffer, size, (LPEXCEPTION_POINTERS)ExceptionInfo, reg, stack, trace))\r\n\t\t\t{\r\n\t\t\t\tDWORD NumberOfBytesWritten = 0;\r\n\t\t\t\tWriteFile(hFile, buffer, strlen(buffer), &NumberOfBytesWritten, NULL);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Try to make a very descriptive exception, for that we need to malloc a huge buffer...\r\n\t\tif (auto buffer = (char*)malloc(max_logsize_ever))\r\n\t\t{\r\n\t\t\tLog(buffer, max_logsize_ever, true, true, true);\r\n\t\t\tfree(buffer);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Use a static buffer, no need for any allocation\r\n\t\t\tstatic const auto size = max_logsize_basic + max_logsize_regs + max_logsize_stackdump;\r\n\t\t\tstatic char static_buf[size];\r\n\t\t\tstatic_assert(size <= max_static_buffer, \"Static buffer is too big\");\r\n\r\n\t\t\tLog(buffer = static_buf, sizeof(static_buf), true, true, false);\r\n\t\t}\r\n\r\n\t\tCloseHandle(hFile);\r\n\t}\r\n\r\n\t// step 3: exit the application\r\n\tShowCursor(TRUE);\r\n\thWnd = FindWindowW(0, L\"\");\r\n\tSetForegroundWindow(hWnd);\r\n\r\n\treturn EXCEPTION_CONTINUE_SEARCH;\r\n}\r\n\r\nvoid Init()\r\n{\r\n\tSetProcessDPIAware();\r\n\r\n\tauto dir = GetModuleFileNameW(hm).substr(0, GetModuleFileNameW(hm).find_last_of(L\"/\\\\\") + 1);\r\n\tSetCurrentDirectoryW(dir.c_str());\r\n\r\n\tstd::wstring modulePath = GetModuleFileNameW(hm);\r\n\tstd::wstring moduleName = modulePath.substr(modulePath.find_last_of(L\"/\\\\\") + 1);\r\n\tmoduleName.resize(moduleName.find_last_of(L'.'));\r\n\tmodulePath.resize(modulePath.find_last_of(L\"/\\\\\") + 1);\r\n\tiniPaths.emplace_back(modulePath + moduleName + L\".ini\");\r\n\tconst auto CONFIG_FILE = L\"plugins\\\\config.ini\";\r\n\tconst auto CONFIG_FILE_TEMPLATE = L\"plugins\\\\config_template.bin\";\r\n\tiniPaths.emplace_back(modulePath + CONFIG_FILE);\r\n\r\n\r\n\t// initialize configuration files.\r\n\tCopyFileW(CONFIG_FILE_TEMPLATE, CONFIG_FILE, true);\r\n\tconst auto COMPONENTS_TEMPLATE = L\"plugins\\\\components_template.bin\";\r\n\tconst auto COMPONENTS = L\"plugins\\\\components.ini\";\r\n\tCopyFileW(COMPONENTS_TEMPLATE, COMPONENTS, true);\r\n\tconst auto KEYCONFIG_TEMPLATE = L\"plugins\\\\keyconfig_template.bin\";\r\n\tconst auto KEYCONFIG = L\"plugins\\\\keyconfig.ini\";\r\n\tCopyFileW(KEYCONFIG_TEMPLATE, KEYCONFIG, true);\r\n\tconst auto PLAYERDATA_TEMPLATE = L\"plugins\\\\playerdata_template.bin\";\r\n\tconst auto PLAYERDATA = L\"plugins\\\\playerdata.ini\";\r\n\tCopyFileW(PLAYERDATA_TEMPLATE, PLAYERDATA, true);\r\n\tconst auto DIVASOUND_TEMPLATE = L\"plugins\\\\DivaSound_template.bin\";\r\n\tconst auto DIVASOUND = L\"plugins\\\\DivaSound.ini\";\r\n\tCopyFileW(DIVASOUND_TEMPLATE, DIVASOUND, true);\r\n\tconst auto SHADERPATCH_TEMPLATE = L\"plugins\\\\ShaderPatch_template.bin\";\r\n\tconst auto SHADERPATCH = L\"plugins\\\\ShaderPatch.ini\";\r\n\tCopyFileW(SHADERPATCH_TEMPLATE, SHADERPATCH, true);\r\n\tconst auto SHADERPATCHCONFIG_TEMPLATE = L\"plugins\\\\ShaderPatchConfig_template.bin\";\r\n\tconst auto SHADERPATCHCONFIG = L\"plugins\\\\ShaderPatchConfig.ini\";\r\n\tCopyFileW(SHADERPATCHCONFIG_TEMPLATE, SHADERPATCHCONFIG, true);\r\n\r\n\tif ((PathFileExistsW(CONFIG_FILE_TEMPLATE) && !PathFileExistsW(CONFIG_FILE)) ||\r\n\t\t(PathFileExistsW(COMPONENTS_TEMPLATE) && !PathFileExistsW(COMPONENTS)) ||\r\n\t\t(PathFileExistsW(KEYCONFIG_TEMPLATE) && !PathFileExistsW(KEYCONFIG)) ||\r\n\t\t(PathFileExistsW(PLAYERDATA_TEMPLATE) && !PathFileExistsW(PLAYERDATA)) ||\r\n\t\t(PathFileExistsW(DIVASOUND_TEMPLATE) && !PathFileExistsW(DIVASOUND)) ||\r\n\t\t(PathFileExistsW(SHADERPATCH_TEMPLATE) && !PathFileExistsW(SHADERPATCH)) ||\r\n\t\t(PathFileExistsW(SHADERPATCHCONFIG_TEMPLATE) && !PathFileExistsW(SHADERPATCHCONFIG))\r\n\t\t)\r\n\t\tMessageBoxW(0, L\"Could not install configuration files. Possible causes:\\n\\n- PD Loader was not installed correctly\\n- The game is on a read-only drive\\n- No privileges to write in the folder\", L\"PD Loader\", MB_ICONWARNING);\r\n\r\n\tCreateDirectoryW(L\"plugins\\\\pv_equip\", NULL);\r\n\tconst auto eq_modules = L\"plugins\\\\pv_equip\\\\modules.ini\";\r\n\tif (!PathFileExistsW(eq_modules))\r\n\t{\r\n\t\tstd::ofstream stream(eq_modules);\r\n\t\tstream << \"[modules]\\n# Manual editing is NOT recommended as the game will save here during gameplay\";\r\n\t\tstream.close();\r\n\t}\r\n\tconst auto eq_sfx = L\"plugins\\\\pv_equip\\\\sfx.ini\";\r\n\tif (!PathFileExistsW(eq_sfx))\r\n\t{\r\n\t\tstd::ofstream stream(eq_sfx);\r\n\t\tstream << \"[SFX]\\n# INI Format = ' pv.xxx.btn = sfx id (ex. 5) '\\n# pv.001.btn=2 for example\\n# pv.xxx.btn, pv.xxx.chain, pv.xxx.slide & pv.xxx.touch can all be assigned using the format\";\r\n\t\tstream.close();\r\n\t}\r\n\tconst auto eq_skins = L\"plugins\\\\pv_equip\\\\skins.ini\";\r\n\tif (!PathFileExistsW(eq_skins))\r\n\t{\r\n\t\tstd::ofstream stream(eq_skins);\r\n\t\tstream << \"[skins]\\n# INI Format = ' pv.xxx.skin = skin ID (ex. 123) '\\n# pv.001.skin=100 for example\";\r\n\t\tstream.close();\r\n\t}\r\n\r\n\tconst std::filesystem::path databank_template = L\"ram\\\\databank_template_v2\";\r\n\tconst std::filesystem::path databank = L\"ram\\\\databank\";\r\n\tif (!std::filesystem::exists(databank)&&std::filesystem::exists(databank_template))\r\n\t{\r\n\t\ttry\r\n\t\t{\r\n\t\t\tstd::filesystem::create_directories(databank);\r\n\t\t\tstd::filesystem::copy(databank_template, databank, std::filesystem::copy_options::recursive);\r\n\t\t}\r\n\t\tcatch (std::exception& e)\r\n\t\t{\r\n\t\t\tstd::cout << \"[PD Loader] databank copy exception: \" << e.what() << std::endl;\r\n\t\t\tMessageBoxW(0, L\"Could not install databank files. Is the game in a read-only folder?\\n\\n\", L\"PD Loader\", MB_ICONWARNING);\r\n\t\t}\r\n\t}\r\n\r\n\tstd::wstring m = GetModuleFileNameW(NULL);\r\n\tm = m.substr(0, m.find_last_of(L\"/\\\\\") + 1) + L\"logs\";\r\n\r\n\tauto FolderExists = [](LPCWSTR szPath) -> BOOL\r\n\t{\r\n\t\tDWORD dwAttrib = GetFileAttributes(szPath);\r\n\t\treturn (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));\r\n\t};\r\n\r\n\tif (FolderExists(m.c_str()))\r\n\t{\r\n\t\tSetUnhandledExceptionFilter(CustomUnhandledExceptionFilter);\r\n\t\t// Now stub out CustomUnhandledExceptionFilter so NO ONE ELSE can set it!\r\n\t\tuint32_t ret = 0x909090C3; //ret\r\n\t\tDWORD protect[2];\r\n\t\tVirtualProtect(&SetUnhandledExceptionFilter, sizeof(ret), PAGE_EXECUTE_READWRITE, &protect[0]);\r\n\t\tmemcpy(&SetUnhandledExceptionFilter, &ret, sizeof(ret));\r\n\t\tVirtualProtect(&SetUnhandledExceptionFilter, sizeof(ret), protect[0], &protect[1]);\r\n\t}\r\n\r\n\tDeleteFileW(L\"~dinput8.dll\");\r\n\tstd::wstring szSelfName = GetSelfName();\r\n\tif (iequals(szSelfName, L\"DINPUT8.dll\"))\r\n\t{\r\n\t\tWIN32_FIND_DATAW fd;\r\n\t\tHANDLE dnsloader = FindFirstFileW(L\"dnsapi.dll\", &fd);\r\n\t\tif (dnsloader != INVALID_HANDLE_VALUE)\r\n\t\t{\r\n\t\t\tMessageBoxW(0, L\"PD Loader was loaded from \\\"dinput8.dll\\\", but \\\"dnsapi.dll\\\" was found. Aborting.\\nPlease refer to the quick start guide or the wiki.\", L\"PD Loader\", MB_ICONERROR);\r\n\t\t\texit(1);\r\n\t\t}\r\n\t}\r\n\telse if (iequals(szSelfName, L\"DNSAPI.dll\"))\r\n\t{\r\n\t\tWIN32_FIND_DATAW fd;\r\n\t\tHANDLE dnsloader = FindFirstFileW(L\"dinput8.dll\", &fd);\r\n\t\tif (dnsloader != INVALID_HANDLE_VALUE)\r\n\t\t{\r\n\t\t\tauto dinput_handle = GetModuleHandleW(L\"DINPUT8.dll\");\r\n\t\t\tif (dinput_handle&&!FreeLibrary(dinput_handle))\r\n\t\t\t{\r\n\t\t\t\tMessageBoxW(0, L\"PD Loader was loaded from \\\"dnsapi.dll\\\", but \\\"dinput8.dll\\\" was found and PD Loader could not unload it. Please delete \\\"dinput8.dll\\\".\", L\"PD Loader\", MB_ICONERROR);\r\n\t\t\t\texit(1);\r\n\t\t\t}\r\n\t\t\telse if (!MoveFileExW(L\"dinput8.dll\", L\"~dinput8.dll\", MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH))\r\n\t\t\t{\r\n\t\t\t\tMessageBoxW(0, L\"PD Loader was loaded from \\\"dnsapi.dll\\\", but \\\"dinput8.dll\\\" was found and PD Loader could not delete it automatically\\nIs it read-only?\", L\"PD Loader\", MB_ICONERROR);\r\n\t\t\t\texit(1);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(IsWindows8OrGreater())\r\n\t\t{\r\n\t\t\tif (MoveFileExW(L\"dnsapi.dll\", L\"dinput8.dll\", MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH))\r\n\t\t\t{\r\n\t\t\t\tWCHAR DIVA_EXECUTABLE[MAX_PATH];\r\n\t\t\t\tGetModuleFileNameW(NULL, DIVA_EXECUTABLE, MAX_PATH);\r\n\t\t\t\tLPWSTR DIVA_COMMAND_LINE = GetCommandLineW();\r\n\t\t\t\tSTARTUPINFOW si;\r\n\t\t\t\tPROCESS_INFORMATION pi;\r\n\t\t\t\tZeroMemory(&si, sizeof(si));\r\n\t\t\t\tsi.cb = sizeof(si);\r\n\t\t\t\tZeroMemory(&pi, sizeof(pi));\r\n\t\t\t\tCreateProcessW(DIVA_EXECUTABLE, DIVA_COMMAND_LINE, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);\r\n\t\t\t\texit(0);\r\n\t\t\t}\r\n\t\t\telse MessageBoxW(0, L\"It is highly recommended to rename \\\"dnsapi.dll\\\" \\\"dinput8.dll\\\" on Windows 8/8.1/10 to avoid issues, but PD Loader could not rename the file automatically.\\nIs it read-only?\", L\"PD Loader\", MB_ICONWARNING);\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tMessageBoxW(0, L\"Supported file names:\\n\\\"dnsapi.dll\\\" (Windows Vista/7)\\n\\\"dinput8.dll\\\"\", L\"PD Loader\", MB_ICONERROR);\r\n\t\texit(1);\r\n\t}\r\n\r\n\tLoadEverything();\r\n\r\n}\r\n\r\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID /*lpReserved*/)\r\n{\r\n\tif (reason == DLL_PROCESS_ATTACH)\r\n\t{\r\n\t\thm = hModule;\r\n\t\tInit();\r\n\t}\r\n\treturn TRUE;\r\n}\r\n"
  },
  {
    "path": "source-code/source/PD-Loader/exception.hpp",
    "content": "#pragma once\n/*\n * Unhandled Exception Tracer\n * by LINK/2012 <dma_2012@hotmail.com>\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <time.h>\n#include <cassert>\n#include <DbgHelp.h>\n#pragma comment(lib, \"Dbghelp.lib\")\n\n /*\n  *  Special Note:\n  *      Try not to allocate any memory in this file!\n  *      Allocation after a exception may not be a good idea...\n  */\n\n#define LODWORD(_qw)    ((DWORD)(_qw))\n#define HIDWORD(_qw)    ((DWORD)(((_qw) >> 32) & 0xffffffff))\n\n  // General constants\nstatic const int sizeof_word = sizeof(void*);           // Size of a CPU word (4 bytes on x86)\nstatic const int max_chars_per_print = MAX_PATH + 256;  // Max characters per Print() call\nstatic const int symbol_max = 256;                      // Max size of a symbol (func symbol, var symbol, etc)\nstatic const int max_static_buffer = 4096;              // Max static buffer for logging\n\n// Stackdump constants\nstatic const int stackdump_max_words = 60;              // max number of CPU words that the stackdump should dump\nstatic const int stackdump_words_per_line = 6;          // max CPU words in a single line\nstatic const int stackdump_line_count = (stackdump_max_words / stackdump_words_per_line) + 1;\n\n// Backtrace constants\nstatic const int max_backtrace_ever = 100;\nstatic const int max_backtrace = 20;\n\n// Maximum log size constants\nstatic const int max_logsize_basic = (MAX_PATH + 200);      // module path + other text\nstatic const int max_logsize_regs = 32 + (4 * 4 * 28);     // info + (regsPerLine * numLines * charsPerReg)\nstatic const int max_logsize_stackdump = 32 + 80 + (stackdump_line_count * 32) + (10 * stackdump_words_per_line * stackdump_line_count);\nstatic const int max_logsize_backtrace = 32 + max_backtrace_ever * (MAX_PATH + symbol_max + 90);\nstatic const int max_logsize_ever = 32 + max_logsize_basic + max_logsize_regs + max_logsize_stackdump + max_logsize_backtrace;\n\n// Internal\nclass ExceptionTracer;\nclass StackTrace;\nstatic HMODULE GetModuleFromAddress(LPVOID address);\nstatic const char* GetExceptionCodeString(unsigned int code);\nstatic const char* FindModuleName(HMODULE module, char* output, DWORD size);\nstatic int LogException(char* buffer, size_t max, LPEXCEPTION_POINTERS pException, bool bLogRegisters, bool bLogStack, bool bLogBacktrace);\nstatic LPTOP_LEVEL_EXCEPTION_FILTER PrevFilter = nullptr;\nstatic void(*ExceptionCallback)(const char* buffer) = nullptr;\n\n// Exportable\nint InstallExceptionCatcher(void(*OnException)(const char* log));\n\n/*\n *  ExceptionTrace\n *      This class is responssible for tracing all possible informations about an LPEXCEPTION_POINTER\n */\nclass ExceptionTracer\n{\npublic:\n\tExceptionTracer(char* buffer, size_t max, LPEXCEPTION_POINTERS pException);\n\tvoid PrintUnhandledException();\n\tvoid PrintRegisters();\n\tvoid PrintStackdump();\n\tvoid PrintBacktrace();\n\n\tvoid EnterScope();\n\tvoid LeaveScope();\n\tvoid Print(const char* fmt, ...);\n\tvoid NewLine() { Print(\"\\n%s\", spc); }\n\nprotected:\n\tEXCEPTION_POINTERS& exception;\n\tEXCEPTION_RECORD& record;\n\tCONTEXT& context;\n\tHMODULE module;\n\n\tchar* buffer;       // Logging buffer\n\tsize_t len;         // Logged length\n\tsize_t max;         // Maximum we can log in that buffer\n\n\tchar spc[(10 * 4) + 1]; // Scope/spacing buffer, 4 spaces per scope, max 10 scopes\n\tsize_t nspc;        // Number spaces used up there\n};\n\n/*\n *  StackTracer\n *      Responssible for backtracing an stack from a context\n */\nclass StackTracer\n{\npublic:\n\tstruct Trace\n\t{\n\t\t// The following values may be null (any)\n\t\tHMODULE module;     // The module the func related to this frame is located\n\t\tvoid* pc;           // Program counter at func related to this frame (EIP)\n\t\tvoid* ret;          // Return address for the frame\n\t\tvoid* frame;        // The frame address (EBP)\n\t\tvoid* stack;        // The stack pointer at the frame (ESP)\n\t};\n\n\tStackTracer(const CONTEXT& context);\n\tTrace* Walk();\n\nprivate:\n\tTrace trace;\n\tDWORD old_options;\n\tCONTEXT context;\n\tSTACKFRAME64 frame;\n};\n\n/*\n *  TheUnhandledExceptionFilter\n *      Logs an unhandled exception\n */\nstatic LONG CALLBACK TheUnhandledExceptionFilter(LPEXCEPTION_POINTERS pException)\n{\n\t// Logs exception into buffer and calls the callback\n\tauto Log = [pException](char* buffer, size_t size, bool reg, bool stack, bool trace)\n\t{\n\t\tif (LogException(buffer, size, (LPEXCEPTION_POINTERS)pException, reg, stack, trace))\n\t\t\tExceptionCallback(buffer);\n\t};\n\n\t// Try to make a very descriptive exception, for that we need to malloc a huge buffer...\n\tif (auto buffer = (char*)malloc(max_logsize_ever))\n\t{\n\t\tLog(buffer, max_logsize_ever, true, true, true);\n\t\tfree(buffer);\n\t}\n\telse\n\t{\n\t\t// Use a static buffer, no need for any allocation\n\t\tstatic const auto size = max_logsize_basic + max_logsize_regs + max_logsize_stackdump;\n\t\tstatic char static_buf[size];\n\t\tstatic_assert(size <= max_static_buffer, \"Static buffer is too big\");\n\n\t\tLog(buffer = static_buf, sizeof(static_buf), true, true, false);\n\t}\n\n\t// Continue exception propagation\n\treturn (PrevFilter ? PrevFilter(pException) : EXCEPTION_CONTINUE_SEARCH);  // I'm not really sure about this return\n}\n\n/*\n *  InstallExceptionCatcher\n *      Installs a exception handler to call the specified callback when it happens with human readalbe information.\n */\nint InstallExceptionCatcher(void(*cb)(const char* log))\n{\n\tPrevFilter = SetUnhandledExceptionFilter(TheUnhandledExceptionFilter);\n\tExceptionCallback = cb;\n\treturn 1;\n}\n\n/*\n * LogException\n *      Takes an LPEXCEPTION_POINTERS and transforms in a string that is put in the logging steam\n */\nstatic int LogException(char* buffer, size_t max, LPEXCEPTION_POINTERS pException, bool bLogRegisters, bool bLogStack, bool bLogBacktrace)\n{\n\tExceptionTracer trace(buffer, max, pException);\n\ttrace.PrintUnhandledException();\n\ttrace.EnterScope();\n\tif (bLogRegisters) trace.PrintRegisters();\n\tif (bLogStack) trace.PrintStackdump();\n\tif (bLogBacktrace) trace.PrintBacktrace();\n\ttrace.LeaveScope();\n\treturn 1;\n}\n\n/*\n *  ExceptionTracer\n *      Contructs a exception trace object, responssible for tracing informations about an exception\n */\nExceptionTracer::ExceptionTracer(char* buffer, size_t max, LPEXCEPTION_POINTERS pException) :\n\tbuffer(buffer), exception(*pException), record(*pException->ExceptionRecord), context(*pException->ContextRecord)\n{\n\tthis->buffer = buffer;\n\tthis->buffer[this->len = 0] = 0;\n\tthis->spc[this->nspc = 0] = 0;\n\tthis->max = max;\n\n\t// Acquiere common information that we'll access\n\tthis->module = GetModuleFromAddress(record.ExceptionAddress);\n}\n\n/*\n *  Print\n *      Prints some formated text into the logging buffer\n */\nvoid ExceptionTracer::Print(const char* fmt, ...)\n{\n\tva_list va;\n\tva_start(va, fmt);\n\tif ((this->max - this->len) > max_chars_per_print)\n\t\tthis->len += vsprintf(&this->buffer[len], fmt, va);\n\tva_end(va);\n}\n\n/*\n *  EnterScope\n *      Enters a new scope in the logging buffer (scope is related to indentation)\n *      This also prints a new line\n */\nvoid ExceptionTracer::EnterScope()\n{\n\tnspc += 4;\n\tspc[nspc - 4] = ' ';\n\tspc[nspc - 3] = ' ';\n\tspc[nspc - 2] = ' ';\n\tspc[nspc - 1] = ' ';\n\tspc[nspc - 0] = 0;\n\tNewLine();\n}\n\n/*\n *  LeaveScope\n *      Leaves the scope\n */\nvoid ExceptionTracer::LeaveScope()\n{\n\tassert(nspc > 0);\n\tnspc -= 4;\n\tspc[nspc] = 0;\n\tNewLine();\n}\n\n/*\n *  PrintUnhandledException\n *      Prints the well known \"Unhandled exception at ...\" into the logging buffer\n */\nvoid ExceptionTracer::PrintUnhandledException()\n{\n\tchar module_name[MAX_PATH];\n\tauto dwExceptionCode = record.ExceptionCode;\n\tuintptr_t address = (uintptr_t)record.ExceptionAddress;\n\n\t// Find out our module name for logging\n\tif (!this->module || !GetModuleFileNameA(this->module, module_name, sizeof(module_name)))\n\t\tstrcpy(module_name, \"unknown\");\n\n\t// Log the exception in a similar format similar to debuggers format\n\tPrint(\"Unhandled exception at 0x%p in %s\", address, FindModuleName(module, module_name, sizeof(module_name)));\n\tif (module) Print(\" (+0x%x)\", address - (uintptr_t)(module));\n\tPrint(\": 0x%X: %s\", dwExceptionCode, GetExceptionCodeString(dwExceptionCode));\n\n\t// If exception is IN_PAGE_ERROR or ACCESS_VIOLATION, we have additional information such as an address\n\tif (dwExceptionCode == EXCEPTION_IN_PAGE_ERROR || dwExceptionCode == EXCEPTION_ACCESS_VIOLATION)\n\t{\n\t\tauto rw = (DWORD)record.ExceptionInformation[0];  // read or write?\n\t\tauto addr = (ULONG_PTR)record.ExceptionInformation[1];  // which address?\n\n\t\tPrint(\" %s 0x%p\",\n\t\t\trw == 0 ? \"reading location\" : rw == 1 ? \"writing location\" : rw == 8 ? \"DEP at\" : \"\",\n\t\t\taddr);\n\n\t\t// IN_PAGE_ERROR have another information...\n\t\tif (dwExceptionCode == EXCEPTION_IN_PAGE_ERROR)\n\t\t{\n\t\t\tNewLine();\n\t\t\tPrint(\"Underlying NTSTATUS code that resulted in the exception is 0x%p\",\n\t\t\t\trecord.ExceptionInformation[2]);\n\t\t}\n\t}\n\n\tPrint(\".\");\n}\n\n/*\n *  PrintRegisters\n *      Prints the content of the assembly registers into the logging buffer\n */\nvoid ExceptionTracer::PrintRegisters()\n{\n\tint regs_in_line = 0;       // Amount of registers currently printed on this line\n\n\t// Prints a register, followed by spaces\n\tauto PrintRegister = [this, &regs_in_line](const char* reg_name, size_t reg_value, const char* spaces)\n\t{\n\t\tPrint(\"%s: 0x%p%s\", reg_name, reg_value, spaces);\n\t\tif (++regs_in_line >= 4) { this->NewLine(); regs_in_line = 0; }\n\t};\n\n\tauto PrintFloatRegister = [this, &regs_in_line](const char* reg_name, int reg_num, uint32_t reg_value1, uint32_t reg_value2, uint32_t reg_value3, uint32_t reg_value4)\n\t{\n\t\tPrint(\"%s%02d: 0x%08X 0x%08X 0x%08X 0x%08X  [ %f %f %f %f ]\", reg_name, reg_num, reg_value1, reg_value2, reg_value3, reg_value4,\n\t\t\t*(float*)& reg_value1, *(float*)& reg_value2, *(float*)& reg_value3, *(float*)& reg_value4);\n\t\tif (++regs_in_line >= 1) { this->NewLine(); regs_in_line = 0; }\n\t};\n\n\t// Prints a general purposes register\n\tauto PrintIntRegister = [PrintRegister](const char* reg_name, size_t reg_value)\n\t{\n\t\tPrintRegister(reg_name, reg_value, \"  \");\n\t};\n\n\t// Prints a segment register\n\tauto PrintSegRegister = [PrintRegister](const char* reg_name, size_t reg_value)\n\t{\n\t\tPrintRegister(reg_name, reg_value, \"   \");\n\t};\n\n\tPrint(\"Register dump:\");\n\tEnterScope();\n\t{\n\t\t// Print main general purposes registers\n\t\tif (context.ContextFlags & CONTEXT_INTEGER)\n\t\t{\n#if !_M_X64\n\t\t\tPrintIntRegister(\"EAX\", context.Eax);\n\t\t\tPrintIntRegister(\"EBX\", context.Ebx);\n\t\t\tPrintIntRegister(\"ECX\", context.Ecx);\n\t\t\tPrintIntRegister(\"EDX\", context.Edx);\n\t\t\tPrintIntRegister(\"EDI\", context.Edi);\n\t\t\tPrintIntRegister(\"ESI\", context.Esi);\n#else\n\t\t\tPrintIntRegister(\"RAX\", context.Rax);\n\t\t\tPrintIntRegister(\"RCX\", context.Rcx);\n\t\t\tPrintIntRegister(\"RDX\", context.Rdx);\n\t\t\tPrintIntRegister(\"RBX\", context.Rbx);\n\t\t\tPrintIntRegister(\"RBP\", context.Rbp);\n\t\t\tPrintIntRegister(\"RSI\", context.Rsi);\n\t\t\tPrintIntRegister(\"RDI\", context.Rdi);\n\t\t\tPrintIntRegister(\"R08\", context.R8);\n\t\t\tPrintIntRegister(\"R09\", context.R9);\n\t\t\tPrintIntRegister(\"R10\", context.R10);\n\t\t\tPrintIntRegister(\"R11\", context.R11);\n\t\t\tPrintIntRegister(\"R12\", context.R12);\n\t\t\tPrintIntRegister(\"R13\", context.R13);\n\t\t\tPrintIntRegister(\"R14\", context.R14);\n\t\t\tPrintIntRegister(\"R15\", context.R15);\n#endif\n\t\t}\n\n\t\t// Print control registers\n\t\tif (context.ContextFlags & CONTEXT_CONTROL)\n\t\t{\n#if !_M_X64\n\t\t\tPrintIntRegister(\"EBP\", context.Ebp);\n\t\t\tPrintIntRegister(\"EIP\", context.Eip);\n\t\t\tPrintIntRegister(\"ESP\", context.Esp);\n\t\t\tPrintIntRegister(\"EFL\", context.EFlags);\n\t\t\tthis->NewLine(); this->NewLine(); regs_in_line = 0;\n\t\t\tPrintSegRegister(\"CS\", context.SegCs);\n\t\t\tPrintSegRegister(\"SS\", context.SegSs);\n#else\n\t\t\tPrintIntRegister(\"RIP\", context.Rip);\n\t\t\tPrintIntRegister(\"RSP\", context.Rsp);\n\t\t\tPrintIntRegister(\"EFL\", context.EFlags);\n\t\t\tthis->NewLine(); this->NewLine(); regs_in_line = 0;\n\t\t\tPrintSegRegister(\"CS\", context.SegCs);\n\t\t\tPrintSegRegister(\"SS\", context.SegSs);\n#endif\n\t\t}\n\n\t\tthis->NewLine(); regs_in_line = 0;\n\n\t\t// Print segment registers\n\t\tif (context.ContextFlags & CONTEXT_SEGMENTS)\n\t\t{\n\t\t\tPrintSegRegister(\"GS\", context.SegGs);\n\t\t\tPrintSegRegister(\"FS\", context.SegFs);\n\t\t\tthis->NewLine(); regs_in_line = 0;\n\t\t\tPrintSegRegister(\"ES\", context.SegEs);\n\t\t\tPrintSegRegister(\"DS\", context.SegDs);\n\t\t}\n\n\t\tthis->NewLine(); this->NewLine(); regs_in_line = 0;\n\n\t\t// Print floating point registers\n\t\tif (context.ContextFlags & CONTEXT_FLOATING_POINT)\n\t\t{\n\t\t\tfor (int i = 0; i < 8; i++)\n\t\t\t{\n#if !_M_X64\n\t\t\t\tauto f = *(M128A*) & (context.FloatSave.RegisterArea[i * 10]);\n\t\t\t\tPrintFloatRegister(\"ST\", i, LODWORD(f.Low), HIDWORD(f.Low), LODWORD(f.High), HIDWORD(f.High));\n#else\n\t\t\t\tPrintFloatRegister(\"ST\", i,\n\t\t\t\t\tLODWORD(context.FltSave.FloatRegisters[i].Low), HIDWORD(context.FltSave.FloatRegisters[i].Low),\n\t\t\t\t\tLODWORD(context.FltSave.FloatRegisters[i].High), HIDWORD(context.FltSave.FloatRegisters[i].High));\n#endif\n\t\t\t}\n\n\t\t\tthis->NewLine();\n\n\t\t\tfor (int i = 0; i < 16; i++)\n\t\t\t{\n#if !_M_X64\n\t\t\t\tauto f = *(M128A*) & (context.ExtendedRegisters[(i + 10) * 16]);\n\t\t\t\tPrintFloatRegister(\"XMM\", i, LODWORD(f.Low), HIDWORD(f.Low), LODWORD(f.High), HIDWORD(f.High));\n\n\t\t\t\tif (i >= 7)\n\t\t\t\t\tbreak;\n#else\n\t\t\t\tPrintFloatRegister(\"XMM\", i,\n\t\t\t\t\tLODWORD(context.FltSave.XmmRegisters[i].Low), HIDWORD(context.FltSave.XmmRegisters[i].Low),\n\t\t\t\t\tLODWORD(context.FltSave.XmmRegisters[i].High), HIDWORD(context.FltSave.XmmRegisters[i].High));\n#endif\n\t\t\t}\n\t\t}\n\t}\n\tLeaveScope();\n}\n\n/*\n *  PrintStackdump\n *      Prints the content of the stack into the logging buffer\n */\nvoid ExceptionTracer::PrintStackdump()\n{\n\t// We need the ESP of the exception context to execute a stack dump, make sure we have access to it\n\tif ((context.ContextFlags & CONTEXT_CONTROL) == 0)\n\t\treturn;\n\n\tstatic const auto align = sizeof_word;      // Stack aligment\n\tstatic const auto max_words_in_line_magic = stackdump_words_per_line + 10;\n\n\tMEMORY_BASIC_INFORMATION mbi;\n#if !_M_X64\n\tuintptr_t base, bottom, top = (uintptr_t)context.Esp;\n#else\n\tuintptr_t base, bottom, top = (uintptr_t)context.Rsp;\n#endif\n\tauto words_in_line = max_words_in_line_magic;\n\n\t// Finds the bottom of the stack from it's base pointer\n\t// Note: mbi will get overriden on this function\n\tauto GetStackBottom = [&mbi](uintptr_t base)\n\t{\n\t\tVirtualQuery((void*)base, &mbi, sizeof(mbi));                               // Find uncommited region of the stack\n\t\tVirtualQuery((char*)mbi.BaseAddress + mbi.RegionSize, &mbi, sizeof(mbi));   // Find guard page\n\t\tVirtualQuery((char*)mbi.BaseAddress + mbi.RegionSize, &mbi, sizeof(mbi));   // Find commited region of the stack\n\t\tauto last = (uintptr_t)mbi.BaseAddress;\n\t\treturn (base + (last - base) + mbi.RegionSize);                             // base + distanceToLastRegion + lastRegionSize\n\t};\n\n\t// Prints an CPU word at the specified stack address\n\tauto PrintWord = [this, &words_in_line](uintptr_t addr)\n\t{\n\t\tif (words_in_line++ >= stackdump_words_per_line)\n\t\t{\n\t\t\t// Print new line only if it's not the first time we enter here (i.e. words_in_line has magical value)\n\t\t\tif (words_in_line != max_words_in_line_magic + 1) NewLine();\n\t\t\twords_in_line = 1;\n\t\t\tPrint(\"0x%p: \", addr);\n\t\t}\n\t\tPrint(\" %p\", *(size_t*)addr);\n\t};\n\n\tPrint(\"Stack dump:\");\n\tEnterScope();\n\t{\n\t\t// Makes sure the pointer at top (ESP) is valid and readable memory\n\t\tif (VirtualQuery((void*)(top), &mbi, sizeof(mbi))\n\t\t\t&& (mbi.State & MEM_COMMIT)\n\t\t\t&& (mbi.Protect & (PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_READWRITE | PAGE_READONLY)) != 0)\n\t\t{\n\t\t\tbase = (uintptr_t)mbi.AllocationBase;          // Base of the stack (uncommited)\n\t\t\tbottom = GetStackBottom(base);                 // Bottom of the stack (commited)\n\n\t\t\t// Align the stack top (esp) in a 4 bytes boundary\n\t\t\tauto remainder = top % align;\n\t\t\tuintptr_t current = remainder ? top + (align - remainder) : top;\n\n\t\t\t// on x86 stack grows downward! (i.e. from bottom to base)\n\t\t\tfor (int n = 0; n < stackdump_max_words && current < bottom; ++n, current += align)\n\t\t\t\tPrintWord(current);\n\n\t\t\tNewLine();\n\t\t\tPrint(\"base: 0x%p   top: 0x%p   bottom: 0x%p\", base, top, bottom);\n\t\t\tNewLine();\n\t\t}\n\t}\n\tLeaveScope();\n}\n\n/*\n *  PrintBacktrace\n *      Prints a call backtrace into the logging buffer\n */\nvoid ExceptionTracer::PrintBacktrace()\n{\n\tStackTracer tracer(this->context);\n\n\tchar module_name[MAX_PATH];\n\tchar sym_buffer[sizeof(SYMBOL_INFO) + symbol_max];\n\n\tint backtrace_count = 0;        // Num of frames traced\n\tbool has_symbol_api = false;    // True if we have the symbol API available for use\n\tDWORD old_options;              // Saves old symbol API options\n\n\tSYMBOL_INFO& symbol = *(SYMBOL_INFO*)sym_buffer;\n\tsymbol.SizeOfStruct = sizeof(SYMBOL_INFO);\n\tsymbol.MaxNameLen = symbol_max;\n\n\t// Tries to get the symbol api\n\tif (SymInitialize(GetCurrentProcess(), 0, TRUE))\n\t{\n\t\thas_symbol_api = true;\n\t\told_options = SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES | SYMOPT_NO_PROMPTS | SYMOPT_FAIL_CRITICAL_ERRORS);\n\t}\n\n\tPrint(\"Backtrace (may be wrong):\");\n\tEnterScope();\n\t{\n\t\t// Walks on the stack until there's no frame to trace or we traced 'max_backtrace' frames\n\t\twhile (auto trace = tracer.Walk())\n\t\t{\n\t\t\tif (++backtrace_count >= max_backtrace)\n\t\t\t\tbreak;\n\n\t\t\tbool has_sym = false;   // This EIP has a symbol associated with it?\n\t\t\tDWORD64 displacement;   // EIP displacement relative to symbol\n\n\t\t\t// If we have access to the symbol api, try to get symbol name from pc (eip)\n\t\t\tif (has_symbol_api)\n\t\t\t\thas_sym = trace->pc ? !!SymFromAddr(GetCurrentProcess(), (DWORD64)trace->pc, &displacement, &symbol) : false;\n\n\t\t\t// Print everything up, this.... Ew, this looks awful!\n\t\t\tPrint(backtrace_count == 1 ? \"=>\" : \"  \");                          // First line should have '=>' to specify where it crashed\n\t\t\tPrint(\"0x%p \", trace->pc);                                          // Print EIP at frame\n\t\t\tif (has_sym) Print(\"%s+0x%x \", symbol.Name, (DWORD)displacement);   // Print frame func symbol\n\t\t\tPrint(\"in %s (+0x%x) \",                                             // Print module\n\t\t\t\ttrace->module ? FindModuleName(trace->module, module_name, sizeof(module_name)) : \"unknown\",\n\t\t\t\t(uintptr_t)(trace->pc) - (uintptr_t)(trace->module) // Module displacement\n\t\t\t);\n\t\t\tif (trace->frame) Print(\"(0x%p) \", trace->frame);                   // Print frame pointer\n\n\t\t\tNewLine();\n\t\t}\n\t}\n\tLeaveScope();\n\n\t// Cleanup the symbol api\n\tif (has_symbol_api)\n\t{\n\t\tSymSetOptions(old_options);\n\t\tSymCleanup(GetCurrentProcess());\n\t}\n}\n\n/*\n * GetExceptionCodeString\n *      Returns an description by an exception code\n */\nstatic const char* GetExceptionCodeString(unsigned int code)\n{\n\tswitch (code)\n\t{\n\tcase EXCEPTION_ACCESS_VIOLATION:         return \"Access violation\";\n\tcase EXCEPTION_ARRAY_BOUNDS_EXCEEDED:    return \"Array bounds exceeded\";\n\tcase EXCEPTION_BREAKPOINT:               return \"Breakpoint exception\";\n\tcase EXCEPTION_DATATYPE_MISALIGNMENT:    return \"Data type misalignment exception\";\n\tcase EXCEPTION_FLT_DENORMAL_OPERAND:     return \"Denormal float operand\";\n\tcase EXCEPTION_FLT_DIVIDE_BY_ZERO:       return \"Floating-point division by zero\";\n\tcase EXCEPTION_FLT_INEXACT_RESULT:       return \"Floating-point inexact result\";\n\tcase EXCEPTION_FLT_INVALID_OPERATION:    return \"Floating-point invalid operation\";\n\tcase EXCEPTION_FLT_OVERFLOW:             return \"Floating-point overflow\";\n\tcase EXCEPTION_FLT_STACK_CHECK:          return \"Floating-point stack check\";\n\tcase EXCEPTION_FLT_UNDERFLOW:            return \"Floating-point underflow\";\n\tcase EXCEPTION_ILLEGAL_INSTRUCTION:      return \"Illegal instruction.\";\n\tcase EXCEPTION_IN_PAGE_ERROR:            return \"In page error\";\n\tcase EXCEPTION_INT_DIVIDE_BY_ZERO:       return \"Integer division by zero\";\n\tcase EXCEPTION_INT_OVERFLOW:             return \"Integer overflow\";\n\tcase EXCEPTION_INVALID_DISPOSITION:      return \"Invalid disposition\";\n\tcase EXCEPTION_NONCONTINUABLE_EXCEPTION: return \"Non-continuable exception\";\n\tcase EXCEPTION_PRIV_INSTRUCTION:         return \"Privileged instruction\";\n\tcase EXCEPTION_SINGLE_STEP:              return \"Single step exception\";\n\tcase EXCEPTION_STACK_OVERFLOW:           return \"Stack overflow\";\n\tdefault:                                 return \"NO_DESCRIPTION\";\n\t}\n}\n\n/*\n * FindModuleName\n *      Finds module filename or \"unknown\"\n */\nstatic const char* FindModuleName(HMODULE module, char* output, DWORD maxsize)\n{\n\tif (GetModuleFileNameA(module, output, maxsize))\n\t{\n\t\t// Finds the filename part in the output string\n\t\tchar* filename = strrchr(output, '\\\\');\n\t\tif (!filename) filename = strrchr(output, '/');\n\n\t\t// If filename found (i.e. output isn't already a filename but full path), make output be filename\n\t\tif (filename)\n\t\t{\n\t\t\tsize_t size = strlen(++filename);\n\t\t\tmemmove(output, filename, size);\n\t\t\toutput[size] = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Unknown module\n\t\tstrcpy(output, \"unknown\");\n\t}\n\treturn output;\n}\n\n/*\n * GetModuleFromAddress\n *      Finds module handle from some address inside it\n */\nstatic HMODULE GetModuleFromAddress(LPVOID address)\n{\n\tHMODULE module;\n\tif (GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,\n\t\t(char*)address, &module))\n\t\treturn module;\n\treturn nullptr;\n}\n\n/*\n*  StackTracer\n*      Constructs the tracer, we basically need to initialize the symbol api\n*/\nStackTracer::StackTracer(const CONTEXT& context)\n{\n\t// Initialise basic values\n\tmemset(&this->frame, 0, sizeof(frame));\n\tmemcpy(&this->context, &context, sizeof(context));\n\n\t// Setup the initial frame context\n#if !_M_X64\n\tframe.AddrPC.Mode = AddrModeFlat;\n\tframe.AddrPC.Offset = context.Eip;\n\tframe.AddrFrame.Mode = AddrModeFlat;\n\tframe.AddrFrame.Offset = context.Ebp;\n\tframe.AddrStack.Mode = AddrModeFlat;\n\tframe.AddrStack.Offset = context.Esp;\n#else\n\tframe.AddrPC.Mode = AddrModeFlat;\n\tframe.AddrPC.Offset = context.Rip;\n\tframe.AddrFrame.Mode = AddrModeFlat;\n\tframe.AddrFrame.Offset = context.Rbp;\n\tframe.AddrStack.Mode = AddrModeFlat;\n\tframe.AddrStack.Offset = context.Rsp;\n#endif\n}\n\n/*\n *   StackTracer::Walk\n *      Walks on the stack, each walk is one frame of backtrace\n *      Returns a frame or null if the walk on the park is not possible anymore\n */\nStackTracer::Trace* StackTracer::Walk()\n{\n\tif (StackWalk64(IMAGE_FILE_MACHINE_I386, GetCurrentProcess(), GetCurrentThread(),\n\t\t&frame, &context, NULL, NULL, NULL, NULL))\n\t{\n\t\ttrace.module = GetModuleFromAddress((void*)frame.AddrPC.Offset);\n\t\ttrace.frame = (void*)frame.AddrFrame.Offset;\n\t\ttrace.stack = (void*)frame.AddrStack.Offset;\n\t\ttrace.pc = (void*)frame.AddrPC.Offset;\n\t\ttrace.ret = (void*)frame.AddrReturn.Offset;\n\t\treturn &trace;\n\t}\n\treturn nullptr;\n}"
  },
  {
    "path": "source-code/source/PD-Loader/framework.h",
    "content": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n#pragma once\n#include <string>\n#include <shlobj.h>\n#include <set>\n#include \"ModuleList.h\"\n#include <intrin.h>\n#pragma intrinsic(_ReturnAddress)\n\nstruct shared\n{\n\tFARPROC DllCanUnloadNow;\n\tFARPROC DllGetClassObject;\n\tFARPROC DllRegisterServer;\n\tFARPROC DllUnregisterServer;\n\tFARPROC DebugSetMute;\n\n\tvoid LoadOriginalLibrary(HMODULE dll)\n\t{\n\t\tDllCanUnloadNow = GetProcAddress(dll, \"DllCanUnloadNow\");\n\t\tDllGetClassObject = GetProcAddress(dll, \"DllGetClassObject\");\n\t\tDllRegisterServer = GetProcAddress(dll, \"DllRegisterServer\");\n\t\tDllUnregisterServer = GetProcAddress(dll, \"DllUnregisterServer\");\n\t\tDebugSetMute = GetProcAddress(dll, \"DebugSetMute\");\n\t}\n} shared;\n\nstruct dnsapi_dll\n{\n\tHMODULE dll;\n\n\t// generated using windows 7 dnsapi.dll\n\t// functions not in vista are commented out manually\n\t// needed windows 8+ have been manually added so they can be stubbed\n\tFARPROC BreakRecordsIntoBlob;\n\tFARPROC CombineRecordsInBlob;\n\tFARPROC DnsAcquireContextHandle_A;\n\tFARPROC DnsAcquireContextHandle_W;\n\tFARPROC DnsAllocateRecord;\n\tFARPROC DnsApiAlloc;\n\tFARPROC DnsApiAllocZero;\n\tFARPROC DnsApiFree;\n\tFARPROC DnsApiHeapReset;\n\tFARPROC DnsApiRealloc;\n\tFARPROC DnsApiSetDebugGlobals;\n\tFARPROC DnsAsyncRegisterHostAddrs;\n\tFARPROC DnsAsyncRegisterInit;\n\tFARPROC DnsAsyncRegisterTerm;\n\tFARPROC DnsCancelQuery;\n\tFARPROC DnsCopyStringEx;\n\tFARPROC DnsCreateReverseNameStringForIpAddress;\n\tFARPROC DnsCreateStandardDnsNameCopy;\n\tFARPROC DnsCreateStringCopy;\n\tFARPROC DnsDhcpRegisterAddrs;\n\tFARPROC DnsDhcpRegisterHostAddrs;\n\tFARPROC DnsDhcpRegisterInit;\n\tFARPROC DnsDhcpRegisterTerm;\n\tFARPROC DnsDhcpRemoveRegistrations;\n\tFARPROC DnsDhcpSrvRegisterHostAddr;\n\t//FARPROC DnsDhcpSrvRegisterHostAddrEx;\n\tFARPROC DnsDhcpSrvRegisterHostName;\n\t//FARPROC DnsDhcpSrvRegisterHostNameEx;\n\tFARPROC DnsDhcpSrvRegisterInit;\n\tFARPROC DnsDhcpSrvRegisterInitialize;\n\tFARPROC DnsDhcpSrvRegisterTerm;\n\tFARPROC DnsDowncaseDnsNameLabel;\n\tFARPROC DnsExtractRecordsFromMessage_UTF8;\n\tFARPROC DnsExtractRecordsFromMessage_W;\n\tFARPROC DnsFindAuthoritativeZone;\n\tFARPROC DnsFlushResolverCache;\n\tFARPROC DnsFlushResolverCacheEntry_A;\n\tFARPROC DnsFlushResolverCacheEntry_UTF8;\n\tFARPROC DnsFlushResolverCacheEntry_W;\n\tFARPROC DnsFree;\n\tFARPROC DnsFreeConfigStructure;\n\t//FARPROC DnsFreePolicyConfig;\n\t//FARPROC DnsFreeProxyName;\n\tFARPROC DnsGetBufferLengthForStringCopy;\n\tFARPROC DnsGetCacheDataTable;\n\tFARPROC DnsGetDnsServerList;\n\tFARPROC DnsGetDomainName;\n\tFARPROC DnsGetLastFailedUpdateInfo;\n\t//FARPROC DnsGetPolicyTableInfo;\n\t//FARPROC DnsGetPolicyTableInfoPrivate;\n\tFARPROC DnsGetPrimaryDomainName_A;\n\t//FARPROC DnsGetProxyInfoPrivate;\n\t//FARPROC DnsGetProxyInformation;\n\tFARPROC DnsGlobals;\n\tFARPROC DnsIpv6AddressToString;\n\tFARPROC DnsIpv6StringToAddress;\n\tFARPROC DnsIsAMailboxType;\n\tFARPROC DnsIsStatusRcode;\n\tFARPROC DnsIsStringCountValidForTextType;\n\tFARPROC DnsLogEvent;\n\tFARPROC DnsLogIn;\n\tFARPROC DnsLogInit;\n\tFARPROC DnsLogIt;\n\tFARPROC DnsLogOut;\n\tFARPROC DnsLogTime;\n\tFARPROC DnsMapRcodeToStatus;\n\tFARPROC DnsModifyRecordsInSet_A;\n\tFARPROC DnsModifyRecordsInSet_UTF8;\n\tFARPROC DnsModifyRecordsInSet_W;\n\tFARPROC DnsNameCompareEx_A;\n\tFARPROC DnsNameCompareEx_UTF8;\n\tFARPROC DnsNameCompareEx_W;\n\tFARPROC DnsNameCompare_A;\n\tFARPROC DnsNameCompare_UTF8;\n\tFARPROC DnsNameCompare_W;\n\tFARPROC DnsNameCopy;\n\tFARPROC DnsNameCopyAllocate;\n\tFARPROC DnsNetworkInfo_CreateFromFAZ;\n\tFARPROC DnsNetworkInformation_CreateFromFAZ;\n\tFARPROC DnsNotifyResolver;\n\tFARPROC DnsNotifyResolverClusterIp;\n\tFARPROC DnsNotifyResolverEx;\n\tFARPROC DnsQueryConfig;\n\tFARPROC DnsQueryConfigAllocEx;\n\tFARPROC DnsQueryConfigDword;\n\tFARPROC DnsQueryEx;\n\tFARPROC DnsQueryExA;\n\tFARPROC DnsQueryExUTF8;\n\tFARPROC DnsQueryExW;\n\tFARPROC DnsQuery_A;\n\tFARPROC DnsQuery_UTF8;\n\tFARPROC DnsQuery_W;\n\tFARPROC DnsRecordBuild_UTF8;\n\tFARPROC DnsRecordBuild_W;\n\tFARPROC DnsRecordCompare;\n\tFARPROC DnsRecordCopyEx;\n\tFARPROC DnsRecordListFree;\n\tFARPROC DnsRecordSetCompare;\n\tFARPROC DnsRecordSetCopyEx;\n\tFARPROC DnsRecordSetDetach;\n\tFARPROC DnsRecordStringForType;\n\tFARPROC DnsRecordStringForWritableType;\n\tFARPROC DnsRecordTypeForName;\n\tFARPROC DnsRegisterClusterAddress;\n\tFARPROC DnsReleaseContextHandle;\n\tFARPROC DnsRemoveRegistrations;\n\tFARPROC DnsReplaceRecordSetA;\n\tFARPROC DnsReplaceRecordSetUTF8;\n\tFARPROC DnsReplaceRecordSetW;\n\tFARPROC DnsResolverOp;\n\tFARPROC DnsScreenLocalAddrsForRegistration;\n\tFARPROC DnsSetConfigDword;\n\tFARPROC DnsStatusString;\n\tFARPROC DnsStringCopyAllocateEx;\n\t//FARPROC DnsTraceServerConfig;\n\tFARPROC DnsUnicodeToUtf8;\n\tFARPROC DnsUpdate;\n\t//FARPROC DnsUpdateMachinePresence;\n\tFARPROC DnsUpdateTest_A;\n\tFARPROC DnsUpdateTest_UTF8;\n\tFARPROC DnsUpdateTest_W;\n\tFARPROC DnsUtf8ToUnicode;\n\tFARPROC DnsValidateNameOrIp_TempW;\n\tFARPROC DnsValidateName_A;\n\tFARPROC DnsValidateName_UTF8;\n\tFARPROC DnsValidateName_W;\n\t//FARPROC DnsValidateServerArray_A; // available in vista sp2\n\t//FARPROC DnsValidateServerArray_W; // available in vista sp2\n\t//FARPROC DnsValidateServerStatus;\n\t//FARPROC DnsValidateServer_A; // available in vista sp2\n\t//FARPROC DnsValidateServer_W; // available in vista sp2\n\tFARPROC DnsValidateUtf8Byte;\n\tFARPROC DnsWriteQuestionToBuffer_UTF8;\n\tFARPROC DnsWriteQuestionToBuffer_W;\n\tFARPROC DnsWriteReverseNameStringForIpAddress;\n\tFARPROC Dns_AddRecordsToMessage;\n\tFARPROC Dns_AllocateMsgBuf;\n\tFARPROC Dns_BuildPacket;\n\tFARPROC Dns_CleanupWinsock;\n\tFARPROC Dns_CloseConnection;\n\tFARPROC Dns_CloseSocket;\n\tFARPROC Dns_CreateMulticastSocket;\n\tFARPROC Dns_CreateSocket;\n\tFARPROC Dns_CreateSocketEx;\n\tFARPROC Dns_ExtractRecordsFromMessage;\n\tFARPROC Dns_FindAuthoritativeZoneLib;\n\tFARPROC Dns_FreeMsgBuf;\n\tFARPROC Dns_GetRandomXid;\n\tFARPROC Dns_InitializeMsgBuf;\n\tFARPROC Dns_InitializeMsgRemoteSockaddr;\n\tFARPROC Dns_InitializeWinsock;\n\tFARPROC Dns_OpenTcpConnectionAndSend;\n\tFARPROC Dns_ParseMessage;\n\tFARPROC Dns_ParsePacketRecord;\n\tFARPROC Dns_PingAdapterServers;\n\tFARPROC Dns_ReadPacketName;\n\tFARPROC Dns_ReadPacketNameAllocate;\n\tFARPROC Dns_ReadRecordStructureFromPacket;\n\tFARPROC Dns_RecvTcp;\n\tFARPROC Dns_ResetNetworkInfo;\n\tFARPROC Dns_SendAndRecvUdp;\n\tFARPROC Dns_SendEx;\n\tFARPROC Dns_SetRecordDatalength;\n\tFARPROC Dns_SetRecordsSection;\n\tFARPROC Dns_SetRecordsTtl;\n\tFARPROC Dns_SkipPacketName;\n\tFARPROC Dns_SkipToRecord;\n\tFARPROC Dns_UpdateLib;\n\tFARPROC Dns_UpdateLibEx;\n\tFARPROC Dns_WriteDottedNameToPacket;\n\tFARPROC Dns_WriteQuestionToMessage;\n\tFARPROC Dns_WriteRecordStructureToPacketEx;\n\tFARPROC ExtraInfo_Init;\n\tFARPROC Faz_AreServerListsInSameNameSpace;\n\t//FARPROC FlushDnsPolicyUnreachableStatus;\n\tFARPROC GetCurrentTimeInSeconds;\n\tFARPROC HostsFile_Close;\n\tFARPROC HostsFile_Open;\n\tFARPROC HostsFile_ReadLine;\n\tFARPROC IpHelp_IsAddrOnLink;\n\tFARPROC Local_GetRecordsForLocalName;\n\tFARPROC Local_GetRecordsForLocalNameEx;\n\tFARPROC NetInfo_Build;\n\tFARPROC NetInfo_Clean;\n\tFARPROC NetInfo_Copy;\n\tFARPROC NetInfo_Free;\n\tFARPROC NetInfo_GetAdapterByAddress;\n\tFARPROC NetInfo_GetAdapterByInterfaceIndex;\n\tFARPROC NetInfo_GetAdapterByName;\n\tFARPROC NetInfo_IsAddrConfig;\n\tFARPROC NetInfo_IsForUpdate;\n\tFARPROC NetInfo_ResetServerPriorities;\n\t//FARPROC NetInfo_UpdateServerReachability;\n\tFARPROC QueryDirectEx;\n\tFARPROC Query_Main;\n\tFARPROC Reg_FreeUpdateInfo;\n\tFARPROC Reg_GetValueEx;\n\tFARPROC Reg_ReadGlobalsEx;\n\tFARPROC Reg_ReadUpdateInfo;\n\tFARPROC Security_ContextListTimeout;\n\tFARPROC Send_AndRecvUdpWithParam;\n\tFARPROC Send_MessagePrivate;\n\tFARPROC Send_OpenTcpConnectionAndSend;\n\tFARPROC Socket_CacheCleanup;\n\tFARPROC Socket_CacheInit;\n\tFARPROC Socket_CleanupWinsock;\n\tFARPROC Socket_ClearMessageSockets;\n\tFARPROC Socket_CloseEx;\n\tFARPROC Socket_CloseMessageSockets;\n\tFARPROC Socket_Create;\n\tFARPROC Socket_CreateMulticast;\n\tFARPROC Socket_InitWinsock;\n\tFARPROC Socket_JoinMulticast;\n\tFARPROC Socket_RecvFrom;\n\tFARPROC Socket_SetMulticastInterface;\n\tFARPROC Socket_SetMulticastLoopBack;\n\tFARPROC Socket_SetTtl;\n\tFARPROC Socket_TcpListen;\n\t//FARPROC Trace_Reset;\n\tFARPROC Update_ReplaceAddressRecordsW;\n\tFARPROC Util_IsIp6Running;\n\n\n\t// DnsQueryEx and DnsCancelQuery are only present on win 8+ so they need stubs for older versions\n\t// they both take pointers to structs as parameters\n\t// (three for DnsQueryEx and one for DnsCancelQuery)\n\t// fortunately they should fit in registers so the stack doesn't matter\n\tstatic LONG WINAPI DnsQueryExStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsCancelQueryStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\n\tvoid LoadOriginalLibrary(HMODULE module)\n\t{\n\t\tdll = module;\n\t\tshared.LoadOriginalLibrary(dll);\n\n\t\tBreakRecordsIntoBlob = GetProcAddress(dll, \"BreakRecordsIntoBlob\");\n\t\tCombineRecordsInBlob = GetProcAddress(dll, \"CombineRecordsInBlob\");\n\t\tDnsAcquireContextHandle_A = GetProcAddress(dll, \"DnsAcquireContextHandle_A\");\n\t\tDnsAcquireContextHandle_W = GetProcAddress(dll, \"DnsAcquireContextHandle_W\");\n\t\tDnsAllocateRecord = GetProcAddress(dll, \"DnsAllocateRecord\");\n\t\tDnsApiAlloc = GetProcAddress(dll, \"DnsApiAlloc\");\n\t\tDnsApiAllocZero = GetProcAddress(dll, \"DnsApiAllocZero\");\n\t\tDnsApiFree = GetProcAddress(dll, \"DnsApiFree\");\n\t\tDnsApiHeapReset = GetProcAddress(dll, \"DnsApiHeapReset\");\n\t\tDnsApiRealloc = GetProcAddress(dll, \"DnsApiRealloc\");\n\t\tDnsApiSetDebugGlobals = GetProcAddress(dll, \"DnsApiSetDebugGlobals\");\n\t\tDnsAsyncRegisterHostAddrs = GetProcAddress(dll, \"DnsAsyncRegisterHostAddrs\");\n\t\tDnsAsyncRegisterInit = GetProcAddress(dll, \"DnsAsyncRegisterInit\");\n\t\tDnsAsyncRegisterTerm = GetProcAddress(dll, \"DnsAsyncRegisterTerm\");\n\t\tDnsCancelQuery = GetProcAddress(dll, \"DnsCancelQuery\");\n\t\tDnsCopyStringEx = GetProcAddress(dll, \"DnsCopyStringEx\");\n\t\tDnsCreateReverseNameStringForIpAddress = GetProcAddress(dll, \"DnsCreateReverseNameStringForIpAddress\");\n\t\tDnsCreateStandardDnsNameCopy = GetProcAddress(dll, \"DnsCreateStandardDnsNameCopy\");\n\t\tDnsCreateStringCopy = GetProcAddress(dll, \"DnsCreateStringCopy\");\n\t\tDnsDhcpRegisterAddrs = GetProcAddress(dll, \"DnsDhcpRegisterAddrs\");\n\t\tDnsDhcpRegisterHostAddrs = GetProcAddress(dll, \"DnsDhcpRegisterHostAddrs\");\n\t\tDnsDhcpRegisterInit = GetProcAddress(dll, \"DnsDhcpRegisterInit\");\n\t\tDnsDhcpRegisterTerm = GetProcAddress(dll, \"DnsDhcpRegisterTerm\");\n\t\tDnsDhcpRemoveRegistrations = GetProcAddress(dll, \"DnsDhcpRemoveRegistrations\");\n\t\tDnsDhcpSrvRegisterHostAddr = GetProcAddress(dll, \"DnsDhcpSrvRegisterHostAddr\");\n\t\t//DnsDhcpSrvRegisterHostAddrEx = GetProcAddress(dll, \"DnsDhcpSrvRegisterHostAddrEx\");\n\t\tDnsDhcpSrvRegisterHostName = GetProcAddress(dll, \"DnsDhcpSrvRegisterHostName\");\n\t\t//DnsDhcpSrvRegisterHostNameEx = GetProcAddress(dll, \"DnsDhcpSrvRegisterHostNameEx\");\n\t\tDnsDhcpSrvRegisterInit = GetProcAddress(dll, \"DnsDhcpSrvRegisterInit\");\n\t\tDnsDhcpSrvRegisterInitialize = GetProcAddress(dll, \"DnsDhcpSrvRegisterInitialize\");\n\t\tDnsDhcpSrvRegisterTerm = GetProcAddress(dll, \"DnsDhcpSrvRegisterTerm\");\n\t\tDnsDowncaseDnsNameLabel = GetProcAddress(dll, \"DnsDowncaseDnsNameLabel\");\n\t\tDnsExtractRecordsFromMessage_UTF8 = GetProcAddress(dll, \"DnsExtractRecordsFromMessage_UTF8\");\n\t\tDnsExtractRecordsFromMessage_W = GetProcAddress(dll, \"DnsExtractRecordsFromMessage_W\");\n\t\tDnsFindAuthoritativeZone = GetProcAddress(dll, \"DnsFindAuthoritativeZone\");\n\t\tDnsFlushResolverCache = GetProcAddress(dll, \"DnsFlushResolverCache\");\n\t\tDnsFlushResolverCacheEntry_A = GetProcAddress(dll, \"DnsFlushResolverCacheEntry_A\");\n\t\tDnsFlushResolverCacheEntry_UTF8 = GetProcAddress(dll, \"DnsFlushResolverCacheEntry_UTF8\");\n\t\tDnsFlushResolverCacheEntry_W = GetProcAddress(dll, \"DnsFlushResolverCacheEntry_W\");\n\t\tDnsFree = GetProcAddress(dll, \"DnsFree\");\n\t\tDnsFreeConfigStructure = GetProcAddress(dll, \"DnsFreeConfigStructure\");\n\t\t//DnsFreePolicyConfig = GetProcAddress(dll, \"DnsFreePolicyConfig\");\n\t\t//DnsFreeProxyName = GetProcAddress(dll, \"DnsFreeProxyName\");\n\t\tDnsGetBufferLengthForStringCopy = GetProcAddress(dll, \"DnsGetBufferLengthForStringCopy\");\n\t\tDnsGetCacheDataTable = GetProcAddress(dll, \"DnsGetCacheDataTable\");\n\t\tDnsGetDnsServerList = GetProcAddress(dll, \"DnsGetDnsServerList\");\n\t\tDnsGetDomainName = GetProcAddress(dll, \"DnsGetDomainName\");\n\t\tDnsGetLastFailedUpdateInfo = GetProcAddress(dll, \"DnsGetLastFailedUpdateInfo\");\n\t\t//DnsGetPolicyTableInfo = GetProcAddress(dll, \"DnsGetPolicyTableInfo\");\n\t\t//DnsGetPolicyTableInfoPrivate = GetProcAddress(dll, \"DnsGetPolicyTableInfoPrivate\");\n\t\tDnsGetPrimaryDomainName_A = GetProcAddress(dll, \"DnsGetPrimaryDomainName_A\");\n\t\t//DnsGetProxyInfoPrivate = GetProcAddress(dll, \"DnsGetProxyInfoPrivate\");\n\t\t//DnsGetProxyInformation = GetProcAddress(dll, \"DnsGetProxyInformation\");\n\t\tDnsGlobals = GetProcAddress(dll, \"DnsGlobals\");\n\t\tDnsIpv6AddressToString = GetProcAddress(dll, \"DnsIpv6AddressToString\");\n\t\tDnsIpv6StringToAddress = GetProcAddress(dll, \"DnsIpv6StringToAddress\");\n\t\tDnsIsAMailboxType = GetProcAddress(dll, \"DnsIsAMailboxType\");\n\t\tDnsIsStatusRcode = GetProcAddress(dll, \"DnsIsStatusRcode\");\n\t\tDnsIsStringCountValidForTextType = GetProcAddress(dll, \"DnsIsStringCountValidForTextType\");\n\t\tDnsLogEvent = GetProcAddress(dll, \"DnsLogEvent\");\n\t\tDnsLogIn = GetProcAddress(dll, \"DnsLogIn\");\n\t\tDnsLogInit = GetProcAddress(dll, \"DnsLogInit\");\n\t\tDnsLogIt = GetProcAddress(dll, \"DnsLogIt\");\n\t\tDnsLogOut = GetProcAddress(dll, \"DnsLogOut\");\n\t\tDnsLogTime = GetProcAddress(dll, \"DnsLogTime\");\n\t\tDnsMapRcodeToStatus = GetProcAddress(dll, \"DnsMapRcodeToStatus\");\n\t\tDnsModifyRecordsInSet_A = GetProcAddress(dll, \"DnsModifyRecordsInSet_A\");\n\t\tDnsModifyRecordsInSet_UTF8 = GetProcAddress(dll, \"DnsModifyRecordsInSet_UTF8\");\n\t\tDnsModifyRecordsInSet_W = GetProcAddress(dll, \"DnsModifyRecordsInSet_W\");\n\t\tDnsNameCompareEx_A = GetProcAddress(dll, \"DnsNameCompareEx_A\");\n\t\tDnsNameCompareEx_UTF8 = GetProcAddress(dll, \"DnsNameCompareEx_UTF8\");\n\t\tDnsNameCompareEx_W = GetProcAddress(dll, \"DnsNameCompareEx_W\");\n\t\tDnsNameCompare_A = GetProcAddress(dll, \"DnsNameCompare_A\");\n\t\tDnsNameCompare_UTF8 = GetProcAddress(dll, \"DnsNameCompare_UTF8\");\n\t\tDnsNameCompare_W = GetProcAddress(dll, \"DnsNameCompare_W\");\n\t\tDnsNameCopy = GetProcAddress(dll, \"DnsNameCopy\");\n\t\tDnsNameCopyAllocate = GetProcAddress(dll, \"DnsNameCopyAllocate\");\n\t\tDnsNetworkInfo_CreateFromFAZ = GetProcAddress(dll, \"DnsNetworkInfo_CreateFromFAZ\");\n\t\tDnsNetworkInformation_CreateFromFAZ = GetProcAddress(dll, \"DnsNetworkInformation_CreateFromFAZ\");\n\t\tDnsNotifyResolver = GetProcAddress(dll, \"DnsNotifyResolver\");\n\t\tDnsNotifyResolverClusterIp = GetProcAddress(dll, \"DnsNotifyResolverClusterIp\");\n\t\tDnsNotifyResolverEx = GetProcAddress(dll, \"DnsNotifyResolverEx\");\n\t\tDnsQueryConfig = GetProcAddress(dll, \"DnsQueryConfig\");\n\t\tDnsQueryConfigAllocEx = GetProcAddress(dll, \"DnsQueryConfigAllocEx\");\n\t\tDnsQueryConfigDword = GetProcAddress(dll, \"DnsQueryConfigDword\");\n\t\tDnsQueryEx = GetProcAddress(dll, \"DnsQueryEx\");\n\t\tDnsQueryExA = GetProcAddress(dll, \"DnsQueryExA\");\n\t\tDnsQueryExUTF8 = GetProcAddress(dll, \"DnsQueryExUTF8\");\n\t\tDnsQueryExW = GetProcAddress(dll, \"DnsQueryExW\");\n\t\tDnsQuery_A = GetProcAddress(dll, \"DnsQuery_A\");\n\t\tDnsQuery_UTF8 = GetProcAddress(dll, \"DnsQuery_UTF8\");\n\t\tDnsQuery_W = GetProcAddress(dll, \"DnsQuery_W\");\n\t\tDnsRecordBuild_UTF8 = GetProcAddress(dll, \"DnsRecordBuild_UTF8\");\n\t\tDnsRecordBuild_W = GetProcAddress(dll, \"DnsRecordBuild_W\");\n\t\tDnsRecordCompare = GetProcAddress(dll, \"DnsRecordCompare\");\n\t\tDnsRecordCopyEx = GetProcAddress(dll, \"DnsRecordCopyEx\");\n\t\tDnsRecordListFree = GetProcAddress(dll, \"DnsRecordListFree\");\n\t\tDnsRecordSetCompare = GetProcAddress(dll, \"DnsRecordSetCompare\");\n\t\tDnsRecordSetCopyEx = GetProcAddress(dll, \"DnsRecordSetCopyEx\");\n\t\tDnsRecordSetDetach = GetProcAddress(dll, \"DnsRecordSetDetach\");\n\t\tDnsRecordStringForType = GetProcAddress(dll, \"DnsRecordStringForType\");\n\t\tDnsRecordStringForWritableType = GetProcAddress(dll, \"DnsRecordStringForWritableType\");\n\t\tDnsRecordTypeForName = GetProcAddress(dll, \"DnsRecordTypeForName\");\n\t\tDnsRegisterClusterAddress = GetProcAddress(dll, \"DnsRegisterClusterAddress\");\n\t\tDnsReleaseContextHandle = GetProcAddress(dll, \"DnsReleaseContextHandle\");\n\t\tDnsRemoveRegistrations = GetProcAddress(dll, \"DnsRemoveRegistrations\");\n\t\tDnsReplaceRecordSetA = GetProcAddress(dll, \"DnsReplaceRecordSetA\");\n\t\tDnsReplaceRecordSetUTF8 = GetProcAddress(dll, \"DnsReplaceRecordSetUTF8\");\n\t\tDnsReplaceRecordSetW = GetProcAddress(dll, \"DnsReplaceRecordSetW\");\n\t\tDnsResolverOp = GetProcAddress(dll, \"DnsResolverOp\");\n\t\tDnsScreenLocalAddrsForRegistration = GetProcAddress(dll, \"DnsScreenLocalAddrsForRegistration\");\n\t\tDnsSetConfigDword = GetProcAddress(dll, \"DnsSetConfigDword\");\n\t\tDnsStatusString = GetProcAddress(dll, \"DnsStatusString\");\n\t\tDnsStringCopyAllocateEx = GetProcAddress(dll, \"DnsStringCopyAllocateEx\");\n\t\t//DnsTraceServerConfig = GetProcAddress(dll, \"DnsTraceServerConfig\");\n\t\tDnsUnicodeToUtf8 = GetProcAddress(dll, \"DnsUnicodeToUtf8\");\n\t\tDnsUpdate = GetProcAddress(dll, \"DnsUpdate\");\n\t\t//DnsUpdateMachinePresence = GetProcAddress(dll, \"DnsUpdateMachinePresence\");\n\t\tDnsUpdateTest_A = GetProcAddress(dll, \"DnsUpdateTest_A\");\n\t\tDnsUpdateTest_UTF8 = GetProcAddress(dll, \"DnsUpdateTest_UTF8\");\n\t\tDnsUpdateTest_W = GetProcAddress(dll, \"DnsUpdateTest_W\");\n\t\tDnsUtf8ToUnicode = GetProcAddress(dll, \"DnsUtf8ToUnicode\");\n\t\tDnsValidateNameOrIp_TempW = GetProcAddress(dll, \"DnsValidateNameOrIp_TempW\");\n\t\tDnsValidateName_A = GetProcAddress(dll, \"DnsValidateName_A\");\n\t\tDnsValidateName_UTF8 = GetProcAddress(dll, \"DnsValidateName_UTF8\");\n\t\tDnsValidateName_W = GetProcAddress(dll, \"DnsValidateName_W\");\n\t\t//DnsValidateServerArray_A = GetProcAddress(dll, \"DnsValidateServerArray_A\");\n\t\t//DnsValidateServerArray_W = GetProcAddress(dll, \"DnsValidateServerArray_W\");\n\t\t//DnsValidateServerStatus = GetProcAddress(dll, \"DnsValidateServerStatus\");\n\t\t//DnsValidateServer_A = GetProcAddress(dll, \"DnsValidateServer_A\");\n\t\t//DnsValidateServer_W = GetProcAddress(dll, \"DnsValidateServer_W\");\n\t\tDnsValidateUtf8Byte = GetProcAddress(dll, \"DnsValidateUtf8Byte\");\n\t\tDnsWriteQuestionToBuffer_UTF8 = GetProcAddress(dll, \"DnsWriteQuestionToBuffer_UTF8\");\n\t\tDnsWriteQuestionToBuffer_W = GetProcAddress(dll, \"DnsWriteQuestionToBuffer_W\");\n\t\tDnsWriteReverseNameStringForIpAddress = GetProcAddress(dll, \"DnsWriteReverseNameStringForIpAddress\");\n\t\tDns_AddRecordsToMessage = GetProcAddress(dll, \"Dns_AddRecordsToMessage\");\n\t\tDns_AllocateMsgBuf = GetProcAddress(dll, \"Dns_AllocateMsgBuf\");\n\t\tDns_BuildPacket = GetProcAddress(dll, \"Dns_BuildPacket\");\n\t\tDns_CleanupWinsock = GetProcAddress(dll, \"Dns_CleanupWinsock\");\n\t\tDns_CloseConnection = GetProcAddress(dll, \"Dns_CloseConnection\");\n\t\tDns_CloseSocket = GetProcAddress(dll, \"Dns_CloseSocket\");\n\t\tDns_CreateMulticastSocket = GetProcAddress(dll, \"Dns_CreateMulticastSocket\");\n\t\tDns_CreateSocket = GetProcAddress(dll, \"Dns_CreateSocket\");\n\t\tDns_CreateSocketEx = GetProcAddress(dll, \"Dns_CreateSocketEx\");\n\t\tDns_ExtractRecordsFromMessage = GetProcAddress(dll, \"Dns_ExtractRecordsFromMessage\");\n\t\tDns_FindAuthoritativeZoneLib = GetProcAddress(dll, \"Dns_FindAuthoritativeZoneLib\");\n\t\tDns_FreeMsgBuf = GetProcAddress(dll, \"Dns_FreeMsgBuf\");\n\t\tDns_GetRandomXid = GetProcAddress(dll, \"Dns_GetRandomXid\");\n\t\tDns_InitializeMsgBuf = GetProcAddress(dll, \"Dns_InitializeMsgBuf\");\n\t\tDns_InitializeMsgRemoteSockaddr = GetProcAddress(dll, \"Dns_InitializeMsgRemoteSockaddr\");\n\t\tDns_InitializeWinsock = GetProcAddress(dll, \"Dns_InitializeWinsock\");\n\t\tDns_OpenTcpConnectionAndSend = GetProcAddress(dll, \"Dns_OpenTcpConnectionAndSend\");\n\t\tDns_ParseMessage = GetProcAddress(dll, \"Dns_ParseMessage\");\n\t\tDns_ParsePacketRecord = GetProcAddress(dll, \"Dns_ParsePacketRecord\");\n\t\tDns_PingAdapterServers = GetProcAddress(dll, \"Dns_PingAdapterServers\");\n\t\tDns_ReadPacketName = GetProcAddress(dll, \"Dns_ReadPacketName\");\n\t\tDns_ReadPacketNameAllocate = GetProcAddress(dll, \"Dns_ReadPacketNameAllocate\");\n\t\tDns_ReadRecordStructureFromPacket = GetProcAddress(dll, \"Dns_ReadRecordStructureFromPacket\");\n\t\tDns_RecvTcp = GetProcAddress(dll, \"Dns_RecvTcp\");\n\t\tDns_ResetNetworkInfo = GetProcAddress(dll, \"Dns_ResetNetworkInfo\");\n\t\tDns_SendAndRecvUdp = GetProcAddress(dll, \"Dns_SendAndRecvUdp\");\n\t\tDns_SendEx = GetProcAddress(dll, \"Dns_SendEx\");\n\t\tDns_SetRecordDatalength = GetProcAddress(dll, \"Dns_SetRecordDatalength\");\n\t\tDns_SetRecordsSection = GetProcAddress(dll, \"Dns_SetRecordsSection\");\n\t\tDns_SetRecordsTtl = GetProcAddress(dll, \"Dns_SetRecordsTtl\");\n\t\tDns_SkipPacketName = GetProcAddress(dll, \"Dns_SkipPacketName\");\n\t\tDns_SkipToRecord = GetProcAddress(dll, \"Dns_SkipToRecord\");\n\t\tDns_UpdateLib = GetProcAddress(dll, \"Dns_UpdateLib\");\n\t\tDns_UpdateLibEx = GetProcAddress(dll, \"Dns_UpdateLibEx\");\n\t\tDns_WriteDottedNameToPacket = GetProcAddress(dll, \"Dns_WriteDottedNameToPacket\");\n\t\tDns_WriteQuestionToMessage = GetProcAddress(dll, \"Dns_WriteQuestionToMessage\");\n\t\tDns_WriteRecordStructureToPacketEx = GetProcAddress(dll, \"Dns_WriteRecordStructureToPacketEx\");\n\t\tExtraInfo_Init = GetProcAddress(dll, \"ExtraInfo_Init\");\n\t\tFaz_AreServerListsInSameNameSpace = GetProcAddress(dll, \"Faz_AreServerListsInSameNameSpace\");\n\t\t//FlushDnsPolicyUnreachableStatus = GetProcAddress(dll, \"FlushDnsPolicyUnreachableStatus\");\n\t\tGetCurrentTimeInSeconds = GetProcAddress(dll, \"GetCurrentTimeInSeconds\");\n\t\tHostsFile_Close = GetProcAddress(dll, \"HostsFile_Close\");\n\t\tHostsFile_Open = GetProcAddress(dll, \"HostsFile_Open\");\n\t\tHostsFile_ReadLine = GetProcAddress(dll, \"HostsFile_ReadLine\");\n\t\tIpHelp_IsAddrOnLink = GetProcAddress(dll, \"IpHelp_IsAddrOnLink\");\n\t\tLocal_GetRecordsForLocalName = GetProcAddress(dll, \"Local_GetRecordsForLocalName\");\n\t\tLocal_GetRecordsForLocalNameEx = GetProcAddress(dll, \"Local_GetRecordsForLocalNameEx\");\n\t\tNetInfo_Build = GetProcAddress(dll, \"NetInfo_Build\");\n\t\tNetInfo_Clean = GetProcAddress(dll, \"NetInfo_Clean\");\n\t\tNetInfo_Copy = GetProcAddress(dll, \"NetInfo_Copy\");\n\t\tNetInfo_Free = GetProcAddress(dll, \"NetInfo_Free\");\n\t\tNetInfo_GetAdapterByAddress = GetProcAddress(dll, \"NetInfo_GetAdapterByAddress\");\n\t\tNetInfo_GetAdapterByInterfaceIndex = GetProcAddress(dll, \"NetInfo_GetAdapterByInterfaceIndex\");\n\t\tNetInfo_GetAdapterByName = GetProcAddress(dll, \"NetInfo_GetAdapterByName\");\n\t\tNetInfo_IsAddrConfig = GetProcAddress(dll, \"NetInfo_IsAddrConfig\");\n\t\tNetInfo_IsForUpdate = GetProcAddress(dll, \"NetInfo_IsForUpdate\");\n\t\tNetInfo_ResetServerPriorities = GetProcAddress(dll, \"NetInfo_ResetServerPriorities\");\n\t\t//NetInfo_UpdateServerReachability = GetProcAddress(dll, \"NetInfo_UpdateServerReachability\");\n\t\tQueryDirectEx = GetProcAddress(dll, \"QueryDirectEx\");\n\t\tQuery_Main = GetProcAddress(dll, \"Query_Main\");\n\t\tReg_FreeUpdateInfo = GetProcAddress(dll, \"Reg_FreeUpdateInfo\");\n\t\tReg_GetValueEx = GetProcAddress(dll, \"Reg_GetValueEx\");\n\t\tReg_ReadGlobalsEx = GetProcAddress(dll, \"Reg_ReadGlobalsEx\");\n\t\tReg_ReadUpdateInfo = GetProcAddress(dll, \"Reg_ReadUpdateInfo\");\n\t\tSecurity_ContextListTimeout = GetProcAddress(dll, \"Security_ContextListTimeout\");\n\t\tSend_AndRecvUdpWithParam = GetProcAddress(dll, \"Send_AndRecvUdpWithParam\");\n\t\tSend_MessagePrivate = GetProcAddress(dll, \"Send_MessagePrivate\");\n\t\tSend_OpenTcpConnectionAndSend = GetProcAddress(dll, \"Send_OpenTcpConnectionAndSend\");\n\t\tSocket_CacheCleanup = GetProcAddress(dll, \"Socket_CacheCleanup\");\n\t\tSocket_CacheInit = GetProcAddress(dll, \"Socket_CacheInit\");\n\t\tSocket_CleanupWinsock = GetProcAddress(dll, \"Socket_CleanupWinsock\");\n\t\tSocket_ClearMessageSockets = GetProcAddress(dll, \"Socket_ClearMessageSockets\");\n\t\tSocket_CloseEx = GetProcAddress(dll, \"Socket_CloseEx\");\n\t\tSocket_CloseMessageSockets = GetProcAddress(dll, \"Socket_CloseMessageSockets\");\n\t\tSocket_Create = GetProcAddress(dll, \"Socket_Create\");\n\t\tSocket_CreateMulticast = GetProcAddress(dll, \"Socket_CreateMulticast\");\n\t\tSocket_InitWinsock = GetProcAddress(dll, \"Socket_InitWinsock\");\n\t\tSocket_JoinMulticast = GetProcAddress(dll, \"Socket_JoinMulticast\");\n\t\tSocket_RecvFrom = GetProcAddress(dll, \"Socket_RecvFrom\");\n\t\tSocket_SetMulticastInterface = GetProcAddress(dll, \"Socket_SetMulticastInterface\");\n\t\tSocket_SetMulticastLoopBack = GetProcAddress(dll, \"Socket_SetMulticastLoopBack\");\n\t\tSocket_SetTtl = GetProcAddress(dll, \"Socket_SetTtl\");\n\t\tSocket_TcpListen = GetProcAddress(dll, \"Socket_TcpListen\");\n\t\t//Trace_Reset = GetProcAddress(dll, \"Trace_Reset\");\n\t\tUpdate_ReplaceAddressRecordsW = GetProcAddress(dll, \"Update_ReplaceAddressRecordsW\");\n\t\tUtil_IsIp6Running = GetProcAddress(dll, \"Util_IsIp6Running\");\n\n\n\t\t// if entry points aren't found, GetProcAddress should return null\n\t\tif (DnsQueryEx == NULL) { DnsQueryEx = (FARPROC)& DnsQueryExStub; };\n\t\tif (DnsCancelQuery == NULL) { DnsCancelQuery = (FARPROC)& DnsCancelQueryStub; };\n\t}\n} dnsapi;\n\nstruct dinput8_dll\n{\n\tHMODULE dll;\n\tFARPROC DirectInput8Create;\n\n\tvoid LoadOriginalLibrary(HMODULE module)\n\t{\n\t\tdll = module;\n\t\tshared.LoadOriginalLibrary(dll);\n\t\tDirectInput8Create = GetProcAddress(dll, \"DirectInput8Create\");\n\t}\n} dinput8;\n\n#pragma runtime_checks( \"\", off )\n\n#ifdef _DEBUG\n#pragma message (\"You are compiling the code in Debug - be warned that wrappers for export functions may not have correct code generated\")\n#endif\n\n// not sure if these all work -- there's a very real possibility some of these will need more full definitions to not break stack parameters\n// (see https://github.com/ThirteenAG/Ultimate-ASI-Loader/blob/master/source/dllmain.h#L2870 for reference)\nvoid _BreakRecordsIntoBlob() { dnsapi.BreakRecordsIntoBlob(); }\nvoid _CombineRecordsInBlob() { dnsapi.CombineRecordsInBlob(); }\nvoid _DnsAcquireContextHandle_A() { dnsapi.DnsAcquireContextHandle_A(); }\nvoid _DnsAcquireContextHandle_W() { dnsapi.DnsAcquireContextHandle_W(); }\nvoid _DnsAllocateRecord() { dnsapi.DnsAllocateRecord(); }\nvoid _DnsApiAlloc() { dnsapi.DnsApiAlloc(); }\nvoid _DnsApiAllocZero() { dnsapi.DnsApiAllocZero(); }\nvoid _DnsApiFree() { dnsapi.DnsApiFree(); }\nvoid _DnsApiHeapReset() { dnsapi.DnsApiHeapReset(); }\nvoid _DnsApiRealloc() { dnsapi.DnsApiRealloc(); }\nvoid _DnsApiSetDebugGlobals() { dnsapi.DnsApiSetDebugGlobals(); }\nvoid _DnsAsyncRegisterHostAddrs() { dnsapi.DnsAsyncRegisterHostAddrs(); }\nvoid _DnsAsyncRegisterInit() { dnsapi.DnsAsyncRegisterInit(); }\nvoid _DnsAsyncRegisterTerm() { dnsapi.DnsAsyncRegisterTerm(); }\nvoid _DnsCancelQuery() { dnsapi.DnsCancelQuery(); }\nvoid _DnsCopyStringEx() { dnsapi.DnsCopyStringEx(); }\nvoid _DnsCreateReverseNameStringForIpAddress() { dnsapi.DnsCreateReverseNameStringForIpAddress(); }\nvoid _DnsCreateStandardDnsNameCopy() { dnsapi.DnsCreateStandardDnsNameCopy(); }\nvoid _DnsCreateStringCopy() { dnsapi.DnsCreateStringCopy(); }\nvoid _DnsDhcpRegisterAddrs() { dnsapi.DnsDhcpRegisterAddrs(); }\nvoid _DnsDhcpRegisterHostAddrs() { dnsapi.DnsDhcpRegisterHostAddrs(); }\nvoid _DnsDhcpRegisterInit() { dnsapi.DnsDhcpRegisterInit(); }\nvoid _DnsDhcpRegisterTerm() { dnsapi.DnsDhcpRegisterTerm(); }\nvoid _DnsDhcpRemoveRegistrations() { dnsapi.DnsDhcpRemoveRegistrations(); }\nvoid _DnsDhcpSrvRegisterHostAddr() { dnsapi.DnsDhcpSrvRegisterHostAddr(); }\n//void _DnsDhcpSrvRegisterHostAddrEx() { dnsapi.DnsDhcpSrvRegisterHostAddrEx(); }\nvoid _DnsDhcpSrvRegisterHostName() { dnsapi.DnsDhcpSrvRegisterHostName(); }\n//void _DnsDhcpSrvRegisterHostNameEx() { dnsapi.DnsDhcpSrvRegisterHostNameEx(); }\nvoid _DnsDhcpSrvRegisterInit() { dnsapi.DnsDhcpSrvRegisterInit(); }\nvoid _DnsDhcpSrvRegisterInitialize() { dnsapi.DnsDhcpSrvRegisterInitialize(); }\nvoid _DnsDhcpSrvRegisterTerm() { dnsapi.DnsDhcpSrvRegisterTerm(); }\nvoid _DnsDowncaseDnsNameLabel() { dnsapi.DnsDowncaseDnsNameLabel(); }\nvoid _DnsExtractRecordsFromMessage_UTF8() { dnsapi.DnsExtractRecordsFromMessage_UTF8(); }\nvoid _DnsExtractRecordsFromMessage_W() { dnsapi.DnsExtractRecordsFromMessage_W(); }\nvoid _DnsFindAuthoritativeZone() { dnsapi.DnsFindAuthoritativeZone(); }\nvoid _DnsFlushResolverCache() { dnsapi.DnsFlushResolverCache(); }\nvoid _DnsFlushResolverCacheEntry_A() { dnsapi.DnsFlushResolverCacheEntry_A(); }\nvoid _DnsFlushResolverCacheEntry_UTF8() { dnsapi.DnsFlushResolverCacheEntry_UTF8(); }\nvoid _DnsFlushResolverCacheEntry_W() { dnsapi.DnsFlushResolverCacheEntry_W(); }\nvoid _DnsFree() { dnsapi.DnsFree(); }\nvoid _DnsFreeConfigStructure() { dnsapi.DnsFreeConfigStructure(); }\n//void _DnsFreePolicyConfig() { dnsapi.DnsFreePolicyConfig(); }\n//void _DnsFreeProxyName() { dnsapi.DnsFreeProxyName(); }\nvoid _DnsGetBufferLengthForStringCopy() { dnsapi.DnsGetBufferLengthForStringCopy(); }\nvoid _DnsGetCacheDataTable() { dnsapi.DnsGetCacheDataTable(); }\nvoid _DnsGetDnsServerList() { dnsapi.DnsGetDnsServerList(); }\nvoid _DnsGetDomainName() { dnsapi.DnsGetDomainName(); }\nvoid _DnsGetLastFailedUpdateInfo() { dnsapi.DnsGetLastFailedUpdateInfo(); }\n//void _DnsGetPolicyTableInfo() { dnsapi.DnsGetPolicyTableInfo(); }\n//void _DnsGetPolicyTableInfoPrivate() { dnsapi.DnsGetPolicyTableInfoPrivate(); }\nvoid _DnsGetPrimaryDomainName_A() { dnsapi.DnsGetPrimaryDomainName_A(); }\n//void _DnsGetProxyInfoPrivate() { dnsapi.DnsGetProxyInfoPrivate(); }\n//void _DnsGetProxyInformation() { dnsapi.DnsGetProxyInformation(); }\nvoid _DnsGlobals() { dnsapi.DnsGlobals(); }\nvoid _DnsIpv6AddressToString() { dnsapi.DnsIpv6AddressToString(); }\nvoid _DnsIpv6StringToAddress() { dnsapi.DnsIpv6StringToAddress(); }\nvoid _DnsIsAMailboxType() { dnsapi.DnsIsAMailboxType(); }\nvoid _DnsIsStatusRcode() { dnsapi.DnsIsStatusRcode(); }\nvoid _DnsIsStringCountValidForTextType() { dnsapi.DnsIsStringCountValidForTextType(); }\nvoid _DnsLogEvent() { dnsapi.DnsLogEvent(); }\nvoid _DnsLogIn() { dnsapi.DnsLogIn(); }\nvoid _DnsLogInit() { dnsapi.DnsLogInit(); }\nvoid _DnsLogIt() { dnsapi.DnsLogIt(); }\nvoid _DnsLogOut() { dnsapi.DnsLogOut(); }\nvoid _DnsLogTime() { dnsapi.DnsLogTime(); }\nvoid _DnsMapRcodeToStatus() { dnsapi.DnsMapRcodeToStatus(); }\nvoid _DnsModifyRecordsInSet_A() { dnsapi.DnsModifyRecordsInSet_A(); }\nvoid _DnsModifyRecordsInSet_UTF8() { dnsapi.DnsModifyRecordsInSet_UTF8(); }\nvoid _DnsModifyRecordsInSet_W() { dnsapi.DnsModifyRecordsInSet_W(); }\nvoid _DnsNameCompareEx_A() { dnsapi.DnsNameCompareEx_A(); }\nvoid _DnsNameCompareEx_UTF8() { dnsapi.DnsNameCompareEx_UTF8(); }\nvoid _DnsNameCompareEx_W() { dnsapi.DnsNameCompareEx_W(); }\nvoid _DnsNameCompare_A() { dnsapi.DnsNameCompare_A(); }\nvoid _DnsNameCompare_UTF8() { dnsapi.DnsNameCompare_UTF8(); }\nvoid _DnsNameCompare_W() { dnsapi.DnsNameCompare_W(); }\nvoid _DnsNameCopy() { dnsapi.DnsNameCopy(); }\nvoid _DnsNameCopyAllocate() { dnsapi.DnsNameCopyAllocate(); }\nvoid _DnsNetworkInfo_CreateFromFAZ() { dnsapi.DnsNetworkInfo_CreateFromFAZ(); }\nvoid _DnsNetworkInformation_CreateFromFAZ() { dnsapi.DnsNetworkInformation_CreateFromFAZ(); }\nvoid _DnsNotifyResolver() { dnsapi.DnsNotifyResolver(); }\nvoid _DnsNotifyResolverClusterIp() { dnsapi.DnsNotifyResolverClusterIp(); }\nvoid _DnsNotifyResolverEx() { dnsapi.DnsNotifyResolverEx(); }\nvoid _DnsQueryConfig() { dnsapi.DnsQueryConfig(); }\nvoid _DnsQueryConfigAllocEx() { dnsapi.DnsQueryConfigAllocEx(); }\nvoid _DnsQueryConfigDword() { dnsapi.DnsQueryConfigDword(); }\nvoid _DnsQueryEx() { dnsapi.DnsQueryEx(); }\nvoid _DnsQueryExA() { dnsapi.DnsQueryExA(); }\nvoid _DnsQueryExUTF8() { dnsapi.DnsQueryExUTF8(); }\nvoid _DnsQueryExW() { dnsapi.DnsQueryExW(); }\nvoid _DnsQuery_A() { dnsapi.DnsQuery_A(); }\nvoid _DnsQuery_UTF8() { dnsapi.DnsQuery_UTF8(); }\nvoid _DnsQuery_W() { dnsapi.DnsQuery_W(); }\nvoid _DnsRecordBuild_UTF8() { dnsapi.DnsRecordBuild_UTF8(); }\nvoid _DnsRecordBuild_W() { dnsapi.DnsRecordBuild_W(); }\nvoid _DnsRecordCompare() { dnsapi.DnsRecordCompare(); }\nvoid _DnsRecordCopyEx() { dnsapi.DnsRecordCopyEx(); }\nvoid _DnsRecordListFree() { dnsapi.DnsRecordListFree(); }\nvoid _DnsRecordSetCompare() { dnsapi.DnsRecordSetCompare(); }\nvoid _DnsRecordSetCopyEx() { dnsapi.DnsRecordSetCopyEx(); }\nvoid _DnsRecordSetDetach() { dnsapi.DnsRecordSetDetach(); }\nvoid _DnsRecordStringForType() { dnsapi.DnsRecordStringForType(); }\nvoid _DnsRecordStringForWritableType() { dnsapi.DnsRecordStringForWritableType(); }\nvoid _DnsRecordTypeForName() { dnsapi.DnsRecordTypeForName(); }\nvoid _DnsRegisterClusterAddress() { dnsapi.DnsRegisterClusterAddress(); }\nvoid _DnsReleaseContextHandle() { dnsapi.DnsReleaseContextHandle(); }\nvoid _DnsRemoveRegistrations() { dnsapi.DnsRemoveRegistrations(); }\nvoid _DnsReplaceRecordSetA() { dnsapi.DnsReplaceRecordSetA(); }\nvoid _DnsReplaceRecordSetUTF8() { dnsapi.DnsReplaceRecordSetUTF8(); }\nvoid _DnsReplaceRecordSetW() { dnsapi.DnsReplaceRecordSetW(); }\nvoid _DnsResolverOp() { dnsapi.DnsResolverOp(); }\nvoid _DnsScreenLocalAddrsForRegistration() { dnsapi.DnsScreenLocalAddrsForRegistration(); }\nvoid _DnsSetConfigDword() { dnsapi.DnsSetConfigDword(); }\nvoid _DnsStatusString() { dnsapi.DnsStatusString(); }\nvoid _DnsStringCopyAllocateEx() { dnsapi.DnsStringCopyAllocateEx(); }\n//void _DnsTraceServerConfig() { dnsapi.DnsTraceServerConfig(); }\nvoid _DnsUnicodeToUtf8() { dnsapi.DnsUnicodeToUtf8(); }\nvoid _DnsUpdate() { dnsapi.DnsUpdate(); }\n//void _DnsUpdateMachinePresence() { dnsapi.DnsUpdateMachinePresence(); }\nvoid _DnsUpdateTest_A() { dnsapi.DnsUpdateTest_A(); }\nvoid _DnsUpdateTest_UTF8() { dnsapi.DnsUpdateTest_UTF8(); }\nvoid _DnsUpdateTest_W() { dnsapi.DnsUpdateTest_W(); }\nvoid _DnsUtf8ToUnicode() { dnsapi.DnsUtf8ToUnicode(); }\nvoid _DnsValidateNameOrIp_TempW() { dnsapi.DnsValidateNameOrIp_TempW(); }\nvoid _DnsValidateName_A() { dnsapi.DnsValidateName_A(); }\nvoid _DnsValidateName_UTF8() { dnsapi.DnsValidateName_UTF8(); }\nvoid _DnsValidateName_W() { dnsapi.DnsValidateName_W(); }\n//void _DnsValidateServerArray_A() { dnsapi.DnsValidateServerArray_A(); }\n//void _DnsValidateServerArray_W() { dnsapi.DnsValidateServerArray_W(); }\n//void _DnsValidateServerStatus() { dnsapi.DnsValidateServerStatus(); }\n//void _DnsValidateServer_A() { dnsapi.DnsValidateServer_A(); }\n//void _DnsValidateServer_W() { dnsapi.DnsValidateServer_W(); }\nvoid _DnsValidateUtf8Byte() { dnsapi.DnsValidateUtf8Byte(); }\nvoid _DnsWriteQuestionToBuffer_UTF8() { dnsapi.DnsWriteQuestionToBuffer_UTF8(); }\nvoid _DnsWriteQuestionToBuffer_W() { dnsapi.DnsWriteQuestionToBuffer_W(); }\nvoid _DnsWriteReverseNameStringForIpAddress() { dnsapi.DnsWriteReverseNameStringForIpAddress(); }\nvoid _Dns_AddRecordsToMessage() { dnsapi.Dns_AddRecordsToMessage(); }\nvoid _Dns_AllocateMsgBuf() { dnsapi.Dns_AllocateMsgBuf(); }\nvoid _Dns_BuildPacket() { dnsapi.Dns_BuildPacket(); }\nvoid _Dns_CleanupWinsock() { dnsapi.Dns_CleanupWinsock(); }\nvoid _Dns_CloseConnection() { dnsapi.Dns_CloseConnection(); }\nvoid _Dns_CloseSocket() { dnsapi.Dns_CloseSocket(); }\nvoid _Dns_CreateMulticastSocket() { dnsapi.Dns_CreateMulticastSocket(); }\nvoid _Dns_CreateSocket() { dnsapi.Dns_CreateSocket(); }\nvoid _Dns_CreateSocketEx() { dnsapi.Dns_CreateSocketEx(); }\nvoid _Dns_ExtractRecordsFromMessage() { dnsapi.Dns_ExtractRecordsFromMessage(); }\nvoid _Dns_FindAuthoritativeZoneLib() { dnsapi.Dns_FindAuthoritativeZoneLib(); }\nvoid _Dns_FreeMsgBuf() { dnsapi.Dns_FreeMsgBuf(); }\nvoid _Dns_GetRandomXid() { dnsapi.Dns_GetRandomXid(); }\nvoid _Dns_InitializeMsgBuf() { dnsapi.Dns_InitializeMsgBuf(); }\nvoid _Dns_InitializeMsgRemoteSockaddr() { dnsapi.Dns_InitializeMsgRemoteSockaddr(); }\nvoid _Dns_InitializeWinsock() { dnsapi.Dns_InitializeWinsock(); }\nvoid _Dns_OpenTcpConnectionAndSend() { dnsapi.Dns_OpenTcpConnectionAndSend(); }\nvoid _Dns_ParseMessage() { dnsapi.Dns_ParseMessage(); }\nvoid _Dns_ParsePacketRecord() { dnsapi.Dns_ParsePacketRecord(); }\nvoid _Dns_PingAdapterServers() { dnsapi.Dns_PingAdapterServers(); }\nvoid _Dns_ReadPacketName() { dnsapi.Dns_ReadPacketName(); }\nvoid _Dns_ReadPacketNameAllocate() { dnsapi.Dns_ReadPacketNameAllocate(); }\nvoid _Dns_ReadRecordStructureFromPacket() { dnsapi.Dns_ReadRecordStructureFromPacket(); }\nvoid _Dns_RecvTcp() { dnsapi.Dns_RecvTcp(); }\nvoid _Dns_ResetNetworkInfo() { dnsapi.Dns_ResetNetworkInfo(); }\nvoid _Dns_SendAndRecvUdp() { dnsapi.Dns_SendAndRecvUdp(); }\nvoid _Dns_SendEx() { dnsapi.Dns_SendEx(); }\nvoid _Dns_SetRecordDatalength() { dnsapi.Dns_SetRecordDatalength(); }\nvoid _Dns_SetRecordsSection() { dnsapi.Dns_SetRecordsSection(); }\nvoid _Dns_SetRecordsTtl() { dnsapi.Dns_SetRecordsTtl(); }\nvoid _Dns_SkipPacketName() { dnsapi.Dns_SkipPacketName(); }\nvoid _Dns_SkipToRecord() { dnsapi.Dns_SkipToRecord(); }\nvoid _Dns_UpdateLib() { dnsapi.Dns_UpdateLib(); }\nvoid _Dns_UpdateLibEx() { dnsapi.Dns_UpdateLibEx(); }\nvoid _Dns_WriteDottedNameToPacket() { dnsapi.Dns_WriteDottedNameToPacket(); }\nvoid _Dns_WriteQuestionToMessage() { dnsapi.Dns_WriteQuestionToMessage(); }\nvoid _Dns_WriteRecordStructureToPacketEx() { dnsapi.Dns_WriteRecordStructureToPacketEx(); }\nvoid _ExtraInfo_Init() { dnsapi.ExtraInfo_Init(); }\nvoid _Faz_AreServerListsInSameNameSpace() { dnsapi.Faz_AreServerListsInSameNameSpace(); }\n//void _FlushDnsPolicyUnreachableStatus() { dnsapi.FlushDnsPolicyUnreachableStatus(); }\nvoid _GetCurrentTimeInSeconds() { dnsapi.GetCurrentTimeInSeconds(); }\nvoid _HostsFile_Close() { dnsapi.HostsFile_Close(); }\nvoid _HostsFile_Open() { dnsapi.HostsFile_Open(); }\nvoid _HostsFile_ReadLine() { dnsapi.HostsFile_ReadLine(); }\nvoid _IpHelp_IsAddrOnLink() { dnsapi.IpHelp_IsAddrOnLink(); }\nvoid _Local_GetRecordsForLocalName() { dnsapi.Local_GetRecordsForLocalName(); }\nvoid _Local_GetRecordsForLocalNameEx() { dnsapi.Local_GetRecordsForLocalNameEx(); }\nvoid _NetInfo_Build() { dnsapi.NetInfo_Build(); }\nvoid _NetInfo_Clean() { dnsapi.NetInfo_Clean(); }\nvoid _NetInfo_Copy() { dnsapi.NetInfo_Copy(); }\nvoid _NetInfo_Free() { dnsapi.NetInfo_Free(); }\nvoid _NetInfo_GetAdapterByAddress() { dnsapi.NetInfo_GetAdapterByAddress(); }\nvoid _NetInfo_GetAdapterByInterfaceIndex() { dnsapi.NetInfo_GetAdapterByInterfaceIndex(); }\nvoid _NetInfo_GetAdapterByName() { dnsapi.NetInfo_GetAdapterByName(); }\nvoid _NetInfo_IsAddrConfig() { dnsapi.NetInfo_IsAddrConfig(); }\nvoid _NetInfo_IsForUpdate() { dnsapi.NetInfo_IsForUpdate(); }\nvoid _NetInfo_ResetServerPriorities() { dnsapi.NetInfo_ResetServerPriorities(); }\n//void _NetInfo_UpdateServerReachability() { dnsapi.NetInfo_UpdateServerReachability(); }\nvoid _QueryDirectEx() { dnsapi.QueryDirectEx(); }\nvoid _Query_Main() { dnsapi.Query_Main(); }\nvoid _Reg_FreeUpdateInfo() { dnsapi.Reg_FreeUpdateInfo(); }\nvoid _Reg_GetValueEx() { dnsapi.Reg_GetValueEx(); }\nvoid _Reg_ReadGlobalsEx() { dnsapi.Reg_ReadGlobalsEx(); }\nvoid _Reg_ReadUpdateInfo() { dnsapi.Reg_ReadUpdateInfo(); }\nvoid _Security_ContextListTimeout() { dnsapi.Security_ContextListTimeout(); }\nvoid _Send_AndRecvUdpWithParam() { dnsapi.Send_AndRecvUdpWithParam(); }\nvoid _Send_MessagePrivate() { dnsapi.Send_MessagePrivate(); }\nvoid _Send_OpenTcpConnectionAndSend() { dnsapi.Send_OpenTcpConnectionAndSend(); }\nvoid _Socket_CacheCleanup() { dnsapi.Socket_CacheCleanup(); }\nvoid _Socket_CacheInit() { dnsapi.Socket_CacheInit(); }\nvoid _Socket_CleanupWinsock() { dnsapi.Socket_CleanupWinsock(); }\nvoid _Socket_ClearMessageSockets() { dnsapi.Socket_ClearMessageSockets(); }\nvoid _Socket_CloseEx() { dnsapi.Socket_CloseEx(); }\nvoid _Socket_CloseMessageSockets() { dnsapi.Socket_CloseMessageSockets(); }\nvoid _Socket_Create() { dnsapi.Socket_Create(); }\nvoid _Socket_CreateMulticast() { dnsapi.Socket_CreateMulticast(); }\nvoid _Socket_InitWinsock() { dnsapi.Socket_InitWinsock(); }\nvoid _Socket_JoinMulticast() { dnsapi.Socket_JoinMulticast(); }\nvoid _Socket_RecvFrom() { dnsapi.Socket_RecvFrom(); }\nvoid _Socket_SetMulticastInterface() { dnsapi.Socket_SetMulticastInterface(); }\nvoid _Socket_SetMulticastLoopBack() { dnsapi.Socket_SetMulticastLoopBack(); }\nvoid _Socket_SetTtl() { dnsapi.Socket_SetTtl(); }\nvoid _Socket_TcpListen() { dnsapi.Socket_TcpListen(); }\n//void _Trace_Reset() { dnsapi.Trace_Reset(); }\nvoid _Update_ReplaceAddressRecordsW() { dnsapi.Update_ReplaceAddressRecordsW(); }\nvoid _Util_IsIp6Running() { dnsapi.Util_IsIp6Running(); }\n\ntypedef HRESULT(*fn_DirectInput8Create)(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID* ppvOut, LPUNKNOWN punkOuter);\nvoid _DirectInput8Create() { (fn_DirectInput8Create)dinput8.DirectInput8Create(); }\n\nvoid _DllRegisterServer() { shared.DllRegisterServer(); }\nvoid _DllUnregisterServer() { shared.DllUnregisterServer(); }\nvoid _DllCanUnloadNow() { shared.DllCanUnloadNow(); }\nvoid _DllGetClassObject() { shared.DllGetClassObject(); }\n\n#pragma runtime_checks( \"\", restore )"
  },
  {
    "path": "source-code/source/PD-Loader/x64.def",
    "content": "LIBRARY \"dinput8\"\nEXPORTS\nDirectInput8Create = _DirectInput8Create\nDllCanUnloadNow = _DllCanUnloadNow PRIVATE\nDllGetClassObject = _DllGetClassObject PRIVATE\nDllRegisterServer = _DllRegisterServer PRIVATE\nDllUnregisterServer = _DllUnregisterServer PRIVATE\n\nLIBRARY \"dnsapi\"\nEXPORTS\nBreakRecordsIntoBlob = _BreakRecordsIntoBlob\nCombineRecordsInBlob = _CombineRecordsInBlob\nDnsAcquireContextHandle_A = _DnsAcquireContextHandle_A\nDnsAcquireContextHandle_W = _DnsAcquireContextHandle_W\nDnsAllocateRecord = _DnsAllocateRecord\nDnsApiAlloc = _DnsApiAlloc\nDnsApiAllocZero = _DnsApiAllocZero\nDnsApiFree = _DnsApiFree\nDnsApiHeapReset = _DnsApiHeapReset\nDnsApiRealloc = _DnsApiRealloc\nDnsApiSetDebugGlobals = _DnsApiSetDebugGlobals\nDnsAsyncRegisterHostAddrs = _DnsAsyncRegisterHostAddrs\nDnsAsyncRegisterInit = _DnsAsyncRegisterInit\nDnsAsyncRegisterTerm = _DnsAsyncRegisterTerm\nDnsCancelQuery = _DnsCancelQuery\nDnsCopyStringEx = _DnsCopyStringEx\nDnsCreateReverseNameStringForIpAddress = _DnsCreateReverseNameStringForIpAddress\nDnsCreateStandardDnsNameCopy = _DnsCreateStandardDnsNameCopy\nDnsCreateStringCopy = _DnsCreateStringCopy\nDnsDhcpRegisterAddrs = _DnsDhcpRegisterAddrs\nDnsDhcpRegisterHostAddrs = _DnsDhcpRegisterHostAddrs\nDnsDhcpRegisterInit = _DnsDhcpRegisterInit\nDnsDhcpRegisterTerm = _DnsDhcpRegisterTerm\nDnsDhcpRemoveRegistrations = _DnsDhcpRemoveRegistrations\nDnsDhcpSrvRegisterHostAddr = _DnsDhcpSrvRegisterHostAddr\n;DnsDhcpSrvRegisterHostAddrEx = _DnsDhcpSrvRegisterHostAddrEx\nDnsDhcpSrvRegisterHostName = _DnsDhcpSrvRegisterHostName\n;DnsDhcpSrvRegisterHostNameEx = _DnsDhcpSrvRegisterHostNameEx\nDnsDhcpSrvRegisterInit = _DnsDhcpSrvRegisterInit\nDnsDhcpSrvRegisterInitialize = _DnsDhcpSrvRegisterInitialize\nDnsDhcpSrvRegisterTerm = _DnsDhcpSrvRegisterTerm\nDnsDowncaseDnsNameLabel = _DnsDowncaseDnsNameLabel\nDnsExtractRecordsFromMessage_UTF8 = _DnsExtractRecordsFromMessage_UTF8\nDnsExtractRecordsFromMessage_W = _DnsExtractRecordsFromMessage_W\nDnsFindAuthoritativeZone = _DnsFindAuthoritativeZone\nDnsFlushResolverCache = _DnsFlushResolverCache\nDnsFlushResolverCacheEntry_A = _DnsFlushResolverCacheEntry_A\nDnsFlushResolverCacheEntry_UTF8 = _DnsFlushResolverCacheEntry_UTF8\nDnsFlushResolverCacheEntry_W = _DnsFlushResolverCacheEntry_W\nDnsFree = _DnsFree\nDnsFreeConfigStructure = _DnsFreeConfigStructure\n;DnsFreePolicyConfig = _DnsFreePolicyConfig\n;DnsFreeProxyName = _DnsFreeProxyName\nDnsGetBufferLengthForStringCopy = _DnsGetBufferLengthForStringCopy\nDnsGetCacheDataTable = _DnsGetCacheDataTable\nDnsGetDnsServerList = _DnsGetDnsServerList\nDnsGetDomainName = _DnsGetDomainName\nDnsGetLastFailedUpdateInfo = _DnsGetLastFailedUpdateInfo\n;DnsGetPolicyTableInfo = _DnsGetPolicyTableInfo\n;DnsGetPolicyTableInfoPrivate = _DnsGetPolicyTableInfoPrivate\nDnsGetPrimaryDomainName_A = _DnsGetPrimaryDomainName_A\n;DnsGetProxyInfoPrivate = _DnsGetProxyInfoPrivate\n;DnsGetProxyInformation = _DnsGetProxyInformation\nDnsGlobals = _DnsGlobals\nDnsIpv6AddressToString = _DnsIpv6AddressToString\nDnsIpv6StringToAddress = _DnsIpv6StringToAddress\nDnsIsAMailboxType = _DnsIsAMailboxType\nDnsIsStatusRcode = _DnsIsStatusRcode\nDnsIsStringCountValidForTextType = _DnsIsStringCountValidForTextType\nDnsLogEvent = _DnsLogEvent\nDnsLogIn = _DnsLogIn\nDnsLogInit = _DnsLogInit\nDnsLogIt = _DnsLogIt\nDnsLogOut = _DnsLogOut\nDnsLogTime = _DnsLogTime\nDnsMapRcodeToStatus = _DnsMapRcodeToStatus\nDnsModifyRecordsInSet_A = _DnsModifyRecordsInSet_A\nDnsModifyRecordsInSet_UTF8 = _DnsModifyRecordsInSet_UTF8\nDnsModifyRecordsInSet_W = _DnsModifyRecordsInSet_W\nDnsNameCompareEx_A = _DnsNameCompareEx_A\nDnsNameCompareEx_UTF8 = _DnsNameCompareEx_UTF8\nDnsNameCompareEx_W = _DnsNameCompareEx_W\nDnsNameCompare_A = _DnsNameCompare_A\nDnsNameCompare_UTF8 = _DnsNameCompare_UTF8\nDnsNameCompare_W = _DnsNameCompare_W\nDnsNameCopy = _DnsNameCopy\nDnsNameCopyAllocate = _DnsNameCopyAllocate\nDnsNetworkInfo_CreateFromFAZ = _DnsNetworkInfo_CreateFromFAZ\nDnsNetworkInformation_CreateFromFAZ = _DnsNetworkInformation_CreateFromFAZ\nDnsNotifyResolver = _DnsNotifyResolver\nDnsNotifyResolverClusterIp = _DnsNotifyResolverClusterIp\nDnsNotifyResolverEx = _DnsNotifyResolverEx\nDnsQueryConfig = _DnsQueryConfig\nDnsQueryConfigAllocEx = _DnsQueryConfigAllocEx\nDnsQueryConfigDword = _DnsQueryConfigDword\nDnsQueryEx = _DnsQueryEx\nDnsQueryExA = _DnsQueryExA\nDnsQueryExUTF8 = _DnsQueryExUTF8\nDnsQueryExW = _DnsQueryExW\nDnsQuery_A = _DnsQuery_A\nDnsQuery_UTF8 = _DnsQuery_UTF8\nDnsQuery_W = _DnsQuery_W\nDnsRecordBuild_UTF8 = _DnsRecordBuild_UTF8\nDnsRecordBuild_W = _DnsRecordBuild_W\nDnsRecordCompare = _DnsRecordCompare\nDnsRecordCopyEx = _DnsRecordCopyEx\nDnsRecordListFree = _DnsRecordListFree\nDnsRecordSetCompare = _DnsRecordSetCompare\nDnsRecordSetCopyEx = _DnsRecordSetCopyEx\nDnsRecordSetDetach = _DnsRecordSetDetach\nDnsRecordStringForType = _DnsRecordStringForType\nDnsRecordStringForWritableType = _DnsRecordStringForWritableType\nDnsRecordTypeForName = _DnsRecordTypeForName\nDnsRegisterClusterAddress = _DnsRegisterClusterAddress\nDnsReleaseContextHandle = _DnsReleaseContextHandle\nDnsRemoveRegistrations = _DnsRemoveRegistrations\nDnsReplaceRecordSetA = _DnsReplaceRecordSetA\nDnsReplaceRecordSetUTF8 = _DnsReplaceRecordSetUTF8\nDnsReplaceRecordSetW = _DnsReplaceRecordSetW\nDnsResolverOp = _DnsResolverOp\nDnsScreenLocalAddrsForRegistration = _DnsScreenLocalAddrsForRegistration\nDnsSetConfigDword = _DnsSetConfigDword\nDnsStatusString = _DnsStatusString\nDnsStringCopyAllocateEx = _DnsStringCopyAllocateEx\n;DnsTraceServerConfig = _DnsTraceServerConfig\nDnsUnicodeToUtf8 = _DnsUnicodeToUtf8\nDnsUpdate = _DnsUpdate\n;DnsUpdateMachinePresence = _DnsUpdateMachinePresence\nDnsUpdateTest_A = _DnsUpdateTest_A\nDnsUpdateTest_UTF8 = _DnsUpdateTest_UTF8\nDnsUpdateTest_W = _DnsUpdateTest_W\nDnsUtf8ToUnicode = _DnsUtf8ToUnicode\nDnsValidateNameOrIp_TempW = _DnsValidateNameOrIp_TempW\nDnsValidateName_A = _DnsValidateName_A\nDnsValidateName_UTF8 = _DnsValidateName_UTF8\nDnsValidateName_W = _DnsValidateName_W\n;DnsValidateServerArray_A = _DnsValidateServerArray_A\n;DnsValidateServerArray_W = _DnsValidateServerArray_W\n;DnsValidateServerStatus = _DnsValidateServerStatus\n;DnsValidateServer_A = _DnsValidateServer_A\n;DnsValidateServer_W = _DnsValidateServer_W\nDnsValidateUtf8Byte = _DnsValidateUtf8Byte\nDnsWriteQuestionToBuffer_UTF8 = _DnsWriteQuestionToBuffer_UTF8\nDnsWriteQuestionToBuffer_W = _DnsWriteQuestionToBuffer_W\nDnsWriteReverseNameStringForIpAddress = _DnsWriteReverseNameStringForIpAddress\nDns_AddRecordsToMessage = _Dns_AddRecordsToMessage\nDns_AllocateMsgBuf = _Dns_AllocateMsgBuf\nDns_BuildPacket = _Dns_BuildPacket\nDns_CleanupWinsock = _Dns_CleanupWinsock\nDns_CloseConnection = _Dns_CloseConnection\nDns_CloseSocket = _Dns_CloseSocket\nDns_CreateMulticastSocket = _Dns_CreateMulticastSocket\nDns_CreateSocket = _Dns_CreateSocket\nDns_CreateSocketEx = _Dns_CreateSocketEx\nDns_ExtractRecordsFromMessage = _Dns_ExtractRecordsFromMessage\nDns_FindAuthoritativeZoneLib = _Dns_FindAuthoritativeZoneLib\nDns_FreeMsgBuf = _Dns_FreeMsgBuf\nDns_GetRandomXid = _Dns_GetRandomXid\nDns_InitializeMsgBuf = _Dns_InitializeMsgBuf\nDns_InitializeMsgRemoteSockaddr = _Dns_InitializeMsgRemoteSockaddr\nDns_InitializeWinsock = _Dns_InitializeWinsock\nDns_OpenTcpConnectionAndSend = _Dns_OpenTcpConnectionAndSend\nDns_ParseMessage = _Dns_ParseMessage\nDns_ParsePacketRecord = _Dns_ParsePacketRecord\nDns_PingAdapterServers = _Dns_PingAdapterServers\nDns_ReadPacketName = _Dns_ReadPacketName\nDns_ReadPacketNameAllocate = _Dns_ReadPacketNameAllocate\nDns_ReadRecordStructureFromPacket = _Dns_ReadRecordStructureFromPacket\nDns_RecvTcp = _Dns_RecvTcp\nDns_ResetNetworkInfo = _Dns_ResetNetworkInfo\nDns_SendAndRecvUdp = _Dns_SendAndRecvUdp\nDns_SendEx = _Dns_SendEx\nDns_SetRecordDatalength = _Dns_SetRecordDatalength\nDns_SetRecordsSection = _Dns_SetRecordsSection\nDns_SetRecordsTtl = _Dns_SetRecordsTtl\nDns_SkipPacketName = _Dns_SkipPacketName\nDns_SkipToRecord = _Dns_SkipToRecord\nDns_UpdateLib = _Dns_UpdateLib\nDns_UpdateLibEx = _Dns_UpdateLibEx\nDns_WriteDottedNameToPacket = _Dns_WriteDottedNameToPacket\nDns_WriteQuestionToMessage = _Dns_WriteQuestionToMessage\nDns_WriteRecordStructureToPacketEx = _Dns_WriteRecordStructureToPacketEx\nExtraInfo_Init = _ExtraInfo_Init\nFaz_AreServerListsInSameNameSpace = _Faz_AreServerListsInSameNameSpace\n;FlushDnsPolicyUnreachableStatus = _FlushDnsPolicyUnreachableStatus\nGetCurrentTimeInSeconds = _GetCurrentTimeInSeconds\nHostsFile_Close = _HostsFile_Close\nHostsFile_Open = _HostsFile_Open\nHostsFile_ReadLine = _HostsFile_ReadLine\nIpHelp_IsAddrOnLink = _IpHelp_IsAddrOnLink\nLocal_GetRecordsForLocalName = _Local_GetRecordsForLocalName\nLocal_GetRecordsForLocalNameEx = _Local_GetRecordsForLocalNameEx\nNetInfo_Build = _NetInfo_Build\nNetInfo_Clean = _NetInfo_Clean\nNetInfo_Copy = _NetInfo_Copy\nNetInfo_Free = _NetInfo_Free\nNetInfo_GetAdapterByAddress = _NetInfo_GetAdapterByAddress\nNetInfo_GetAdapterByInterfaceIndex = _NetInfo_GetAdapterByInterfaceIndex\nNetInfo_GetAdapterByName = _NetInfo_GetAdapterByName\nNetInfo_IsAddrConfig = _NetInfo_IsAddrConfig\nNetInfo_IsForUpdate = _NetInfo_IsForUpdate\nNetInfo_ResetServerPriorities = _NetInfo_ResetServerPriorities\n;NetInfo_UpdateServerReachability = _NetInfo_UpdateServerReachability\nQueryDirectEx = _QueryDirectEx\nQuery_Main = _Query_Main\nReg_FreeUpdateInfo = _Reg_FreeUpdateInfo\nReg_GetValueEx = _Reg_GetValueEx\nReg_ReadGlobalsEx = _Reg_ReadGlobalsEx\nReg_ReadUpdateInfo = _Reg_ReadUpdateInfo\nSecurity_ContextListTimeout = _Security_ContextListTimeout\nSend_AndRecvUdpWithParam = _Send_AndRecvUdpWithParam\nSend_MessagePrivate = _Send_MessagePrivate\nSend_OpenTcpConnectionAndSend = _Send_OpenTcpConnectionAndSend\nSocket_CacheCleanup = _Socket_CacheCleanup\nSocket_CacheInit = _Socket_CacheInit\nSocket_CleanupWinsock = _Socket_CleanupWinsock\nSocket_ClearMessageSockets = _Socket_ClearMessageSockets\nSocket_CloseEx = _Socket_CloseEx\nSocket_CloseMessageSockets = _Socket_CloseMessageSockets\nSocket_Create = _Socket_Create\nSocket_CreateMulticast = _Socket_CreateMulticast\nSocket_InitWinsock = _Socket_InitWinsock\nSocket_JoinMulticast = _Socket_JoinMulticast\nSocket_RecvFrom = _Socket_RecvFrom\nSocket_SetMulticastInterface = _Socket_SetMulticastInterface\nSocket_SetMulticastLoopBack = _Socket_SetMulticastLoopBack\nSocket_SetTtl = _Socket_SetTtl\nSocket_TcpListen = _Socket_TcpListen\n;Trace_Reset = _Trace_Reset\nUpdate_ReplaceAddressRecordsW = _Update_ReplaceAddressRecordsW\nUtil_IsIp6Running = _Util_IsIp6Running\n\nDllCanUnloadNow = _DllCanUnloadNow PRIVATE\nDllGetClassObject = _DllGetClassObject PRIVATE\nDllRegisterServer = _DllRegisterServer PRIVATE\nDllUnregisterServer = _DllUnregisterServer PRIVATE"
  },
  {
    "path": "source-code/source/fakedll/ModuleList.h",
    "content": "#pragma once\n\n#include <vector>\n#include <algorithm>\n#include <cassert>\n#include <string>\n#include <tuple>\n\nstd::wstring GetModuleFileNameW(HMODULE hModule)\n{\n\tstatic constexpr auto INITIAL_BUFFER_SIZE = MAX_PATH;\n\tstatic constexpr auto MAX_ITERATIONS = 7;\n\tstd::wstring ret;\n\tauto bufferSize = INITIAL_BUFFER_SIZE;\n\tfor (size_t iterations = 0; iterations < MAX_ITERATIONS; ++iterations)\n\t{\n\t\tret.resize(bufferSize);\n\t\tauto charsReturned = GetModuleFileNameW(hModule, &ret[0], bufferSize);\n\t\tif (charsReturned < ret.length())\n\t\t{\n\t\t\tret.resize(charsReturned);\n\t\t\treturn ret;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbufferSize *= 2;\n\t\t}\n\t}\n\treturn L\"\";\n}\n\nauto starts_with = [](const std::wstring& big_str, const std::wstring& small_str) -> auto\n{\n\treturn big_str.compare(0, small_str.length(), small_str) == 0;\n};\n\n// Stores a list of loaded modules with their names, WITHOUT extension\nclass ModuleList\n{\npublic:\n\tenum class SearchLocation\n\t{\n\t\tAll,\n\t\tLocalOnly,\n\t\tSystemOnly,\n\t};\n\n\t// Initializes module list\n\t// Needs to be called before any calls to Get or GetAll\n\tvoid Enumerate(SearchLocation location = SearchLocation::All)\n\t{\n\t\tconstexpr size_t INITIAL_SIZE = sizeof(HMODULE) * 256;\n\t\tHMODULE* modules = static_cast<HMODULE*>(malloc(INITIAL_SIZE));\n\t\tif (modules != nullptr)\n\t\t{\n\t\t\ttypedef BOOL(WINAPI * Func)(HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);\n\n\t\t\tHMODULE hLib = LoadLibrary(TEXT(\"kernel32\"));\n\t\t\tassert(hLib != nullptr); // If this fails then everything is probably broken anyway\n\n\t\t\tFunc pEnumProcessModules = reinterpret_cast<Func>(GetProcAddress(hLib, \"K32EnumProcessModules\"));\n\t\t\tif (pEnumProcessModules == nullptr)\n\t\t\t{\n\t\t\t\t// Try psapi\n\t\t\t\tFreeLibrary(hLib);\n\t\t\t\thLib = LoadLibrary(TEXT(\"psapi\"));\n\t\t\t\tif (hLib != nullptr)\n\t\t\t\t{\n\t\t\t\t\tpEnumProcessModules = reinterpret_cast<Func>(GetProcAddress(hLib, \"EnumProcessModules\"));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pEnumProcessModules != nullptr)\n\t\t\t{\n\t\t\t\tconst HANDLE currentProcess = GetCurrentProcess();\n\t\t\t\tDWORD cbNeeded = 0;\n\t\t\t\tif (pEnumProcessModules(currentProcess, modules, INITIAL_SIZE, &cbNeeded) != 0)\n\t\t\t\t{\n\t\t\t\t\tif (cbNeeded > INITIAL_SIZE)\n\t\t\t\t\t{\n\t\t\t\t\t\tHMODULE* newModules = static_cast<HMODULE*>(realloc(modules, cbNeeded));\n\t\t\t\t\t\tif (newModules != nullptr)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodules = newModules;\n\n\t\t\t\t\t\t\tif (pEnumProcessModules(currentProcess, modules, cbNeeded, &cbNeeded) != 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tEnumerateInternal(modules, location, cbNeeded / sizeof(HMODULE));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tEnumerateInternal(modules, location, cbNeeded / sizeof(HMODULE));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hLib != nullptr)\n\t\t\t{\n\t\t\t\tFreeLibrary(hLib);\n\t\t\t}\n\n\t\t\tfree(modules);\n\t\t}\n\t}\n\n\t// Recreates module list\n\tvoid ReEnumerate(SearchLocation location = SearchLocation::All)\n\t{\n\t\tClear();\n\t\tEnumerate(location);\n\t}\n\n\t// Clears module list\n\tvoid Clear()\n\t{\n\t\tm_moduleList.clear();\n\t}\n\n\t// Gets handle of a loaded module with given name, NULL otherwise\n\tHMODULE Get(const wchar_t* moduleName) const\n\t{\n\t\t// If vector is empty then we're trying to call it without calling Enumerate first\n\t\tassert(m_moduleList.size() != 0);\n\n\t\tauto it = std::find_if(m_moduleList.begin(), m_moduleList.end(), [&](const auto& e) {\n\t\t\treturn _wcsicmp(moduleName, std::get<1>(e).c_str()) == 0;\n\t\t});\n\t\treturn it != m_moduleList.end() ? std::get<0>(*it) : nullptr;\n\t}\n\n\t// Gets handles to all loaded modules with given name\n\tstd::vector<HMODULE> GetAll(const wchar_t* moduleName) const\n\t{\n\t\t// If vector is empty then we're trying to call it without calling Enumerate first\n\t\tassert(m_moduleList.size() != 0);\n\n\t\tstd::vector<HMODULE> results;\n\t\tfor (auto& e : m_moduleList)\n\t\t{\n\t\t\tif (_wcsicmp(moduleName, std::get<1>(e).c_str()) == 0)\n\t\t\t{\n\t\t\t\tresults.push_back(std::get<0>(e));\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\nprivate:\n\tvoid EnumerateInternal(HMODULE* modules, SearchLocation location, size_t numModules)\n\t{\n\t\tconst auto exeModulePath = GetModuleFileNameW(NULL).substr(0, GetModuleFileNameW(NULL).find_last_of(L\"/\\\\\"));\n\n\t\tm_moduleList.reserve(numModules);\n\t\tfor (size_t i = 0; i < numModules; i++)\n\t\t{\n\t\t\t// Obtain module name, with resizing if necessary\n\t\t\tauto moduleName = GetModuleFileNameW(*modules);\n\n\t\t\tif (!moduleName.empty())\n\t\t\t{\n\t\t\t\tconst wchar_t* nameBegin = wcsrchr(moduleName.c_str(), '\\\\') + 1;\n\t\t\t\tconst wchar_t* dotPos = wcsrchr(nameBegin, '.');\n\t\t\t\tbool isLocal = starts_with(std::wstring(moduleName), exeModulePath);\n\n\t\t\t\tif ((isLocal && location != SearchLocation::SystemOnly) || (!isLocal && location != SearchLocation::LocalOnly))\n\t\t\t\t{\n\t\t\t\t\tif (dotPos != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tm_moduleList.emplace_back(*modules, std::wstring(nameBegin, dotPos), isLocal);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tm_moduleList.emplace_back(*modules, nameBegin, isLocal);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmodules++;\n\t\t}\n\t}\n\npublic: std::vector< std::tuple<HMODULE, std::wstring, bool> > m_moduleList;\n};"
  },
  {
    "path": "source-code/source/fakedll/dllmain.cpp",
    "content": "#include \"framework.h\"\n#include \"exception.hpp\"\n\nHMODULE hm;\nstd::vector<std::wstring> iniPaths;\n\nbool iequals(std::wstring_view s1, std::wstring_view s2)\n{\n\tstd::wstring str1(std::move(s1));\n\tstd::wstring str2(std::move(s2));\n\tstd::transform(str1.begin(), str1.end(), str1.begin(), [](wchar_t c) { return ::towlower(c); });\n\tstd::transform(str2.begin(), str2.end(), str2.begin(), [](wchar_t c) { return ::towlower(c); });\n\treturn (str1 == str2);\n}\n\nstd::wstring to_wstring(std::string_view cstr)\n{\n\tstd::string str(std::move(cstr));\n\tauto charsReturned = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);\n\tstd::wstring wstrTo(charsReturned, 0);\n\tMultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], charsReturned);\n\treturn wstrTo;\n}\n\nstd::wstring SHGetKnownFolderPath(REFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken)\n{\n\tstd::wstring r;\n\tWCHAR* szSystemPath = nullptr;\n\tif (SUCCEEDED(SHGetKnownFolderPath(rfid, dwFlags, hToken, &szSystemPath)))\n\t{\n\t\tr = szSystemPath;\n\t}\n\tCoTaskMemFree(szSystemPath);\n\treturn r;\n};\n\nHMODULE LoadLibraryW(const std::wstring& lpLibFileName)\n{\n\treturn LoadLibraryW(lpLibFileName.c_str());\n}\n\nstd::wstring GetCurrentDirectoryW()\n{\n\tstatic constexpr auto INITIAL_BUFFER_SIZE = MAX_PATH;\n\tstatic constexpr auto MAX_ITERATIONS = 7;\n\tstd::wstring ret;\n\tauto bufferSize = INITIAL_BUFFER_SIZE;\n\tfor (size_t iterations = 0; iterations < MAX_ITERATIONS; ++iterations)\n\t{\n\t\tret.resize(bufferSize);\n\t\tauto charsReturned = GetCurrentDirectoryW(bufferSize, &ret[0]);\n\t\tif (charsReturned < ret.length())\n\t\t{\n\t\t\tret.resize(charsReturned);\n\t\t\treturn ret;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbufferSize *= 2;\n\t\t}\n\t}\n\treturn L\"\";\n}\n\nUINT GetPrivateProfileIntW(LPCWSTR lpAppName, LPCWSTR lpKeyName, INT nDefault, const std::vector<std::wstring>& fileNames)\n{\n\tfor (const auto& file : fileNames)\n\t{\n\t\tnDefault = GetPrivateProfileIntW(lpAppName, lpKeyName, nDefault, file.c_str());\n\t}\n\treturn nDefault;\n}\n\nstd::wstring GetSelfName()\n{\n\tconst std::wstring moduleFileName = GetModuleFileNameW(hm);\n\treturn moduleFileName.substr(moduleFileName.find_last_of(L\"/\\\\\") + 1);\n}\n\ntemplate<typename T, typename... Args>\nvoid GetSections(T&& h, Args... args)\n{\n\tconst std::set< std::string_view, std::less<> > s = { args... };\n\tsize_t dwLoadOffset = (size_t)GetModuleHandle(NULL);\n\tBYTE* pImageBase = reinterpret_cast<BYTE*>(dwLoadOffset);\n\tPIMAGE_DOS_HEADER   pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(dwLoadOffset);\n\tPIMAGE_NT_HEADERS   pNtHeader = reinterpret_cast<PIMAGE_NT_HEADERS>(pImageBase + pDosHeader->e_lfanew);\n\tPIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNtHeader);\n\tfor (int iSection = 0; iSection < pNtHeader->FileHeader.NumberOfSections; ++iSection, ++pSection)\n\t{\n\t\tauto pszSectionName = reinterpret_cast<const char*>(pSection->Name);\n\t\tif (s.find(pszSectionName) != s.end())\n\t\t{\n\t\t\tDWORD dwPhysSize = (pSection->Misc.VirtualSize + 4095) & ~4095;\n\t\t\tstd::forward<T>(h)(pSection, dwLoadOffset, dwPhysSize);\n\t\t}\n\t}\n}\n\nenum Kernel32ExportsNames\n{\n\teGetStartupInfoA,\n\teGetStartupInfoW,\n\teGetModuleHandleA,\n\teGetModuleHandleW,\n\teGetProcAddress,\n\teGetShortPathNameA,\n\teFindNextFileA,\n\teFindNextFileW,\n\teLoadLibraryA,\n\teLoadLibraryW,\n\teFreeLibrary,\n\teCreateEventA,\n\teCreateEventW,\n\teGetSystemInfo,\n\teInterlockedCompareExchange,\n\teSleep,\n\n\tKernel32ExportsNamesCount\n};\n\nenum Kernel32ExportsData\n{\n\tIATPtr,\n\tProcAddress,\n\n\tKernel32ExportsDataCount\n};\n\nsize_t Kernel32Data[Kernel32ExportsNamesCount][Kernel32ExportsDataCount];\n\nstatic LONG OriginalLibraryLoaded = 0;\nvoid LoadOriginalLibrary()\n{\n\tif (_InterlockedCompareExchange(&OriginalLibraryLoaded, 1, 0) != 0) return;\n\n\tauto szSelfName = GetSelfName();\n\tauto szSystemPath = SHGetKnownFolderPath(FOLDERID_System, 0, nullptr) + L'\\\\' + szSelfName;\n\tauto szLocalPath = GetModuleFileNameW(hm); szLocalPath = szLocalPath.substr(0, szLocalPath.find_last_of(L\"/\\\\\") + 1);\n\n\tif (iequals(szSelfName, L\"dnsapi.dll\")) {\n\t\tdnsapi.LoadOriginalLibrary(LoadLibraryW(szSystemPath));\n\t}\n}\n\nvoid FindFiles(WIN32_FIND_DATAW* fd)\n{\n\tauto dir = GetCurrentDirectoryW();\n\n\tHANDLE dvaFile = FindFirstFileW(L\"*.dva\", fd);\n\tif (dvaFile != INVALID_HANDLE_VALUE)\n\t{\n\t\tdo {\n\t\t\tif (!(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\n\t\t\t{\n\t\t\t\tauto pos = wcslen(fd->cFileName);\n\n\t\t\t\tif (fd->cFileName[pos - 4] == '.' &&\n\t\t\t\t\t(fd->cFileName[pos - 3] == 'd' || fd->cFileName[pos - 3] == 'D') &&\n\t\t\t\t\t(fd->cFileName[pos - 2] == 'v' || fd->cFileName[pos - 2] == 'V') &&\n\t\t\t\t\t(fd->cFileName[pos - 1] == 'a' || fd->cFileName[pos - 1] == 'A'))\n\t\t\t\t{\n\t\t\t\t\tauto path = dir + L'\\\\' + fd->cFileName;\n\n\t\t\t\t\tif (GetModuleHandle(path.c_str()) == NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tauto h = LoadLibraryW(path);\n\t\t\t\t\t\tSetCurrentDirectoryW(dir.c_str()); //in case dva switched it\n\n\t\t\t\t\t\tif (h == NULL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto e = GetLastError();\n\t\t\t\t\t\t\tif (e != ERROR_DLL_INIT_FAILED) // in case dllmain returns false\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstd::wstring msg = L\"Unable to load \" + std::wstring(fd->cFileName) + L\". Error: \" + std::to_wstring(e);\n\t\t\t\t\t\t\t\tMessageBoxW(0, msg.c_str(), L\"PD Loader\", MB_ICONERROR);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto procedure = (void(*)())GetProcAddress(h, \"InitializeDVA\");\n\n\t\t\t\t\t\t\tif (procedure != NULL)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tprocedure();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} while (FindNextFileW(dvaFile, fd));\n\t\tFindClose(dvaFile);\n\t}\n}\n\nvoid LoadPlugins()\n{\n\tauto oldDir = GetCurrentDirectoryW(); // store the current directory\n\n\tauto szSelfPath = GetModuleFileNameW(hm).substr(0, GetModuleFileNameW(hm).find_last_of(L\"/\\\\\") + 1);\n\tSetCurrentDirectoryW(szSelfPath.c_str());\n\n\tauto nWantsToLoadPlugins = GetPrivateProfileIntW(L\"global\", L\"enable\", TRUE, iniPaths);\n\n\tif (nWantsToLoadPlugins)\n\t{\n\t\tWIN32_FIND_DATAW fd;\n\n\t\tSetCurrentDirectoryW(szSelfPath.c_str());\n\n\t\tif (SetCurrentDirectoryW(L\"plugins\\\\\"))\n\t\t\tFindFiles(&fd);\n\t}\n\n\tSetCurrentDirectoryW(oldDir.c_str()); // Reset the current directory\n}\n\nvoid InjectCode(void* address, const std::vector<uint8_t> data)\n{\n\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\tDWORD oldProtect;\n\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\tmemcpy(address, data.data(), byteCount);\n\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n}\n\nstatic LONG LoadedPluginsYet = 0;\nvoid LoadEverything()\n{\n\tif (_InterlockedCompareExchange(&LoadedPluginsYet, 1, 0) != 0) return;\n\n\tLoadOriginalLibrary();\n\t//LoadPlugins();\n\tInjectCode((void*)0x00000001409FF58E, { 0x52, 0x54, 0x46, 0x4D });\n\tInjectCode((void*)0x00000001409FF730, { 0x53, 0x65, 0x65, 0x20, 0x52, 0x45, 0x41, 0x44, 0x4D, 0x45, 0x2E, 0x74, 0x78, 0x74, 0x2E, 0x00, 0x00 });\n}\n\nstatic LONG RestoredOnce = 0;\nvoid LoadPluginsAndRestoreIAT(uintptr_t retaddr)\n{\n\tbool calledFromBind = false;\n\n\t//steam drm check\n\tGetSections([&](PIMAGE_SECTION_HEADER pSection, size_t dwLoadOffset, DWORD dwPhysSize) {\n\t\tauto dwStart = static_cast<uintptr_t>(dwLoadOffset + pSection->VirtualAddress);\n\t\tauto dwEnd = dwStart + dwPhysSize;\n\t\tif (retaddr >= dwStart && retaddr <= dwEnd)\n\t\t\tcalledFromBind = true;\n\t}, \".bind\");\n\n\tif (calledFromBind) return;\n\n\tif (_InterlockedCompareExchange(&RestoredOnce, 1, 0) != 0) return;\n\n\tLoadEverything();\n\n\tfor (size_t i = 0; i < Kernel32ExportsNamesCount; i++)\n\t{\n\t\tif (Kernel32Data[i][IATPtr] && Kernel32Data[i][ProcAddress])\n\t\t{\n\t\t\tauto ptr = (size_t*)Kernel32Data[i][IATPtr];\n\t\t\tDWORD dwProtect[2];\n\t\t\tVirtualProtect(ptr, sizeof(size_t), PAGE_EXECUTE_READWRITE, &dwProtect[0]);\n\t\t\t*ptr = Kernel32Data[i][ProcAddress];\n\t\t\tVirtualProtect(ptr, sizeof(size_t), dwProtect[0], &dwProtect[1]);\n\t\t}\n\t}\n}\n\nvoid WINAPI CustomGetStartupInfoA(LPSTARTUPINFOA lpStartupInfo)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetStartupInfoA(lpStartupInfo);\n}\n\nvoid WINAPI CustomGetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetStartupInfoW(lpStartupInfo);\n}\n\nHMODULE WINAPI CustomGetModuleHandleA(LPCSTR lpModuleName)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetModuleHandleA(lpModuleName);\n}\n\nHMODULE WINAPI CustomGetModuleHandleW(LPCWSTR lpModuleName)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetModuleHandleW(lpModuleName);\n}\n\nFARPROC WINAPI CustomGetProcAddress(HMODULE hModule, LPCSTR lpProcName)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetProcAddress(hModule, lpProcName);\n}\n\nDWORD WINAPI CustomGetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetShortPathNameA(lpszLongPath, lpszShortPath, cchBuffer);\n}\n\nBOOL WINAPI CustomFindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn FindNextFileA(hFindFile, lpFindFileData);\n}\n\nBOOL WINAPI CustomFindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn FindNextFileW(hFindFile, lpFindFileData);\n}\n\nHMODULE WINAPI CustomLoadLibraryA(LPCSTR lpLibFileName)\n{\n\tLoadOriginalLibrary();\n\n\treturn LoadLibraryA(lpLibFileName);\n}\n\nHMODULE WINAPI CustomLoadLibraryW(LPCWSTR lpLibFileName)\n{\n\tLoadOriginalLibrary();\n\n\treturn LoadLibraryW(lpLibFileName);\n}\n\nBOOL WINAPI CustomFreeLibrary(HMODULE hLibModule)\n{\n\tif (hLibModule != hm)\n\t\treturn FreeLibrary(hLibModule);\n\telse\n\t\treturn !NULL;\n}\n\nHANDLE WINAPI CustomCreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn CreateEventA(lpEventAttributes, bManualReset, bInitialState, lpName);\n}\n\nHANDLE WINAPI CustomCreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn CreateEventW(lpEventAttributes, bManualReset, bInitialState, lpName);\n}\n\nvoid WINAPI CustomGetSystemInfo(LPSYSTEM_INFO lpSystemInfo)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn GetSystemInfo(lpSystemInfo);\n}\n\nLONG WINAPI CustomInterlockedCompareExchange(LONG volatile* Destination, LONG ExChange, LONG Comperand)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn _InterlockedCompareExchange(Destination, ExChange, Comperand);\n}\n\nvoid WINAPI CustomSleep(DWORD dwMilliseconds)\n{\n\tLoadPluginsAndRestoreIAT((uintptr_t)_ReturnAddress());\n\treturn Sleep(dwMilliseconds);\n}\n\nbool HookKernel32IAT(HMODULE mod, bool exe)\n{\n\tauto hExecutableInstance = (size_t)mod;\n\tIMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)(hExecutableInstance + ((IMAGE_DOS_HEADER*)hExecutableInstance)->e_lfanew);\n\tIMAGE_IMPORT_DESCRIPTOR* pImports = (IMAGE_IMPORT_DESCRIPTOR*)(hExecutableInstance + ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);\n\tsize_t                      nNumImports = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size / sizeof(IMAGE_IMPORT_DESCRIPTOR) - 1;\n\n\tif (exe)\n\t{\n\t\tKernel32Data[eGetStartupInfoA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetStartupInfoA\");\n\t\tKernel32Data[eGetStartupInfoW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetStartupInfoW\");\n\t\tKernel32Data[eGetModuleHandleA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetModuleHandleA\");\n\t\tKernel32Data[eGetModuleHandleW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetModuleHandleW\");\n\t\tKernel32Data[eGetProcAddress][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetProcAddress\");\n\t\tKernel32Data[eGetShortPathNameA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetShortPathNameA\");\n\t\tKernel32Data[eFindNextFileA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"FindNextFileA\");\n\t\tKernel32Data[eFindNextFileW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"FindNextFileW\");\n\t\tKernel32Data[eLoadLibraryA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"LoadLibraryA\");\n\t\tKernel32Data[eLoadLibraryW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"LoadLibraryW\");\n\t\tKernel32Data[eFreeLibrary][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"FreeLibrary\");\n\t\tKernel32Data[eCreateEventA][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"CreateEventA\");\n\t\tKernel32Data[eCreateEventW][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"CreateEventW\");\n\t\tKernel32Data[eGetSystemInfo][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"GetSystemInfo\");\n\t\tKernel32Data[eInterlockedCompareExchange][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"InterlockedCompareExchange\");\n\t\tKernel32Data[eSleep][ProcAddress] = (size_t)GetProcAddress(GetModuleHandle(TEXT(\"KERNEL32.DLL\")), \"Sleep\");\n\t}\n\n\tuint32_t matchedImports = 0;\n\n\tauto PatchIAT = [&](size_t start, size_t end, size_t exe_end)\n\t{\n\t\tfor (size_t i = 0; i < nNumImports; i++)\n\t\t{\n\t\t\tif (hExecutableInstance + (pImports + i)->FirstThunk > start && !(end && hExecutableInstance + (pImports + i)->FirstThunk > end))\n\t\t\t\tend = hExecutableInstance + (pImports + i)->FirstThunk;\n\t\t}\n\n\t\tif (!end) { end = start + 0x100; }\n\t\tif (end > exe_end) //for very broken exes\n\t\t{\n\t\t\tstart = hExecutableInstance;\n\t\t\tend = exe_end;\n\t\t}\n\n\t\tfor (auto i = start; i < end; i += sizeof(size_t))\n\t\t{\n\t\t\tDWORD dwProtect[2];\n\t\t\tVirtualProtect((size_t*)i, sizeof(size_t), PAGE_EXECUTE_READWRITE, &dwProtect[0]);\n\n\t\t\tauto ptr = *(size_t*)i;\n\t\t\tif (!ptr)\n\t\t\t\tcontinue;\n\n\t\t\tif (ptr == Kernel32Data[eGetStartupInfoA][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetStartupInfoA][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetStartupInfoA;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eGetStartupInfoW][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetStartupInfoW][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetStartupInfoW;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eGetModuleHandleA][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetModuleHandleA][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetModuleHandleA;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eGetModuleHandleW][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetModuleHandleW][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetModuleHandleW;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eGetProcAddress][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetProcAddress][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetProcAddress;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eGetShortPathNameA][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetShortPathNameA][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetShortPathNameA;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eFindNextFileA][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eFindNextFileA][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomFindNextFileA;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eFindNextFileW][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eFindNextFileW][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomFindNextFileW;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eLoadLibraryA][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eLoadLibraryA][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomLoadLibraryA;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eLoadLibraryW][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eLoadLibraryW][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomLoadLibraryW;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eFreeLibrary][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eFreeLibrary][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomFreeLibrary;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eCreateEventA][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eCreateEventA][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomCreateEventA;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eCreateEventW][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eCreateEventW][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomCreateEventW;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eGetSystemInfo][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eGetSystemInfo][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomGetSystemInfo;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eInterlockedCompareExchange][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eInterlockedCompareExchange][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomInterlockedCompareExchange;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\t\t\telse if (ptr == Kernel32Data[eSleep][ProcAddress])\n\t\t\t{\n\t\t\t\tif (exe) Kernel32Data[eSleep][IATPtr] = i;\n\t\t\t\t*(size_t*)i = (size_t)CustomSleep;\n\t\t\t\tmatchedImports++;\n\t\t\t}\n\n\t\t\tVirtualProtect((size_t*)i, sizeof(size_t), dwProtect[0], &dwProtect[1]);\n\t\t}\n\t};\n\n\tstatic auto getSection = [](const PIMAGE_NT_HEADERS nt_headers, unsigned section) -> PIMAGE_SECTION_HEADER\n\t{\n\t\treturn reinterpret_cast<PIMAGE_SECTION_HEADER>(\n\t\t\t(UCHAR*)nt_headers->OptionalHeader.DataDirectory +\n\t\t\tnt_headers->OptionalHeader.NumberOfRvaAndSizes * sizeof(IMAGE_DATA_DIRECTORY) +\n\t\t\tsection * sizeof(IMAGE_SECTION_HEADER));\n\t};\n\n\tstatic auto getSectionEnd = [](IMAGE_NT_HEADERS* ntHeader, size_t inst) -> auto\n\t{\n\t\tauto sec = getSection(ntHeader, ntHeader->FileHeader.NumberOfSections - 1);\n\t\tauto secSize = max(sec->SizeOfRawData, sec->Misc.VirtualSize);\n\t\tauto end = inst + max(sec->PointerToRawData, sec->VirtualAddress) + secSize;\n\t\treturn end;\n\t};\n\n\tauto hExecutableInstance_end = getSectionEnd(ntHeader, hExecutableInstance);\n\n\t// Find kernel32.dll\n\tfor (size_t i = 0; i < nNumImports; i++)\n\t{\n\t\tif ((size_t)(hExecutableInstance + (pImports + i)->Name) < hExecutableInstance_end)\n\t\t{\n\t\t\tif (!_stricmp((const char*)(hExecutableInstance + (pImports + i)->Name), \"KERNEL32.DLL\"))\n\t\t\t\tPatchIAT(hExecutableInstance + (pImports + i)->FirstThunk, 0, hExecutableInstance_end);\n\t\t}\n\t}\n\n\t// Fixing ordinals\n\tauto szSelfName = GetSelfName();\n\n\tstatic auto PatchOrdinals = [&szSelfName](size_t hInstance)\n\t{\n\t\tIMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)(hInstance + ((IMAGE_DOS_HEADER*)hInstance)->e_lfanew);\n\t\tIMAGE_IMPORT_DESCRIPTOR* pImports = (IMAGE_IMPORT_DESCRIPTOR*)(hInstance + ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);\n\t\tsize_t                      nNumImports = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size / sizeof(IMAGE_IMPORT_DESCRIPTOR) - 1;\n\n\t\tfor (size_t i = 0; i < nNumImports; i++)\n\t\t{\n\t\t\tif ((size_t)(hInstance + (pImports + i)->Name) < getSectionEnd(ntHeader, (size_t)hInstance))\n\t\t\t{\n\t\t\t\tif (iequals(szSelfName, (to_wstring((const char*)(hInstance + (pImports + i)->Name)))))\n\t\t\t\t{\n\t\t\t\t\tPIMAGE_THUNK_DATA thunk = (PIMAGE_THUNK_DATA)(hInstance + (pImports + i)->OriginalFirstThunk);\n\t\t\t\t\tsize_t j = 0;\n\t\t\t\t\twhile (thunk->u1.Function)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPIMAGE_IMPORT_BY_NAME import = (PIMAGE_IMPORT_BY_NAME)(hInstance + thunk->u1.AddressOfData);\n\t\t\t\t\t\t\tvoid** p = (void**)(hInstance + (pImports + i)->FirstThunk);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t++thunk;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tModuleList dlls;\n\tdlls.Enumerate(ModuleList::SearchLocation::LocalOnly);\n\tfor (auto& e : dlls.m_moduleList)\n\t{\n\t\tPatchOrdinals((size_t)std::get<HMODULE>(e));\n\t}\n\treturn matchedImports > 0;\n}\n\nLONG WINAPI CustomUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo)\n{\n\t// step 1: write minidump\n\twchar_t\t\tmodulename[MAX_PATH];\n\twchar_t\t\tfilename[MAX_PATH];\n\twchar_t\t\ttimestamp[128];\n\t__time64_t\ttime;\n\tstruct tm\tltime;\n\tHANDLE\t\thFile;\n\tHWND\t\thWnd;\n\n\twchar_t* modulenameptr = NULL;\n\tif (GetModuleFileNameW(GetModuleHandle(NULL), modulename, _countof(modulename)) != 0)\n\t{\n\t\tmodulenameptr = wcsrchr(modulename, '\\\\');\n\t\t*modulenameptr = L'\\0';\n\t\tmodulenameptr += 1;\n\t}\n\telse\n\t{\n\t\t*modulenameptr = L'err.err';\n\t}\n\n\t_time64(&time);\n\t_localtime64_s(&ltime, &time);\n\twcsftime(timestamp, _countof(timestamp), L\"%Y%m%d%H%M%S\", &ltime);\n\tswprintf_s(filename, L\"%s\\\\%s\\\\%s.%s.dmp\", modulename, L\"logs\", modulenameptr, timestamp);\n\n\thFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n\n\tif (hFile != INVALID_HANDLE_VALUE)\n\t{\n\t\tMINIDUMP_EXCEPTION_INFORMATION ex;\n\t\tmemset(&ex, 0, sizeof(ex));\n\t\tex.ThreadId = GetCurrentThreadId();\n\t\tex.ExceptionPointers = ExceptionInfo;\n\t\tex.ClientPointers = TRUE;\n\n\t\tif (FAILED(MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithDataSegs, &ex, NULL, NULL)))\n\t\t{\n\t\t}\n\n\t\tCloseHandle(hFile);\n\t}\n\n\t// step 2: write log\n\t// Logs exception into buffer and writes to file\n\tswprintf_s(filename, L\"%s\\\\%s\\\\%s.%s.log\", modulename, L\"logs\", modulenameptr, timestamp);\n\thFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\n\n\tif (hFile != INVALID_HANDLE_VALUE)\n\t{\n\t\tauto Log = [ExceptionInfo, hFile](char* buffer, size_t size, bool reg, bool stack, bool trace)\n\t\t{\n\t\t\tif (LogException(buffer, size, (LPEXCEPTION_POINTERS)ExceptionInfo, reg, stack, trace))\n\t\t\t{\n\t\t\t\tDWORD NumberOfBytesWritten = 0;\n\t\t\t\tWriteFile(hFile, buffer, strlen(buffer), &NumberOfBytesWritten, NULL);\n\t\t\t}\n\t\t};\n\n\t\t// Try to make a very descriptive exception, for that we need to malloc a huge buffer...\n\t\tif (auto buffer = (char*)malloc(max_logsize_ever))\n\t\t{\n\t\t\tLog(buffer, max_logsize_ever, true, true, true);\n\t\t\tfree(buffer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Use a static buffer, no need for any allocation\n\t\t\tstatic const auto size = max_logsize_basic + max_logsize_regs + max_logsize_stackdump;\n\t\t\tstatic char static_buf[size];\n\t\t\tstatic_assert(size <= max_static_buffer, \"Static buffer is too big\");\n\n\t\t\tLog(buffer = static_buf, sizeof(static_buf), true, true, false);\n\t\t}\n\n\t\tCloseHandle(hFile);\n\t}\n\n\t// step 3: exit the application\n\tShowCursor(TRUE);\n\thWnd = FindWindowW(0, L\"\");\n\tSetForegroundWindow(hWnd);\n\n\treturn EXCEPTION_CONTINUE_SEARCH;\n}\n\nvoid Init()\n{\n\tstd::wstring modulePath = GetModuleFileNameW(hm);\n\tstd::wstring moduleName = modulePath.substr(modulePath.find_last_of(L\"/\\\\\") + 1);\n\tmoduleName.resize(moduleName.find_last_of(L'.'));\n\tmodulePath.resize(modulePath.find_last_of(L\"/\\\\\") + 1);\n\tiniPaths.emplace_back(modulePath + moduleName + L\".ini\");\n\tiniPaths.emplace_back(modulePath + L\"plugins\\\\config.ini\");\n\n\tstd::wstring m = GetModuleFileNameW(NULL);\n\tm = m.substr(0, m.find_last_of(L\"/\\\\\") + 1) + L\"logs\";\n\n\tauto FolderExists = [](LPCWSTR szPath) -> BOOL\n\t{\n\t\tDWORD dwAttrib = GetFileAttributes(szPath);\n\t\treturn (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));\n\t};\n\n\tif (FolderExists(m.c_str()))\n\t{\n\t\tSetUnhandledExceptionFilter(CustomUnhandledExceptionFilter);\n\t\t// Now stub out CustomUnhandledExceptionFilter so NO ONE ELSE can set it!\n\t\tuint32_t ret = 0x909090C3; //ret\n\t\tDWORD protect[2];\n\t\tVirtualProtect(&SetUnhandledExceptionFilter, sizeof(ret), PAGE_EXECUTE_READWRITE, &protect[0]);\n\t\tmemcpy(&SetUnhandledExceptionFilter, &ret, sizeof(ret));\n\t\tVirtualProtect(&SetUnhandledExceptionFilter, sizeof(ret), protect[0], &protect[1]);\n\t}\n\n\tLoadEverything();\n\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID /*lpReserved*/)\n{\n\tif (reason == DLL_PROCESS_ATTACH)\n\t{\n\t\thm = hModule;\n\t\tInit();\n\t}\n\treturn TRUE;\n}\n"
  },
  {
    "path": "source-code/source/fakedll/exception.hpp",
    "content": "#pragma once\n/*\n * Unhandled Exception Tracer\n * by LINK/2012 <dma_2012@hotmail.com>\n *\n *  This source code is offered for use in the public domain. You may\n *  use, modify or distribute it freely.\n *\n *  This code is distributed in the hope that it will be useful but\n *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n *  DISCLAIMED. This includes but is not limited to warranties of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <time.h>\n#include <cassert>\n#include <DbgHelp.h>\n#pragma comment(lib, \"Dbghelp.lib\")\n\n /*\n  *  Special Note:\n  *      Try not to allocate any memory in this file!\n  *      Allocation after a exception may not be a good idea...\n  */\n\n#define LODWORD(_qw)    ((DWORD)(_qw))\n#define HIDWORD(_qw)    ((DWORD)(((_qw) >> 32) & 0xffffffff))\n\n  // General constants\nstatic const int sizeof_word = sizeof(void*);           // Size of a CPU word (4 bytes on x86)\nstatic const int max_chars_per_print = MAX_PATH + 256;  // Max characters per Print() call\nstatic const int symbol_max = 256;                      // Max size of a symbol (func symbol, var symbol, etc)\nstatic const int max_static_buffer = 4096;              // Max static buffer for logging\n\n// Stackdump constants\nstatic const int stackdump_max_words = 60;              // max number of CPU words that the stackdump should dump\nstatic const int stackdump_words_per_line = 6;          // max CPU words in a single line\nstatic const int stackdump_line_count = (stackdump_max_words / stackdump_words_per_line) + 1;\n\n// Backtrace constants\nstatic const int max_backtrace_ever = 100;\nstatic const int max_backtrace = 20;\n\n// Maximum log size constants\nstatic const int max_logsize_basic = (MAX_PATH + 200);      // module path + other text\nstatic const int max_logsize_regs = 32 + (4 * 4 * 28);     // info + (regsPerLine * numLines * charsPerReg)\nstatic const int max_logsize_stackdump = 32 + 80 + (stackdump_line_count * 32) + (10 * stackdump_words_per_line * stackdump_line_count);\nstatic const int max_logsize_backtrace = 32 + max_backtrace_ever * (MAX_PATH + symbol_max + 90);\nstatic const int max_logsize_ever = 32 + max_logsize_basic + max_logsize_regs + max_logsize_stackdump + max_logsize_backtrace;\n\n// Internal\nclass ExceptionTracer;\nclass StackTrace;\nstatic HMODULE GetModuleFromAddress(LPVOID address);\nstatic const char* GetExceptionCodeString(unsigned int code);\nstatic const char* FindModuleName(HMODULE module, char* output, DWORD size);\nstatic int LogException(char* buffer, size_t max, LPEXCEPTION_POINTERS pException, bool bLogRegisters, bool bLogStack, bool bLogBacktrace);\nstatic LPTOP_LEVEL_EXCEPTION_FILTER PrevFilter = nullptr;\nstatic void(*ExceptionCallback)(const char* buffer) = nullptr;\n\n// Exportable\nint InstallExceptionCatcher(void(*OnException)(const char* log));\n\n/*\n *  ExceptionTrace\n *      This class is responssible for tracing all possible informations about an LPEXCEPTION_POINTER\n */\nclass ExceptionTracer\n{\npublic:\n\tExceptionTracer(char* buffer, size_t max, LPEXCEPTION_POINTERS pException);\n\tvoid PrintUnhandledException();\n\tvoid PrintRegisters();\n\tvoid PrintStackdump();\n\tvoid PrintBacktrace();\n\n\tvoid EnterScope();\n\tvoid LeaveScope();\n\tvoid Print(const char* fmt, ...);\n\tvoid NewLine() { Print(\"\\n%s\", spc); }\n\nprotected:\n\tEXCEPTION_POINTERS& exception;\n\tEXCEPTION_RECORD& record;\n\tCONTEXT& context;\n\tHMODULE module;\n\n\tchar* buffer;       // Logging buffer\n\tsize_t len;         // Logged length\n\tsize_t max;         // Maximum we can log in that buffer\n\n\tchar spc[(10 * 4) + 1]; // Scope/spacing buffer, 4 spaces per scope, max 10 scopes\n\tsize_t nspc;        // Number spaces used up there\n};\n\n/*\n *  StackTracer\n *      Responssible for backtracing an stack from a context\n */\nclass StackTracer\n{\npublic:\n\tstruct Trace\n\t{\n\t\t// The following values may be null (any)\n\t\tHMODULE module;     // The module the func related to this frame is located\n\t\tvoid* pc;           // Program counter at func related to this frame (EIP)\n\t\tvoid* ret;          // Return address for the frame\n\t\tvoid* frame;        // The frame address (EBP)\n\t\tvoid* stack;        // The stack pointer at the frame (ESP)\n\t};\n\n\tStackTracer(const CONTEXT& context);\n\tTrace* Walk();\n\nprivate:\n\tTrace trace;\n\tDWORD old_options;\n\tCONTEXT context;\n\tSTACKFRAME64 frame;\n};\n\n/*\n *  TheUnhandledExceptionFilter\n *      Logs an unhandled exception\n */\nstatic LONG CALLBACK TheUnhandledExceptionFilter(LPEXCEPTION_POINTERS pException)\n{\n\t// Logs exception into buffer and calls the callback\n\tauto Log = [pException](char* buffer, size_t size, bool reg, bool stack, bool trace)\n\t{\n\t\tif (LogException(buffer, size, (LPEXCEPTION_POINTERS)pException, reg, stack, trace))\n\t\t\tExceptionCallback(buffer);\n\t};\n\n\t// Try to make a very descriptive exception, for that we need to malloc a huge buffer...\n\tif (auto buffer = (char*)malloc(max_logsize_ever))\n\t{\n\t\tLog(buffer, max_logsize_ever, true, true, true);\n\t\tfree(buffer);\n\t}\n\telse\n\t{\n\t\t// Use a static buffer, no need for any allocation\n\t\tstatic const auto size = max_logsize_basic + max_logsize_regs + max_logsize_stackdump;\n\t\tstatic char static_buf[size];\n\t\tstatic_assert(size <= max_static_buffer, \"Static buffer is too big\");\n\n\t\tLog(buffer = static_buf, sizeof(static_buf), true, true, false);\n\t}\n\n\t// Continue exception propagation\n\treturn (PrevFilter ? PrevFilter(pException) : EXCEPTION_CONTINUE_SEARCH);  // I'm not really sure about this return\n}\n\n/*\n *  InstallExceptionCatcher\n *      Installs a exception handler to call the specified callback when it happens with human readalbe information.\n */\nint InstallExceptionCatcher(void(*cb)(const char* log))\n{\n\tPrevFilter = SetUnhandledExceptionFilter(TheUnhandledExceptionFilter);\n\tExceptionCallback = cb;\n\treturn 1;\n}\n\n/*\n * LogException\n *      Takes an LPEXCEPTION_POINTERS and transforms in a string that is put in the logging steam\n */\nstatic int LogException(char* buffer, size_t max, LPEXCEPTION_POINTERS pException, bool bLogRegisters, bool bLogStack, bool bLogBacktrace)\n{\n\tExceptionTracer trace(buffer, max, pException);\n\ttrace.PrintUnhandledException();\n\ttrace.EnterScope();\n\tif (bLogRegisters) trace.PrintRegisters();\n\tif (bLogStack) trace.PrintStackdump();\n\tif (bLogBacktrace) trace.PrintBacktrace();\n\ttrace.LeaveScope();\n\treturn 1;\n}\n\n/*\n *  ExceptionTracer\n *      Contructs a exception trace object, responssible for tracing informations about an exception\n */\nExceptionTracer::ExceptionTracer(char* buffer, size_t max, LPEXCEPTION_POINTERS pException) :\n\tbuffer(buffer), exception(*pException), record(*pException->ExceptionRecord), context(*pException->ContextRecord)\n{\n\tthis->buffer = buffer;\n\tthis->buffer[this->len = 0] = 0;\n\tthis->spc[this->nspc = 0] = 0;\n\tthis->max = max;\n\n\t// Acquiere common information that we'll access\n\tthis->module = GetModuleFromAddress(record.ExceptionAddress);\n}\n\n/*\n *  Print\n *      Prints some formated text into the logging buffer\n */\nvoid ExceptionTracer::Print(const char* fmt, ...)\n{\n\tva_list va;\n\tva_start(va, fmt);\n\tif ((this->max - this->len) > max_chars_per_print)\n\t\tthis->len += vsprintf(&this->buffer[len], fmt, va);\n\tva_end(va);\n}\n\n/*\n *  EnterScope\n *      Enters a new scope in the logging buffer (scope is related to indentation)\n *      This also prints a new line\n */\nvoid ExceptionTracer::EnterScope()\n{\n\tnspc += 4;\n\tspc[nspc - 4] = ' ';\n\tspc[nspc - 3] = ' ';\n\tspc[nspc - 2] = ' ';\n\tspc[nspc - 1] = ' ';\n\tspc[nspc - 0] = 0;\n\tNewLine();\n}\n\n/*\n *  LeaveScope\n *      Leaves the scope\n */\nvoid ExceptionTracer::LeaveScope()\n{\n\tassert(nspc > 0);\n\tnspc -= 4;\n\tspc[nspc] = 0;\n\tNewLine();\n}\n\n/*\n *  PrintUnhandledException\n *      Prints the well known \"Unhandled exception at ...\" into the logging buffer\n */\nvoid ExceptionTracer::PrintUnhandledException()\n{\n\tchar module_name[MAX_PATH];\n\tauto dwExceptionCode = record.ExceptionCode;\n\tuintptr_t address = (uintptr_t)record.ExceptionAddress;\n\n\t// Find out our module name for logging\n\tif (!this->module || !GetModuleFileNameA(this->module, module_name, sizeof(module_name)))\n\t\tstrcpy(module_name, \"unknown\");\n\n\t// Log the exception in a similar format similar to debuggers format\n\tPrint(\"Unhandled exception at 0x%p in %s\", address, FindModuleName(module, module_name, sizeof(module_name)));\n\tif (module) Print(\" (+0x%x)\", address - (uintptr_t)(module));\n\tPrint(\": 0x%X: %s\", dwExceptionCode, GetExceptionCodeString(dwExceptionCode));\n\n\t// If exception is IN_PAGE_ERROR or ACCESS_VIOLATION, we have additional information such as an address\n\tif (dwExceptionCode == EXCEPTION_IN_PAGE_ERROR || dwExceptionCode == EXCEPTION_ACCESS_VIOLATION)\n\t{\n\t\tauto rw = (DWORD)record.ExceptionInformation[0];  // read or write?\n\t\tauto addr = (ULONG_PTR)record.ExceptionInformation[1];  // which address?\n\n\t\tPrint(\" %s 0x%p\",\n\t\t\trw == 0 ? \"reading location\" : rw == 1 ? \"writing location\" : rw == 8 ? \"DEP at\" : \"\",\n\t\t\taddr);\n\n\t\t// IN_PAGE_ERROR have another information...\n\t\tif (dwExceptionCode == EXCEPTION_IN_PAGE_ERROR)\n\t\t{\n\t\t\tNewLine();\n\t\t\tPrint(\"Underlying NTSTATUS code that resulted in the exception is 0x%p\",\n\t\t\t\trecord.ExceptionInformation[2]);\n\t\t}\n\t}\n\n\tPrint(\".\");\n}\n\n/*\n *  PrintRegisters\n *      Prints the content of the assembly registers into the logging buffer\n */\nvoid ExceptionTracer::PrintRegisters()\n{\n\tint regs_in_line = 0;       // Amount of registers currently printed on this line\n\n\t// Prints a register, followed by spaces\n\tauto PrintRegister = [this, &regs_in_line](const char* reg_name, size_t reg_value, const char* spaces)\n\t{\n\t\tPrint(\"%s: 0x%p%s\", reg_name, reg_value, spaces);\n\t\tif (++regs_in_line >= 4) { this->NewLine(); regs_in_line = 0; }\n\t};\n\n\tauto PrintFloatRegister = [this, &regs_in_line](const char* reg_name, int reg_num, uint32_t reg_value1, uint32_t reg_value2, uint32_t reg_value3, uint32_t reg_value4)\n\t{\n\t\tPrint(\"%s%02d: 0x%08X 0x%08X 0x%08X 0x%08X  [ %f %f %f %f ]\", reg_name, reg_num, reg_value1, reg_value2, reg_value3, reg_value4,\n\t\t\t*(float*)& reg_value1, *(float*)& reg_value2, *(float*)& reg_value3, *(float*)& reg_value4);\n\t\tif (++regs_in_line >= 1) { this->NewLine(); regs_in_line = 0; }\n\t};\n\n\t// Prints a general purposes register\n\tauto PrintIntRegister = [PrintRegister](const char* reg_name, size_t reg_value)\n\t{\n\t\tPrintRegister(reg_name, reg_value, \"  \");\n\t};\n\n\t// Prints a segment register\n\tauto PrintSegRegister = [PrintRegister](const char* reg_name, size_t reg_value)\n\t{\n\t\tPrintRegister(reg_name, reg_value, \"   \");\n\t};\n\n\tPrint(\"Register dump:\");\n\tEnterScope();\n\t{\n\t\t// Print main general purposes registers\n\t\tif (context.ContextFlags & CONTEXT_INTEGER)\n\t\t{\n#if !_M_X64\n\t\t\tPrintIntRegister(\"EAX\", context.Eax);\n\t\t\tPrintIntRegister(\"EBX\", context.Ebx);\n\t\t\tPrintIntRegister(\"ECX\", context.Ecx);\n\t\t\tPrintIntRegister(\"EDX\", context.Edx);\n\t\t\tPrintIntRegister(\"EDI\", context.Edi);\n\t\t\tPrintIntRegister(\"ESI\", context.Esi);\n#else\n\t\t\tPrintIntRegister(\"RAX\", context.Rax);\n\t\t\tPrintIntRegister(\"RCX\", context.Rcx);\n\t\t\tPrintIntRegister(\"RDX\", context.Rdx);\n\t\t\tPrintIntRegister(\"RBX\", context.Rbx);\n\t\t\tPrintIntRegister(\"RBP\", context.Rbp);\n\t\t\tPrintIntRegister(\"RSI\", context.Rsi);\n\t\t\tPrintIntRegister(\"RDI\", context.Rdi);\n\t\t\tPrintIntRegister(\"R08\", context.R8);\n\t\t\tPrintIntRegister(\"R09\", context.R9);\n\t\t\tPrintIntRegister(\"R10\", context.R10);\n\t\t\tPrintIntRegister(\"R11\", context.R11);\n\t\t\tPrintIntRegister(\"R12\", context.R12);\n\t\t\tPrintIntRegister(\"R13\", context.R13);\n\t\t\tPrintIntRegister(\"R14\", context.R14);\n\t\t\tPrintIntRegister(\"R15\", context.R15);\n#endif\n\t\t}\n\n\t\t// Print control registers\n\t\tif (context.ContextFlags & CONTEXT_CONTROL)\n\t\t{\n#if !_M_X64\n\t\t\tPrintIntRegister(\"EBP\", context.Ebp);\n\t\t\tPrintIntRegister(\"EIP\", context.Eip);\n\t\t\tPrintIntRegister(\"ESP\", context.Esp);\n\t\t\tPrintIntRegister(\"EFL\", context.EFlags);\n\t\t\tthis->NewLine(); this->NewLine(); regs_in_line = 0;\n\t\t\tPrintSegRegister(\"CS\", context.SegCs);\n\t\t\tPrintSegRegister(\"SS\", context.SegSs);\n#else\n\t\t\tPrintIntRegister(\"RIP\", context.Rip);\n\t\t\tPrintIntRegister(\"RSP\", context.Rsp);\n\t\t\tPrintIntRegister(\"EFL\", context.EFlags);\n\t\t\tthis->NewLine(); this->NewLine(); regs_in_line = 0;\n\t\t\tPrintSegRegister(\"CS\", context.SegCs);\n\t\t\tPrintSegRegister(\"SS\", context.SegSs);\n#endif\n\t\t}\n\n\t\tthis->NewLine(); regs_in_line = 0;\n\n\t\t// Print segment registers\n\t\tif (context.ContextFlags & CONTEXT_SEGMENTS)\n\t\t{\n\t\t\tPrintSegRegister(\"GS\", context.SegGs);\n\t\t\tPrintSegRegister(\"FS\", context.SegFs);\n\t\t\tthis->NewLine(); regs_in_line = 0;\n\t\t\tPrintSegRegister(\"ES\", context.SegEs);\n\t\t\tPrintSegRegister(\"DS\", context.SegDs);\n\t\t}\n\n\t\tthis->NewLine(); this->NewLine(); regs_in_line = 0;\n\n\t\t// Print floating point registers\n\t\tif (context.ContextFlags & CONTEXT_FLOATING_POINT)\n\t\t{\n\t\t\tfor (int i = 0; i < 8; i++)\n\t\t\t{\n#if !_M_X64\n\t\t\t\tauto f = *(M128A*) & (context.FloatSave.RegisterArea[i * 10]);\n\t\t\t\tPrintFloatRegister(\"ST\", i, LODWORD(f.Low), HIDWORD(f.Low), LODWORD(f.High), HIDWORD(f.High));\n#else\n\t\t\t\tPrintFloatRegister(\"ST\", i,\n\t\t\t\t\tLODWORD(context.FltSave.FloatRegisters[i].Low), HIDWORD(context.FltSave.FloatRegisters[i].Low),\n\t\t\t\t\tLODWORD(context.FltSave.FloatRegisters[i].High), HIDWORD(context.FltSave.FloatRegisters[i].High));\n#endif\n\t\t\t}\n\n\t\t\tthis->NewLine();\n\n\t\t\tfor (int i = 0; i < 16; i++)\n\t\t\t{\n#if !_M_X64\n\t\t\t\tauto f = *(M128A*) & (context.ExtendedRegisters[(i + 10) * 16]);\n\t\t\t\tPrintFloatRegister(\"XMM\", i, LODWORD(f.Low), HIDWORD(f.Low), LODWORD(f.High), HIDWORD(f.High));\n\n\t\t\t\tif (i >= 7)\n\t\t\t\t\tbreak;\n#else\n\t\t\t\tPrintFloatRegister(\"XMM\", i,\n\t\t\t\t\tLODWORD(context.FltSave.XmmRegisters[i].Low), HIDWORD(context.FltSave.XmmRegisters[i].Low),\n\t\t\t\t\tLODWORD(context.FltSave.XmmRegisters[i].High), HIDWORD(context.FltSave.XmmRegisters[i].High));\n#endif\n\t\t\t}\n\t\t}\n\t}\n\tLeaveScope();\n}\n\n/*\n *  PrintStackdump\n *      Prints the content of the stack into the logging buffer\n */\nvoid ExceptionTracer::PrintStackdump()\n{\n\t// We need the ESP of the exception context to execute a stack dump, make sure we have access to it\n\tif ((context.ContextFlags & CONTEXT_CONTROL) == 0)\n\t\treturn;\n\n\tstatic const auto align = sizeof_word;      // Stack aligment\n\tstatic const auto max_words_in_line_magic = stackdump_words_per_line + 10;\n\n\tMEMORY_BASIC_INFORMATION mbi;\n#if !_M_X64\n\tuintptr_t base, bottom, top = (uintptr_t)context.Esp;\n#else\n\tuintptr_t base, bottom, top = (uintptr_t)context.Rsp;\n#endif\n\tauto words_in_line = max_words_in_line_magic;\n\n\t// Finds the bottom of the stack from it's base pointer\n\t// Note: mbi will get overriden on this function\n\tauto GetStackBottom = [&mbi](uintptr_t base)\n\t{\n\t\tVirtualQuery((void*)base, &mbi, sizeof(mbi));                               // Find uncommited region of the stack\n\t\tVirtualQuery((char*)mbi.BaseAddress + mbi.RegionSize, &mbi, sizeof(mbi));   // Find guard page\n\t\tVirtualQuery((char*)mbi.BaseAddress + mbi.RegionSize, &mbi, sizeof(mbi));   // Find commited region of the stack\n\t\tauto last = (uintptr_t)mbi.BaseAddress;\n\t\treturn (base + (last - base) + mbi.RegionSize);                             // base + distanceToLastRegion + lastRegionSize\n\t};\n\n\t// Prints an CPU word at the specified stack address\n\tauto PrintWord = [this, &words_in_line](uintptr_t addr)\n\t{\n\t\tif (words_in_line++ >= stackdump_words_per_line)\n\t\t{\n\t\t\t// Print new line only if it's not the first time we enter here (i.e. words_in_line has magical value)\n\t\t\tif (words_in_line != max_words_in_line_magic + 1) NewLine();\n\t\t\twords_in_line = 1;\n\t\t\tPrint(\"0x%p: \", addr);\n\t\t}\n\t\tPrint(\" %p\", *(size_t*)addr);\n\t};\n\n\tPrint(\"Stack dump:\");\n\tEnterScope();\n\t{\n\t\t// Makes sure the pointer at top (ESP) is valid and readable memory\n\t\tif (VirtualQuery((void*)(top), &mbi, sizeof(mbi))\n\t\t\t&& (mbi.State & MEM_COMMIT)\n\t\t\t&& (mbi.Protect & (PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_READWRITE | PAGE_READONLY)) != 0)\n\t\t{\n\t\t\tbase = (uintptr_t)mbi.AllocationBase;          // Base of the stack (uncommited)\n\t\t\tbottom = GetStackBottom(base);                 // Bottom of the stack (commited)\n\n\t\t\t// Align the stack top (esp) in a 4 bytes boundary\n\t\t\tauto remainder = top % align;\n\t\t\tuintptr_t current = remainder ? top + (align - remainder) : top;\n\n\t\t\t// on x86 stack grows downward! (i.e. from bottom to base)\n\t\t\tfor (int n = 0; n < stackdump_max_words && current < bottom; ++n, current += align)\n\t\t\t\tPrintWord(current);\n\n\t\t\tNewLine();\n\t\t\tPrint(\"base: 0x%p   top: 0x%p   bottom: 0x%p\", base, top, bottom);\n\t\t\tNewLine();\n\t\t}\n\t}\n\tLeaveScope();\n}\n\n/*\n *  PrintBacktrace\n *      Prints a call backtrace into the logging buffer\n */\nvoid ExceptionTracer::PrintBacktrace()\n{\n\tStackTracer tracer(this->context);\n\n\tchar module_name[MAX_PATH];\n\tchar sym_buffer[sizeof(SYMBOL_INFO) + symbol_max];\n\n\tint backtrace_count = 0;        // Num of frames traced\n\tbool has_symbol_api = false;    // True if we have the symbol API available for use\n\tDWORD old_options;              // Saves old symbol API options\n\n\tSYMBOL_INFO& symbol = *(SYMBOL_INFO*)sym_buffer;\n\tsymbol.SizeOfStruct = sizeof(SYMBOL_INFO);\n\tsymbol.MaxNameLen = symbol_max;\n\n\t// Tries to get the symbol api\n\tif (SymInitialize(GetCurrentProcess(), 0, TRUE))\n\t{\n\t\thas_symbol_api = true;\n\t\told_options = SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES | SYMOPT_NO_PROMPTS | SYMOPT_FAIL_CRITICAL_ERRORS);\n\t}\n\n\tPrint(\"Backtrace (may be wrong):\");\n\tEnterScope();\n\t{\n\t\t// Walks on the stack until there's no frame to trace or we traced 'max_backtrace' frames\n\t\twhile (auto trace = tracer.Walk())\n\t\t{\n\t\t\tif (++backtrace_count >= max_backtrace)\n\t\t\t\tbreak;\n\n\t\t\tbool has_sym = false;   // This EIP has a symbol associated with it?\n\t\t\tDWORD64 displacement;   // EIP displacement relative to symbol\n\n\t\t\t// If we have access to the symbol api, try to get symbol name from pc (eip)\n\t\t\tif (has_symbol_api)\n\t\t\t\thas_sym = trace->pc ? !!SymFromAddr(GetCurrentProcess(), (DWORD64)trace->pc, &displacement, &symbol) : false;\n\n\t\t\t// Print everything up, this.... Ew, this looks awful!\n\t\t\tPrint(backtrace_count == 1 ? \"=>\" : \"  \");                          // First line should have '=>' to specify where it crashed\n\t\t\tPrint(\"0x%p \", trace->pc);                                          // Print EIP at frame\n\t\t\tif (has_sym) Print(\"%s+0x%x \", symbol.Name, (DWORD)displacement);   // Print frame func symbol\n\t\t\tPrint(\"in %s (+0x%x) \",                                             // Print module\n\t\t\t\ttrace->module ? FindModuleName(trace->module, module_name, sizeof(module_name)) : \"unknown\",\n\t\t\t\t(uintptr_t)(trace->pc) - (uintptr_t)(trace->module) // Module displacement\n\t\t\t);\n\t\t\tif (trace->frame) Print(\"(0x%p) \", trace->frame);                   // Print frame pointer\n\n\t\t\tNewLine();\n\t\t}\n\t}\n\tLeaveScope();\n\n\t// Cleanup the symbol api\n\tif (has_symbol_api)\n\t{\n\t\tSymSetOptions(old_options);\n\t\tSymCleanup(GetCurrentProcess());\n\t}\n}\n\n/*\n * GetExceptionCodeString\n *      Returns an description by an exception code\n */\nstatic const char* GetExceptionCodeString(unsigned int code)\n{\n\tswitch (code)\n\t{\n\tcase EXCEPTION_ACCESS_VIOLATION:         return \"Access violation\";\n\tcase EXCEPTION_ARRAY_BOUNDS_EXCEEDED:    return \"Array bounds exceeded\";\n\tcase EXCEPTION_BREAKPOINT:               return \"Breakpoint exception\";\n\tcase EXCEPTION_DATATYPE_MISALIGNMENT:    return \"Data type misalignment exception\";\n\tcase EXCEPTION_FLT_DENORMAL_OPERAND:     return \"Denormal float operand\";\n\tcase EXCEPTION_FLT_DIVIDE_BY_ZERO:       return \"Floating-point division by zero\";\n\tcase EXCEPTION_FLT_INEXACT_RESULT:       return \"Floating-point inexact result\";\n\tcase EXCEPTION_FLT_INVALID_OPERATION:    return \"Floating-point invalid operation\";\n\tcase EXCEPTION_FLT_OVERFLOW:             return \"Floating-point overflow\";\n\tcase EXCEPTION_FLT_STACK_CHECK:          return \"Floating-point stack check\";\n\tcase EXCEPTION_FLT_UNDERFLOW:            return \"Floating-point underflow\";\n\tcase EXCEPTION_ILLEGAL_INSTRUCTION:      return \"Illegal instruction.\";\n\tcase EXCEPTION_IN_PAGE_ERROR:            return \"In page error\";\n\tcase EXCEPTION_INT_DIVIDE_BY_ZERO:       return \"Integer division by zero\";\n\tcase EXCEPTION_INT_OVERFLOW:             return \"Integer overflow\";\n\tcase EXCEPTION_INVALID_DISPOSITION:      return \"Invalid disposition\";\n\tcase EXCEPTION_NONCONTINUABLE_EXCEPTION: return \"Non-continuable exception\";\n\tcase EXCEPTION_PRIV_INSTRUCTION:         return \"Privileged instruction\";\n\tcase EXCEPTION_SINGLE_STEP:              return \"Single step exception\";\n\tcase EXCEPTION_STACK_OVERFLOW:           return \"Stack overflow\";\n\tdefault:                                 return \"NO_DESCRIPTION\";\n\t}\n}\n\n/*\n * FindModuleName\n *      Finds module filename or \"unknown\"\n */\nstatic const char* FindModuleName(HMODULE module, char* output, DWORD maxsize)\n{\n\tif (GetModuleFileNameA(module, output, maxsize))\n\t{\n\t\t// Finds the filename part in the output string\n\t\tchar* filename = strrchr(output, '\\\\');\n\t\tif (!filename) filename = strrchr(output, '/');\n\n\t\t// If filename found (i.e. output isn't already a filename but full path), make output be filename\n\t\tif (filename)\n\t\t{\n\t\t\tsize_t size = strlen(++filename);\n\t\t\tmemmove(output, filename, size);\n\t\t\toutput[size] = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Unknown module\n\t\tstrcpy(output, \"unknown\");\n\t}\n\treturn output;\n}\n\n/*\n * GetModuleFromAddress\n *      Finds module handle from some address inside it\n */\nstatic HMODULE GetModuleFromAddress(LPVOID address)\n{\n\tHMODULE module;\n\tif (GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,\n\t\t(char*)address, &module))\n\t\treturn module;\n\treturn nullptr;\n}\n\n/*\n*  StackTracer\n*      Constructs the tracer, we basically need to initialize the symbol api\n*/\nStackTracer::StackTracer(const CONTEXT& context)\n{\n\t// Initialise basic values\n\tmemset(&this->frame, 0, sizeof(frame));\n\tmemcpy(&this->context, &context, sizeof(context));\n\n\t// Setup the initial frame context\n#if !_M_X64\n\tframe.AddrPC.Mode = AddrModeFlat;\n\tframe.AddrPC.Offset = context.Eip;\n\tframe.AddrFrame.Mode = AddrModeFlat;\n\tframe.AddrFrame.Offset = context.Ebp;\n\tframe.AddrStack.Mode = AddrModeFlat;\n\tframe.AddrStack.Offset = context.Esp;\n#else\n\tframe.AddrPC.Mode = AddrModeFlat;\n\tframe.AddrPC.Offset = context.Rip;\n\tframe.AddrFrame.Mode = AddrModeFlat;\n\tframe.AddrFrame.Offset = context.Rbp;\n\tframe.AddrStack.Mode = AddrModeFlat;\n\tframe.AddrStack.Offset = context.Rsp;\n#endif\n}\n\n/*\n *   StackTracer::Walk\n *      Walks on the stack, each walk is one frame of backtrace\n *      Returns a frame or null if the walk on the park is not possible anymore\n */\nStackTracer::Trace* StackTracer::Walk()\n{\n\tif (StackWalk64(IMAGE_FILE_MACHINE_I386, GetCurrentProcess(), GetCurrentThread(),\n\t\t&frame, &context, NULL, NULL, NULL, NULL))\n\t{\n\t\ttrace.module = GetModuleFromAddress((void*)frame.AddrPC.Offset);\n\t\ttrace.frame = (void*)frame.AddrFrame.Offset;\n\t\ttrace.stack = (void*)frame.AddrStack.Offset;\n\t\ttrace.pc = (void*)frame.AddrPC.Offset;\n\t\ttrace.ret = (void*)frame.AddrReturn.Offset;\n\t\treturn &trace;\n\t}\n\treturn nullptr;\n}"
  },
  {
    "path": "source-code/source/fakedll/fakedll.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{B49C6ABE-931C-4F91-9A94-21A41A305FEE}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>fakedll</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n    <TargetFrameworkVersion>\n    </TargetFrameworkVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CLRSupport>false</CLRSupport>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <TargetName>fakednsapi</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetName>fakednsapi</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_DEBUG;PDLOADER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>..\\dependencies\\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <ModuleDefinitionFile>x64.def</ModuleDefinitionFile>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;NDEBUG;PDLOADER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>..\\dependencies\\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <ModuleDefinitionFile>x64.def</ModuleDefinitionFile>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"exception.hpp\" />\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"ModuleList.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"x64.def\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/fakedll/fakedll.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"ModuleList.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"exception.hpp\">\n      <Filter>Source Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"x64.def\">\n      <Filter>Source Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/fakedll/framework.h",
    "content": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n#pragma once\n#include <string>\n#include <shlobj.h>\n#include <set>\n#include \"ModuleList.h\"\n#include <intrin.h>\n#pragma intrinsic(_ReturnAddress)\n\nstruct shared\n{\n\tFARPROC DllCanUnloadNow;\n\tFARPROC DllGetClassObject;\n\tFARPROC DllRegisterServer;\n\tFARPROC DllUnregisterServer;\n\tFARPROC DebugSetMute;\n\n\tvoid LoadOriginalLibrary(HMODULE dll)\n\t{\n\t\tDllCanUnloadNow = GetProcAddress(dll, \"DllCanUnloadNow\");\n\t\tDllGetClassObject = GetProcAddress(dll, \"DllGetClassObject\");\n\t\tDllRegisterServer = GetProcAddress(dll, \"DllRegisterServer\");\n\t\tDllUnregisterServer = GetProcAddress(dll, \"DllUnregisterServer\");\n\t\tDebugSetMute = GetProcAddress(dll, \"DebugSetMute\");\n\t}\n} shared;\n\nstruct dnsapi_dll\n{\n\tHMODULE dll;\n\n\t// only some functions are implemented.\n\t// PDAFT doesn't use many, so this should hopefully be fine\n\tFARPROC DnsFree;\n\tFARPROC DnsQuery_A;\n\tFARPROC DnsQueryEx;\n\tFARPROC DnsCancelQuery;\n\tFARPROC DnsDhcpRegisterTerm;\n\tFARPROC DnsNotifyResolver;\n\tFARPROC DnsDhcpRegisterHostAddrs;\n\tFARPROC DnsQueryConfigDword;\n\tFARPROC DnsDhcpRemoveRegistrations;\n\tFARPROC DnsDhcpRegisterInit;\n\tFARPROC DnsDhcpRegisterAddrs;\n\n\t// DnsQueryEx and DnsCancelQuery take pointers to structs as parameters\n\t// (three for DnsQueryEx and one for DnsCancelQuery)\n\t// fortunately they should fit in registers so the stack doesn't matter\n\t// hopefully this works fine... I have no clue what I'm doing\n\tstatic LONG WINAPI DnsQueryExStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsCancelQueryStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\t/*static LONG WINAPI DnsDhcpRegisterTermStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsNotifyResolverStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsDhcpRegisterHostAddrsStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsQueryConfigDwordStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsDhcpRemoveRegistrationsStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsDhcpRegisterInitStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}\n\tstatic LONG WINAPI DnsDhcpRegisterAddrsStub()\n\t{\n\t\treturn 9004; // DNS_ERROR_RCODE_NOT_IMPLEMENTED\n\t}*/\n\n\tvoid LoadOriginalLibrary(HMODULE module)\n\t{\n\t\tdll = module;\n\t\tshared.LoadOriginalLibrary(dll);\n\t\tDnsFree = GetProcAddress(dll, \"DnsFree\");\n\t\tDnsQuery_A = GetProcAddress(dll, \"DnsQuery_A\");\n\t\tDnsQueryEx = GetProcAddress(dll, \"DnsQueryEx\");\n\t\tDnsCancelQuery = GetProcAddress(dll, \"DnsCancelQuery\");\n\t\tDnsDhcpRegisterTerm = GetProcAddress(dll, \"DnsDhcpRegisterTerm\");\n\t\tDnsNotifyResolver = GetProcAddress(dll, \"DnsNotifyResolver\");\n\t\tDnsDhcpRegisterHostAddrs = GetProcAddress(dll, \"DnsDhcpRegisterHostAddrs\");\n\t\tDnsQueryConfigDword = GetProcAddress(dll, \"DnsQueryConfigDword\");\n\t\tDnsDhcpRemoveRegistrations = GetProcAddress(dll, \"DnsDhcpRemoveRegistrations\");\n\t\tDnsDhcpRegisterInit = GetProcAddress(dll, \"DnsDhcpRegisterInit\");\n\t\tDnsDhcpRegisterAddrs = GetProcAddress(dll, \"DnsDhcpRegisterAddrs\");\n\n\t\t// if entry points aren't found, GetProcAddress should return null\n\t\t// I hope this is correct\n\t\t// Thanks to somewhatlurker\n\t\tif (DnsQueryEx == NULL) { DnsQueryEx = (FARPROC)& DnsQueryExStub; };\n\t\tif (DnsCancelQuery == NULL) { DnsCancelQuery = (FARPROC)& DnsCancelQueryStub; };\n\t\t/*if (DnsDhcpRegisterTerm == NULL) { DnsDhcpRegisterTerm = (FARPROC)& DnsDhcpRegisterTermStub; };\n\t\tif (DnsNotifyResolver == NULL) { DnsNotifyResolver = (FARPROC)& DnsNotifyResolverStub; };\n\t\tif (DnsDhcpRegisterHostAddrs == NULL) { DnsDhcpRegisterHostAddrs = (FARPROC)& DnsDhcpRegisterHostAddrsStub; };\n\t\tif (DnsQueryConfigDword == NULL) { DnsQueryConfigDword = (FARPROC)& DnsQueryConfigDwordStub; };\n\t\tif (DnsDhcpRemoveRegistrations == NULL) { DnsDhcpRemoveRegistrations = (FARPROC)& DnsDhcpRemoveRegistrationsStub; };\n\t\tif (DnsDhcpRegisterInit == NULL) { DnsDhcpRegisterInit = (FARPROC)& DnsDhcpRegisterInitStub; };\n\t\tif (DnsDhcpRegisterAddrs == NULL) { DnsDhcpRegisterAddrs = (FARPROC)& DnsDhcpRegisterAddrsStub; };*/\n\t}\n} dnsapi;\n\nvoid _DnsFree() { dnsapi.DnsFree(); }\nvoid _DnsQuery_A() { dnsapi.DnsQuery_A(); }\nvoid _DnsQueryEx() { dnsapi.DnsQueryEx(); }\nvoid _DnsCancelQuery() { dnsapi.DnsCancelQuery(); }\nvoid _DnsDhcpRegisterTerm() { dnsapi.DnsDhcpRegisterTerm(); }\nvoid _DnsNotifyResolver() { dnsapi.DnsNotifyResolver(); }\nvoid _DnsDhcpRegisterHostAddrs() { dnsapi.DnsDhcpRegisterHostAddrs(); }\nvoid _DnsQueryConfigDword() { dnsapi.DnsQueryConfigDword(); }\nvoid _DnsDhcpRemoveRegistrations() { dnsapi.DnsDhcpRemoveRegistrations(); }\nvoid _DnsDhcpRegisterInit() { dnsapi.DnsDhcpRegisterInit(); }\nvoid _DnsDhcpRegisterAddrs() { dnsapi.DnsDhcpRegisterAddrs(); }\n\n#pragma runtime_checks( \"\", off )\n\n#ifdef _DEBUG\n#pragma message (\"You are compiling the code in Debug - be warned that wrappers for export functions may not have correct code generated\")\n#endif\n\nvoid _DllRegisterServer() { shared.DllRegisterServer(); }\nvoid _DllUnregisterServer() { shared.DllUnregisterServer(); }\nvoid _DllCanUnloadNow() { shared.DllCanUnloadNow(); }\nvoid _DllGetClassObject() { shared.DllGetClassObject(); }\n\n#pragma runtime_checks( \"\", restore )"
  },
  {
    "path": "source-code/source/fakedll/x64.def",
    "content": "LIBRARY \"dnsapi\"\nEXPORTS\nDnsFree = _DnsFree\nDnsQuery_A = _DnsQuery_A\nDnsQueryEx = _DnsQueryEx\nDnsCancelQuery = _DnsCancelQuery\nDnsDhcpRegisterTerm = _DnsDhcpRegisterTerm\nDnsNotifyResolver = _DnsNotifyResolver\nDnsDhcpRegisterHostAddrs = _DnsDhcpRegisterHostAddrs\nDnsQueryConfigDword = _DnsQueryConfigDword\nDnsDhcpRemoveRegistrations = _DnsDhcpRemoveRegistrations\nDnsDhcpRegisterInit = _DnsDhcpRegisterInit\nDnsDhcpRegisterAddrs = _DnsDhcpRegisterAddrs\nDllCanUnloadNow = _DllCanUnloadNow PRIVATE\nDllGetClassObject = _DllGetClassObject PRIVATE\nDllRegisterServer = _DllRegisterServer PRIVATE\nDllUnregisterServer = _DllUnregisterServer PRIVATE"
  },
  {
    "path": "source-code/source/plugins/DSCRemote/DSCRemote.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}</ProjectGuid>\n    <RootNamespace>DSCRemote</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>detours.lib;evr.lib;mfplat.lib;mfuuid.lib;strmiids.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n      <LanguageStandard>\n      </LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>detours.lib;evr.lib;mfplat.lib;mfuuid.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"PluginConfigApi.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DSCRemote/DSCRemote.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"PluginConfigApi.h\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DSCRemote/PluginConfigApi.h",
    "content": "#pragma once\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n#include <windows.h>\n#include <vector>\n\n// resolution class to store and sort the width and height easily\nclass resolution\n{\npublic:\n\tunsigned int width;\n\tunsigned int height;\n\n\tresolution()\n\t{\n\t\twidth = 0;\n\t\theight = 0;\n\t}\n\n\tresolution(unsigned int width, unsigned int height)\n\t{\n\t\tresolution::width = width;\n\t\tresolution::height = height;\n\t}\n\n\tbool operator ==(const resolution &res2)\n\t{\n\t\treturn width == res2.width && height == res2.height;\n\t}\n\n\t// in comparisons width takes priority because it's usually displayed first\n\tbool operator <(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height < res2.height;\n\t\telse\n\t\t\treturn width < res2.width;\n\t}\n\tbool operator >(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height > res2.height;\n\t\telse\n\t\t\treturn width > res2.width;\n\t}\n};\n\nnamespace PluginConfig\n{\n#pragma pack(push, 1)\n\tenum ConfigType {\n\t\tCONFIG_BOOLEAN,\n\t\tCONFIG_NUMERIC,\n\t\tCONFIG_STRING,\n\t\tCONFIG_DROPDOWN_INDEX,\n\t\tCONFIG_DROPDOWN_TEXT,\n\t\tCONFIG_DROPDOWN_NUMBER,\n\t\tCONFIG_RESOLUTION,\n\t\tCONFIG_GROUP_START,\n\t\tCONFIG_GROUP_END,\n\t\tCONFIG_BUTTON,\n\t\tCONFIG_SPACER\n\t};\n\n\tstruct PluginConfigBooleanData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tbool defaultVal;\n\t\tbool saveAsString;\n\t};\n\n\tstruct PluginConfigNumericData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tint minVal;\n\t\tint maxVal;\n\t};\n\n\tstruct PluginConfigStringData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownIndexData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t};\n\n\tstruct PluginConfigDropdownTextData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t\tbool editable;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownNumberData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<int> valueInts;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigResolutionData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniVarName2;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tresolution defaultVal;\n\t\tstd::vector<resolution> valueResolutions;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigGroupData\n\t{\n\t\tLPCWSTR name;\n\t\tint height;\n\t};\n\n\tstruct PluginConfigButtonData {\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tvoid(*func)();\n\t};\n\n\tstruct PluginConfigSpacerData {\n\t\tint height;\n\t};\n\n\tstruct PluginConfigOption\n\t{\n\t\tConfigType cfgType;\n\t\tvoid* data;\n\t};\n\n\tstruct PluginConfigArray\n\t{\n\t\tint len;\n\t\tPluginConfigOption* options;\n\t};\n#pragma pack(pop)\n}"
  },
  {
    "path": "source-code/source/plugins/DSCRemote/dllmain.cpp",
    "content": "#include <WinSock2.h>\n#pragma comment(lib, \"Ws2_32.lib\")\n#include <detours.h>\n#include <thread>\n#include <string>\n#include \"framework.h\"\n#include \"PluginConfigApi.h\"\n#include <iostream>\n\nbool(__cdecl* DSC_EXECUTE_COMMAND)(__int64 dsc_address, float delta_time, __int64 start_time, void* wait_timer, int* a5, int a6, int a7)\n= (bool(__cdecl*)(__int64 dsc_address, float delta_time, __int64 start_time, void* wait_timer, int* a5, int a6, int a7))\n0x14011CBA0;\nbool hookedDSC_EXECUTE_COMMAND(__int64 dsc_address, float delta_time, __int64 start_time, void* wait_timer, int* a5, int a6, int a7);\nvoid serve();\n\nbool debug = false;\nunsigned short port = 8139;\n\nvoid loadConfig()\n{\n\tport = GetPrivateProfileIntW(L\"general\", L\"port\", 8139, CONFIG_FILE);\n\tdebug = GetPrivateProfileIntW(L\"general\", L\"debug\", 0, CONFIG_FILE) > 0;\n\n\treturn;\n}\n\nfloat last_delta_time = 0.0;\n__int64 last_start_time = 0i64;\nvoid* last_wait_timer = nullptr;\nint* last_a5 = nullptr;\nint last_a6 = 0;\nint last_a7 = 0;\n\nbool hookedDSC_EXECUTE_COMMAND(__int64 dsc_address, float delta_time, __int64 start_time, void* wait_timer, int* a5, int a6, int a7)\n{\n\tlast_delta_time = delta_time;\n\tlast_start_time = start_time;\n\tlast_wait_timer = wait_timer;\n\tlast_a5 = a5;\n\tlast_a6 = a6;\n\tlast_a7 = a7;\n\n\treturn DSC_EXECUTE_COMMAND(dsc_address, delta_time, start_time, wait_timer, a5, a6, a7);\n}\n\nvoid serve()\n{\n\tusing namespace std;\n\n\tcout << \"[DSCRemote] Staring server...\" << endl;\n\n\tWSADATA wsadata;\n\tint result = WSAStartup(MAKEWORD(2, 2), &wsadata);\n\tif (result) // error\n\t{\n\t\tcout << \"[DSCRemote] E: WSAStartup error \" << result << '.' << endl;\n\t\treturn;\n\t}\n\n\tSOCKET sock;\n\tsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\n\tif (result == INVALID_SOCKET)\n\t{\n\t\tcout << \"[DSCRemote] E: Invalid socket.\" << endl;\n\t\tWSACleanup();\n\t\treturn;\n\t}\n\n\tsockaddr_in saddrin;\n\tsaddrin.sin_family = AF_INET;\n\tsaddrin.sin_addr.s_addr = 0;\n\tsaddrin.sin_port = htons(port);\n\n\tresult = ::bind(sock, (sockaddr*)&saddrin, sizeof(sockaddr_in));\n\tif (result) // error\n\t{\n\t\tcout << \"[DSCRemote] E: Couldn't bind port \" << port << '.' << endl;\n\t\tclosesocket(sock);\n\t\tWSACleanup();\n\t\treturn;\n\t}\n\n\tresult = listen(sock, 1);\n\tif (result) // error\n\t{\n\t\tcout << \"[DSCRemote] E: Couldn't listen.\" << endl;\n\t\tclosesocket(sock);\n\t\tWSACleanup();\n\t\treturn;\n\t}\n\twhile (true)\n\t{\n\t\tcout << \"[DSCRemote] Waiting for client...\" << endl;\n\t\tSOCKET client_sock;\n\t\tclient_sock = accept(sock, NULL, NULL);\n\t\tcout << \"[DSCRemote] Client accepted.\" << endl;\n\n\t\tchar buff_recv[64];\n\t\tvector<int> cmdStack;\n\t\tdo\n\t\t{\n\t\t\tresult = recv(client_sock, buff_recv, sizeof(buff_recv), 0);\n\t\t\tif (result > 0)\n\t\t\t{\n\t\t\t\tif (debug) cout << \"[DSCRemote] D: Received: \" << buff_recv << endl;\n\t\t\t\tif (buff_recv[0] != 'i')\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tlong stack = stol(buff_recv);\n\t\t\t\t\tfor (int i = 0; i < sizeof(buff_recv); i++) buff_recv[i] = '\\0';\n\t\t\t\t\tcmdStack.push_back(stack);\n\t\t\t\t\tconst char buff_out[] = \"Stacking command/parameter. Send 'i' to inject.\";\n\t\t\t\t\tsend(client_sock, buff_out, sizeof(buff_out), 0);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i < sizeof(buff_recv); i++) buff_recv[i] = '\\0';\n\n\t\t\t\tconst char buff_out[] = \"Injecting stack.\";\n\t\t\t\tsend(client_sock, buff_out, sizeof(buff_out), 0);\n\n\t\t\t\tconst int64_t dscbaseaddr = 0x140CDD978i64;\n\t\t\t\tint* currentpos = (int*)(dscbaseaddr + 0x2bf2c);\n\t\t\t\tint* command = (int*)(dscbaseaddr + 0xc);\n\n\t\t\t\tint posbk = *currentpos;\n\t\t\t\tvector<int> cmdbk;\n\t\t\t\tfor (int i=0; i<cmdStack.size(); i++)\n\t\t\t\t\tcmdbk.push_back(command[i]);\n\n\t\t\t\t*currentpos = 0;\n\n\t\t\t\tfor (int i = 0; i < cmdStack.size(); i++)\n\t\t\t\t{\n\t\t\t\t\tif (debug) cout << \"[DSCRemote] D: Injecting \" << cmdStack.at(i) << endl;\n\t\t\t\t\tcommand[i] = cmdStack.at(i);\n\t\t\t\t}\n\n\t\t\t\tcmdStack.clear();\n\n\t\t\t\tDSC_EXECUTE_COMMAND(dscbaseaddr, last_delta_time, last_start_time, last_wait_timer, last_a5, last_a6, last_a7);\n\n\t\t\t\tfor (int i = 0; i < cmdbk.size(); i++)\n\t\t\t\t{\n\t\t\t\t\tif (debug) cout << \"[DSCRemote] D: Restoring \" << cmdbk.at(i) << endl;\n\t\t\t\t\tcommand[i] = cmdbk.at(i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcmdbk.clear();\n\t\t\t\t*currentpos = posbk;\n\t\t\t}\n\t\t} while (result > 0);\n\t\tclosesocket(client_sock);\n\t\tcout << \"[DSCRemote] Restarting...\" << endl;\n\t}\n\n\tcout << \"[DSCRemote] Bye!\" << endl;\n\tclosesocket(sock);\n\tWSACleanup();\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\tusing namespace std;\n\n\t\tloadConfig();\n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tcout << \"[DSCRemote] Hooking functions...\" << endl;\n\t\tDetourAttach(&(PVOID&)DSC_EXECUTE_COMMAND, (PVOID)hookedDSC_EXECUTE_COMMAND);\n\t\tcout << \"[DSCRemote] Functions hooked.\" << endl;\n\t\tDetourTransactionCommit();\n\n\t\tthread* server_thread = new thread(serve);\n\t}\n\n\treturn TRUE;\n}\n\nPluginConfig::PluginConfigOption config[] = {\n\t{ PluginConfig::CONFIG_NUMERIC, new PluginConfig::PluginConfigNumericData{ L\"port\", L\"general\", CONFIG_FILE, L\"Port\", L\"TCP/IP port.\", 8139, 1, USHRT_MAX } },\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"debug\", L\"general\", CONFIG_FILE, L\"Debug\", L\"Print extra information.\", false } },\n};\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"DSCRemote\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"Allows external applications to send DSC commands via TCP/IP.\";\n}\n\nextern \"C\" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)\n{\n\treturn PluginConfig::PluginConfigArray{ _countof(config), config };\n}\n"
  },
  {
    "path": "source-code/source/plugins/DSCRemote/framework.h",
    "content": "#include <windows.h>\n#include <string>\n\nstd::wstring ExePath() {\n\tWCHAR buffer[MAX_PATH];\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\treturn std::wstring(buffer);\n}\n\nstd::wstring DirPath() {\n\tstd::wstring exepath = ExePath();\n\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\n\treturn exepath.substr(0, pos);\n}\n\nstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\DSCRemote.ini\";\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\n"
  },
  {
    "path": "source-code/source/plugins/DivaMovie/DivaMovie.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <VCProjectVersion>16.0</VCProjectVersion>\r\n    <ProjectGuid>{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}</ProjectGuid>\r\n    <RootNamespace>DivaMovie</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>MultiByte</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"Shared\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <TargetExt>.dva</TargetExt>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <TargetExt>.dva</TargetExt>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <SDLCheck>true</SDLCheck>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\simpleini;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r\n      <AdditionalDependencies>detours.lib;evr.lib;mfplat.lib;mfuuid.lib;strmiids.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\simpleini;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <AdditionalDependencies>detours.lib;evr.lib;mfplat.lib;mfuuid.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"dllmain.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"framework.h\" />\r\n    <ClInclude Include=\"PluginConfigApi.h\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DivaMovie/DivaMovie.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"PluginConfigApi.h\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DivaMovie/PluginConfigApi.h",
    "content": "#pragma once\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n#include <windows.h>\n#include <vector>\n\n// resolution class to store and sort the width and height easily\nclass resolution\n{\npublic:\n\tunsigned int width;\n\tunsigned int height;\n\n\tresolution()\n\t{\n\t\twidth = 0;\n\t\theight = 0;\n\t}\n\n\tresolution(unsigned int width, unsigned int height)\n\t{\n\t\tresolution::width = width;\n\t\tresolution::height = height;\n\t}\n\n\tbool operator ==(const resolution &res2)\n\t{\n\t\treturn width == res2.width && height == res2.height;\n\t}\n\n\t// in comparisons width takes priority because it's usually displayed first\n\tbool operator <(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height < res2.height;\n\t\telse\n\t\t\treturn width < res2.width;\n\t}\n\tbool operator >(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height > res2.height;\n\t\telse\n\t\t\treturn width > res2.width;\n\t}\n};\n\nnamespace PluginConfig\n{\n#pragma pack(push, 1)\n\tenum ConfigType {\n\t\tCONFIG_BOOLEAN,\n\t\tCONFIG_NUMERIC,\n\t\tCONFIG_STRING,\n\t\tCONFIG_DROPDOWN_INDEX,\n\t\tCONFIG_DROPDOWN_TEXT,\n\t\tCONFIG_DROPDOWN_NUMBER,\n\t\tCONFIG_RESOLUTION,\n\t\tCONFIG_GROUP_START,\n\t\tCONFIG_GROUP_END,\n\t\tCONFIG_BUTTON,\n\t\tCONFIG_SPACER\n\t};\n\n\tstruct PluginConfigBooleanData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tbool defaultVal;\n\t\tbool saveAsString;\n\t};\n\n\tstruct PluginConfigNumericData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tint minVal;\n\t\tint maxVal;\n\t};\n\n\tstruct PluginConfigStringData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownIndexData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t};\n\n\tstruct PluginConfigDropdownTextData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t\tbool editable;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownNumberData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<int> valueInts;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigResolutionData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniVarName2;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tresolution defaultVal;\n\t\tstd::vector<resolution> valueResolutions;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigGroupData\n\t{\n\t\tLPCWSTR name;\n\t\tint height;\n\t};\n\n\tstruct PluginConfigButtonData {\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tvoid(*func)();\n\t};\n\n\tstruct PluginConfigSpacerData {\n\t\tint height;\n\t};\n\n\tstruct PluginConfigOption\n\t{\n\t\tConfigType cfgType;\n\t\tvoid* data;\n\t};\n\n\tstruct PluginConfigArray\n\t{\n\t\tint len;\n\t\tPluginConfigOption* options;\n\t};\n#pragma pack(pop)\n}"
  },
  {
    "path": "source-code/source/plugins/DivaMovie/dllmain.cpp",
    "content": "#include \"framework.h\"\r\n#include \"PluginConfigApi.h\"\r\n\r\n#include <evr.h>\r\n\r\n#include <d3d9.h>\r\n#include <dvdmedia.h>\r\n#include <dxva2api.h>\r\n\r\n#include <mfapi.h>\r\n#include <mferror.h>\r\n#include <mftransform.h>\r\n#include <SimpleIni.h>\r\n\r\nbool forceSoftwareDecoding = false, forceHybridDecoding = false, debug = false;\r\n\r\nIDirect3DDeviceManager9* deviceManager;\r\n\r\nIMFTransform* mfTransform;\r\nint width;\r\nint height;\r\nunsigned long samplesize;\r\nunsigned long subtype;\r\n\r\nIMFSample* dstSample;\r\nIDirect3DSurface9* dstSurface;\r\nIMFSample* srcSample;\r\nIMFMediaBuffer* srcBuffer;\r\n\r\nHRESULT initialize(IMFTransform* transform)\r\n{\r\n\tHRESULT result = S_OK;\r\n\r\n\tIMFMediaType* type = NULL;\r\n\tIMFMediaBuffer* buffer = NULL;\r\n\tHANDLE hDevice = NULL;\r\n\tIDirectXVideoAccelerationService* service = NULL;\r\n\r\n\tAM_MEDIA_TYPE* format = NULL;\r\n\tVIDEOINFOHEADER2* header = NULL;\r\n\r\n\t// Release what we already had beforehand\r\n\tSAFE_RELEASE(mfTransform);\r\n\tSAFE_RELEASE(dstSample);\r\n\tSAFE_RELEASE(dstSurface);\r\n\tSAFE_RELEASE(srcSample);\r\n\tSAFE_RELEASE(srcBuffer);\r\n\r\n\tASSERT(transform->GetOutputCurrentType(0, &type));\r\n\tASSERT(type->GetRepresentation(AM_MEDIA_TYPE_REPRESENTATION, (void**)&format));\r\n\r\n\theader = (VIDEOINFOHEADER2*)format->pbFormat;\r\n\r\n\twidth = header->bmiHeader.biWidth;\r\n\theight = header->bmiHeader.biHeight;\r\n\tsamplesize = format->lSampleSize;\r\n\tsubtype = format->subtype.Data1;\r\n\r\n\t// System memory sample\r\n\tASSERT(MFCreateSample(&srcSample));\r\n\tASSERT(MFCreateMemoryBuffer(format->lSampleSize, &buffer));\r\n\tASSERT(srcSample->AddBuffer(buffer));\r\n\tASSERT(buffer->QueryInterface(&srcBuffer));\r\n\r\n\t// Video memory sample\r\n\tASSERT(deviceManager->OpenDeviceHandle(&hDevice));\r\n\tASSERT(deviceManager->GetVideoService(hDevice, __uuidof(IDirectXVideoAccelerationService), (void**)& service));\r\n\tASSERT(service->CreateSurface(width, height, 0, (D3DFORMAT)subtype, D3DPOOL_DEFAULT, 0, DXVA2_VideoSoftwareRenderTarget, &dstSurface, NULL));\r\n\tASSERT(MFCreateVideoSampleFromSurface(dstSurface, &dstSample));\r\n\tASSERT(deviceManager->CloseDeviceHandle(hDevice));\r\n\r\n\tmfTransform = transform;\r\n\tmfTransform->AddRef();\r\n\r\nend:\r\n\tif (format)\r\n\t\ttype->FreeRepresentation(AM_MEDIA_TYPE_REPRESENTATION, format);\r\n\r\n\tSAFE_RELEASE(service);\r\n\tSAFE_RELEASE(buffer);\r\n\tSAFE_RELEASE(type);\r\n\r\n\treturn result;\r\n}\r\n\r\nVTABLE_HOOK(HRESULT, IMFTransform, ProcessOutput, DWORD dwFlags, DWORD cOutputBufferCount,\r\n\tMFT_OUTPUT_DATA_BUFFER* pOutputSamples, DWORD* pdwStatus)\r\n{\r\n\tif (pOutputSamples->pSample != NULL || deviceManager == NULL || cOutputBufferCount != 1)\r\n\t\treturn originalProcessOutput(This, dwFlags, cOutputBufferCount, pOutputSamples, pdwStatus);\r\n\r\n\tHRESULT result = S_OK;\r\n\r\n\tif (mfTransform != This)\r\n\t\tASSERT(initialize(This));\r\n\r\n\tpOutputSamples->pSample = srcSample;\r\n\tpOutputSamples->pSample->AddRef();\r\n\r\n\tASSERT(originalProcessOutput(This, dwFlags, cOutputBufferCount, pOutputSamples, pdwStatus));\r\n\r\n\tD3DLOCKED_RECT rect;\r\n\tBYTE* buf;\r\n\tASSERT(srcBuffer->Lock(&buf, NULL, NULL));\r\n\tASSERT(dstSurface->LockRect(&rect, NULL, NULL));\r\n\tASSERT(MFCopyImage((BYTE*)rect.pBits, rect.Pitch, buf, samplesize, samplesize, 1));\r\n\tASSERT(dstSurface->UnlockRect());\r\n\tASSERT(srcBuffer->Unlock());\r\n\r\n\tLONGLONG duration;\r\n\tASSERT(srcSample->GetSampleDuration(&duration));\r\n\tASSERT(dstSample->SetSampleDuration(duration));\r\n\r\n\tLONGLONG time;\r\n\tASSERT(srcSample->GetSampleTime(&time));\r\n\tASSERT(dstSample->SetSampleTime(time));\r\n\r\n\tDWORD flags;\r\n\tASSERT(srcSample->GetSampleFlags(&flags));\r\n\tASSERT(dstSample->SetSampleFlags(flags));\r\n\r\n\tpOutputSamples->pSample->Release();\r\n\tpOutputSamples->pSample = dstSample;\r\n\tpOutputSamples->pSample->AddRef();\r\nend:\r\n\treturn result;\r\n}\r\n\r\nVTABLE_HOOK(HRESULT, IMFTransform, ProcessMessage, MFT_MESSAGE_TYPE eMessage, ULONG_PTR ulParam)\r\n{\r\n\tif (forceSoftwareDecoding)\r\n\t{\r\n\t\tif (eMessage == MFT_MESSAGE_SET_D3D_MANAGER) {\r\n\t\t\tPRINT(\"[DivaMovie] Force Software Decoding enabled\\n\");\r\n\t\t\tINSTALL_VTABLE_HOOK(This, ProcessOutput, 25);\r\n\t\t\treturn S_OK;\r\n\t\t}\r\n\t\treturn originalProcessMessage(This, eMessage, ulParam);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tHRESULT result = originalProcessMessage(This, eMessage, ulParam);\r\n\t\tif (eMessage == MFT_MESSAGE_SET_D3D_MANAGER && result == MF_E_UNSUPPORTED_D3D_TYPE)\r\n\t\t{\r\n\t\t\tPRINT(\"[DivaMovie] This system does not support DXVA hardware decoding\\n\");\r\n\t\t\tresult = originalProcessMessage(This, eMessage, NULL);\r\n\t\t\tif (SUCCEEDED(result))\r\n\t\t\t\tINSTALL_VTABLE_HOOK(This, ProcessOutput, 25);\r\n\t\t}\r\n\t\telse if (!forceHybridDecoding && eMessage == MFT_MESSAGE_SET_D3D_MANAGER && result == 0)\r\n\t\t{\r\n\t\t\tstatic bool warn = false;\r\n\t\t\tif (!warn)\r\n\t\t\t{\r\n\t\t\t\tMessageBoxW(0, L\"Your system supports DXVA hardware decoding and Force Hybrid Decoding is disabled.\\nDivaMovie will be disabled.\\n\\nIt is HIGHLY recommended to restart the game now.\", L\"DivaMovie\", MB_ICONINFORMATION);\r\n\r\n\t\t\t\tCSimpleIniW ini_reader;\r\n\t\t\t\tini_reader.SetUnicode(false);\r\n\t\t\t\tini_reader.LoadFile(MASTER_CONFIG_FILE);\r\n\t\t\t\tini_reader.SetValue(L\"plugins\", L\"DivaMovie.dva\", L\"0\");\r\n\t\t\t\tini_reader.SaveFile(MASTER_CONFIG_FILE);\r\n\r\n\t\t\t\twarn = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\t\r\n}\r\n\r\nHOOK(void*, IMFTransformInitializer, 0x140420B90, void* a1, void* a2, IMFTransform** transform)\r\n{\r\n\tvoid* result = originalIMFTransformInitializer(a1, a2, transform);\r\n\tINSTALL_VTABLE_HOOK(*transform, ProcessMessage, 23);\r\n\treturn result;\r\n}\r\n\r\nHOOK(HRESULT, DXVA2CreateDirect3DDeviceManager, PROC_ADDRESS(\"dxva2.dll\", \"DXVA2CreateDirect3DDeviceManager9\"),\r\n\tUINT* pResetToken, IDirect3DDeviceManager9** ppDeviceManager)\r\n{\r\n\tHRESULT result = originalDXVA2CreateDirect3DDeviceManager(pResetToken, ppDeviceManager);\r\n\r\n\tif (FAILED(result))\r\n\t\treturn result;\r\n\r\n\tif (deviceManager)\r\n\t\tdeviceManager->Release();\r\n\r\n\tdeviceManager = *ppDeviceManager;\r\n\tdeviceManager->AddRef();\r\n\r\n\treturn result;\r\n}\r\n\r\nvoid loadConfig() {\r\n\tforceSoftwareDecoding = GetPrivateProfileIntW(L\"general\", L\"force_software_decoding\", 0, CONFIG_FILE) > 0 ? true : false;\r\n\tforceHybridDecoding = GetPrivateProfileIntW(L\"general\", L\"force_hybrid_decoding\", 0, CONFIG_FILE) > 0 ? true : false;\r\n\tdebug = GetPrivateProfileIntW(L\"general\", L\"debug\", 0, CONFIG_FILE) > 0 ? true : false;\r\n}\r\n\r\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\r\n{\r\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\r\n\t{\r\n\t\tloadConfig();\r\n\t\tINSTALL_HOOK(DXVA2CreateDirect3DDeviceManager);\r\n\t\tINSTALL_HOOK(IMFTransformInitializer);\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nPluginConfig::PluginConfigOption config[] = {\r\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"force_software_decoding\", L\"general\", CONFIG_FILE, L\"Force Software Decoding\", L\"Use software decoding even on systems that support DXVA hardware decoding.\", false } },\r\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"force_hybrid_decoding\", L\"general\", CONFIG_FILE, L\"Force Hybrid Decoding\", L\"Do not disable DivaMovie on systems that support DXVA hardware decoding.\\nCan cause issues on recent drivers.\", false } },\r\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"debug\", L\"general\", CONFIG_FILE, L\"Debug (slow!)\", L\"Enable PRINT (possibly at the cost of performance).\", false } },\r\n};\r\n\r\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\r\n{\r\n\treturn L\"DivaMovie\";\r\n}\r\n\r\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\r\n{\r\n\treturn L\"DivaMovie Plugin by Skyth\\n\\nDivaMovie enables movies on systems that do not support DXVA hardware decoding.\";\r\n}\r\n\r\nextern \"C\" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)\r\n{\r\n\treturn PluginConfig::PluginConfigArray{ _countof(config), config };\r\n}"
  },
  {
    "path": "source-code/source/plugins/DivaMovie/framework.h",
    "content": "#pragma once\r\n\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#include <cstdio>\r\n#include <windows.h>\r\n#include <detours.h>\r\n#include <string>\r\n\r\nstd::wstring ExePath() {\r\n\tWCHAR buffer[MAX_PATH];\r\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\r\n\treturn std::wstring(buffer);\r\n}\r\n\r\nstd::wstring DirPath() {\r\n\tstd::wstring exepath = ExePath();\r\n\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\r\n\treturn exepath.substr(0, pos);\r\n}\r\n\r\nstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\DivaMovie.ini\";\r\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\r\n\r\nstd::wstring MASTER_CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\config.ini\";\r\nLPCWSTR MASTER_CONFIG_FILE = MASTER_CONFIG_FILE_STRING.c_str();\r\n\r\n#define PRINT(value, ...) if (debug) printf(value, __VA_ARGS__);\r\n\r\n#define PROC_ADDRESS(libraryName, procName) \\\r\n\tGetProcAddress(LoadLibrary(TEXT(libraryName)), procName)\r\n\r\n#define SAFE_RELEASE(object) if (object) { object->Release(); object = NULL; }\r\n\r\n#define VTABLE_HOOK(returnType, className, functionName, ...) \\\r\n\ttypedef returnType functionName(className* This, __VA_ARGS__); \\\r\n\tfunctionName* original##functionName; \\\r\n\treturnType implOf##functionName(className* This, __VA_ARGS__)\r\n\r\n#define INSTALL_VTABLE_HOOK(object, functionName, functionIndex) \\\r\n\t{ \\\r\n\t\tvoid** addr = &(*(void***)object)[functionIndex]; \\\r\n\t\tif (*addr != implOf##functionName) \\\r\n\t\t{ \\\r\n\t\t\tPRINT(\"[DivaMovie] Installing %s hook...\\n\", #functionName); \\\r\n\t\t\toriginal##functionName = (functionName*)*addr; \\\r\n\t\t\tDWORD oldProtect; \\\r\n\t\t\tVirtualProtect(addr, sizeof(void*), PAGE_EXECUTE_READWRITE, &oldProtect); \\\r\n\t\t\t*addr = implOf##functionName; \\\r\n\t\t\tVirtualProtect(addr, sizeof(void*), oldProtect, NULL); \\\r\n\t\t} \\\r\n\t}\r\n\r\n#define HOOK(returnType, function, location, ...) \\\r\n    typedef returnType function(__VA_ARGS__); \\\r\n    function* original##function = (function*)location; \\\r\n    returnType implOf##function(__VA_ARGS__)\r\n\r\n#define INSTALL_HOOK(functionName) \\\r\n\t{ \\\r\n\t\tPRINT(\"[DivaMovie] Installing %s hook...\\n\", #functionName); \\\r\n\t\tDetourTransactionBegin(); \\\r\n\t\tDetourUpdateThread(GetCurrentThread()); \\\r\n\t\tDetourAttach((void**)&original##functionName, implOf##functionName); \\\r\n\t\tDetourTransactionCommit(); \\\r\n\t}\r\n\r\n#define ASSERT(function) \\\r\n\tif (FAILED(result = (function))) \\\r\n\t{ \\\r\n\t\tPRINT(\"[DivaMovie] %s failed (error code: 0x%08x)\\n\", #function, (unsigned int)result); \\\r\n\t\tgoto end; \\\r\n\t} /*\\\r\n\telse \\\r\n\t{ \\\r\n\t\tPRINT(\"[DivaMovie] %s succeeded\\n\", #function); \\\r\n\t}*/\r\n"
  },
  {
    "path": "source-code/source/plugins/DivaSound/DivaSound.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}</ProjectGuid>\n    <RootNamespace>DivaSound</RootNamespace>\n    <ProjectName>DivaSound</ProjectName>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v142</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\detours\\include;miniaudio;bassasio</AdditionalIncludeDirectories>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>detours.lib;syelog.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;bassasio</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\detours\\include;miniaudio;bassasio</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>detours.lib;syelog.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;bassasio</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\framework.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DivaSound/DivaSound.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DivaSound/bassasio/bassasio.h",
    "content": "/*\n\tBASSASIO 1.4 C/C++ header file\n\tCopyright (c) 2005-2019 Un4seen Developments Ltd.\n\n\tSee the BASSASIO.CHM file for more detailed documentation\n*/\n/*\n\tDivaSound version -- loads the required functions at runtime\n*/\n\n#ifndef BASSASIO_H\n#define BASSASIO_H\n\n#include <wtypes.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef BASSASIODEF\n#define BASSASIODEF(f) WINAPI f\n#endif\n\n#define BASSASIOVERSION 0x104\t// API version\n\n// error codes returned by BASS_ASIO_ErrorGetCode\n#define BASS_OK\t\t\t\t0\t// all is OK\n#define BASS_ERROR_FILEOPEN\t2\t// can't open the file\n#define BASS_ERROR_DRIVER\t3\t// can't find a free/valid driver\n#define BASS_ERROR_HANDLE\t5\t// invalid handle\n#define BASS_ERROR_FORMAT\t6\t// unsupported sample format\n#define BASS_ERROR_INIT\t\t8\t// BASS_ASIO_Init has not been successfully called\n#define BASS_ERROR_START\t9\t// BASS_ASIO_Start has/hasn't been called\n#define BASS_ERROR_ALREADY\t14\t// already initialized/started\n#define BASS_ERROR_NOCHAN\t18\t// no channels are enabled\n#define BASS_ERROR_ILLPARAM\t20\t// an illegal parameter was specified\n#define BASS_ERROR_DEVICE\t23\t// illegal device number\n#define BASS_ERROR_NOTAVAIL\t37\t// not available\n#define BASS_ERROR_UNKNOWN\t-1\t// some other mystery error\n\n// BASS_ASIO_Init flags\n#define BASS_ASIO_THREAD\t1 // host driver in dedicated thread\n#define BASS_ASIO_JOINORDER\t2 // order joined channels by when they were joined\n\n// device info structure\ntypedef struct {\n\tconst char *name;\t// description\n\tconst char *driver;\t// driver\n} BASS_ASIO_DEVICEINFO;\n\ntypedef struct {\n\tchar name[32];\t// driver name\n\tDWORD version;\t// driver version\n\tDWORD inputs;\t// number of inputs\n\tDWORD outputs;\t// number of outputs\n\tDWORD bufmin;\t// minimum buffer length\n\tDWORD bufmax;\t// maximum buffer length\n\tDWORD bufpref;\t// preferred/default buffer length\n\tint bufgran;\t// buffer length granularity\n\tDWORD initflags; // BASS_ASIO_Init \"flags\" parameter\n} BASS_ASIO_INFO;\n\ntypedef struct {\n\tDWORD group;\n\tDWORD format;\t// sample format (BASS_ASIO_FORMAT_xxx)\n\tchar name[32];\t// channel name\n} BASS_ASIO_CHANNELINFO;\n\n// sample formats\n#define BASS_ASIO_FORMAT_16BIT\t\t16 // 16-bit integer\n#define BASS_ASIO_FORMAT_24BIT\t\t17 // 24-bit integer\n#define BASS_ASIO_FORMAT_32BIT\t\t18 // 32-bit integer\n#define BASS_ASIO_FORMAT_FLOAT\t\t19 // 32-bit floating-point\n#define BASS_ASIO_FORMAT_DSD_LSB\t32 // DSD (LSB 1st)\n#define BASS_ASIO_FORMAT_DSD_MSB\t33 // DSD (MSB 1st)\n#define BASS_ASIO_FORMAT_DITHER\t\t0x100 // flag: apply dither when converting from floating-point to integer\n\n// BASS_ASIO_ChannelReset flags\n#define BASS_ASIO_RESET_ENABLE\t1 // disable channel\n#define BASS_ASIO_RESET_JOIN\t2 // unjoin channel\n#define BASS_ASIO_RESET_PAUSE\t4 // unpause channel\n#define BASS_ASIO_RESET_FORMAT\t8 // reset sample format to native format\n#define BASS_ASIO_RESET_RATE\t16 // reset sample rate to device rate\n#define BASS_ASIO_RESET_VOLUME\t32 // reset volume to 1.0\n#define BASS_ASIO_RESET_JOINED\t0x10000 // apply to joined channels too\n\n// BASS_ASIO_ChannelIsActive return values\n#define BASS_ASIO_ACTIVE_DISABLED\t0\n#define BASS_ASIO_ACTIVE_ENABLED\t1\n#define BASS_ASIO_ACTIVE_PAUSED\t\t2\n\ntypedef DWORD (CALLBACK ASIOPROC)(BOOL input, DWORD channel, void *buffer, DWORD length, void *user);\n/* ASIO channel callback function.\ninput  : Input? else output\nchannel: Channel number\nbuffer : Buffer containing the sample data\nlength : Number of bytes\nuser   : The 'user' parameter given when calling BASS_ASIO_ChannelEnable\nRETURN : The number of bytes written (ignored with input channels) */\n\ntypedef void (CALLBACK ASIONOTIFYPROC)(DWORD notify, void *user);\n/* Driver notification callback function.\nnotify : The notification (BASS_ASIO_NOTIFY_xxx)\nuser   : The 'user' parameter given when calling BASS_ASIO_SetNotify */\n\n// driver notifications\n#define BASS_ASIO_NOTIFY_RATE\t1 // sample rate change\n#define BASS_ASIO_NOTIFY_RESET\t2 // reset (reinitialization) request\n\n// BASS_ASIO_ChannelGetLevel flags\n#define BASS_ASIO_LEVEL_RMS\t\t0x1000000\n\nHMODULE bassAsioModule = LoadLibraryW(L\"bassasio.dll\");\n\nDWORD(WINAPI* BASS_ASIO_GetVersion)() = (DWORD(WINAPI*)())GetProcAddress(bassAsioModule, \"BASS_ASIO_GetVersion\");\nBOOL(WINAPI* BASS_ASIO_SetUnicode)(BOOL unicode) = (BOOL(WINAPI*)(BOOL unicode))GetProcAddress(bassAsioModule, \"BASS_ASIO_SetUnicode\");\n// DWORD BASSASIODEF(BASS_ASIO_ErrorGetCode)();\nBOOL(WINAPI* BASS_ASIO_GetDeviceInfo)(DWORD device, BASS_ASIO_DEVICEINFO *info) = (BOOL(WINAPI*)(DWORD device, BASS_ASIO_DEVICEINFO *info))GetProcAddress(bassAsioModule, \"BASS_ASIO_GetDeviceInfo\");\n// DWORD BASSASIODEF(BASS_ASIO_AddDevice)(const GUID *clsid, const char *driver, const char *name);\n// BOOL BASSASIODEF(BASS_ASIO_SetDevice)(DWORD device);\n// DWORD BASSASIODEF(BASS_ASIO_GetDevice)();\nBOOL(WINAPI* BASS_ASIO_Init)(int device, DWORD flags) = (BOOL(WINAPI*)(int device, DWORD flags))GetProcAddress(bassAsioModule, \"BASS_ASIO_Init\");\nBOOL(WINAPI* BASS_ASIO_Free)() = (BOOL(WINAPI*)())GetProcAddress(bassAsioModule, \"BASS_ASIO_Free\");\n// BOOL BASSASIODEF(BASS_ASIO_Lock)(BOOL lock);\nBOOL(WINAPI* BASS_ASIO_SetNotify)(ASIONOTIFYPROC *proc, void *user) = (BOOL(WINAPI*)(ASIONOTIFYPROC *proc, void *user))GetProcAddress(bassAsioModule, \"BASS_ASIO_SetNotify\");\nBOOL(WINAPI* BASS_ASIO_ControlPanel)() = (BOOL(WINAPI*)())GetProcAddress(bassAsioModule, \"BASS_ASIO_ControlPanel\");\nBOOL(WINAPI* BASS_ASIO_GetInfo)(BASS_ASIO_INFO *info) = (BOOL(WINAPI*)(BASS_ASIO_INFO *info))GetProcAddress(bassAsioModule, \"BASS_ASIO_GetInfo\");\nBOOL(WINAPI* BASS_ASIO_CheckRate)(double rate) = (BOOL(WINAPI*)(double rate))GetProcAddress(bassAsioModule, \"BASS_ASIO_CheckRate\");\nBOOL(WINAPI* BASS_ASIO_SetRate)(double rate) = (BOOL(WINAPI*)(double rate))GetProcAddress(bassAsioModule, \"BASS_ASIO_SetRate\");\ndouble(WINAPI* BASS_ASIO_GetRate)() = (double(WINAPI*)())GetProcAddress(bassAsioModule, \"BASS_ASIO_GetRate\");\nBOOL(WINAPI* BASS_ASIO_Start)(DWORD buflen, DWORD threads) = (BOOL(WINAPI*)(DWORD buflen, DWORD threads))GetProcAddress(bassAsioModule, \"BASS_ASIO_Start\");\nBOOL(WINAPI* BASS_ASIO_Stop)() = (BOOL(WINAPI*)())GetProcAddress(bassAsioModule, \"BASS_ASIO_Stop\");\nBOOL(WINAPI* BASS_ASIO_IsStarted)() = (BOOL(WINAPI*)())GetProcAddress(bassAsioModule, \"BASS_ASIO_IsStarted\");\n// DWORD BASSASIODEF(BASS_ASIO_GetLatency)(BOOL input);\n// float BASSASIODEF(BASS_ASIO_GetCPU)();\n// BOOL BASSASIODEF(BASS_ASIO_Monitor)(int input, DWORD output, DWORD gain, DWORD state, DWORD pan);\n// BOOL BASSASIODEF(BASS_ASIO_SetDSD)(BOOL dsd);\n// BOOL BASSASIODEF(BASS_ASIO_Future)(DWORD selector, void *param);\n\n// BOOL BASSASIODEF(BASS_ASIO_ChannelGetInfo)(BOOL input, DWORD channel, BASS_ASIO_CHANNELINFO *info);\n// BOOL BASSASIODEF(BASS_ASIO_ChannelReset)(BOOL input, int channel, DWORD flags);\nBOOL(WINAPI* BASS_ASIO_ChannelEnable)(BOOL input, DWORD channel, ASIOPROC *proc, void *user) = (BOOL(WINAPI*)(BOOL input, DWORD channel, ASIOPROC *proc, void *user))GetProcAddress(bassAsioModule, \"BASS_ASIO_ChannelEnable\");\n// BOOL BASSASIODEF(BASS_ASIO_ChannelEnableMirror)(DWORD channel, BOOL input2, DWORD channel2);\n// BOOL BASSASIODEF(BASS_ASIO_ChannelEnableBASS)(BOOL input, DWORD channel, DWORD handle, BOOL join);\nBOOL(WINAPI* BASS_ASIO_ChannelJoin)(BOOL input, DWORD channel, int channel2) = (BOOL(WINAPI*)(BOOL input, DWORD channel, int channel2))GetProcAddress(bassAsioModule, \"BASS_ASIO_ChannelJoin\");\n// BOOL BASSASIODEF(BASS_ASIO_ChannelPause)(BOOL input, DWORD channel);\n// DWORD BASSASIODEF(BASS_ASIO_ChannelIsActive)(BOOL input, DWORD channel);\nBOOL(WINAPI* BASS_ASIO_ChannelSetFormat)(BOOL input, DWORD channel, DWORD format) = (BOOL(WINAPI*)(BOOL input, DWORD channel, DWORD format))GetProcAddress(bassAsioModule, \"BASS_ASIO_ChannelSetFormat\");\n// DWORD BASSASIODEF(BASS_ASIO_ChannelGetFormat)(BOOL input, DWORD channel);\nBOOL(WINAPI* BASS_ASIO_ChannelSetRate)(BOOL input, DWORD channel, double rate) = (BOOL(WINAPI*)(BOOL input, DWORD channel, double rate))GetProcAddress(bassAsioModule, \"BASS_ASIO_ChannelSetRate\");\n// double BASSASIODEF(BASS_ASIO_ChannelGetRate)(BOOL input, DWORD channel);\n// BOOL BASSASIODEF(BASS_ASIO_ChannelSetVolume)(BOOL input, int channel, float volume);\n// float BASSASIODEF(BASS_ASIO_ChannelGetVolume)(BOOL input, int channel);\n// float BASSASIODEF(BASS_ASIO_ChannelGetLevel)(BOOL input, DWORD channel);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "source-code/source/plugins/DivaSound/miniaudio/miniaudio.h",
    "content": "/*\nAudio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file.\nminiaudio (formerly mini_al) - v0.9.5 - 2019-05-21\n\nDavid Reid - davidreidsoftware@gmail.com\n*/\n\n/*\nMAJOR CHANGES IN VERSION 0.9\n============================\nVersion 0.9 includes major API changes, centered mostly around full-duplex and the rebrand to \"miniaudio\". Before I go into\ndetail about the major changes I would like to apologize. I know it's annoying dealing with breaking API changes, but I think\nit's best to get these changes out of the way now while the library is still relatively young and unknown.\n\nThere's been a lot of refactoring with this release so there's a good chance a few bugs have been introduced. I apologize in\nadvance for this. You may want to hold off on upgrading for the short term if you're worried. If mini_al v0.8.14 works for\nyou, and you don't need full-duplex support, you can avoid upgrading (though you won't be getting future bug fixes).\n\n\nRebranding to \"miniaudio\"\n-------------------------\nThe decision was made to rename mini_al to miniaudio. Don't worry, it's the same project. The reason for this is simple:\n\n1) Having the word \"audio\" in the title makes it immediately clear that the library is related to audio; and\n2) I don't like the look of the underscore.\n\nThis rebrand has necessitated a change in namespace from \"mal\" to \"ma\". I know this is annoying, and I apologize, but it's\nbetter to get this out of the road now rather than later. Also, since there are necessary API changes for full-duplex support\nI think it's better to just get the namespace change over and done with at the same time as the full-duplex changes. I'm hoping\nthis will be the last of the major API changes. Fingers crossed!\n\nThe implementation define is now \"#define MINIAUDIO_IMPLEMENTATION\". You can also use \"#define MA_IMPLEMENTATION\" if that's\nyour preference.\n\n\nFull-Duplex Support\n-------------------\nThe major feature added to version 0.9 is full-duplex. This has necessitated a few API changes.\n\n1) The data callback has now changed. Previously there was one type of callback for playback and another for capture. I wanted\n   to avoid a third callback just for full-duplex so the decision was made to break this API and unify the callbacks. Now,\n   there is just one callback which is the same for all three modes (playback, capture, duplex). The new callback looks like\n   the following:\n\n       void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);\n\n   This callback allows you to move data straight out of the input buffer and into the output buffer in full-duplex mode. In\n   playback-only mode, pInput will be null. Likewise, pOutput will be null in capture-only mode. The sample count is no longer\n   returned from the callback since it's not necessary for miniaudio anymore.\n\n2) The device config needed to change in order to support full-duplex. Full-duplex requires the ability to allow the client\n   to choose a different PCM format for the playback and capture sides. The old ma_device_config object simply did not allow\n   this and needed to change. With these changes you now specify the device ID, format, channels, channel map and share mode\n   on a per-playback and per-capture basis (see example below). The sample rate must be the same for playback and capture.\n\n   Since the device config API has changed I have also decided to take the opportunity to simplify device initialization. Now,\n   the device ID, device type and callback user data are set in the config. ma_device_init() is now simplified down to taking\n   just the context, device config and a pointer to the device object being initialized. The rationale for this change is that\n   it just makes more sense to me that these are set as part of the config like everything else.\n\n   Example device initialization:\n\n       ma_device_config config = ma_device_config_init(ma_device_type_duplex);   // Or ma_device_type_playback or ma_device_type_capture.\n       config.playback.pDeviceID = &myPlaybackDeviceID; // Or NULL for the default playback device.\n       config.playback.format    = ma_format_f32;\n       config.playback.channels  = 2;\n       config.capture.pDeviceID  = &myCaptureDeviceID;  // Or NULL for the default capture device.\n       config.capture.format     = ma_format_s16;\n       config.capture.channels   = 1;\n       config.sampleRate         = 44100;\n       config.dataCallback       = data_callback;\n       config.pUserData          = &myUserData;\n\n       result = ma_device_init(&myContext, &config, &device);\n       if (result != MA_SUCCESS) {\n           ... handle error ...\n       }\n\n   Note that the \"onDataCallback\" member of ma_device_config has been renamed to \"dataCallback\". Also, \"onStopCallback\" has\n   been renamed to \"stopCallback\".\n\nThis is the first pass for full-duplex and there is a known bug. You will hear crackling on the following backends when sample\nrate conversion is required for the playback device:\n  - Core Audio\n  - JACK\n  - AAudio\n  - OpenSL\n  - WebAudio\n\nIn addition to the above, not all platforms have been absolutely thoroughly tested simply because I lack the hardware for such\nthorough testing. If you experience a bug, an issue report on GitHub or an email would be greatly appreciated (and a sample\nprogram that reproduces the issue if possible).\n\n\nOther API Changes\n-----------------\nIn addition to the above, the following API changes have been made:\n\n- The log callback is no longer passed to ma_context_config_init(). Instead you need to set it manually after initialization.\n- The onLogCallback member of ma_context_config has been renamed to \"logCallback\".\n- The log callback now takes a logLevel parameter. The new callback looks like: void log_callback(ma_context* pContext, ma_device* pDevice, ma_uint32 logLevel, const char* message)\n  - You can use ma_log_level_to_string() to convert the logLevel to human readable text if you want to log it.\n- Some APIs have been renamed:\n  - mal_decoder_read()          -> ma_decoder_read_pcm_frames()\n  - mal_decoder_seek_to_frame() -> ma_decoder_seek_to_pcm_frame()\n  - mal_sine_wave_read()        -> ma_sine_wave_read_f32()\n  - mal_sine_wave_read_ex()     -> ma_sine_wave_read_f32_ex()\n- Some APIs have been removed:\n  - mal_device_get_buffer_size_in_bytes()\n  - mal_device_set_recv_callback()\n  - mal_device_set_send_callback()\n  - mal_src_set_input_sample_rate()\n  - mal_src_set_output_sample_rate()\n- Error codes have been rearranged. If you're a binding maintainer you will need to update.\n- The ma_backend enums have been rearranged to priority order. The rationale for this is to simplify automatic backend selection\n  and to make it easier to see the priority. If you're a binding maintainer you will need to update.\n- ma_dsp has been renamed to ma_pcm_converter. The rationale for this change is that I'm expecting \"ma_dsp\" to conflict with\n  some future planned high-level APIs.\n- For functions that take a pointer/count combo, such as ma_decoder_read_pcm_frames(), the parameter order has changed so that\n  the pointer comes before the count. The rationale for this is to keep it consistent with things like memcpy().\n\n\nMiscellaneous Changes\n---------------------\nThe following miscellaneous changes have also been made.\n\n- The AAudio backend has been added for Android 8 and above. This is Android's new \"High-Performance Audio\" API. (For the\n  record, this is one of the nicest audio APIs out there, just behind the BSD audio APIs).\n- The WebAudio backend has been added. This is based on ScriptProcessorNode. This removes the need for SDL.\n- The SDL and OpenAL backends have been removed. These were originally implemented to add support for platforms for which miniaudio\n  was not explicitly supported. These are no longer needed and have therefore been removed.\n- Device initialization now fails if the requested share mode is not supported. If you ask for exclusive mode, you either get an\n  exclusive mode device, or an error. The rationale for this change is to give the client more control over how to handle cases\n  when the desired shared mode is unavailable.\n- A lock-free ring buffer API has been added. There are two varients of this. \"ma_rb\" operates on bytes, whereas \"ma_pcm_rb\"\n  operates on PCM frames.\n- The library is now licensed as a choice of Public Domain (Unlicense) _or_ MIT-0 (No Attribution) which is the same as MIT, but\n  removes the attribution requirement. The rationale for this is to support countries that don't recognize public domain.\n*/\n\n/*\nABOUT\n=====\nminiaudio is a single file library for audio playback and capture. It's written in C (compilable as\nC++) and released into the public domain.\n\nSupported Backends:\n  - WASAPI\n  - DirectSound\n  - WinMM\n  - Core Audio (Apple)\n  - ALSA\n  - PulseAudio\n  - JACK\n  - sndio (OpenBSD)\n  - audio(4) (NetBSD and OpenBSD)\n  - OSS (FreeBSD)\n  - AAudio (Android 8.0+)\n  - OpenSL|ES (Android only)\n  - Web Audio (Emscripten)\n  - Null (Silence)\n\nSupported Formats:\n  - Unsigned 8-bit PCM\n  - Signed 16-bit PCM\n  - Signed 24-bit PCM (tightly packed)\n  - Signed 32-bit PCM\n  - IEEE 32-bit floating point PCM\n\n\nUSAGE\n=====\nminiaudio is a single-file library. To use it, do something like the following in one .c file.\n  #define MINIAUDIO_IMPLEMENTATION\n  #include \"miniaudio.h\"\n\nYou can then #include this file in other parts of the program as you would with any other header file.\n\nminiaudio uses an asynchronous, callback based API. You initialize a device with a configuration (sample rate,\nchannel count, etc.) which includes the callback you want to use to handle data transmission to/from the\ndevice. In the callback you either read from a data pointer in the case of playback or write to it in the case\nof capture.\n\nPlayback Example\n----------------\n  void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)\n  {\n      ma_decoder* pDecoder = (ma_decoder*)pDevice->pUserData;\n      if (pDecoder == NULL) {\n          return;\n      }\n  \n      ma_decoder_read_pcm_frames(pDecoder, frameCount, pOutput);\n  }\n\n  ...\n\n  ma_device_config config = ma_device_config_init(ma_device_type_playback);\n  config.playback.format   = decoder.outputFormat;\n  config.playback.channels = decoder.outputChannels;\n  config.sampleRate        = decoder.outputSampleRate;\n  config.dataCallback      = data_callback;\n  config.pUserData         = &decoder;\n\n  ma_device device;\n  if (ma_device_init(NULL, &config, &device) != MA_SUCCESS) {\n      ... An error occurred ...\n  }\n\n  ma_device_start(&device);     // The device is sleeping by default so you'll need to start it manually.\n\n  ...\n\n  ma_device_uninit(&device);    // This will stop the device so no need to do that manually.\n\n\nBUILDING\n========\nminiaudio should Just Work by adding it to your project's source tree. You do not need to download or install\nany dependencies. See below for platform-specific details.\n\nIf you want to disable a specific backend, #define the appropriate MA_NO_* option before the implementation.\n\nNote that GCC and Clang requires \"-msse2\", \"-mavx2\", etc. for SIMD optimizations.\n\n\nBuilding for Windows\n--------------------\nThe Windows build should compile clean on all popular compilers without the need to configure any include paths\nnor link to any libraries.\n\nBuilding for macOS and iOS\n--------------------------\nThe macOS build should compile clean without the need to download any dependencies or link to any libraries or\nframeworks. The iOS build needs to be compiled as Objective-C (sorry) and will need to link the relevant frameworks\nbut should Just Work with Xcode.\n\nBuilding for Linux\n------------------\nThe Linux build only requires linking to -ldl, -lpthread and -lm. You do not need any development packages.\n\nBuilding for BSD\n----------------\nThe BSD build only requires linking to -ldl, -lpthread and -lm. NetBSD uses audio(4), OpenBSD uses sndio and\nFreeBSD uses OSS.\n\nBuilding for Android\n--------------------\nAAudio is the highest priority backend on Android. This should work out out of the box without needing any kind of\ncompiler configuration. Support for AAudio starts with Android 8 which means older versions will fall back to\nOpenSL|ES which requires API level 16+.\n\nBuilding for Emscripten\n-----------------------\nThe Emscripten build emits Web Audio JavaScript directly and should Just Work without any configuration.\n\n\nNOTES\n=====\n- This library uses an asynchronous API for delivering and requesting audio data. Each device will have\n  it's own worker thread which is managed by the library.\n- If ma_device_init() is called with a device that's not aligned to the platform's natural alignment\n  boundary (4 bytes on 32-bit, 8 bytes on 64-bit), it will _not_ be thread-safe. The reason for this\n  is that it depends on members of ma_device being correctly aligned for atomic assignments.\n- Sample data is always native-endian and interleaved. For example, ma_format_s16 means signed 16-bit\n  integer samples, interleaved. Let me know if you need non-interleaved and I'll look into it.\n- The sndio backend is currently only enabled on OpenBSD builds.\n- The audio(4) backend is supported on OpenBSD, but you may need to disable sndiod before you can use it.\n- Automatic stream routing is enabled on a per-backend basis. Support is explicitly enabled for WASAPI\n  and Core Audio, however other backends such as PulseAudio may naturally support it, though not all have\n  been tested.\n\n\nBACKEND NUANCES\n===============\n\nPulseAudio\n----------\n- If you experience bad glitching/noise on Arch Linux, consider this fix from the Arch wiki:\n    https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Glitches,_skips_or_crackling\n  Alternatively, consider using a different backend such as ALSA.\n\nAndroid\n-------\n- To capture audio on Android, remember to add the RECORD_AUDIO permission to your manifest:\n    <uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n- With OpenSL|ES, only a single ma_context can be active at any given time. This is due to a limitation with OpenSL|ES.\n- With AAudio, only default devices are enumerated. This is due to AAudio not having an enumeration API (devices are\n  enumerated through Java). You can however perform your own device enumeration through Java and then set the ID in the\n  ma_device_id structure (ma_device_id.aaudio) and pass it to ma_device_init().\n- The backend API will perform resampling where possible. The reason for this as opposed to using miniaudio's built-in\n  resampler is to take advantage of any potential device-specific optimizations the driver may implement.\n\nUWP\n---\n- UWP only supports default playback and capture devices.\n- UWP requires the Microphone capability to be enabled in the application's manifest (Package.appxmanifest):\n      <Package ...>\n          ...\n          <Capabilities>\n              <DeviceCapability Name=\"microphone\" />\n          </Capabilities>\n      </Package>\n\nWeb Audio / Emscripten\n----------------------\n- The first time a context is initialized it will create a global object called \"mal\" whose primary purpose is to act\n  as a factory for device objects.\n- Currently the Web Audio backend uses ScriptProcessorNode's, but this may need to change later as they've been deprecated.\n- Google is implementing a policy in their browsers that prevent automatic media output without first receiving some kind\n  of user input. See here for details: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes. Starting\n  the device may fail if you try to start playback without first handling some kind of user input.\n\n\nOPTIONS\n=======\n#define these options before including this file.\n\n#define MA_NO_WASAPI\n  Disables the WASAPI backend.\n\n#define MA_NO_DSOUND\n  Disables the DirectSound backend.\n\n#define MA_NO_WINMM\n  Disables the WinMM backend.\n\n#define MA_NO_ALSA\n  Disables the ALSA backend.\n\n#define MA_NO_PULSEAUDIO\n  Disables the PulseAudio backend.\n\n#define MA_NO_JACK\n  Disables the JACK backend.\n\n#define MA_NO_COREAUDIO\n  Disables the Core Audio backend.\n\n#define MA_NO_SNDIO\n  Disables the sndio backend.\n\n#define MA_NO_AUDIO4\n  Disables the audio(4) backend.\n\n#define MA_NO_OSS\n  Disables the OSS backend.\n\n#define MA_NO_AAUDIO\n  Disables the AAudio backend.\n\n#define MA_NO_OPENSL\n  Disables the OpenSL|ES backend.\n\n#define MA_NO_WEBAUDIO\n  Disables the Web Audio backend.\n\n#define MA_NO_NULL\n  Disables the null backend.\n\n#define MA_DEFAULT_PERIODS\n  When a period count of 0 is specified when a device is initialized, it will default to this.\n\n#define MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_LOW_LATENCY\n#define MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_CONSERVATIVE\n  When a buffer size of 0 is specified when a device is initialized it will default to a buffer of this size, depending\n  on the chosen performance profile. These can be increased or decreased depending on your specific requirements.\n\n#define MA_NO_DECODING\n  Disables the decoding APIs.\n\n#define MA_NO_DEVICE_IO\n  Disables playback and recording. This will disable ma_context and ma_device APIs. This is useful if you only want to\n  use miniaudio's data conversion and/or decoding APIs. \n\n#define MA_NO_STDIO\n  Disables file IO APIs.\n\n#define MA_NO_SSE2\n  Disables SSE2 optimizations.\n\n#define MA_NO_AVX2\n  Disables AVX2 optimizations.\n\n#define MA_NO_AVX512\n  Disables AVX-512 optimizations.\n\n#define MA_NO_NEON\n  Disables NEON optimizations.\n\n#define MA_LOG_LEVEL <Level>\n  Sets the logging level. Set level to one of the following:\n    MA_LOG_LEVEL_VERBOSE\n    MA_LOG_LEVEL_INFO\n    MA_LOG_LEVEL_WARNING\n    MA_LOG_LEVEL_ERROR\n\n#define MA_DEBUG_OUTPUT\n  Enable printf() debug output.\n\n#define MA_COINIT_VALUE\n  Windows only. The value to pass to internal calls to CoInitializeEx(). Defaults to COINIT_MULTITHREADED.\n\n\nDEFINITIONS\n===========\nThis section defines common terms used throughout miniaudio. Unfortunately there is often ambiguity in the use of terms\nthroughout the audio space, so this section is intended to clarify how miniaudio uses each term.\n\nSample\n------\nA sample is a single unit of audio data. If the sample format is f32, then one sample is one 32-bit floating point number.\n\nFrame / PCM Frame\n-----------------\nA frame is a groups of samples equal to the number of channels. For a stereo stream a frame is 2 samples, a mono frame\nis 1 sample, a 5.1 surround sound frame is 6 samples, etc. The terms \"frame\" and \"PCM frame\" are the same thing in\nminiaudio. Note that this is different to a compressed frame. If ever miniaudio needs to refer to a compressed frame, such\nas a FLAC frame, it will always clarify what it's referring to with something like \"FLAC frame\" or whatnot.\n\nChannel\n-------\nA stream of monaural audio that is emitted from an individual speaker in a speaker system, or received from an individual\nmicrophone in a microphone system. A stereo stream has two channels (a left channel, and a right channel), a 5.1 surround\nsound system has 6 channels, etc. Some audio systems refer to a channel as a complex audio stream that's mixed with other\nchannels to produce the final mix - this is completely different to miniaudio's use of the term \"channel\" and should not be\nconfused.\n\nSample Rate\n-----------\nThe sample rate in miniaudio is always expressed in Hz, such as 44100, 48000, etc. It's the number of PCM frames that are\nprocessed per second.\n\nFormats\n-------\nThroughout miniaudio you will see references to different sample formats:\n    u8  - Unsigned 8-bit integer\n    s16 - Signed 16-bit integer\n    s24 - Signed 24-bit integer (tightly packed).\n    s32 - Signed 32-bit integer\n    f32 - 32-bit floating point\n*/\n\n#ifndef miniaudio_h\n#define miniaudio_h\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(_MSC_VER)\n    #pragma warning(push)\n    #pragma warning(disable:4201)   /* nonstandard extension used: nameless struct/union */\n    #pragma warning(disable:4324)   /* structure was padded due to alignment specifier */\n#else\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wpedantic\" /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */\n#endif\n\n/* Platform/backend detection. */\n#ifdef _WIN32\n    #define MA_WIN32\n    #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PC_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)\n        #define MA_WIN32_UWP\n    #else\n        #define MA_WIN32_DESKTOP\n    #endif\n#else\n    #define MA_POSIX\n    #include <pthread.h>    /* Unfortunate #include, but needed for pthread_t, pthread_mutex_t and pthread_cond_t types. */\n\n    #ifdef __unix__\n        #define MA_UNIX\n        #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)\n            #define MA_BSD\n        #endif\n    #endif\n    #ifdef __linux__\n        #define MA_LINUX\n    #endif\n    #ifdef __APPLE__\n        #define MA_APPLE\n    #endif\n    #ifdef __ANDROID__\n        #define MA_ANDROID\n    #endif\n    #ifdef __EMSCRIPTEN__\n        #define MA_EMSCRIPTEN\n    #endif\n#endif\n\n#include <stddef.h> /* For size_t. */\n\n/* Sized types. Prefer built-in types. Fall back to stdint. */\n#ifdef _MSC_VER\n    #if defined(__clang__)\n        #pragma GCC diagnostic push\n        #pragma GCC diagnostic ignored \"-Wlanguage-extension-token\"\n        #pragma GCC diagnostic ignored \"-Wc++11-long-long\"\n    #endif\n    typedef   signed __int8  ma_int8;\n    typedef unsigned __int8  ma_uint8;\n    typedef   signed __int16 ma_int16;\n    typedef unsigned __int16 ma_uint16;\n    typedef   signed __int32 ma_int32;\n    typedef unsigned __int32 ma_uint32;\n    typedef   signed __int64 ma_int64;\n    typedef unsigned __int64 ma_uint64;\n    #if defined(__clang__)\n        #pragma GCC diagnostic pop\n    #endif\n#else\n    #define MA_HAS_STDINT\n    #include <stdint.h>\n    typedef int8_t   ma_int8;\n    typedef uint8_t  ma_uint8;\n    typedef int16_t  ma_int16;\n    typedef uint16_t ma_uint16;\n    typedef int32_t  ma_int32;\n    typedef uint32_t ma_uint32;\n    typedef int64_t  ma_int64;\n    typedef uint64_t ma_uint64;\n#endif\n\n#ifdef MA_HAS_STDINT\n    typedef uintptr_t ma_uintptr;\n#else\n    #if defined(_WIN32)\n        #if defined(_WIN64)\n            typedef ma_uint64 ma_uintptr;\n        #else\n            typedef ma_uint32 ma_uintptr;\n        #endif\n    #elif defined(__GNUC__)\n        #if defined(__LP64__)\n            typedef ma_uint64 ma_uintptr;\n        #else\n            typedef ma_uint32 ma_uintptr;\n        #endif\n    #else\n        typedef ma_uint64 ma_uintptr;   /* Fallback. */\n    #endif\n#endif\n\ntypedef ma_uint8                   ma_bool8;\ntypedef ma_uint32                  ma_bool32;\n#define MA_TRUE                    1\n#define MA_FALSE                   0\n\ntypedef void* ma_handle;\ntypedef void* ma_ptr;\ntypedef void (* ma_proc)(void);\n\n#if defined(_MSC_VER) && !defined(_WCHAR_T_DEFINED)\ntypedef ma_uint16 wchar_t;\n#endif\n\n/* Define NULL for some compilers. */\n#ifndef NULL\n#define NULL 0\n#endif\n\n#if defined(SIZE_MAX)\n    #define MA_SIZE_MAX    SIZE_MAX\n#else\n    #define MA_SIZE_MAX    0xFFFFFFFF  /* When SIZE_MAX is not defined by the standard library just default to the maximum 32-bit unsigned integer. */\n#endif\n\n\n#ifdef _MSC_VER\n#define MA_INLINE __forceinline\n#else\n#ifdef __GNUC__\n#define MA_INLINE __inline__ __attribute__((always_inline))\n#else\n#define MA_INLINE\n#endif\n#endif\n\n#if defined(_MSC_VER)\n    #if _MSC_VER >= 1400\n        #define MA_ALIGN(alignment) __declspec(align(alignment))\n    #endif\n#elif !defined(__DMC__)\n    #define MA_ALIGN(alignment) __attribute__((aligned(alignment)))\n#endif\n#ifndef MA_ALIGN\n    #define MA_ALIGN(alignment)\n#endif\n\n#ifdef _MSC_VER\n#define MA_ALIGNED_STRUCT(alignment) MA_ALIGN(alignment) struct\n#else\n#define MA_ALIGNED_STRUCT(alignment) struct MA_ALIGN(alignment)\n#endif\n\n/* SIMD alignment in bytes. Currently set to 64 bytes in preparation for future AVX-512 optimizations. */\n#define MA_SIMD_ALIGNMENT  64\n\n\n/* Logging levels */\n#define MA_LOG_LEVEL_VERBOSE   4\n#define MA_LOG_LEVEL_INFO      3\n#define MA_LOG_LEVEL_WARNING   2\n#define MA_LOG_LEVEL_ERROR     1\n\n#ifndef MA_LOG_LEVEL\n#define MA_LOG_LEVEL           MA_LOG_LEVEL_ERROR\n#endif\n\ntypedef struct ma_context ma_context;\ntypedef struct ma_device ma_device;\n\ntypedef ma_uint8 ma_channel;\n#define MA_CHANNEL_NONE                                0\n#define MA_CHANNEL_MONO                                1\n#define MA_CHANNEL_FRONT_LEFT                          2\n#define MA_CHANNEL_FRONT_RIGHT                         3\n#define MA_CHANNEL_FRONT_CENTER                        4\n#define MA_CHANNEL_LFE                                 5\n#define MA_CHANNEL_BACK_LEFT                           6\n#define MA_CHANNEL_BACK_RIGHT                          7\n#define MA_CHANNEL_FRONT_LEFT_CENTER                   8\n#define MA_CHANNEL_FRONT_RIGHT_CENTER                  9\n#define MA_CHANNEL_BACK_CENTER                         10\n#define MA_CHANNEL_SIDE_LEFT                           11\n#define MA_CHANNEL_SIDE_RIGHT                          12\n#define MA_CHANNEL_TOP_CENTER                          13\n#define MA_CHANNEL_TOP_FRONT_LEFT                      14\n#define MA_CHANNEL_TOP_FRONT_CENTER                    15\n#define MA_CHANNEL_TOP_FRONT_RIGHT                     16\n#define MA_CHANNEL_TOP_BACK_LEFT                       17\n#define MA_CHANNEL_TOP_BACK_CENTER                     18\n#define MA_CHANNEL_TOP_BACK_RIGHT                      19\n#define MA_CHANNEL_AUX_0                               20\n#define MA_CHANNEL_AUX_1                               21\n#define MA_CHANNEL_AUX_2                               22\n#define MA_CHANNEL_AUX_3                               23\n#define MA_CHANNEL_AUX_4                               24\n#define MA_CHANNEL_AUX_5                               25\n#define MA_CHANNEL_AUX_6                               26\n#define MA_CHANNEL_AUX_7                               27\n#define MA_CHANNEL_AUX_8                               28\n#define MA_CHANNEL_AUX_9                               29\n#define MA_CHANNEL_AUX_10                              30\n#define MA_CHANNEL_AUX_11                              31\n#define MA_CHANNEL_AUX_12                              32\n#define MA_CHANNEL_AUX_13                              33\n#define MA_CHANNEL_AUX_14                              34\n#define MA_CHANNEL_AUX_15                              35\n#define MA_CHANNEL_AUX_16                              36\n#define MA_CHANNEL_AUX_17                              37\n#define MA_CHANNEL_AUX_18                              38\n#define MA_CHANNEL_AUX_19                              39\n#define MA_CHANNEL_AUX_20                              40\n#define MA_CHANNEL_AUX_21                              41\n#define MA_CHANNEL_AUX_22                              42\n#define MA_CHANNEL_AUX_23                              43\n#define MA_CHANNEL_AUX_24                              44\n#define MA_CHANNEL_AUX_25                              45\n#define MA_CHANNEL_AUX_26                              46\n#define MA_CHANNEL_AUX_27                              47\n#define MA_CHANNEL_AUX_28                              48\n#define MA_CHANNEL_AUX_29                              49\n#define MA_CHANNEL_AUX_30                              50\n#define MA_CHANNEL_AUX_31                              51\n#define MA_CHANNEL_LEFT                                MA_CHANNEL_FRONT_LEFT\n#define MA_CHANNEL_RIGHT                               MA_CHANNEL_FRONT_RIGHT\n#define MA_CHANNEL_POSITION_COUNT                      MA_CHANNEL_AUX_31 + 1\n\n\ntypedef int ma_result;\n#define MA_SUCCESS                                      0\n\n/* General errors. */\n#define MA_ERROR                                       -1      /* A generic error. */\n#define MA_INVALID_ARGS                                -2\n#define MA_INVALID_OPERATION                           -3\n#define MA_OUT_OF_MEMORY                               -4\n#define MA_ACCESS_DENIED                               -5\n#define MA_TOO_LARGE                                   -6\n#define MA_TIMEOUT                                     -7\n\n/* General miniaudio-specific errors. */\n#define MA_FORMAT_NOT_SUPPORTED                        -100\n#define MA_DEVICE_TYPE_NOT_SUPPORTED                   -101\n#define MA_SHARE_MODE_NOT_SUPPORTED                    -102\n#define MA_NO_BACKEND                                  -103\n#define MA_NO_DEVICE                                   -104\n#define MA_API_NOT_FOUND                               -105\n#define MA_INVALID_DEVICE_CONFIG                       -106\n\n/* State errors. */\n#define MA_DEVICE_BUSY                                 -200\n#define MA_DEVICE_NOT_INITIALIZED                      -201\n#define MA_DEVICE_NOT_STARTED                          -202\n#define MA_DEVICE_UNAVAILABLE                          -203\n\n/* Operation errors. */\n#define MA_FAILED_TO_MAP_DEVICE_BUFFER                 -300\n#define MA_FAILED_TO_UNMAP_DEVICE_BUFFER               -301\n#define MA_FAILED_TO_INIT_BACKEND                      -302\n#define MA_FAILED_TO_READ_DATA_FROM_CLIENT             -303\n#define MA_FAILED_TO_READ_DATA_FROM_DEVICE             -304\n#define MA_FAILED_TO_SEND_DATA_TO_CLIENT               -305\n#define MA_FAILED_TO_SEND_DATA_TO_DEVICE               -306\n#define MA_FAILED_TO_OPEN_BACKEND_DEVICE               -307\n#define MA_FAILED_TO_START_BACKEND_DEVICE              -308\n#define MA_FAILED_TO_STOP_BACKEND_DEVICE               -309\n#define MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE          -310\n#define MA_FAILED_TO_CREATE_MUTEX                      -311\n#define MA_FAILED_TO_CREATE_EVENT                      -312\n#define MA_FAILED_TO_CREATE_THREAD                     -313\n\n\n/* Standard sample rates. */\n#define MA_SAMPLE_RATE_8000                            8000\n#define MA_SAMPLE_RATE_11025                           11025\n#define MA_SAMPLE_RATE_16000                           16000\n#define MA_SAMPLE_RATE_22050                           22050\n#define MA_SAMPLE_RATE_24000                           24000\n#define MA_SAMPLE_RATE_32000                           32000\n#define MA_SAMPLE_RATE_44100                           44100\n#define MA_SAMPLE_RATE_48000                           48000\n#define MA_SAMPLE_RATE_88200                           88200\n#define MA_SAMPLE_RATE_96000                           96000\n#define MA_SAMPLE_RATE_176400                          176400\n#define MA_SAMPLE_RATE_192000                          192000\n#define MA_SAMPLE_RATE_352800                          352800\n#define MA_SAMPLE_RATE_384000                          384000\n\n#define MA_MIN_PCM_SAMPLE_SIZE_IN_BYTES                1   /* For simplicity, miniaudio does not support PCM samples that are not byte aligned. */\n#define MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES                8\n#define MA_MIN_CHANNELS                                1\n#define MA_MAX_CHANNELS                                32\n#define MA_MIN_SAMPLE_RATE                             MA_SAMPLE_RATE_8000\n#define MA_MAX_SAMPLE_RATE                             MA_SAMPLE_RATE_384000\n#define MA_SRC_SINC_MIN_WINDOW_WIDTH                   2\n#define MA_SRC_SINC_MAX_WINDOW_WIDTH                   32\n#define MA_SRC_SINC_DEFAULT_WINDOW_WIDTH               32\n#define MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION            8\n#define MA_SRC_INPUT_BUFFER_SIZE_IN_SAMPLES            256\n\ntypedef enum\n{\n    ma_stream_format_pcm = 0,\n} ma_stream_format;\n\ntypedef enum\n{\n    ma_stream_layout_interleaved = 0,\n    ma_stream_layout_deinterleaved\n} ma_stream_layout;\n\ntypedef enum\n{\n    ma_dither_mode_none = 0,\n    ma_dither_mode_rectangle,\n    ma_dither_mode_triangle\n} ma_dither_mode;\n\ntypedef enum\n{\n    /*\n    I like to keep these explicitly defined because they're used as a key into a lookup table. When items are\n    added to this, make sure there are no gaps and that they're added to the lookup table in ma_get_bytes_per_sample().\n    */\n    ma_format_unknown = 0,     /* Mainly used for indicating an error, but also used as the default for the output format for decoders. */\n    ma_format_u8      = 1,\n    ma_format_s16     = 2,     /* Seems to be the most widely supported format. */\n    ma_format_s24     = 3,     /* Tightly packed. 3 bytes per sample. */\n    ma_format_s32     = 4,\n    ma_format_f32     = 5,\n    ma_format_count\n} ma_format;\n\ntypedef enum\n{\n    ma_channel_mix_mode_rectangular = 0,   /* Simple averaging based on the plane(s) the channel is sitting on. */\n    ma_channel_mix_mode_simple,            /* Drop excess channels; zeroed out extra channels. */\n    ma_channel_mix_mode_custom_weights,    /* Use custom weights specified in ma_channel_router_config. */\n    ma_channel_mix_mode_planar_blend = ma_channel_mix_mode_rectangular,\n    ma_channel_mix_mode_default = ma_channel_mix_mode_planar_blend\n} ma_channel_mix_mode;\n\ntypedef enum\n{\n    ma_standard_channel_map_microsoft,\n    ma_standard_channel_map_alsa,\n    ma_standard_channel_map_rfc3551,   /* Based off AIFF. */\n    ma_standard_channel_map_flac,\n    ma_standard_channel_map_vorbis,\n    ma_standard_channel_map_sound4,    /* FreeBSD's sound(4). */\n    ma_standard_channel_map_sndio,     /* www.sndio.org/tips.html */\n    ma_standard_channel_map_webaudio = ma_standard_channel_map_flac, /* https://webaudio.github.io/web-audio-api/#ChannelOrdering. Only 1, 2, 4 and 6 channels are defined, but can fill in the gaps with logical assumptions. */\n    ma_standard_channel_map_default = ma_standard_channel_map_microsoft\n} ma_standard_channel_map;\n\ntypedef enum\n{\n    ma_performance_profile_low_latency = 0,\n    ma_performance_profile_conservative\n} ma_performance_profile;\n\n\ntypedef struct ma_format_converter ma_format_converter;\ntypedef ma_uint32 (* ma_format_converter_read_proc)              (ma_format_converter* pConverter, ma_uint32 frameCount, void* pFramesOut, void* pUserData);\ntypedef ma_uint32 (* ma_format_converter_read_deinterleaved_proc)(ma_format_converter* pConverter, ma_uint32 frameCount, void** ppSamplesOut, void* pUserData);\n\ntypedef struct\n{\n    ma_format formatIn;\n    ma_format formatOut;\n    ma_uint32 channels;\n    ma_stream_format streamFormatIn;\n    ma_stream_format streamFormatOut;\n    ma_dither_mode ditherMode;\n    ma_bool32 noSSE2   : 1;\n    ma_bool32 noAVX2   : 1;\n    ma_bool32 noAVX512 : 1;\n    ma_bool32 noNEON   : 1;\n    ma_format_converter_read_proc onRead;\n    ma_format_converter_read_deinterleaved_proc onReadDeinterleaved;\n    void* pUserData;\n} ma_format_converter_config;\n\nstruct ma_format_converter\n{\n    ma_format_converter_config config;\n    ma_bool32 useSSE2   : 1;\n    ma_bool32 useAVX2   : 1;\n    ma_bool32 useAVX512 : 1;\n    ma_bool32 useNEON   : 1;\n    void (* onConvertPCM)(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode);\n    void (* onInterleavePCM)(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels);\n    void (* onDeinterleavePCM)(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels);\n};\n\n\n\ntypedef struct ma_channel_router ma_channel_router;\ntypedef ma_uint32 (* ma_channel_router_read_deinterleaved_proc)(ma_channel_router* pRouter, ma_uint32 frameCount, void** ppSamplesOut, void* pUserData);\n\ntypedef struct\n{\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_channel_mix_mode mixingMode;\n    float weights[MA_MAX_CHANNELS][MA_MAX_CHANNELS];  /* [in][out]. Only used when mixingMode is set to ma_channel_mix_mode_custom_weights. */\n    ma_bool32 noSSE2   : 1;\n    ma_bool32 noAVX2   : 1;\n    ma_bool32 noAVX512 : 1;\n    ma_bool32 noNEON   : 1;\n    ma_channel_router_read_deinterleaved_proc onReadDeinterleaved;\n    void* pUserData;\n} ma_channel_router_config;\n\nstruct ma_channel_router\n{\n    ma_channel_router_config config;\n    ma_bool32 isPassthrough   : 1;\n    ma_bool32 isSimpleShuffle : 1;\n    ma_bool32 useSSE2         : 1;\n    ma_bool32 useAVX2         : 1;\n    ma_bool32 useAVX512       : 1;\n    ma_bool32 useNEON         : 1;\n    ma_uint8 shuffleTable[MA_MAX_CHANNELS];\n};\n\n\n\ntypedef struct ma_src ma_src;\ntypedef ma_uint32 (* ma_src_read_deinterleaved_proc)(ma_src* pSRC, ma_uint32 frameCount, void** ppSamplesOut, void* pUserData); /* Returns the number of frames that were read. */\n\ntypedef enum\n{\n    ma_src_algorithm_linear = 0,\n    ma_src_algorithm_sinc,\n    ma_src_algorithm_none,\n    ma_src_algorithm_default = ma_src_algorithm_linear\n} ma_src_algorithm;\n\ntypedef enum\n{\n    ma_src_sinc_window_function_hann = 0,\n    ma_src_sinc_window_function_rectangular,\n    ma_src_sinc_window_function_default = ma_src_sinc_window_function_hann\n} ma_src_sinc_window_function;\n\ntypedef struct\n{\n    ma_src_sinc_window_function windowFunction;\n    ma_uint32 windowWidth;\n} ma_src_config_sinc;\n\ntypedef struct\n{\n    ma_uint32 sampleRateIn;\n    ma_uint32 sampleRateOut;\n    ma_uint32 channels;\n    ma_src_algorithm algorithm;\n    ma_bool32 neverConsumeEndOfInput : 1;\n    ma_bool32 noSSE2   : 1;\n    ma_bool32 noAVX2   : 1;\n    ma_bool32 noAVX512 : 1;\n    ma_bool32 noNEON   : 1;\n    ma_src_read_deinterleaved_proc onReadDeinterleaved;\n    void* pUserData;\n    union\n    {\n        ma_src_config_sinc sinc;\n    };\n} ma_src_config;\n\nMA_ALIGNED_STRUCT(MA_SIMD_ALIGNMENT) ma_src\n{\n    union\n    {\n        struct\n        {\n            MA_ALIGN(MA_SIMD_ALIGNMENT) float input[MA_MAX_CHANNELS][MA_SRC_INPUT_BUFFER_SIZE_IN_SAMPLES];\n            float timeIn;\n            ma_uint32 leftoverFrames;\n        } linear;\n\n        struct\n        {\n            MA_ALIGN(MA_SIMD_ALIGNMENT) float input[MA_MAX_CHANNELS][MA_SRC_SINC_MAX_WINDOW_WIDTH*2 + MA_SRC_INPUT_BUFFER_SIZE_IN_SAMPLES];\n            float timeIn;\n            ma_uint32 inputFrameCount;     /* The number of frames sitting in the input buffer, not including the first half of the window. */\n            ma_uint32 windowPosInSamples;  /* An offset of <input>. */\n            float table[MA_SRC_SINC_MAX_WINDOW_WIDTH*1 * MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION]; /* Precomputed lookup table. The +1 is used to avoid the need for an overflow check. */\n        } sinc;\n    };\n\n    ma_src_config config;\n    ma_bool32 isEndOfInputLoaded : 1;\n    ma_bool32 useSSE2   : 1;\n    ma_bool32 useAVX2   : 1;\n    ma_bool32 useAVX512 : 1;\n    ma_bool32 useNEON   : 1;\n};\n\ntypedef struct ma_pcm_converter ma_pcm_converter;\ntypedef ma_uint32 (* ma_pcm_converter_read_proc)(ma_pcm_converter* pDSP, void* pSamplesOut, ma_uint32 frameCount, void* pUserData);\n\ntypedef struct\n{\n    ma_format formatIn;\n    ma_uint32 channelsIn;\n    ma_uint32 sampleRateIn;\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n    ma_format formatOut;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateOut;\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_channel_mix_mode channelMixMode;\n    ma_dither_mode ditherMode;\n    ma_src_algorithm srcAlgorithm;\n    ma_bool32 allowDynamicSampleRate;\n    ma_bool32 neverConsumeEndOfInput : 1;  /* <-- For SRC. */\n    ma_bool32 noSSE2   : 1;\n    ma_bool32 noAVX2   : 1;\n    ma_bool32 noAVX512 : 1;\n    ma_bool32 noNEON   : 1;\n    ma_pcm_converter_read_proc onRead;\n    void* pUserData;\n    union\n    {\n        ma_src_config_sinc sinc;\n    };\n} ma_pcm_converter_config;\n\nMA_ALIGNED_STRUCT(MA_SIMD_ALIGNMENT) ma_pcm_converter\n{\n    ma_pcm_converter_read_proc onRead;\n    void* pUserData;\n    ma_format_converter formatConverterIn;             /* For converting data to f32 in preparation for further processing. */\n    ma_format_converter formatConverterOut;            /* For converting data to the requested output format. Used as the final step in the processing pipeline. */\n    ma_channel_router channelRouter;                   /* For channel conversion. */\n    ma_src src;                                        /* For sample rate conversion. */\n    ma_bool32 isDynamicSampleRateAllowed     : 1;      /* ma_pcm_converter_set_input_sample_rate() and ma_pcm_converter_set_output_sample_rate() will fail if this is set to false. */\n    ma_bool32 isPreFormatConversionRequired  : 1;\n    ma_bool32 isPostFormatConversionRequired : 1;\n    ma_bool32 isChannelRoutingRequired       : 1;\n    ma_bool32 isSRCRequired                  : 1;\n    ma_bool32 isChannelRoutingAtStart        : 1;\n    ma_bool32 isPassthrough                  : 1;      /* <-- Will be set to true when the DSP pipeline is an optimized passthrough. */\n};\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nDATA CONVERSION\n===============\n\nThis section contains the APIs for data conversion. You will find everything here for channel mapping, sample format conversion, resampling, etc.\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n\n/************************************************************************************************************************************************************\n\nChannel Maps\n============\n\nBelow is the channel map used by ma_standard_channel_map_default:\n\n|---------------|------------------------------|\n| Channel Count | Mapping                      |\n|---------------|------------------------------|\n| 1 (Mono)      | 0: MA_CHANNEL_MONO           |\n|---------------|------------------------------|\n| 2 (Stereo)    | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|---------------|------------------------------|\n| 3             | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|               | 2: MA_CHANNEL_FRONT_CENTER   |\n|---------------|------------------------------|\n| 4 (Surround)  | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|               | 2: MA_CHANNEL_FRONT_CENTER   |\n|               | 3: MA_CHANNEL_BACK_CENTER    |\n|---------------|------------------------------|\n| 5             | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|               | 2: MA_CHANNEL_FRONT_CENTER   |\n|               | 3: MA_CHANNEL_BACK_LEFT      |\n|               | 4: MA_CHANNEL_BACK_RIGHT     |\n|---------------|------------------------------|\n| 6 (5.1)       | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|               | 2: MA_CHANNEL_FRONT_CENTER   |\n|               | 3: MA_CHANNEL_LFE            |\n|               | 4: MA_CHANNEL_SIDE_LEFT      |\n|               | 5: MA_CHANNEL_SIDE_RIGHT     |\n|---------------|------------------------------|\n| 7             | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|               | 2: MA_CHANNEL_FRONT_CENTER   |\n|               | 3: MA_CHANNEL_LFE            |\n|               | 4: MA_CHANNEL_BACK_CENTER    |\n|               | 4: MA_CHANNEL_SIDE_LEFT      |\n|               | 5: MA_CHANNEL_SIDE_RIGHT     |\n|---------------|------------------------------|\n| 8 (7.1)       | 0: MA_CHANNEL_FRONT_LEFT     |\n|               | 1: MA_CHANNEL_FRONT_RIGHT    |\n|               | 2: MA_CHANNEL_FRONT_CENTER   |\n|               | 3: MA_CHANNEL_LFE            |\n|               | 4: MA_CHANNEL_BACK_LEFT      |\n|               | 5: MA_CHANNEL_BACK_RIGHT     |\n|               | 6: MA_CHANNEL_SIDE_LEFT      |\n|               | 7: MA_CHANNEL_SIDE_RIGHT     |\n|---------------|------------------------------|\n| Other         | All channels set to 0. This  |\n|               | is equivalent to the same    |\n|               | mapping as the device.       |\n|---------------|------------------------------|\n\n************************************************************************************************************************************************************/\n\n/*\nHelper for retrieving a standard channel map.\n*/\nvoid ma_get_standard_channel_map(ma_standard_channel_map standardChannelMap, ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS]);\n\n/*\nCopies a channel map.\n*/\nvoid ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels);\n\n\n/*\nDetermines whether or not a channel map is valid.\n\nA blank channel map is valid (all channels set to MA_CHANNEL_NONE). The way a blank channel map is handled is context specific, but\nis usually treated as a passthrough.\n\nInvalid channel maps:\n  - A channel map with no channels\n  - A channel map with more than one channel and a mono channel\n*/\nma_bool32 ma_channel_map_valid(ma_uint32 channels, const ma_channel channelMap[MA_MAX_CHANNELS]);\n\n/*\nHelper for comparing two channel maps for equality.\n\nThis assumes the channel count is the same between the two.\n*/\nma_bool32 ma_channel_map_equal(ma_uint32 channels, const ma_channel channelMapA[MA_MAX_CHANNELS], const ma_channel channelMapB[MA_MAX_CHANNELS]);\n\n/*\nHelper for determining if a channel map is blank (all channels set to MA_CHANNEL_NONE).\n*/\nma_bool32 ma_channel_map_blank(ma_uint32 channels, const ma_channel channelMap[MA_MAX_CHANNELS]);\n\n/*\nHelper for determining whether or not a channel is present in the given channel map.\n*/\nma_bool32 ma_channel_map_contains_channel_position(ma_uint32 channels, const ma_channel channelMap[MA_MAX_CHANNELS], ma_channel channelPosition);\n\n\n/************************************************************************************************************************************************************\n\nFormat Conversion\n=================\nThe format converter serves two purposes:\n  1) Conversion between data formats (u8 to f32, etc.)\n  2) Interleaving and deinterleaving\n\nWhen initializing a converter, you specify the input and output formats (u8, s16, etc.) and read callbacks. There are two read callbacks - one for\ninterleaved input data (onRead) and another for deinterleaved input data (onReadDeinterleaved). You implement whichever is most convenient for you. You\ncan implement both, but it's not recommended as it just introduces unnecessary complexity.\n\nTo read data as interleaved samples, use ma_format_converter_read(). Otherwise use ma_format_converter_read_deinterleaved().\n\nDithering\n---------\nThe format converter also supports dithering. Dithering can be set using ditherMode variable in the config, like so.\n\n  pConfig->ditherMode = ma_dither_mode_rectangle;\n\nThe different dithering modes include the following, in order of efficiency:\n  - None:      ma_dither_mode_none\n  - Rectangle: ma_dither_mode_rectangle\n  - Triangle:  ma_dither_mode_triangle\n\nNote that even if the dither mode is set to something other than ma_dither_mode_none, it will be ignored for conversions where dithering is not needed.\nDithering is available for the following conversions:\n  - s16 -> u8\n  - s24 -> u8\n  - s32 -> u8\n  - f32 -> u8\n  - s24 -> s16\n  - s32 -> s16\n  - f32 -> s16\n\nNote that it is not an error to pass something other than ma_dither_mode_none for conversions where dither is not used. It will just be ignored.\n\n************************************************************************************************************************************************************/\n\n/*\nInitializes a format converter.\n*/\nma_result ma_format_converter_init(const ma_format_converter_config* pConfig, ma_format_converter* pConverter);\n\n/*\nReads data from the format converter as interleaved channels.\n*/\nma_uint64 ma_format_converter_read(ma_format_converter* pConverter, ma_uint64 frameCount, void* pFramesOut, void* pUserData);\n\n/*\nReads data from the format converter as deinterleaved channels.\n*/\nma_uint64 ma_format_converter_read_deinterleaved(ma_format_converter* pConverter, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData);\n\n/*\nHelper for initializing a format converter config.\n*/\nma_format_converter_config ma_format_converter_config_init_new(void);\nma_format_converter_config ma_format_converter_config_init(ma_format formatIn, ma_format formatOut, ma_uint32 channels, ma_format_converter_read_proc onRead, void* pUserData);\nma_format_converter_config ma_format_converter_config_init_deinterleaved(ma_format formatIn, ma_format formatOut, ma_uint32 channels, ma_format_converter_read_deinterleaved_proc onReadDeinterleaved, void* pUserData);\n\n\n\n/************************************************************************************************************************************************************\n\nChannel Routing\n===============\nThere are two main things you can do with the channel router:\n  1) Rearrange channels\n  2) Convert from one channel count to another\n\nChannel Rearrangement\n---------------------\nA simple example of channel rearrangement may be swapping the left and right channels in a stereo stream. To do this you just pass in the same channel\ncount for both the input and output with channel maps that contain the same channels (in a different order).\n\nChannel Conversion\n------------------\nThe channel router can also convert from one channel count to another, such as converting a 5.1 stream to stero. When changing the channel count, the\nrouter will first perform a 1:1 mapping of channel positions that are present in both the input and output channel maps. The second thing it will do\nis distribute the input mono channel (if any) across all output channels, excluding any None and LFE channels. If there is an output mono channel, all\ninput channels will be averaged, excluding any None and LFE channels.\n\nThe last case to consider is when a channel position in the input channel map is not present in the output channel map, and vice versa. In this case the\nchannel router will perform a blend of other related channels to produce an audible channel. There are several blending modes.\n  1) Simple\n     Unmatched channels are silenced.\n  2) Planar Blending\n     Channels are blended based on a set of planes that each speaker emits audio from.\n\nRectangular / Planar Blending\n-----------------------------\nIn this mode, channel positions are associated with a set of planes where the channel conceptually emits audio from. An example is the front/left speaker.\nThis speaker is positioned to the front of the listener, so you can think of it as emitting audio from the front plane. It is also positioned to the left\nof the listener so you can think of it as also emitting audio from the left plane. Now consider the (unrealistic) situation where the input channel map\ncontains only the front/left channel position, but the output channel map contains both the front/left and front/center channel. When deciding on the audio\ndata to send to the front/center speaker (which has no 1:1 mapping with an input channel) we need to use some logic based on our available input channel\npositions.\n\nAs mentioned earlier, our front/left speaker is, conceptually speaking, emitting audio from the front _and_ the left planes. Similarly, the front/center\nspeaker is emitting audio from _only_ the front plane. What these two channels have in common is that they are both emitting audio from the front plane.\nThus, it makes sense that the front/center speaker should receive some contribution from the front/left channel. How much contribution depends on their\nplanar relationship (thus the name of this blending technique).\n\nBecause the front/left channel is emitting audio from two planes (front and left), you can think of it as though it's willing to dedicate 50% of it's total\nvolume to each of it's planes (a channel position emitting from 1 plane would be willing to given 100% of it's total volume to that plane, and a channel\nposition emitting from 3 planes would be willing to given 33% of it's total volume to each plane). Similarly, the front/center speaker is emitting audio\nfrom only one plane so you can think of it as though it's willing to _take_ 100% of it's volume from front plane emissions. Now, since the front/left\nchannel is willing to _give_ 50% of it's total volume to the front plane, and the front/center speaker is willing to _take_ 100% of it's total volume\nfrom the front, you can imagine that 50% of the front/left speaker will be given to the front/center speaker.\n\nUsage\n-----\nTo use the channel router you need to specify three things:\n  1) The input channel count and channel map\n  2) The output channel count and channel map\n  3) The mixing mode to use in the case where a 1:1 mapping is unavailable\n\nNote that input and output data is always deinterleaved 32-bit floating point.\n\nInitialize the channel router with ma_channel_router_init(). You will need to pass in a config object which specifies the input and output configuration,\nmixing mode and a callback for sending data to the router. This callback will be called when input data needs to be sent to the router for processing. Note\nthat the mixing mode is only used when a 1:1 mapping is unavailable. This includes the custom weights mode.\n\nRead data from the channel router with ma_channel_router_read_deinterleaved(). Output data is always 32-bit floating point.\n\n************************************************************************************************************************************************************/\n\n/*\nInitializes a channel router where it is assumed that the input data is non-interleaved.\n*/\nma_result ma_channel_router_init(const ma_channel_router_config* pConfig, ma_channel_router* pRouter);\n\n/*\nReads data from the channel router as deinterleaved channels.\n*/\nma_uint64 ma_channel_router_read_deinterleaved(ma_channel_router* pRouter, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData);\n\n/*\nHelper for initializing a channel router config.\n*/\nma_channel_router_config ma_channel_router_config_init(ma_uint32 channelsIn, const ma_channel channelMapIn[MA_MAX_CHANNELS], ma_uint32 channelsOut, const ma_channel channelMapOut[MA_MAX_CHANNELS], ma_channel_mix_mode mixingMode, ma_channel_router_read_deinterleaved_proc onRead, void* pUserData);\n\n\n/************************************************************************************************************************************************************\n\nSample Rate Conversion\n======================\n\n************************************************************************************************************************************************************/\n\n/*\nInitializes a sample rate conversion object.\n*/\nma_result ma_src_init(const ma_src_config* pConfig, ma_src* pSRC);\n\n/*\nDynamically adjusts the sample rate.\n\nThis is useful for dynamically adjust pitch. Keep in mind, however, that this will speed up or slow down the sound. If this\nis not acceptable you will need to use your own algorithm.\n*/\nma_result ma_src_set_sample_rate(ma_src* pSRC, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\n\n/*\nReads a number of frames.\n\nReturns the number of frames actually read.\n*/\nma_uint64 ma_src_read_deinterleaved(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData);\n\n/*\nHelper for creating a sample rate conversion config.\n*/\nma_src_config ma_src_config_init_new(void);\nma_src_config ma_src_config_init(ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_uint32 channels, ma_src_read_deinterleaved_proc onReadDeinterleaved, void* pUserData);\n\n\n/************************************************************************************************************************************************************\n\nConversion\n\n************************************************************************************************************************************************************/\n\n/*\nInitializes a DSP object.\n*/\nma_result ma_pcm_converter_init(const ma_pcm_converter_config* pConfig, ma_pcm_converter* pDSP);\n\n/*\nDynamically adjusts the input sample rate.\n\nThis will fail is the DSP was not initialized with allowDynamicSampleRate.\n\nDEPRECATED. Use ma_pcm_converter_set_sample_rate() instead.\n*/\nma_result ma_pcm_converter_set_input_sample_rate(ma_pcm_converter* pDSP, ma_uint32 sampleRateOut);\n\n/*\nDynamically adjusts the output sample rate.\n\nThis is useful for dynamically adjust pitch. Keep in mind, however, that this will speed up or slow down the sound. If this\nis not acceptable you will need to use your own algorithm.\n\nThis will fail is the DSP was not initialized with allowDynamicSampleRate.\n\nDEPRECATED. Use ma_pcm_converter_set_sample_rate() instead.\n*/\nma_result ma_pcm_converter_set_output_sample_rate(ma_pcm_converter* pDSP, ma_uint32 sampleRateOut);\n\n/*\nDynamically adjusts the output sample rate.\n\nThis is useful for dynamically adjust pitch. Keep in mind, however, that this will speed up or slow down the sound. If this\nis not acceptable you will need to use your own algorithm.\n\nThis will fail if the DSP was not initialized with allowDynamicSampleRate.\n*/\nma_result ma_pcm_converter_set_sample_rate(ma_pcm_converter* pDSP, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\n\n/*\nReads a number of frames and runs them through the DSP processor.\n*/\nma_uint64 ma_pcm_converter_read(ma_pcm_converter* pDSP, void* pFramesOut, ma_uint64 frameCount);\n\n/*\nHelper for initializing a ma_pcm_converter_config object.\n*/\nma_pcm_converter_config ma_pcm_converter_config_init_new(void);\nma_pcm_converter_config ma_pcm_converter_config_init(ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, ma_pcm_converter_read_proc onRead, void* pUserData);\nma_pcm_converter_config ma_pcm_converter_config_init_ex(ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_channel channelMapIn[MA_MAX_CHANNELS], ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut,  ma_channel channelMapOut[MA_MAX_CHANNELS], ma_pcm_converter_read_proc onRead, void* pUserData);\n\n/*\nHigh-level helper for doing a full format conversion in one go. Returns the number of output frames. Call this with pOut set to NULL to\ndetermine the required size of the output buffer.\n\nA return value of 0 indicates an error.\n\nThis function is useful for one-off bulk conversions, but if you're streaming data you should use the DSP APIs instead.\n*/\nma_uint64 ma_convert_frames(void* pOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, const void* pIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_uint64 frameCount);\nma_uint64 ma_convert_frames_ex(void* pOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, ma_channel channelMapOut[MA_MAX_CHANNELS], const void* pIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_channel channelMapIn[MA_MAX_CHANNELS], ma_uint64 frameCount);\n\n\n/************************************************************************************************************************************************************\n\nRing Buffer\n===========\n\nFeatures\n--------\n- Lock free (assuming single producer, single consumer)\n- Support for interleaved and deinterleaved streams\n- Allows the caller to allocate their own block of memory\n\nUsage\n-----\n- Call ma_rb_init() to initialize a simple buffer, with an optional pre-allocated buffer. If you pass in NULL\n  for the pre-allocated buffer, it will be allocated for you and free()'d in ma_rb_uninit(). If you pass in\n  your own pre-allocated buffer, free()-ing is left to you.\n\n- Call ma_rb_init_ex() if you need a deinterleaved buffer. The data for each sub-buffer is offset from each\n  other based on the stride. Use ma_rb_get_subbuffer_stride(), ma_rb_get_subbuffer_offset() and\n  ma_rb_get_subbuffer_ptr() to manage your sub-buffers.\n\n- Use ma_rb_acquire_read() and ma_rb_acquire_write() to retrieve a pointer to a section of the ring buffer.\n  You specify the number of bytes you need, and on output it will set to what was actually acquired. If the\n  read or write pointer is positioned such that the number of bytes requested will require a loop, it will be\n  clamped to the end of the buffer. Therefore, the number of bytes you're given may be less than the number\n  you requested.\n\n- After calling ma_rb_acquire_read/write(), you do your work on the buffer and then \"commit\" it with\n  ma_rb_commit_read/write(). This is where the read/write pointers are updated. When you commit you need to\n  pass in the buffer that was returned by the earlier call to ma_rb_acquire_read/write() and is only used\n  for validation. The number of bytes passed to ma_rb_commit_read/write() is what's used to increment the\n  pointers.\n\n- If you want to correct for drift between the write pointer and the read pointer you can use a combination\n  of ma_rb_pointer_distance(), ma_rb_seek_read() and ma_rb_seek_write(). Note that you can only move the\n  pointers forward, and you should only move the read pointer forward via the consumer thread, and the write\n  pointer forward by the producer thread. If there is too much space between the pointers, move the read\n  pointer forward. If there is too little space between the pointers, move the write pointer forward.\n\n\nNotes\n-----\n- Thread safety depends on a single producer, single consumer model. Only one thread is allowed to write, and\n  only one thread is allowed to read. The producer is the only one allowed to move the write pointer, and the\n  consumer is the only one allowed to move the read pointer.\n- Operates on bytes. Use ma_pcm_rb to operate in terms of PCM frames.\n- Maximum buffer size in bytes is 0x7FFFFFFF-(MA_SIMD_ALIGNMENT-1) because of reasons.\n\n\nPCM Ring Buffer\n===============\nThis is the same as the regular ring buffer, except that it works on PCM frames instead of bytes.\n\n************************************************************************************************************************************************************/\ntypedef struct\n{\n    void* pBuffer;\n    ma_uint32 subbufferSizeInBytes;\n    ma_uint32 subbufferCount;\n    ma_uint32 subbufferStrideInBytes;\n    volatile ma_uint32 encodedReadOffset;  /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. */\n    volatile ma_uint32 encodedWriteOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. */\n    ma_bool32 ownsBuffer          : 1;     /* Used to know whether or not miniaudio is responsible for free()-ing the buffer. */\n    ma_bool32 clearOnWriteAcquire : 1;     /* When set, clears the acquired write buffer before returning from ma_rb_acquire_write(). */\n} ma_rb;\n\nma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, ma_rb* pRB);\nma_result ma_rb_init(size_t bufferSizeInBytes, void* pOptionalPreallocatedBuffer, ma_rb* pRB);\nvoid ma_rb_uninit(ma_rb* pRB);\nma_result ma_rb_acquire_read(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut);\nma_result ma_rb_commit_read(ma_rb* pRB, size_t sizeInBytes, void* pBufferOut);\nma_result ma_rb_acquire_write(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut);\nma_result ma_rb_commit_write(ma_rb* pRB, size_t sizeInBytes, void* pBufferOut);\nma_result ma_rb_seek_read(ma_rb* pRB, size_t offsetInBytes);\nma_result ma_rb_seek_write(ma_rb* pRB, size_t offsetInBytes);\nma_int32 ma_rb_pointer_distance(ma_rb* pRB);    /* Returns the distance between the write pointer and the read pointer. Should never be negative for a correct program. */\nsize_t ma_rb_get_subbuffer_size(ma_rb* pRB);\nsize_t ma_rb_get_subbuffer_stride(ma_rb* pRB);\nsize_t ma_rb_get_subbuffer_offset(ma_rb* pRB, size_t subbufferIndex);\nvoid* ma_rb_get_subbuffer_ptr(ma_rb* pRB, size_t subbufferIndex, void* pBuffer);\n\n\ntypedef struct\n{\n    ma_rb rb;\n    ma_format format;\n    ma_uint32 channels;\n} ma_pcm_rb;\n\nma_result ma_pcm_rb_init_ex(ma_format format, ma_uint32 channels, ma_uint32 subbufferSizeInFrames, ma_uint32 subbufferCount, ma_uint32 subbufferStrideInFrames, void* pOptionalPreallocatedBuffer, ma_pcm_rb* pRB);\nma_result ma_pcm_rb_init(ma_format format, ma_uint32 channels, ma_uint32 bufferSizeInFrames, void* pOptionalPreallocatedBuffer, ma_pcm_rb* pRB);\nvoid ma_pcm_rb_uninit(ma_pcm_rb* pRB);\nma_result ma_pcm_rb_acquire_read(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut);\nma_result ma_pcm_rb_commit_read(ma_pcm_rb* pRB, ma_uint32 sizeInFrames, void* pBufferOut);\nma_result ma_pcm_rb_acquire_write(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut);\nma_result ma_pcm_rb_commit_write(ma_pcm_rb* pRB, ma_uint32 sizeInFrames, void* pBufferOut);\nma_result ma_pcm_rb_seek_read(ma_pcm_rb* pRB, ma_uint32 offsetInFrames);\nma_result ma_pcm_rb_seek_write(ma_pcm_rb* pRB, ma_uint32 offsetInFrames);\nma_int32 ma_pcm_rb_pointer_disance(ma_pcm_rb* pRB); /* Return value is in frames. */\nma_uint32 ma_pcm_rb_get_subbuffer_size(ma_pcm_rb* pRB);\nma_uint32 ma_pcm_rb_get_subbuffer_stride(ma_pcm_rb* pRB);\nma_uint32 ma_pcm_rb_get_subbuffer_offset(ma_pcm_rb* pRB, ma_uint32 subbufferIndex);\nvoid* ma_pcm_rb_get_subbuffer_ptr(ma_pcm_rb* pRB, ma_uint32 subbufferIndex, void* pBuffer);\n\n\n/************************************************************************************************************************************************************\n\nMiscellaneous Helpers\n\n************************************************************************************************************************************************************/\n\n/*\nmalloc(). Calls MA_MALLOC().\n*/\nvoid* ma_malloc(size_t sz);\n\n/*\nrealloc(). Calls MA_REALLOC().\n*/\nvoid* ma_realloc(void* p, size_t sz);\n\n/*\nfree(). Calls MA_FREE().\n*/\nvoid ma_free(void* p);\n\n/*\nPerforms an aligned malloc, with the assumption that the alignment is a power of 2.\n*/\nvoid* ma_aligned_malloc(size_t sz, size_t alignment);\n\n/*\nFree's an aligned malloc'd buffer.\n*/\nvoid ma_aligned_free(void* p);\n\n/*\nRetrieves a friendly name for a format.\n*/\nconst char* ma_get_format_name(ma_format format);\n\n/*\nBlends two frames in floating point format.\n*/\nvoid ma_blend_f32(float* pOut, float* pInA, float* pInB, float factor, ma_uint32 channels);\n\n/*\nRetrieves the size of a sample in bytes for the given format.\n\nThis API is efficient and is implemented using a lookup table.\n\nThread Safety: SAFE\n  This API is pure.\n*/\nma_uint32 ma_get_bytes_per_sample(ma_format format);\nstatic MA_INLINE ma_uint32 ma_get_bytes_per_frame(ma_format format, ma_uint32 channels) { return ma_get_bytes_per_sample(format) * channels; }\n\n/*\nConverts a log level to a string.\n*/\nconst char* ma_log_level_to_string(ma_uint32 logLevel);\n\n\n/************************************************************************************************************************************************************\n\nFormat Conversion\n\n************************************************************************************************************************************************************/\nvoid ma_pcm_u8_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_u8_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_u8_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_u8_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s16_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s16_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s16_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s16_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s24_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s24_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s24_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s24_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s32_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s32_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s32_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_s32_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_f32_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_f32_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_f32_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_f32_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nvoid ma_pcm_convert(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 sampleCount, ma_dither_mode ditherMode);\n\n/*\nDeinterleaves an interleaved buffer.\n*/\nvoid ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void* pInterleavedPCMFrames, void** ppDeinterleavedPCMFrames);\n\n/*\nInterleaves a group of deinterleaved buffers.\n*/\nvoid ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void** ppDeinterleavedPCMFrames, void* pInterleavedPCMFrames);\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nDEVICE I/O\n==========\n\nThis section contains the APIs for device playback and capture. Here is where you'll find ma_device_init(), etc.\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n#ifndef MA_NO_DEVICE_IO\n/* Some backends are only supported on certain platforms. */\n#if defined(MA_WIN32)\n    #define MA_SUPPORT_WASAPI\n    #if defined(MA_WIN32_DESKTOP)  /* DirectSound and WinMM backends are only supported on desktops. */\n        #define MA_SUPPORT_DSOUND\n        #define MA_SUPPORT_WINMM\n        #define MA_SUPPORT_JACK    /* JACK is technically supported on Windows, but I don't know how many people use it in practice... */\n    #endif\n#endif\n#if defined(MA_UNIX)\n    #if defined(MA_LINUX)\n        #if !defined(MA_ANDROID)   /* ALSA is not supported on Android. */\n            #define MA_SUPPORT_ALSA\n        #endif\n    #endif\n    #if !defined(MA_BSD) && !defined(MA_ANDROID) && !defined(MA_EMSCRIPTEN)\n        #define MA_SUPPORT_PULSEAUDIO\n        #define MA_SUPPORT_JACK\n    #endif\n    #if defined(MA_ANDROID)\n        #define MA_SUPPORT_AAUDIO\n        #define MA_SUPPORT_OPENSL\n    #endif\n    #if defined(__OpenBSD__)        /* <-- Change this to \"#if defined(MA_BSD)\" to enable sndio on all BSD flavors. */\n        #define MA_SUPPORT_SNDIO    /* sndio is only supported on OpenBSD for now. May be expanded later if there's demand. */\n    #endif\n    #if defined(__NetBSD__) || defined(__OpenBSD__)\n        #define MA_SUPPORT_AUDIO4   /* Only support audio(4) on platforms with known support. */\n    #endif\n    #if defined(__FreeBSD__) || defined(__DragonFly__)\n        #define MA_SUPPORT_OSS      /* Only support OSS on specific platforms with known support. */\n    #endif\n#endif\n#if defined(MA_APPLE)\n    #define MA_SUPPORT_COREAUDIO\n#endif\n#if defined(MA_EMSCRIPTEN)\n    #define MA_SUPPORT_WEBAUDIO\n#endif\n\n/* Explicitly disable the Null backend for Emscripten because it uses a background thread which is not properly supported right now. */\n#if !defined(MA_EMSCRIPTEN)\n#define MA_SUPPORT_NULL\n#endif\n\n\n#if !defined(MA_NO_WASAPI) && defined(MA_SUPPORT_WASAPI)\n    #define MA_ENABLE_WASAPI\n#endif\n#if !defined(MA_NO_DSOUND) && defined(MA_SUPPORT_DSOUND)\n    #define MA_ENABLE_DSOUND\n#endif\n#if !defined(MA_NO_WINMM) && defined(MA_SUPPORT_WINMM)\n    #define MA_ENABLE_WINMM\n#endif\n#if !defined(MA_NO_ALSA) && defined(MA_SUPPORT_ALSA)\n    #define MA_ENABLE_ALSA\n#endif\n#if !defined(MA_NO_PULSEAUDIO) && defined(MA_SUPPORT_PULSEAUDIO)\n    #define MA_ENABLE_PULSEAUDIO\n#endif\n#if !defined(MA_NO_JACK) && defined(MA_SUPPORT_JACK)\n    #define MA_ENABLE_JACK\n#endif\n#if !defined(MA_NO_COREAUDIO) && defined(MA_SUPPORT_COREAUDIO)\n    #define MA_ENABLE_COREAUDIO\n#endif\n#if !defined(MA_NO_SNDIO) && defined(MA_SUPPORT_SNDIO)\n    #define MA_ENABLE_SNDIO\n#endif\n#if !defined(MA_NO_AUDIO4) && defined(MA_SUPPORT_AUDIO4)\n    #define MA_ENABLE_AUDIO4\n#endif\n#if !defined(MA_NO_OSS) && defined(MA_SUPPORT_OSS)\n    #define MA_ENABLE_OSS\n#endif\n#if !defined(MA_NO_AAUDIO) && defined(MA_SUPPORT_AAUDIO)\n    #define MA_ENABLE_AAUDIO\n#endif\n#if !defined(MA_NO_OPENSL) && defined(MA_SUPPORT_OPENSL)\n    #define MA_ENABLE_OPENSL\n#endif\n#if !defined(MA_NO_WEBAUDIO) && defined(MA_SUPPORT_WEBAUDIO)\n    #define MA_ENABLE_WEBAUDIO\n#endif\n#if !defined(MA_NO_NULL) && defined(MA_SUPPORT_NULL)\n    #define MA_ENABLE_NULL\n#endif\n\n#ifdef MA_SUPPORT_WASAPI\n/* We need a IMMNotificationClient object for WASAPI. */\ntypedef struct\n{\n    void* lpVtbl;\n    ma_uint32 counter;\n    ma_device* pDevice;\n} ma_IMMNotificationClient;\n#endif\n\n/* Backend enums must be in priority order. */\ntypedef enum\n{\n    ma_backend_wasapi,\n    ma_backend_dsound,\n    ma_backend_winmm,\n    ma_backend_coreaudio,\n    ma_backend_sndio,\n    ma_backend_audio4,\n    ma_backend_oss,\n    ma_backend_pulseaudio,\n    ma_backend_alsa,\n    ma_backend_jack,\n    ma_backend_aaudio,\n    ma_backend_opensl,\n    ma_backend_webaudio,\n    ma_backend_null    /* <-- Must always be the last item. Lowest priority, and used as the terminator for backend enumeration. */\n} ma_backend;\n\n/* Thread priorties should be ordered such that the default priority of the worker thread is 0. */\ntypedef enum\n{\n    ma_thread_priority_idle     = -5,\n    ma_thread_priority_lowest   = -4,\n    ma_thread_priority_low      = -3,\n    ma_thread_priority_normal   = -2,\n    ma_thread_priority_high     = -1,\n    ma_thread_priority_highest  =  0,\n    ma_thread_priority_realtime =  1,\n    ma_thread_priority_default  =  0\n} ma_thread_priority;\n\ntypedef struct\n{\n    ma_context* pContext;\n\n    union\n    {\n#ifdef MA_WIN32\n        struct\n        {\n            /*HANDLE*/ ma_handle hThread;\n        } win32;\n#endif\n#ifdef MA_POSIX\n        struct\n        {\n            pthread_t thread;\n        } posix;\n#endif\n        int _unused;\n    };\n} ma_thread;\n\ntypedef struct\n{\n    ma_context* pContext;\n\n    union\n    {\n#ifdef MA_WIN32\n        struct\n        {\n            /*HANDLE*/ ma_handle hMutex;\n        } win32;\n#endif\n#ifdef MA_POSIX\n        struct\n        {\n            pthread_mutex_t mutex;\n        } posix;\n#endif\n        int _unused;\n    };\n} ma_mutex;\n\ntypedef struct\n{\n    ma_context* pContext;\n\n    union\n    {\n#ifdef MA_WIN32\n        struct\n        {\n            /*HANDLE*/ ma_handle hEvent;\n        } win32;\n#endif\n#ifdef MA_POSIX\n        struct\n        {\n            pthread_mutex_t mutex;\n            pthread_cond_t condition;\n            ma_uint32 value;\n        } posix;\n#endif\n        int _unused;\n    };\n} ma_event;\n\n\n/*\nThe callback for processing audio data from the device.\n\npOutput is a pointer to a buffer that will receive audio data that will later be played back through the speakers. This will be non-null\nfor a playback or full-duplex device and null for a capture device.\n\npInput is a pointer to a buffer containing input data from the device. This will be non-null for a capture or full-duplex device, and\nnull for a playback device.\n\nframeCount is the number of PCM frames to process. If an output buffer is provided (pOutput is not null), applications should write out\nto the entire output buffer.\n\nDo _not_ call any miniaudio APIs from the callback. Attempting the stop the device can result in a deadlock. The proper way to stop the\ndevice is to call ma_device_stop() from a different thread, normally the main application thread.\n*/\ntypedef void (* ma_device_callback_proc)(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);\n\n/*\nThe callback for when the device has been stopped.\n\nThis will be called when the device is stopped explicitly with ma_device_stop() and also called implicitly when the device is stopped\nthrough external forces such as being unplugged or an internal error occuring.\n\nDo not restart the device from the callback.\n*/\ntypedef void (* ma_stop_proc)(ma_device* pDevice);\n\n/*\nThe callback for handling log messages.\n\nIt is possible for pDevice to be null in which case the log originated from the context. If it is non-null you can assume the message\ncame from the device.\n\nlogLevel is one of the following:\n    MA_LOG_LEVEL_VERBOSE\n    MA_LOG_LEVEL_INFO\n    MA_LOG_LEVEL_WARNING\n    MA_LOG_LEVEL_ERROR\n*/\ntypedef void (* ma_log_proc)(ma_context* pContext, ma_device* pDevice, ma_uint32 logLevel, const char* message);\n\ntypedef enum\n{\n    ma_device_type_playback = 1,\n    ma_device_type_capture  = 2,\n    ma_device_type_duplex   = ma_device_type_playback | ma_device_type_capture,\n} ma_device_type;\n\ntypedef enum\n{\n    ma_share_mode_shared = 0,\n    ma_share_mode_exclusive,\n} ma_share_mode;\n\ntypedef union\n{\n#ifdef MA_SUPPORT_WASAPI\n    wchar_t wasapi[64];             /* WASAPI uses a wchar_t string for identification. */\n#endif\n#ifdef MA_SUPPORT_DSOUND\n    ma_uint8 dsound[16];            /* DirectSound uses a GUID for identification. */\n#endif\n#ifdef MA_SUPPORT_WINMM\n    /*UINT_PTR*/ ma_uint32 winmm;   /* When creating a device, WinMM expects a Win32 UINT_PTR for device identification. In practice it's actually just a UINT. */\n#endif\n#ifdef MA_SUPPORT_ALSA\n    char alsa[256];                 /* ALSA uses a name string for identification. */\n#endif\n#ifdef MA_SUPPORT_PULSEAUDIO\n    char pulse[256];                /* PulseAudio uses a name string for identification. */\n#endif\n#ifdef MA_SUPPORT_JACK\n    int jack;                       /* JACK always uses default devices. */\n#endif\n#ifdef MA_SUPPORT_COREAUDIO\n    char coreaudio[256];            /* Core Audio uses a string for identification. */\n#endif\n#ifdef MA_SUPPORT_SNDIO\n    char sndio[256];                /* \"snd/0\", etc. */\n#endif\n#ifdef MA_SUPPORT_AUDIO4\n    char audio4[256];               /* \"/dev/audio\", etc. */\n#endif\n#ifdef MA_SUPPORT_OSS\n    char oss[64];                   /* \"dev/dsp0\", etc. \"dev/dsp\" for the default device. */\n#endif\n#ifdef MA_SUPPORT_AAUDIO\n    ma_int32 aaudio;                /* AAudio uses a 32-bit integer for identification. */\n#endif\n#ifdef MA_SUPPORT_OPENSL\n    ma_uint32 opensl;               /* OpenSL|ES uses a 32-bit unsigned integer for identification. */\n#endif\n#ifdef MA_SUPPORT_WEBAUDIO\n    char webaudio[32];              /* Web Audio always uses default devices for now, but if this changes it'll be a GUID. */\n#endif\n#ifdef MA_SUPPORT_NULL\n    int nullbackend;                /* The null backend uses an integer for device IDs. */\n#endif\n} ma_device_id;\n\ntypedef struct\n{\n    /* Basic info. This is the only information guaranteed to be filled in during device enumeration. */\n    ma_device_id id;\n    char name[256];\n\n    /*\n    Detailed info. As much of this is filled as possible with ma_context_get_device_info(). Note that you are allowed to initialize\n    a device with settings outside of this range, but it just means the data will be converted using miniaudio's data conversion\n    pipeline before sending the data to/from the device. Most programs will need to not worry about these values, but it's provided\n    here mainly for informational purposes or in the rare case that someone might find it useful.\n    \n    These will be set to 0 when returned by ma_context_enumerate_devices() or ma_context_get_devices().\n    */\n    ma_uint32 formatCount;\n    ma_format formats[ma_format_count];\n    ma_uint32 minChannels;\n    ma_uint32 maxChannels;\n    ma_uint32 minSampleRate;\n    ma_uint32 maxSampleRate;\n} ma_device_info;\n\ntypedef union\n{\n    ma_int64 counter;\n    double counterD;\n} ma_timer;\n\ntypedef struct\n{\n    ma_device_type deviceType;\n    ma_uint32 sampleRate;\n    ma_uint32 bufferSizeInFrames;\n    ma_uint32 bufferSizeInMilliseconds;\n    ma_uint32 periods;\n    ma_performance_profile performanceProfile;\n    ma_device_callback_proc dataCallback;\n    ma_stop_proc stopCallback;\n    void* pUserData;\n    struct\n    {\n        ma_device_id* pDeviceID;\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel channelMap[MA_MAX_CHANNELS];\n        ma_share_mode shareMode;\n    } playback;\n    struct\n    {\n        ma_device_id* pDeviceID;\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel channelMap[MA_MAX_CHANNELS];\n        ma_share_mode shareMode;\n    } capture;\n\n    struct\n    {\n        ma_bool32 noMMap;  /* Disables MMap mode. */\n    } alsa;\n    struct\n    {\n        const char* pStreamNamePlayback;\n        const char* pStreamNameCapture;\n    } pulse;\n} ma_device_config;\n\ntypedef struct\n{\n    ma_log_proc logCallback;\n    ma_thread_priority threadPriority;\n    void* pUserData;\n\n    struct\n    {\n        ma_bool32 useVerboseDeviceEnumeration;\n    } alsa;\n    struct\n    {\n        const char* pApplicationName;\n        const char* pServerName;\n        ma_bool32 tryAutoSpawn; /* Enables autospawning of the PulseAudio daemon if necessary. */\n    } pulse;\n    struct\n    {\n        const char* pClientName;\n        ma_bool32 tryStartServer;\n    } jack;\n} ma_context_config;\n\ntypedef ma_bool32 (* ma_enum_devices_callback_proc)(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData);\n\nstruct ma_context\n{\n    ma_backend backend;                    /* DirectSound, ALSA, etc. */\n    ma_log_proc logCallback;\n    ma_thread_priority threadPriority;\n    void* pUserData;\n    ma_mutex deviceEnumLock;               /* Used to make ma_context_get_devices() thread safe. */\n    ma_mutex deviceInfoLock;               /* Used to make ma_context_get_device_info() thread safe. */\n    ma_uint32 deviceInfoCapacity;          /* Total capacity of pDeviceInfos. */\n    ma_uint32 playbackDeviceInfoCount;\n    ma_uint32 captureDeviceInfoCount;\n    ma_device_info* pDeviceInfos;          /* Playback devices first, then capture. */\n    ma_bool32 isBackendAsynchronous : 1;   /* Set when the context is initialized. Set to 1 for asynchronous backends such as Core Audio and JACK. Do not modify. */\n\n    ma_result (* onUninit        )(ma_context* pContext);\n    ma_bool32 (* onDeviceIDEqual )(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1);\n    ma_result (* onEnumDevices   )(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData);    /* Return false from the callback to stop enumeration. */\n    ma_result (* onGetDeviceInfo )(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo);\n    ma_result (* onDeviceInit    )(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice);\n    void      (* onDeviceUninit  )(ma_device* pDevice);\n    ma_result (* onDeviceStart   )(ma_device* pDevice);\n    ma_result (* onDeviceStop    )(ma_device* pDevice);\n    ma_result (* onDeviceWrite   )(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount);    /* Data is in internal device format. */\n    ma_result (* onDeviceRead    )(ma_device* pDevice,       void* pPCMFrames, ma_uint32 frameCount);    /* Data is in internal device format. */\n    ma_result (* onDeviceMainLoop)(ma_device* pDevice);\n\n    union\n    {\n#ifdef MA_SUPPORT_WASAPI\n        struct\n        {\n            int _unused;\n        } wasapi;\n#endif\n#ifdef MA_SUPPORT_DSOUND\n        struct\n        {\n            ma_handle hDSoundDLL;\n            ma_proc DirectSoundCreate;\n            ma_proc DirectSoundEnumerateA;\n            ma_proc DirectSoundCaptureCreate;\n            ma_proc DirectSoundCaptureEnumerateA;\n        } dsound;\n#endif\n#ifdef MA_SUPPORT_WINMM\n        struct\n        {\n            ma_handle hWinMM;\n            ma_proc waveOutGetNumDevs;\n            ma_proc waveOutGetDevCapsA;\n            ma_proc waveOutOpen;\n            ma_proc waveOutClose;\n            ma_proc waveOutPrepareHeader;\n            ma_proc waveOutUnprepareHeader;\n            ma_proc waveOutWrite;\n            ma_proc waveOutReset;\n            ma_proc waveInGetNumDevs;\n            ma_proc waveInGetDevCapsA;\n            ma_proc waveInOpen;\n            ma_proc waveInClose;\n            ma_proc waveInPrepareHeader;\n            ma_proc waveInUnprepareHeader;\n            ma_proc waveInAddBuffer;\n            ma_proc waveInStart;\n            ma_proc waveInReset;\n        } winmm;\n#endif\n#ifdef MA_SUPPORT_ALSA\n        struct\n        {\n            ma_handle asoundSO;\n            ma_proc snd_pcm_open;\n            ma_proc snd_pcm_close;\n            ma_proc snd_pcm_hw_params_sizeof;\n            ma_proc snd_pcm_hw_params_any;\n            ma_proc snd_pcm_hw_params_set_format;\n            ma_proc snd_pcm_hw_params_set_format_first;\n            ma_proc snd_pcm_hw_params_get_format_mask;\n            ma_proc snd_pcm_hw_params_set_channels_near;\n            ma_proc snd_pcm_hw_params_set_rate_resample;\n            ma_proc snd_pcm_hw_params_set_rate_near;\n            ma_proc snd_pcm_hw_params_set_buffer_size_near;\n            ma_proc snd_pcm_hw_params_set_periods_near;\n            ma_proc snd_pcm_hw_params_set_access;\n            ma_proc snd_pcm_hw_params_get_format;\n            ma_proc snd_pcm_hw_params_get_channels;\n            ma_proc snd_pcm_hw_params_get_channels_min;\n            ma_proc snd_pcm_hw_params_get_channels_max;\n            ma_proc snd_pcm_hw_params_get_rate;\n            ma_proc snd_pcm_hw_params_get_rate_min;\n            ma_proc snd_pcm_hw_params_get_rate_max;\n            ma_proc snd_pcm_hw_params_get_buffer_size;\n            ma_proc snd_pcm_hw_params_get_periods;\n            ma_proc snd_pcm_hw_params_get_access;\n            ma_proc snd_pcm_hw_params;\n            ma_proc snd_pcm_sw_params_sizeof;\n            ma_proc snd_pcm_sw_params_current;\n            ma_proc snd_pcm_sw_params_get_boundary;\n            ma_proc snd_pcm_sw_params_set_avail_min;\n            ma_proc snd_pcm_sw_params_set_start_threshold;\n            ma_proc snd_pcm_sw_params_set_stop_threshold;\n            ma_proc snd_pcm_sw_params;\n            ma_proc snd_pcm_format_mask_sizeof;\n            ma_proc snd_pcm_format_mask_test;\n            ma_proc snd_pcm_get_chmap;\n            ma_proc snd_pcm_state;\n            ma_proc snd_pcm_prepare;\n            ma_proc snd_pcm_start;\n            ma_proc snd_pcm_drop;\n            ma_proc snd_pcm_drain;\n            ma_proc snd_device_name_hint;\n            ma_proc snd_device_name_get_hint;\n            ma_proc snd_card_get_index;\n            ma_proc snd_device_name_free_hint;\n            ma_proc snd_pcm_mmap_begin;\n            ma_proc snd_pcm_mmap_commit;\n            ma_proc snd_pcm_recover;\n            ma_proc snd_pcm_readi;\n            ma_proc snd_pcm_writei;\n            ma_proc snd_pcm_avail;\n            ma_proc snd_pcm_avail_update;\n            ma_proc snd_pcm_wait;\n            ma_proc snd_pcm_info;\n            ma_proc snd_pcm_info_sizeof;\n            ma_proc snd_pcm_info_get_name;\n            ma_proc snd_config_update_free_global;\n\n            ma_mutex internalDeviceEnumLock;\n            ma_bool32 useVerboseDeviceEnumeration;\n        } alsa;\n#endif\n#ifdef MA_SUPPORT_PULSEAUDIO\n        struct\n        {\n            ma_handle pulseSO;\n            ma_proc pa_mainloop_new;\n            ma_proc pa_mainloop_free;\n            ma_proc pa_mainloop_get_api;\n            ma_proc pa_mainloop_iterate;\n            ma_proc pa_mainloop_wakeup;\n            ma_proc pa_context_new;\n            ma_proc pa_context_unref;\n            ma_proc pa_context_connect;\n            ma_proc pa_context_disconnect;\n            ma_proc pa_context_set_state_callback;\n            ma_proc pa_context_get_state;\n            ma_proc pa_context_get_sink_info_list;\n            ma_proc pa_context_get_source_info_list;\n            ma_proc pa_context_get_sink_info_by_name;\n            ma_proc pa_context_get_source_info_by_name;\n            ma_proc pa_operation_unref;\n            ma_proc pa_operation_get_state;\n            ma_proc pa_channel_map_init_extend;\n            ma_proc pa_channel_map_valid;\n            ma_proc pa_channel_map_compatible;\n            ma_proc pa_stream_new;\n            ma_proc pa_stream_unref;\n            ma_proc pa_stream_connect_playback;\n            ma_proc pa_stream_connect_record;\n            ma_proc pa_stream_disconnect;\n            ma_proc pa_stream_get_state;\n            ma_proc pa_stream_get_sample_spec;\n            ma_proc pa_stream_get_channel_map;\n            ma_proc pa_stream_get_buffer_attr;\n            ma_proc pa_stream_set_buffer_attr;\n            ma_proc pa_stream_get_device_name;\n            ma_proc pa_stream_set_write_callback;\n            ma_proc pa_stream_set_read_callback;\n            ma_proc pa_stream_flush;\n            ma_proc pa_stream_drain;\n            ma_proc pa_stream_is_corked;\n            ma_proc pa_stream_cork;\n            ma_proc pa_stream_trigger;\n            ma_proc pa_stream_begin_write;\n            ma_proc pa_stream_write;\n            ma_proc pa_stream_peek;\n            ma_proc pa_stream_drop;\n            ma_proc pa_stream_writable_size;\n            ma_proc pa_stream_readable_size;\n\n            char* pApplicationName;\n            char* pServerName;\n            ma_bool32 tryAutoSpawn;\n        } pulse;\n#endif\n#ifdef MA_SUPPORT_JACK\n        struct\n        {\n            ma_handle jackSO;\n            ma_proc jack_client_open;\n            ma_proc jack_client_close;\n            ma_proc jack_client_name_size;\n            ma_proc jack_set_process_callback;\n            ma_proc jack_set_buffer_size_callback;\n            ma_proc jack_on_shutdown;\n            ma_proc jack_get_sample_rate;\n            ma_proc jack_get_buffer_size;\n            ma_proc jack_get_ports;\n            ma_proc jack_activate;\n            ma_proc jack_deactivate;\n            ma_proc jack_connect;\n            ma_proc jack_port_register;\n            ma_proc jack_port_name;\n            ma_proc jack_port_get_buffer;\n            ma_proc jack_free;\n\n            char* pClientName;\n            ma_bool32 tryStartServer;\n        } jack;\n#endif\n#ifdef MA_SUPPORT_COREAUDIO\n        struct\n        {\n            ma_handle hCoreFoundation;\n            ma_proc CFStringGetCString;\n            \n            ma_handle hCoreAudio;\n            ma_proc AudioObjectGetPropertyData;\n            ma_proc AudioObjectGetPropertyDataSize;\n            ma_proc AudioObjectSetPropertyData;\n            ma_proc AudioObjectAddPropertyListener;\n            \n            ma_handle hAudioUnit;  /* Could possibly be set to AudioToolbox on later versions of macOS. */\n            ma_proc AudioComponentFindNext;\n            ma_proc AudioComponentInstanceDispose;\n            ma_proc AudioComponentInstanceNew;\n            ma_proc AudioOutputUnitStart;\n            ma_proc AudioOutputUnitStop;\n            ma_proc AudioUnitAddPropertyListener;\n            ma_proc AudioUnitGetPropertyInfo;\n            ma_proc AudioUnitGetProperty;\n            ma_proc AudioUnitSetProperty;\n            ma_proc AudioUnitInitialize;\n            ma_proc AudioUnitRender;\n            \n            /*AudioComponent*/ ma_ptr component;\n        } coreaudio;\n#endif\n#ifdef MA_SUPPORT_SNDIO\n        struct\n        {\n            ma_handle sndioSO;\n            ma_proc sio_open;\n            ma_proc sio_close;\n            ma_proc sio_setpar;\n            ma_proc sio_getpar;\n            ma_proc sio_getcap;\n            ma_proc sio_start;\n            ma_proc sio_stop;\n            ma_proc sio_read;\n            ma_proc sio_write;\n            ma_proc sio_onmove;\n            ma_proc sio_nfds;\n            ma_proc sio_pollfd;\n            ma_proc sio_revents;\n            ma_proc sio_eof;\n            ma_proc sio_setvol;\n            ma_proc sio_onvol;\n            ma_proc sio_initpar;\n        } sndio;\n#endif\n#ifdef MA_SUPPORT_AUDIO4\n        struct\n        {\n            int _unused;\n        } audio4;\n#endif\n#ifdef MA_SUPPORT_OSS\n        struct\n        {\n            int versionMajor;\n            int versionMinor;\n        } oss;\n#endif\n#ifdef MA_SUPPORT_AAUDIO\n        struct\n        {\n            ma_handle hAAudio; /* libaaudio.so */\n            ma_proc AAudio_createStreamBuilder;\n            ma_proc AAudioStreamBuilder_delete;\n            ma_proc AAudioStreamBuilder_setDeviceId;\n            ma_proc AAudioStreamBuilder_setDirection;\n            ma_proc AAudioStreamBuilder_setSharingMode;\n            ma_proc AAudioStreamBuilder_setFormat;\n            ma_proc AAudioStreamBuilder_setChannelCount;\n            ma_proc AAudioStreamBuilder_setSampleRate;\n            ma_proc AAudioStreamBuilder_setBufferCapacityInFrames;\n            ma_proc AAudioStreamBuilder_setFramesPerDataCallback;\n            ma_proc AAudioStreamBuilder_setDataCallback;\n            ma_proc AAudioStreamBuilder_setPerformanceMode;\n            ma_proc AAudioStreamBuilder_openStream;\n            ma_proc AAudioStream_close;\n            ma_proc AAudioStream_getState;\n            ma_proc AAudioStream_waitForStateChange;\n            ma_proc AAudioStream_getFormat;\n            ma_proc AAudioStream_getChannelCount;\n            ma_proc AAudioStream_getSampleRate;\n            ma_proc AAudioStream_getBufferCapacityInFrames;\n            ma_proc AAudioStream_getFramesPerDataCallback;\n            ma_proc AAudioStream_getFramesPerBurst;\n            ma_proc AAudioStream_requestStart;\n            ma_proc AAudioStream_requestStop;\n        } aaudio;\n#endif\n#ifdef MA_SUPPORT_OPENSL\n        struct\n        {\n            int _unused;\n        } opensl;\n#endif\n#ifdef MA_SUPPORT_WEBAUDIO\n        struct\n        {\n            int _unused;\n        } webaudio;\n#endif\n#ifdef MA_SUPPORT_NULL\n        struct\n        {\n            int _unused;\n        } null_backend;\n#endif\n    };\n\n    union\n    {\n#ifdef MA_WIN32\n        struct\n        {\n            /*HMODULE*/ ma_handle hOle32DLL;\n            ma_proc CoInitializeEx;\n            ma_proc CoUninitialize;\n            ma_proc CoCreateInstance;\n            ma_proc CoTaskMemFree;\n            ma_proc PropVariantClear;\n            ma_proc StringFromGUID2;\n\n            /*HMODULE*/ ma_handle hUser32DLL;\n            ma_proc GetForegroundWindow;\n            ma_proc GetDesktopWindow;\n\n            /*HMODULE*/ ma_handle hAdvapi32DLL;\n            ma_proc RegOpenKeyExA;\n            ma_proc RegCloseKey;\n            ma_proc RegQueryValueExA;\n        } win32;\n#endif\n#ifdef MA_POSIX\n        struct\n        {\n            ma_handle pthreadSO;\n            ma_proc pthread_create;\n            ma_proc pthread_join;\n            ma_proc pthread_mutex_init;\n            ma_proc pthread_mutex_destroy;\n            ma_proc pthread_mutex_lock;\n            ma_proc pthread_mutex_unlock;\n            ma_proc pthread_cond_init;\n            ma_proc pthread_cond_destroy;\n            ma_proc pthread_cond_wait;\n            ma_proc pthread_cond_signal;\n            ma_proc pthread_attr_init;\n            ma_proc pthread_attr_destroy;\n            ma_proc pthread_attr_setschedpolicy;\n            ma_proc pthread_attr_getschedparam;\n            ma_proc pthread_attr_setschedparam;\n        } posix;\n#endif\n        int _unused;\n    };\n};\n\nMA_ALIGNED_STRUCT(MA_SIMD_ALIGNMENT) ma_device\n{\n    ma_context* pContext;\n    ma_device_type type;\n    ma_uint32 sampleRate;\n    ma_uint32 state;\n    ma_device_callback_proc onData;\n    ma_stop_proc onStop;\n    void* pUserData;                        /* Application defined data. */\n    ma_mutex lock;\n    ma_event wakeupEvent;\n    ma_event startEvent;\n    ma_event stopEvent;\n    ma_thread thread;\n    ma_result workResult;                   /* This is set by the worker thread after it's finished doing a job. */\n    ma_bool32 usingDefaultSampleRate : 1;\n    ma_bool32 usingDefaultBufferSize : 1;\n    ma_bool32 usingDefaultPeriods    : 1;\n    ma_bool32 isOwnerOfContext       : 1;   /* When set to true, uninitializing the device will also uninitialize the context. Set to true when NULL is passed into ma_device_init(). */\n    struct\n    {\n        char name[256];                     /* Maybe temporary. Likely to be replaced with a query API. */\n        ma_share_mode shareMode;            /* Set to whatever was passed in when the device was initialized. */\n        ma_bool32 usingDefaultFormat     : 1;\n        ma_bool32 usingDefaultChannels   : 1;\n        ma_bool32 usingDefaultChannelMap : 1;\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel channelMap[MA_MAX_CHANNELS];\n        ma_format internalFormat;\n        ma_uint32 internalChannels;\n        ma_uint32 internalSampleRate;\n        ma_channel internalChannelMap[MA_MAX_CHANNELS];\n        ma_uint32 internalBufferSizeInFrames;\n        ma_uint32 internalPeriods;\n        ma_pcm_converter converter;\n        ma_uint32 _dspFrameCount;           /* Internal use only. Used as the data source when reading from the device. */\n        const ma_uint8* _dspFrames;         /* ^^^ AS ABOVE ^^^ */\n    } playback;\n    struct\n    {\n        char name[256];                     /* Maybe temporary. Likely to be replaced with a query API. */\n        ma_share_mode shareMode;            /* Set to whatever was passed in when the device was initialized. */\n        ma_bool32 usingDefaultFormat     : 1;\n        ma_bool32 usingDefaultChannels   : 1;\n        ma_bool32 usingDefaultChannelMap : 1;\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel channelMap[MA_MAX_CHANNELS];\n        ma_format internalFormat;\n        ma_uint32 internalChannels;\n        ma_uint32 internalSampleRate;\n        ma_channel internalChannelMap[MA_MAX_CHANNELS];\n        ma_uint32 internalBufferSizeInFrames;\n        ma_uint32 internalPeriods;\n        ma_pcm_converter converter;\n        ma_uint32 _dspFrameCount;           /* Internal use only. Used as the data source when reading from the device. */\n        const ma_uint8* _dspFrames;         /* ^^^ AS ABOVE ^^^ */\n    } capture;\n\n    union\n    {\n#ifdef MA_SUPPORT_WASAPI\n        struct\n        {\n            /*IAudioClient**/ ma_ptr pAudioClientPlayback;\n            /*IAudioClient**/ ma_ptr pAudioClientCapture;\n            /*IAudioRenderClient**/ ma_ptr pRenderClient;\n            /*IAudioCaptureClient**/ ma_ptr pCaptureClient;\n            /*IMMDeviceEnumerator**/ ma_ptr pDeviceEnumerator; /* Used for IMMNotificationClient notifications. Required for detecting default device changes. */\n            ma_IMMNotificationClient notificationClient;\n            /*HANDLE*/ ma_handle hEventPlayback;               /* Auto reset. Initialized to signaled. */\n            /*HANDLE*/ ma_handle hEventCapture;                /* Auto reset. Initialized to unsignaled. */\n            ma_uint32 actualBufferSizeInFramesPlayback;        /* Value from GetBufferSize(). internalBufferSizeInFrames is not set to the _actual_ buffer size when low-latency shared mode is being used due to the way the IAudioClient3 API works. */\n            ma_uint32 actualBufferSizeInFramesCapture;\n            ma_uint32 originalBufferSizeInFrames;\n            ma_uint32 originalBufferSizeInMilliseconds;\n            ma_uint32 originalPeriods;\n            ma_bool32 hasDefaultPlaybackDeviceChanged;         /* <-- Make sure this is always a whole 32-bits because we use atomic assignments. */\n            ma_bool32 hasDefaultCaptureDeviceChanged;          /* <-- Make sure this is always a whole 32-bits because we use atomic assignments. */\n            ma_uint32 periodSizeInFramesPlayback;\n            ma_uint32 periodSizeInFramesCapture;\n            ma_bool32 isStartedCapture;\n            ma_bool32 isStartedPlayback;\n        } wasapi;\n#endif\n#ifdef MA_SUPPORT_DSOUND\n        struct\n        {\n            /*LPDIRECTSOUND*/ ma_ptr pPlayback;\n            /*LPDIRECTSOUNDBUFFER*/ ma_ptr pPlaybackPrimaryBuffer;\n            /*LPDIRECTSOUNDBUFFER*/ ma_ptr pPlaybackBuffer;\n            /*LPDIRECTSOUNDCAPTURE*/ ma_ptr pCapture;\n            /*LPDIRECTSOUNDCAPTUREBUFFER*/ ma_ptr pCaptureBuffer;\n        } dsound;\n#endif\n#ifdef MA_SUPPORT_WINMM\n        struct\n        {\n            /*HWAVEOUT*/ ma_handle hDevicePlayback;\n            /*HWAVEIN*/ ma_handle hDeviceCapture;\n            /*HANDLE*/ ma_handle hEventPlayback;\n            /*HANDLE*/ ma_handle hEventCapture;\n            ma_uint32 fragmentSizeInFrames;\n            ma_uint32 fragmentSizeInBytes;\n            ma_uint32 iNextHeaderPlayback;             /* [0,periods). Used as an index into pWAVEHDRPlayback. */\n            ma_uint32 iNextHeaderCapture;              /* [0,periods). Used as an index into pWAVEHDRCapture. */\n            ma_uint32 headerFramesConsumedPlayback;    /* The number of PCM frames consumed in the buffer in pWAVEHEADER[iNextHeader]. */\n            ma_uint32 headerFramesConsumedCapture;     /* ^^^ */\n            /*WAVEHDR**/ ma_uint8* pWAVEHDRPlayback;   /* One instantiation for each period. */\n            /*WAVEHDR**/ ma_uint8* pWAVEHDRCapture;    /* One instantiation for each period. */\n            ma_uint8* pIntermediaryBufferPlayback;\n            ma_uint8* pIntermediaryBufferCapture;\n            ma_uint8* _pHeapData;                      /* Used internally and is used for the heap allocated data for the intermediary buffer and the WAVEHDR structures. */\n            ma_bool32 isStarted;\n        } winmm;\n#endif\n#ifdef MA_SUPPORT_ALSA\n        struct\n        {\n            /*snd_pcm_t**/ ma_ptr pPCMPlayback;\n            /*snd_pcm_t**/ ma_ptr pPCMCapture;\n            ma_bool32 isUsingMMapPlayback : 1;\n            ma_bool32 isUsingMMapCapture  : 1;\n        } alsa;\n#endif\n#ifdef MA_SUPPORT_PULSEAUDIO\n        struct\n        {\n            /*pa_mainloop**/ ma_ptr pMainLoop;\n            /*pa_mainloop_api**/ ma_ptr pAPI;\n            /*pa_context**/ ma_ptr pPulseContext;\n            /*pa_stream**/ ma_ptr pStreamPlayback;\n            /*pa_stream**/ ma_ptr pStreamCapture;\n            /*pa_context_state*/ ma_uint32 pulseContextState;\n            void* pMappedBufferPlayback;\n            const void* pMappedBufferCapture;\n            ma_uint32 mappedBufferFramesRemainingPlayback;\n            ma_uint32 mappedBufferFramesRemainingCapture;\n            ma_uint32 mappedBufferFramesCapacityPlayback;\n            ma_uint32 mappedBufferFramesCapacityCapture;\n            ma_bool32 breakFromMainLoop : 1;\n        } pulse;\n#endif\n#ifdef MA_SUPPORT_JACK\n        struct\n        {\n            /*jack_client_t**/ ma_ptr pClient;\n            /*jack_port_t**/ ma_ptr pPortsPlayback[MA_MAX_CHANNELS];\n            /*jack_port_t**/ ma_ptr pPortsCapture[MA_MAX_CHANNELS];\n            float* pIntermediaryBufferPlayback; /* Typed as a float because JACK is always floating point. */\n            float* pIntermediaryBufferCapture;\n            ma_pcm_rb duplexRB;\n        } jack;\n#endif\n#ifdef MA_SUPPORT_COREAUDIO\n        struct\n        {\n            ma_uint32 deviceObjectIDPlayback;\n            ma_uint32 deviceObjectIDCapture;\n            /*AudioUnit*/ ma_ptr audioUnitPlayback;\n            /*AudioUnit*/ ma_ptr audioUnitCapture;\n            /*AudioBufferList**/ ma_ptr pAudioBufferList;  /* Only used for input devices. */\n            ma_event stopEvent;\n            ma_uint32 originalBufferSizeInFrames;\n            ma_uint32 originalBufferSizeInMilliseconds;\n            ma_uint32 originalPeriods;\n            ma_bool32 isDefaultPlaybackDevice;\n            ma_bool32 isDefaultCaptureDevice;\n            ma_bool32 isSwitchingPlaybackDevice;   /* <-- Set to true when the default device has changed and miniaudio is in the process of switching. */\n            ma_bool32 isSwitchingCaptureDevice;    /* <-- Set to true when the default device has changed and miniaudio is in the process of switching. */\n            ma_pcm_rb duplexRB;\n        } coreaudio;\n#endif\n#ifdef MA_SUPPORT_SNDIO\n        struct\n        {\n            ma_ptr handlePlayback;\n            ma_ptr handleCapture;\n            ma_bool32 isStartedPlayback;\n            ma_bool32 isStartedCapture;\n        } sndio;\n#endif\n#ifdef MA_SUPPORT_AUDIO4\n        struct\n        {\n            int fdPlayback;\n            int fdCapture;\n        } audio4;\n#endif\n#ifdef MA_SUPPORT_OSS\n        struct\n        {\n            int fdPlayback;\n            int fdCapture;\n        } oss;\n#endif\n#ifdef MA_SUPPORT_AAUDIO\n        struct\n        {\n            /*AAudioStream**/ ma_ptr pStreamPlayback;\n            /*AAudioStream**/ ma_ptr pStreamCapture;\n            ma_pcm_rb duplexRB;\n        } aaudio;\n#endif\n#ifdef MA_SUPPORT_OPENSL\n        struct\n        {\n            /*SLObjectItf*/ ma_ptr pOutputMixObj;\n            /*SLOutputMixItf*/ ma_ptr pOutputMix;\n            /*SLObjectItf*/ ma_ptr pAudioPlayerObj;\n            /*SLPlayItf*/ ma_ptr pAudioPlayer;\n            /*SLObjectItf*/ ma_ptr pAudioRecorderObj;\n            /*SLRecordItf*/ ma_ptr pAudioRecorder;\n            /*SLAndroidSimpleBufferQueueItf*/ ma_ptr pBufferQueuePlayback;\n            /*SLAndroidSimpleBufferQueueItf*/ ma_ptr pBufferQueueCapture;\n            ma_uint32 currentBufferIndexPlayback;\n            ma_uint32 currentBufferIndexCapture;\n            ma_uint8* pBufferPlayback;      /* This is malloc()'d and is used for storing audio data. Typed as ma_uint8 for easy offsetting. */\n            ma_uint8* pBufferCapture;\n            ma_pcm_rb duplexRB;\n        } opensl;\n#endif\n#ifdef MA_SUPPORT_WEBAUDIO\n        struct\n        {\n            int indexPlayback;              /* We use a factory on the JavaScript side to manage devices and use an index for JS/C interop. */\n            int indexCapture;\n            ma_pcm_rb duplexRB;             /* In external capture format. */\n        } webaudio;\n#endif\n#ifdef MA_SUPPORT_NULL\n        struct\n        {\n            ma_thread deviceThread;\n            ma_event operationEvent;\n            ma_event operationCompletionEvent;\n            ma_uint32 operation;\n            ma_result operationResult;\n            ma_timer timer;\n            double priorRunTime;\n            ma_uint32 currentPeriodFramesRemainingPlayback;\n            ma_uint32 currentPeriodFramesRemainingCapture;\n            ma_uint64 lastProcessedFramePlayback;\n            ma_uint32 lastProcessedFrameCapture;\n            ma_bool32 isStarted;\n        } null_device;\n#endif\n    };\n};\n#if defined(_MSC_VER)\n    #pragma warning(pop)\n#else\n    #pragma GCC diagnostic pop  /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */\n#endif\n\n/*\nInitializes a context.\n\nThe context is used for selecting and initializing the relevant backends.\n\nNote that the location of the context cannot change throughout it's lifetime. Consider allocating\nthe ma_context object with malloc() if this is an issue. The reason for this is that a pointer\nto the context is stored in the ma_device structure.\n\n<backends> is used to allow the application to prioritize backends depending on it's specific\nrequirements. This can be null in which case it uses the default priority, which is as follows:\n  - WASAPI\n  - DirectSound\n  - WinMM\n  - Core Audio (Apple)\n  - sndio\n  - audio(4)\n  - OSS\n  - PulseAudio\n  - ALSA\n  - JACK\n  - AAudio\n  - OpenSL|ES\n  - Web Audio / Emscripten\n  - Null\n\n<pConfig> is used to configure the context. Use the logCallback config to set a callback for whenever a\nlog message is posted. The priority of the worker thread can be set with the threadPriority config.\n\nIt is recommended that only a single context is active at any given time because it's a bulky data\nstructure which performs run-time linking for the relevant backends every time it's initialized.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: UNSAFE\n*/\nma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext);\n\n/*\nUninitializes a context.\n\nResults are undefined if you call this while any device created by this context is still active.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: UNSAFE\n*/\nma_result ma_context_uninit(ma_context* pContext);\n\n/*\nEnumerates over every device (both playback and capture).\n\nThis is a lower-level enumeration function to the easier to use ma_context_get_devices(). Use\nma_context_enumerate_devices() if you would rather not incur an internal heap allocation, or\nit simply suits your code better.\n\nDo _not_ assume the first enumerated device of a given type is the default device.\n\nSome backends and platforms may only support default playback and capture devices.\n\nNote that this only retrieves the ID and name/description of the device. The reason for only\nretrieving basic information is that it would otherwise require opening the backend device in\norder to probe it for more detailed information which can be inefficient. Consider using\nma_context_get_device_info() for this, but don't call it from within the enumeration callback.\n\nIn general, you should not do anything complicated from within the callback. In particular, do\nnot try initializing a device from within the callback.\n\nConsider using ma_context_get_devices() for a simpler and safer API, albeit at the expense of\nan internal heap allocation.\n\nReturning false from the callback will stop enumeration. Returning true will continue enumeration.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: SAFE\n  This is guarded using a simple mutex lock.\n*/\nma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData);\n\n/*\nRetrieves basic information about every active playback and/or capture device.\n\nYou can pass in NULL for the playback or capture lists in which case they'll be ignored.\n\nIt is _not_ safe to assume the first device in the list is the default device.\n\nThe returned pointers will become invalid upon the next call this this function, or when the\ncontext is uninitialized. Do not free the returned pointers.\n\nThis function follows the same enumeration rules as ma_context_enumerate_devices(). See\ndocumentation for ma_context_enumerate_devices() for more information.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: SAFE\n  Since each call to this function invalidates the pointers from the previous call, you\n  should not be calling this simultaneously across multiple threads. Instead, you need to\n  make a copy of the returned data with your own higher level synchronization.\n*/\nma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount);\n\n/*\nRetrieves information about a device with the given ID.\n\nDo _not_ call this from within the ma_context_enumerate_devices() callback.\n\nIt's possible for a device to have different information and capabilities depending on whether\nor not it's opened in shared or exclusive mode. For example, in shared mode, WASAPI always uses\nfloating point samples for mixing, but in exclusive mode it can be anything. Therefore, this\nfunction allows you to specify which share mode you want information for. Note that not all\nbackends and devices support shared or exclusive mode, in which case this function will fail\nif the requested share mode is unsupported.\n\nThis leaves pDeviceInfo unmodified in the result of an error.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: SAFE\n  This is guarded using a simple mutex lock.\n*/\nma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo);\n\n/*\nInitializes a device.\n\nThe context can be null in which case it uses the default. This is equivalent to passing in a\ncontext that was initialized like so:\n\n    ma_context_init(NULL, 0, NULL, &context);\n\nDo not pass in null for the context if you are needing to open multiple devices. You can,\nhowever, use null when initializing the first device, and then use device.pContext for the\ninitialization of other devices.\n\nThe device's configuration is controlled with pConfig. This allows you to configure the sample\nformat, channel count, sample rate, etc. Before calling ma_device_init(), you will need to\ninitialize a ma_device_config object using ma_device_config_init(). You must set the callback in\nthe device config. Once initialized, the device's config is immutable. If you need to change the\nconfig you will need to initialize a new device.\n\nPassing in 0 to any property in pConfig will force the use of a default value. In the case of\nsample format, channel count, sample rate and channel map it will default to the values used by\nthe backend's internal device. For the size of the buffer you can set bufferSizeInFrames or\nbufferSizeInMilliseconds (if both are set it will prioritize bufferSizeInFrames). If both are\nset to zero, it will default to MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_LOW_LATENCY or\nMA_BASE_BUFFER_SIZE_IN_MILLISECONDS_CONSERVATIVE, depending on whether or not performanceProfile\nis set to ma_performance_profile_low_latency or ma_performance_profile_conservative.\n\nIf you request exclusive mode and the backend does not support it an error will be returned. For\nrobustness, you may want to first try initializing the device in exclusive mode, and then fall back\nto shared mode if required. Alternatively you can just request shared mode (the default if you\nleave it unset in the config) which is the most reliable option. Some backends do not have a\npractical way of choosing whether or not the device should be exclusive or not (ALSA, for example)\nin which case it just acts as a hint. Unless you have special requirements you should try avoiding\nexclusive mode as it's intrusive to the user. Starting with Windows 10, miniaudio will use low-latency\nshared mode where possible which may make exclusive mode unnecessary.\n\nWhen sending or receiving data to/from a device, miniaudio will internally perform a format\nconversion to convert between the format specified by pConfig and the format used internally by\nthe backend. If you pass in NULL for pConfig or 0 for the sample format, channel count,\nsample rate _and_ channel map, data transmission will run on an optimized pass-through fast path.\n\nThe buffer size should be treated as a hint. miniaudio will try it's best to use exactly what you\nask for, but it may differ. You should not assume the number of frames specified in each call to\nthe data callback is exactly what you originally specified.\n\nThe <periods> property controls how frequently the background thread is woken to check for more\ndata. It's tied to the buffer size, so as an example, if your buffer size is equivalent to 10\nmilliseconds and you have 2 periods, the CPU will wake up approximately every 5 milliseconds.\n\nWhen compiling for UWP you must ensure you call this function on the main UI thread because the\noperating system may need to present the user with a message asking for permissions. Please refer\nto the official documentation for ActivateAudioInterfaceAsync() for more information.\n\nALSA Specific: When initializing the default device, requesting shared mode will try using the\n\"dmix\" device for playback and the \"dsnoop\" device for capture. If these fail it will try falling\nback to the \"hw\" device.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: UNSAFE\n  It is not safe to call this function simultaneously for different devices because some backends\n  depend on and mutate global state (such as OpenSL|ES). The same applies to calling this at the\n  same time as ma_device_uninit().\n*/\nma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice);\n\n/*\nInitializes a device without a context, with extra parameters for controlling the configuration\nof the internal self-managed context.\n\nSee ma_device_init() and ma_context_init().\n*/\nma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pContextConfig, const ma_device_config* pConfig, ma_device* pDevice);\n\n/*\nUninitializes a device.\n\nThis will explicitly stop the device. You do not need to call ma_device_stop() beforehand, but it's\nharmless if you do.\n\nDo not call this in any callback.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: UNSAFE\n  As soon as this API is called the device should be considered undefined. All bets are off if you\n  try using the device at the same time as uninitializing it.\n*/\nvoid ma_device_uninit(ma_device* pDevice);\n\n/*\nSets the callback to use when the device has stopped, either explicitly or as a result of an error.\n\nThread Safety: SAFE\n  This API is implemented as a simple atomic assignment.\n*/\nvoid ma_device_set_stop_callback(ma_device* pDevice, ma_stop_proc proc);\n\n/*\nActivates the device. For playback devices this begins playback. For capture devices it begins\nrecording.\n\nFor a playback device, this will retrieve an initial chunk of audio data from the client before\nreturning. The reason for this is to ensure there is valid audio data in the buffer, which needs\nto be done _before_ the device begins playback.\n\nThis API waits until the backend device has been started for real by the worker thread. It also\nwaits on a mutex for thread-safety.\n\nDo not call this in any callback.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: SAFE\n*/\nma_result ma_device_start(ma_device* pDevice);\n\n/*\nPuts the device to sleep, but does not uninitialize it. Use ma_device_start() to start it up again.\n\nThis API needs to wait on the worker thread to stop the backend device properly before returning. It\nalso waits on a mutex for thread-safety. In addition, some backends need to wait for the device to\nfinish playback/recording of the current fragment which can take some time (usually proportionate to\nthe buffer size that was specified at initialization time).\n\nThis should not drop unprocessed samples. Backends are required to either pause the stream in-place\nor drain the buffer if pausing is not possible. The reason for this is that stopping the device and\nthe resuming it with ma_device_start() (which you might do when your program loses focus) may result\nin a situation where those samples are never output to the speakers or received from the microphone\nwhich can in turn result in de-syncs.\n\nDo not call this in any callback.\n\nReturn Value:\n  MA_SUCCESS if successful; any other error code otherwise.\n\nThread Safety: SAFE\n*/\nma_result ma_device_stop(ma_device* pDevice);\n\n/*\nDetermines whether or not the device is started.\n\nThis is implemented as a simple accessor.\n\nReturn Value:\n  True if the device is started, false otherwise.\n\nThread Safety: SAFE\n  If another thread calls ma_device_start() or ma_device_stop() at this same time as this function\n  is called, there's a very small chance the return value will be out of sync.\n*/\nma_bool32 ma_device_is_started(ma_device* pDevice);\n\n\n/*\nHelper function for initializing a ma_context_config object.\n*/\nma_context_config ma_context_config_init(void);\n\n/*\nInitializes a device config.\n\nBy default, the device config will use native device settings (format, channels, sample rate, etc.). Using native\nsettings means you will get an optimized pass-through data transmission pipeline to and from the device, but you will\nneed to do all format conversions manually. Normally you would want to use a known format that your program can handle\nnatively, which you can do by specifying it after this function returns, like so:\n\n    ma_device_config config = ma_device_config_init(ma_device_type_playback);\n    config.callback = my_data_callback;\n    config.pUserData = pMyUserData;\n    config.format = ma_format_f32;\n    config.channels = 2;\n    config.sampleRate = 44100;\n\nIn this case miniaudio will perform all of the necessary data conversion for you behind the scenes.\n\nCurrently miniaudio only supports asynchronous, callback based data delivery which means you must specify callback. A\npointer to user data can also be specified which is set in the pUserData member of the ma_device object.\n\nTo specify a channel map you can use ma_get_standard_channel_map():\n\n    ma_get_standard_channel_map(ma_standard_channel_map_default, config.channels, config.channelMap);\n\nAlternatively you can set the channel map manually if you need something specific or something that isn't one of miniaudio's\nstock channel maps.\n\nBy default the system's default device will be used. Set the pDeviceID member to a pointer to a ma_device_id object to \nuse a specific device. You can enumerate over the devices with ma_context_enumerate_devices() or ma_context_get_devices()\nwhich will give you access to the device ID. Set pDeviceID to NULL to use the default device.\n\nThe device type can be one of the ma_device_type's:\n  ma_device_type_playback\n  ma_device_type_capture\n  ma_device_type_duplex\n\nThread Safety: SAFE\n*/\nma_device_config ma_device_config_init(ma_device_type deviceType);\n\n\n/************************************************************************************************************************************************************\n\nUtiltities\n\n************************************************************************************************************************************************************/\n\n/*\nCreates a mutex.\n\nA mutex must be created from a valid context. A mutex is initially unlocked.\n*/\nma_result ma_mutex_init(ma_context* pContext, ma_mutex* pMutex);\n\n/*\nDeletes a mutex.\n*/\nvoid ma_mutex_uninit(ma_mutex* pMutex);\n\n/*\nLocks a mutex with an infinite timeout.\n*/\nvoid ma_mutex_lock(ma_mutex* pMutex);\n\n/*\nUnlocks a mutex.\n*/\nvoid ma_mutex_unlock(ma_mutex* pMutex);\n\n\n/*\nRetrieves a friendly name for a backend.\n*/\nconst char* ma_get_backend_name(ma_backend backend);\n\n/*\nAdjust buffer size based on a scaling factor.\n\nThis just multiplies the base size by the scaling factor, making sure it's a size of at least 1.\n*/\nma_uint32 ma_scale_buffer_size(ma_uint32 baseBufferSize, float scale);\n\n/*\nCalculates a buffer size in milliseconds from the specified number of frames and sample rate.\n*/\nma_uint32 ma_calculate_buffer_size_in_milliseconds_from_frames(ma_uint32 bufferSizeInFrames, ma_uint32 sampleRate);\n\n/*\nCalculates a buffer size in frames from the specified number of milliseconds and sample rate.\n*/\nma_uint32 ma_calculate_buffer_size_in_frames_from_milliseconds(ma_uint32 bufferSizeInMilliseconds, ma_uint32 sampleRate);\n\n/*\nRetrieves the default buffer size in milliseconds based on the specified performance profile.\n*/\nma_uint32 ma_get_default_buffer_size_in_milliseconds(ma_performance_profile performanceProfile);\n\n/*\nCalculates a buffer size in frames for the specified performance profile and scale factor.\n*/\nma_uint32 ma_get_default_buffer_size_in_frames(ma_performance_profile performanceProfile, ma_uint32 sampleRate);\n\n/*\nCopies silent frames into the given buffer.\n*/\nvoid ma_zero_pcm_frames(void* p, ma_uint32 frameCount, ma_format format, ma_uint32 channels);\n\n#endif  /* MA_NO_DEVICE_IO */\n\n\n\n\n/************************************************************************************************************************************************************\n\nDecoding\n\n************************************************************************************************************************************************************/\n#ifndef MA_NO_DECODING\n\ntypedef struct ma_decoder ma_decoder;\n\ntypedef enum\n{\n    ma_seek_origin_start,\n    ma_seek_origin_current\n} ma_seek_origin;\n\ntypedef size_t    (* ma_decoder_read_proc)                    (ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead); /* Returns the number of bytes read. */\ntypedef ma_bool32 (* ma_decoder_seek_proc)                    (ma_decoder* pDecoder, int byteOffset, ma_seek_origin origin);\ntypedef ma_result (* ma_decoder_seek_to_pcm_frame_proc)       (ma_decoder* pDecoder, ma_uint64 frameIndex);\ntypedef ma_result (* ma_decoder_uninit_proc)                  (ma_decoder* pDecoder);\ntypedef ma_uint64 (* ma_decoder_get_length_in_pcm_frames_proc)(ma_decoder* pDecoder);\n\ntypedef struct\n{\n    ma_format format;      /* Set to 0 or ma_format_unknown to use the stream's internal format. */\n    ma_uint32 channels;    /* Set to 0 to use the stream's internal channels. */\n    ma_uint32 sampleRate;  /* Set to 0 to use the stream's internal sample rate. */\n    ma_channel channelMap[MA_MAX_CHANNELS];\n    ma_channel_mix_mode channelMixMode;\n    ma_dither_mode ditherMode;\n    ma_src_algorithm srcAlgorithm;\n    union\n    {\n        ma_src_config_sinc sinc;\n    } src;\n} ma_decoder_config;\n\nstruct ma_decoder\n{\n    ma_decoder_read_proc onRead;\n    ma_decoder_seek_proc onSeek;\n    void* pUserData;\n    ma_uint64  readPointer; /* Used for returning back to a previous position after analysing the stream or whatnot. */\n    ma_format  internalFormat;\n    ma_uint32  internalChannels;\n    ma_uint32  internalSampleRate;\n    ma_channel internalChannelMap[MA_MAX_CHANNELS];\n    ma_format  outputFormat;\n    ma_uint32  outputChannels;\n    ma_uint32  outputSampleRate;\n    ma_channel outputChannelMap[MA_MAX_CHANNELS];\n    ma_pcm_converter dsp;   /* <-- Format conversion is achieved by running frames through this. */\n    ma_decoder_seek_to_pcm_frame_proc onSeekToPCMFrame;\n    ma_decoder_uninit_proc onUninit;\n    ma_decoder_get_length_in_pcm_frames_proc onGetLengthInPCMFrames;\n    void* pInternalDecoder; /* <-- The drwav/drflac/stb_vorbis/etc. objects. */\n    struct\n    {\n        const ma_uint8* pData;\n        size_t dataSize;\n        size_t currentReadPos;\n    } memory;               /* Only used for decoders that were opened against a block of memory. */\n};\n\nma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate);\n\nma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_wav(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_flac(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_vorbis(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_mp3(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_raw(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfigIn, const ma_decoder_config* pConfigOut, ma_decoder* pDecoder);\n\nma_result ma_decoder_init_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_memory_wav(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_memory_flac(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_memory_vorbis(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_memory_mp3(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_memory_raw(const void* pData, size_t dataSize, const ma_decoder_config* pConfigIn, const ma_decoder_config* pConfigOut, ma_decoder* pDecoder);\n\n#ifndef MA_NO_STDIO\nma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nma_result ma_decoder_init_file_wav(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\n#endif\n\nma_result ma_decoder_uninit(ma_decoder* pDecoder);\n\n/*\nRetrieves the length of the decoder in PCM frames.\n\nDo not call this on streams of an undefined length, such as internet radio.\n\nIf the length is unknown or an error occurs, 0 will be returned.\n\nThis will always return 0 for Vorbis decoders. This is due to a limitation with stb_vorbis in push mode which is what miniaudio\nuses internally.\n\nThis will run in linear time for MP3 decoders. Do not call this in time critical scenarios.\n*/\nma_uint64 ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder);\n\nma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount);\nma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex);\n\n/*\nHelper for opening and decoding a file into a heap allocated block of memory. Free the returned pointer with ma_free(). On input,\npConfig should be set to what you want. On output it will be set to what you got.\n*/\n#ifndef MA_NO_STDIO\nma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppDataOut);\n#endif\nma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppDataOut);\n\n#endif  /* MA_NO_DECODING */\n\n\n/************************************************************************************************************************************************************\n\nGeneration\n\n************************************************************************************************************************************************************/\ntypedef struct\n{\n    double amplitude;\n    double periodsPerSecond;\n    double delta;\n    double time;\n} ma_sine_wave;\n\nma_result ma_sine_wave_init(double amplitude, double period, ma_uint32 sampleRate, ma_sine_wave* pSineWave);\nma_uint64 ma_sine_wave_read_f32(ma_sine_wave* pSineWave, ma_uint64 count, float* pSamples);\nma_uint64 ma_sine_wave_read_f32_ex(ma_sine_wave* pSineWave, ma_uint64 frameCount, ma_uint32 channels, ma_stream_layout layout, float** ppFrames);\n\n#ifdef __cplusplus\n}\n#endif\n#endif  /* miniaudio_h */\n\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nIMPLEMENTATION\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n#if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)\n#include <assert.h>\n#include <limits.h> /* For INT_MAX */\n#include <math.h>   /* sin(), etc. */\n\n#if defined(MA_DEBUG_OUTPUT)\n#include <stdio.h>  /* for printf() for debug output */\n#endif\n\n#ifdef MA_WIN32\n#include <windows.h>\n#include <objbase.h>\n#include <mmreg.h>\n#include <mmsystem.h>\n#else\n#include <stdlib.h> /* For malloc()/free() */\n#include <string.h> /* For memset() */\n#endif\n\n#if defined(MA_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200)\n#include <mach/mach_time.h> /* For mach_absolute_time() */\n#endif\n\n#ifdef MA_POSIX\n#include <sys/time.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <dlfcn.h>\n#endif\n\n#ifdef MA_EMSCRIPTEN\n#include <emscripten/emscripten.h>\n#endif\n\n#if !defined(MA_64BIT) && !defined(MA_32BIT)\n#ifdef _WIN32\n#ifdef _WIN64\n#define MA_64BIT\n#else\n#define MA_32BIT\n#endif\n#endif\n#endif\n\n#if !defined(MA_64BIT) && !defined(MA_32BIT)\n#ifdef __GNUC__\n#ifdef __LP64__\n#define MA_64BIT\n#else\n#define MA_32BIT\n#endif\n#endif\n#endif\n\n#if !defined(MA_64BIT) && !defined(MA_32BIT)\n#include <stdint.h>\n#if INTPTR_MAX == INT64_MAX\n#define MA_64BIT\n#else\n#define MA_32BIT\n#endif\n#endif\n\n/* Architecture Detection */\n#if defined(__x86_64__) || defined(_M_X64)\n#define MA_X64\n#elif defined(__i386) || defined(_M_IX86)\n#define MA_X86\n#elif defined(__arm__) || defined(_M_ARM)\n#define MA_ARM\n#endif\n\n/* Cannot currently support AVX-512 if AVX is disabled. */\n#if !defined(MA_NO_AVX512) && defined(MA_NO_AVX2)\n#define MA_NO_AVX512\n#endif\n\n/* Intrinsics Support */\n#if defined(MA_X64) || defined(MA_X86)\n    #if defined(_MSC_VER) && !defined(__clang__)\n        /* MSVC. */\n        #if _MSC_VER >= 1400 && !defined(MA_NO_SSE2)   /* 2005 */\n            #define MA_SUPPORT_SSE2\n        #endif\n        /*#if _MSC_VER >= 1600 && !defined(MA_NO_AVX)*/    /* 2010 */\n        /*    #define MA_SUPPORT_AVX*/\n        /*#endif*/\n        #if _MSC_VER >= 1700 && !defined(MA_NO_AVX2)   /* 2012 */\n            #define MA_SUPPORT_AVX2\n        #endif\n        #if _MSC_VER >= 1910 && !defined(MA_NO_AVX512) /* 2017 */\n            #define MA_SUPPORT_AVX512\n        #endif\n    #else\n        /* Assume GNUC-style. */\n        #if defined(__SSE2__) && !defined(MA_NO_SSE2)\n            #define MA_SUPPORT_SSE2\n        #endif\n        /*#if defined(__AVX__) && !defined(MA_NO_AVX)*/\n        /*    #define MA_SUPPORT_AVX*/\n        /*#endif*/\n        #if defined(__AVX2__) && !defined(MA_NO_AVX2)\n            #define MA_SUPPORT_AVX2\n        #endif\n        #if defined(__AVX512F__) && !defined(MA_NO_AVX512)\n            #define MA_SUPPORT_AVX512\n        #endif\n    #endif\n\n    /* If at this point we still haven't determined compiler support for the intrinsics just fall back to __has_include. */\n    #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include)\n        #if !defined(MA_SUPPORT_SSE2)   && !defined(MA_NO_SSE2)   && __has_include(<emmintrin.h>)\n            #define MA_SUPPORT_SSE2\n        #endif\n        /*#if !defined(MA_SUPPORT_AVX)    && !defined(MA_NO_AVX)    && __has_include(<immintrin.h>)*/\n        /*    #define MA_SUPPORT_AVX*/\n        /*#endif*/\n        #if !defined(MA_SUPPORT_AVX2)   && !defined(MA_NO_AVX2)   && __has_include(<immintrin.h>)\n            #define MA_SUPPORT_AVX2\n        #endif\n        #if !defined(MA_SUPPORT_AVX512) && !defined(MA_NO_AVX512) && __has_include(<zmmintrin.h>)\n            #define MA_SUPPORT_AVX512\n        #endif\n    #endif\n\n    #if defined(MA_SUPPORT_AVX512)\n        #include <immintrin.h>  /* Not a mistake. Intentionally including <immintrin.h> instead of <zmmintrin.h> because otherwise the compiler will complain. */\n    #elif defined(MA_SUPPORT_AVX2) || defined(MA_SUPPORT_AVX)\n        #include <immintrin.h>\n    #elif defined(MA_SUPPORT_SSE2)\n        #include <emmintrin.h>\n    #endif\n#endif\n\n#if defined(MA_ARM)\n    #if !defined(MA_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n        #define MA_SUPPORT_NEON\n    #endif\n\n    /* Fall back to looking for the #include file. */\n    #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include)\n        #if !defined(MA_SUPPORT_NEON) && !defined(MA_NO_NEON) && __has_include(<arm_neon.h>)\n            #define MA_SUPPORT_NEON\n        #endif\n    #endif\n\n    #if defined(MA_SUPPORT_NEON)\n        #include <arm_neon.h>\n    #endif\n#endif\n\n#if defined(_MSC_VER)\n    #pragma warning(push)\n    #pragma warning(disable:4752)   /* found Intel(R) Advanced Vector Extensions; consider using /arch:AVX */\n#endif\n\n#if defined(MA_X64) || defined(MA_X86)\n    #if defined(_MSC_VER) && !defined(__clang__)\n        #if _MSC_VER >= 1400\n            #include <intrin.h>\n            static MA_INLINE void ma_cpuid(int info[4], int fid)\n            {\n                __cpuid(info, fid);\n            }\n        #else\n            #define MA_NO_CPUID\n        #endif\n\n        #if _MSC_VER >= 1600\n            static MA_INLINE unsigned __int64 ma_xgetbv(int reg)\n            {\n                return _xgetbv(reg);\n            }\n        #else\n            #define MA_NO_XGETBV\n        #endif\n    #elif (defined(__GNUC__) || defined(__clang__)) && !defined(MA_ANDROID)\n        static MA_INLINE void ma_cpuid(int info[4], int fid)\n        {\n            /*\n            It looks like the -fPIC option uses the ebx register which GCC complains about. We can work around this by just using a different register, the\n            specific register of which I'm letting the compiler decide on. The \"k\" prefix is used to specify a 32-bit register. The {...} syntax is for\n            supporting different assembly dialects.\n            \n            What's basically happening is that we're saving and restoring the ebx register manually.\n            */\n            #if defined(DRFLAC_X86) && defined(__PIC__)\n                __asm__ __volatile__ (\n                    \"xchg{l} {%%}ebx, %k1;\"\n                    \"cpuid;\"\n                    \"xchg{l} {%%}ebx, %k1;\"\n                    : \"=a\"(info[0]), \"=&r\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                );\n            #else\n                __asm__ __volatile__ (\n                    \"cpuid\" : \"=a\"(info[0]), \"=b\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                );\n            #endif\n        }\n\n        static MA_INLINE ma_uint64 ma_xgetbv(int reg)\n        {\n            unsigned int hi;\n            unsigned int lo;\n\n            __asm__ __volatile__ (\n                \"xgetbv\" : \"=a\"(lo), \"=d\"(hi) : \"c\"(reg)\n            );\n\n            return ((ma_uint64)hi << 32) | (ma_uint64)lo;\n        }\n    #else\n        #define MA_NO_CPUID\n        #define MA_NO_XGETBV\n    #endif\n#else\n    #define MA_NO_CPUID\n    #define MA_NO_XGETBV\n#endif\n\nstatic MA_INLINE ma_bool32 ma_has_sse2()\n{\n#if defined(MA_SUPPORT_SSE2)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_SSE2)\n        #if defined(MA_X64)\n            return MA_TRUE;    /* 64-bit targets always support SSE2. */\n        #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate SSE2 code we can assume support. */\n        #else\n            #if defined(MA_NO_CPUID)\n                return MA_FALSE;\n            #else\n                int info[4];\n                ma_cpuid(info, 1);\n                return (info[3] & (1 << 26)) != 0;\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* SSE2 is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\n#if 0\nstatic MA_INLINE ma_bool32 ma_has_avx()\n{\n#if defined(MA_SUPPORT_AVX)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX)\n        #if defined(_AVX_) || defined(__AVX__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate AVX code we can assume support. */\n        #else\n            /* AVX requires both CPU and OS support. */\n            #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV)\n                return MA_FALSE;\n            #else\n                int info[4];\n                ma_cpuid(info, 1);\n                if (((info[2] & (1 << 27)) != 0) && ((info[2] & (1 << 28)) != 0)) {\n                    ma_uint64 xrc = ma_xgetbv(0);\n                    if ((xrc & 0x06) == 0x06) {\n                        return MA_TRUE;\n                    } else {\n                        return MA_FALSE;\n                    }\n                } else {\n                    return MA_FALSE;\n                }\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* AVX is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n#endif\n\nstatic MA_INLINE ma_bool32 ma_has_avx2()\n{\n#if defined(MA_SUPPORT_AVX2)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX2)\n        #if defined(_AVX2_) || defined(__AVX2__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate AVX2 code we can assume support. */\n        #else\n            /* AVX2 requires both CPU and OS support. */\n            #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV)\n                return MA_FALSE;\n            #else\n                int info1[4];\n                int info7[4];\n                ma_cpuid(info1, 1);\n                ma_cpuid(info7, 7);\n                if (((info1[2] & (1 << 27)) != 0) && ((info7[1] & (1 << 5)) != 0)) {\n                    ma_uint64 xrc = ma_xgetbv(0);\n                    if ((xrc & 0x06) == 0x06) {\n                        return MA_TRUE;\n                    } else {\n                        return MA_FALSE;\n                    }\n                } else {\n                    return MA_FALSE;\n                }\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* AVX2 is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\nstatic MA_INLINE ma_bool32 ma_has_avx512f()\n{\n#if defined(MA_SUPPORT_AVX512)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX512)\n        #if defined(__AVX512F__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate AVX-512F code we can assume support. */\n        #else\n            /* AVX-512 requires both CPU and OS support. */\n            #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV)\n                return MA_FALSE;\n            #else\n                int info1[4];\n                int info7[4];\n                ma_cpuid(info1, 1);\n                ma_cpuid(info7, 7);\n                if (((info1[2] & (1 << 27)) != 0) && ((info7[1] & (1 << 16)) != 0)) {\n                    ma_uint64 xrc = ma_xgetbv(0);\n                    if ((xrc & 0xE6) == 0xE6) {\n                        return MA_TRUE;\n                    } else {\n                        return MA_FALSE;\n                    }\n                } else {\n                    return MA_FALSE;\n                }\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* AVX-512F is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\nstatic MA_INLINE ma_bool32 ma_has_neon()\n{\n#if defined(MA_SUPPORT_NEON)\n    #if defined(MA_ARM) && !defined(MA_NO_NEON)\n        #if (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n            return MA_TRUE;    /* If the compiler is allowed to freely generate NEON code we can assume support. */\n        #else\n            /* TODO: Runtime check. */\n            return MA_FALSE;\n        #endif\n    #else\n        return MA_FALSE;       /* NEON is only supported on ARM architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\n\nstatic MA_INLINE ma_bool32 ma_is_little_endian()\n{\n#if defined(MA_X86) || defined(MA_X64)\n    return MA_TRUE;\n#else\n    int n = 1;\n    return (*(char*)&n) == 1;\n#endif\n}\n\nstatic MA_INLINE ma_bool32 ma_is_big_endian()\n{\n    return !ma_is_little_endian();\n}\n\n\n#ifndef MA_COINIT_VALUE\n#define MA_COINIT_VALUE    0   /* 0 = COINIT_MULTITHREADED*/\n#endif\n\n\n\n#ifndef MA_PI\n#define MA_PI      3.14159265358979323846264f\n#endif\n#ifndef MA_PI_D\n#define MA_PI_D    3.14159265358979323846264\n#endif\n#ifndef MA_TAU\n#define MA_TAU     6.28318530717958647693f\n#endif\n#ifndef MA_TAU_D\n#define MA_TAU_D   6.28318530717958647693\n#endif\n\n\n/* The default format when ma_format_unknown (0) is requested when initializing a device. */\n#ifndef MA_DEFAULT_FORMAT\n#define MA_DEFAULT_FORMAT                                  ma_format_f32\n#endif\n\n/* The default channel count to use when 0 is used when initializing a device. */\n#ifndef MA_DEFAULT_CHANNELS\n#define MA_DEFAULT_CHANNELS                                2\n#endif\n\n/* The default sample rate to use when 0 is used when initializing a device. */\n#ifndef MA_DEFAULT_SAMPLE_RATE\n#define MA_DEFAULT_SAMPLE_RATE                             48000\n#endif\n\n/* Default periods when none is specified in ma_device_init(). More periods means more work on the CPU. */\n#ifndef MA_DEFAULT_PERIODS\n#define MA_DEFAULT_PERIODS                                 3\n#endif\n\n/* The base buffer size in milliseconds for low latency mode. */\n#ifndef MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_LOW_LATENCY\n#define MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_LOW_LATENCY    (10*MA_DEFAULT_PERIODS)\n#endif\n\n/* The base buffer size in milliseconds for conservative mode. */\n#ifndef MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_CONSERVATIVE\n#define MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_CONSERVATIVE   (100*MA_DEFAULT_PERIODS)\n#endif\n\n\n/* Standard sample rates, in order of priority. */\nma_uint32 g_maStandardSampleRatePriorities[] = {\n    MA_SAMPLE_RATE_48000,  /* Most common */\n    MA_SAMPLE_RATE_44100,\n\n    MA_SAMPLE_RATE_32000,  /* Lows */\n    MA_SAMPLE_RATE_24000,\n    MA_SAMPLE_RATE_22050,\n\n    MA_SAMPLE_RATE_88200,  /* Highs */\n    MA_SAMPLE_RATE_96000,\n    MA_SAMPLE_RATE_176400,\n    MA_SAMPLE_RATE_192000,\n\n    MA_SAMPLE_RATE_16000,  /* Extreme lows */\n    MA_SAMPLE_RATE_11025,\n    MA_SAMPLE_RATE_8000,\n\n    MA_SAMPLE_RATE_352800, /* Extreme highs */\n    MA_SAMPLE_RATE_384000\n};\n\nma_format g_maFormatPriorities[] = {\n    ma_format_s16,         /* Most common */\n    ma_format_f32,\n    \n    /*ma_format_s24_32,*/    /* Clean alignment */\n    ma_format_s32,\n    \n    ma_format_s24,         /* Unclean alignment */\n    \n    ma_format_u8           /* Low quality */\n};\n\n\n\n/******************************************************************************\n\nStandard Library Stuff\n\n******************************************************************************/\n#ifndef MA_MALLOC\n#ifdef MA_WIN32\n#define MA_MALLOC(sz) HeapAlloc(GetProcessHeap(), 0, (sz))\n#else\n#define MA_MALLOC(sz) malloc((sz))\n#endif\n#endif\n\n#ifndef MA_REALLOC\n#ifdef MA_WIN32\n#define MA_REALLOC(p, sz) (((sz) > 0) ? ((p) ? HeapReAlloc(GetProcessHeap(), 0, (p), (sz)) : HeapAlloc(GetProcessHeap(), 0, (sz))) : ((VOID*)(size_t)(HeapFree(GetProcessHeap(), 0, (p)) & 0)))\n#else\n#define MA_REALLOC(p, sz) realloc((p), (sz))\n#endif\n#endif\n\n#ifndef MA_FREE\n#ifdef MA_WIN32\n#define MA_FREE(p) HeapFree(GetProcessHeap(), 0, (p))\n#else\n#define MA_FREE(p) free((p))\n#endif\n#endif\n\n#ifndef MA_ZERO_MEMORY\n#ifdef MA_WIN32\n#define MA_ZERO_MEMORY(p, sz) ZeroMemory((p), (sz))\n#else\n#define MA_ZERO_MEMORY(p, sz) memset((p), 0, (sz))\n#endif\n#endif\n\n#ifndef MA_COPY_MEMORY\n#ifdef MA_WIN32\n#define MA_COPY_MEMORY(dst, src, sz) CopyMemory((dst), (src), (sz))\n#else\n#define MA_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))\n#endif\n#endif\n\n#ifndef MA_ASSERT\n#ifdef MA_WIN32\n#define MA_ASSERT(condition) assert(condition)\n#else\n#define MA_ASSERT(condition) assert(condition)\n#endif\n#endif\n\n#define ma_zero_memory MA_ZERO_MEMORY\n#define ma_copy_memory MA_COPY_MEMORY\n#define ma_assert      MA_ASSERT\n\n#define ma_zero_object(p)          ma_zero_memory((p), sizeof(*(p)))\n#define ma_countof(x)              (sizeof(x) / sizeof(x[0]))\n#define ma_max(x, y)               (((x) > (y)) ? (x) : (y))\n#define ma_min(x, y)               (((x) < (y)) ? (x) : (y))\n#define ma_clamp(x, lo, hi)        (ma_max(lo, ma_min(x, hi)))\n#define ma_offset_ptr(p, offset)   (((ma_uint8*)(p)) + (offset))\n\n#define ma_buffer_frame_capacity(buffer, channels, format) (sizeof(buffer) / ma_get_bytes_per_sample(format) / (channels))\n\n/*\nReturn Values:\n  0:  Success\n  22: EINVAL\n  34: ERANGE\n\nNot using symbolic constants for errors because I want to avoid #including errno.h\n*/\nint ma_strcpy_s(char* dst, size_t dstSizeInBytes, const char* src)\n{\n    size_t i;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    for (i = 0; i < dstSizeInBytes && src[i] != '\\0'; ++i) {\n        dst[i] = src[i];\n    }\n\n    if (i < dstSizeInBytes) {\n        dst[i] = '\\0';\n        return 0;\n    }\n\n    dst[0] = '\\0';\n    return 34;\n}\n\nint ma_strncpy_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count)\n{\n    size_t maxcount;\n    size_t i;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    maxcount = count;\n    if (count == ((size_t)-1) || count >= dstSizeInBytes) {        /* -1 = _TRUNCATE */\n        maxcount = dstSizeInBytes - 1;\n    }\n\n    for (i = 0; i < maxcount && src[i] != '\\0'; ++i) {\n        dst[i] = src[i];\n    }\n\n    if (src[i] == '\\0' || i == count || count == ((size_t)-1)) {\n        dst[i] = '\\0';\n        return 0;\n    }\n\n    dst[0] = '\\0';\n    return 34;\n}\n\nint ma_strcat_s(char* dst, size_t dstSizeInBytes, const char* src)\n{\n    char* dstorig;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    dstorig = dst;\n\n    while (dstSizeInBytes > 0 && dst[0] != '\\0') {\n        dst += 1;\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes == 0) {\n        return 22;  /* Unterminated. */\n    }\n\n\n    while (dstSizeInBytes > 0 && src[0] != '\\0') {\n        *dst++ = *src++;\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes > 0) {\n        dst[0] = '\\0';\n    } else {\n        dstorig[0] = '\\0';\n        return 34;\n    }\n\n    return 0;\n}\n\nint ma_strncat_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count)\n{\n    char* dstorig;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        return 22;\n    }\n\n    dstorig = dst;\n\n    while (dstSizeInBytes > 0 && dst[0] != '\\0') {\n        dst += 1;\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes == 0) {\n        return 22;  /* Unterminated. */\n    }\n\n\n    if (count == ((size_t)-1)) {        /* _TRUNCATE */\n        count = dstSizeInBytes - 1;\n    }\n\n    while (dstSizeInBytes > 0 && src[0] != '\\0' && count > 0) {\n        *dst++ = *src++;\n        dstSizeInBytes -= 1;\n        count -= 1;\n    }\n\n    if (dstSizeInBytes > 0) {\n        dst[0] = '\\0';\n    } else {\n        dstorig[0] = '\\0';\n        return 34;\n    }\n\n    return 0;\n}\n\nint ma_itoa_s(int value, char* dst, size_t dstSizeInBytes, int radix)\n{\n    int sign;\n    unsigned int valueU;\n    char* dstEnd;\n\n    if (dst == NULL || dstSizeInBytes == 0) {\n        return 22;\n    }\n    if (radix < 2 || radix > 36) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    sign = (value < 0 && radix == 10) ? -1 : 1;     /* The negative sign is only used when the base is 10. */\n\n    if (value < 0) {\n        valueU = -value;\n    } else {\n        valueU = value;\n    }\n\n    dstEnd = dst;\n    do\n    {\n        int remainder = valueU % radix;\n        if (remainder > 9) {\n            *dstEnd = (char)((remainder - 10) + 'a');\n        } else {\n            *dstEnd = (char)(remainder + '0');\n        }\n\n        dstEnd += 1;\n        dstSizeInBytes -= 1;\n        valueU /= radix;\n    } while (dstSizeInBytes > 0 && valueU > 0);\n\n    if (dstSizeInBytes == 0) {\n        dst[0] = '\\0';\n        return 22;  /* Ran out of room in the output buffer. */\n    }\n\n    if (sign < 0) {\n        *dstEnd++ = '-';\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes == 0) {\n        dst[0] = '\\0';\n        return 22;  /* Ran out of room in the output buffer. */\n    }\n\n    *dstEnd = '\\0';\n\n\n    /* At this point the string will be reversed. */\n    dstEnd -= 1;\n    while (dst < dstEnd) {\n        char temp = *dst;\n        *dst = *dstEnd;\n        *dstEnd = temp;\n\n        dst += 1;\n        dstEnd -= 1;\n    }\n\n    return 0;\n}\n\nint ma_strcmp(const char* str1, const char* str2)\n{\n    if (str1 == str2) return  0;\n\n    /* These checks differ from the standard implementation. It's not important, but I prefer it just for sanity. */\n    if (str1 == NULL) return -1;\n    if (str2 == NULL) return  1;\n\n    for (;;) {\n        if (str1[0] == '\\0') {\n            break;\n        }\n        if (str1[0] != str2[0]) {\n            break;\n        }\n\n        str1 += 1;\n        str2 += 1;\n    }\n\n    return ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0];\n}\n\nint ma_strappend(char* dst, size_t dstSize, const char* srcA, const char* srcB)\n{\n    int result;\n\n    result = ma_strncpy_s(dst, dstSize, srcA, (size_t)-1);\n    if (result != 0) {\n        return result;\n    }\n\n    result = ma_strncat_s(dst, dstSize, srcB, (size_t)-1);\n    if (result != 0) {\n        return result;\n    }\n\n    return result;\n}\n\nchar* ma_copy_string(const char* src)\n{\n    size_t sz = strlen(src)+1;\n    char* dst = (char*)ma_malloc(sz);\n    if (dst == NULL) {\n        return NULL;\n    }\n\n    ma_strcpy_s(dst, sz, src);\n\n    return dst;\n}\n\n\n/* Thanks to good old Bit Twiddling Hacks for this one: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */\nstatic MA_INLINE unsigned int ma_next_power_of_2(unsigned int x)\n{\n    x--;\n    x |= x >> 1;\n    x |= x >> 2;\n    x |= x >> 4;\n    x |= x >> 8;\n    x |= x >> 16;\n    x++;\n\n    return x;\n}\n\nstatic MA_INLINE unsigned int ma_prev_power_of_2(unsigned int x)\n{\n    return ma_next_power_of_2(x) >> 1;\n}\n\nstatic MA_INLINE unsigned int ma_round_to_power_of_2(unsigned int x)\n{\n    unsigned int prev = ma_prev_power_of_2(x);\n    unsigned int next = ma_next_power_of_2(x);\n    if ((next - x) > (x - prev)) {\n        return prev;\n    } else {\n        return next;\n    }\n}\n\nstatic MA_INLINE unsigned int ma_count_set_bits(unsigned int x)\n{\n    unsigned int count = 0;\n    while (x != 0) {\n        if (x & 1) {\n            count += 1;\n        }\n        \n        x = x >> 1;\n    }\n    \n    return count;\n}\n\n\n\n/* Clamps an f32 sample to -1..1 */\nstatic MA_INLINE float ma_clip_f32(float x)\n{\n    if (x < -1) return -1;\n    if (x > +1) return +1;\n    return x;\n}\n\nstatic MA_INLINE float ma_mix_f32(float x, float y, float a)\n{\n    return x*(1-a) + y*a;\n}\nstatic MA_INLINE float ma_mix_f32_fast(float x, float y, float a)\n{\n    float r0 = (y - x);\n    float r1 = r0*a;\n    return x + r1;\n    /*return x + (y - x)*a;*/\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE __m128 ma_mix_f32_fast__sse2(__m128 x, __m128 y, __m128 a)\n{\n    return _mm_add_ps(x, _mm_mul_ps(_mm_sub_ps(y, x), a));\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nstatic MA_INLINE __m256 ma_mix_f32_fast__avx2(__m256 x, __m256 y, __m256 a)\n{\n    return _mm256_add_ps(x, _mm256_mul_ps(_mm256_sub_ps(y, x), a));\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nstatic MA_INLINE __m512 ma_mix_f32_fast__avx512(__m512 x, __m512 y, __m512 a)\n{\n    return _mm512_add_ps(x, _mm512_mul_ps(_mm512_sub_ps(y, x), a));\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE float32x4_t ma_mix_f32_fast__neon(float32x4_t x, float32x4_t y, float32x4_t a)\n{\n    return vaddq_f32(x, vmulq_f32(vsubq_f32(y, x), a));\n}\n#endif\n\n\nstatic MA_INLINE double ma_mix_f64(double x, double y, double a)\n{\n    return x*(1-a) + y*a;\n}\nstatic MA_INLINE double ma_mix_f64_fast(double x, double y, double a)\n{\n    return x + (y - x)*a;\n}\n\nstatic MA_INLINE float ma_scale_to_range_f32(float x, float lo, float hi)\n{\n    return lo + x*(hi-lo);\n}\n\n\n/*\nRandom Number Generation\n\nminiaudio uses the LCG random number generation algorithm. This is good enough for audio.\n\nNote that miniaudio's LCG implementation uses global state which is _not_ thread-local. When this is called across\nmultiple threads, results will be unpredictable. However, it won't crash and results will still be random enough\nfor miniaudio's purposes.\n*/\n#define MA_LCG_M   2147483647\n#define MA_LCG_A   48271\n#define MA_LCG_C   0\nstatic ma_int32 g_maLCG;\n\nvoid ma_seed(ma_int32 seed)\n{\n    g_maLCG = seed;\n}\n\nma_int32 ma_rand_s32()\n{\n    ma_int32 lcg = g_maLCG;\n    ma_int32 r = (MA_LCG_A * lcg + MA_LCG_C) % MA_LCG_M;\n    g_maLCG = r;\n    return r;\n}\n\ndouble ma_rand_f64()\n{\n    return (ma_rand_s32() + 0x80000000) / (double)0x7FFFFFFF;\n}\n\nfloat ma_rand_f32()\n{\n    return (float)ma_rand_f64();\n}\n\nstatic MA_INLINE float ma_rand_range_f32(float lo, float hi)\n{\n    return ma_scale_to_range_f32(ma_rand_f32(), lo, hi);\n}\n\nstatic MA_INLINE ma_int32 ma_rand_range_s32(ma_int32 lo, ma_int32 hi)\n{\n    double x = ma_rand_f64();\n    return lo + (ma_int32)(x*(hi-lo));\n}\n\n\nstatic MA_INLINE float ma_dither_f32_rectangle(float ditherMin, float ditherMax)\n{\n    return ma_rand_range_f32(ditherMin, ditherMax);\n}\n\nstatic MA_INLINE float ma_dither_f32_triangle(float ditherMin, float ditherMax)\n{\n    float a = ma_rand_range_f32(ditherMin, 0);\n    float b = ma_rand_range_f32(0, ditherMax);\n    return a + b;\n}\n\nstatic MA_INLINE float ma_dither_f32(ma_dither_mode ditherMode, float ditherMin, float ditherMax)\n{\n    if (ditherMode == ma_dither_mode_rectangle) {\n        return ma_dither_f32_rectangle(ditherMin, ditherMax);\n    }\n    if (ditherMode == ma_dither_mode_triangle) {\n        return ma_dither_f32_triangle(ditherMin, ditherMax);\n    }\n\n    return 0;\n}\n\nstatic MA_INLINE ma_int32 ma_dither_s32(ma_dither_mode ditherMode, ma_int32 ditherMin, ma_int32 ditherMax)\n{\n    if (ditherMode == ma_dither_mode_rectangle) {\n        ma_int32 a = ma_rand_range_s32(ditherMin, ditherMax);\n        return a;\n    }\n    if (ditherMode == ma_dither_mode_triangle) {\n        ma_int32 a = ma_rand_range_s32(ditherMin, 0);\n        ma_int32 b = ma_rand_range_s32(0, ditherMax);\n        return a + b;\n    }\n\n    return 0;\n}\n\n\n/*\nSplits a buffer into parts of equal length and of the given alignment. The returned size of the split buffers will be a\nmultiple of the alignment. The alignment must be a power of 2.\n*/\nvoid ma_split_buffer(void* pBuffer, size_t bufferSize, size_t splitCount, size_t alignment, void** ppBuffersOut, size_t* pSplitSizeOut)\n{\n    ma_uintptr pBufferUnaligned;\n    ma_uintptr pBufferAligned;\n    size_t unalignedBytes;\n    size_t splitSize;\n\n    if (pSplitSizeOut) {\n        *pSplitSizeOut = 0;\n    }\n\n    if (pBuffer == NULL || bufferSize == 0 || splitCount == 0) {\n        return;\n    }\n\n    if (alignment == 0) {\n        alignment = 1;\n    }\n\n    pBufferUnaligned = (ma_uintptr)pBuffer;\n    pBufferAligned   = (pBufferUnaligned + (alignment-1)) & ~(alignment-1);\n    unalignedBytes   = (size_t)(pBufferAligned - pBufferUnaligned);\n\n    splitSize = 0;\n    if (bufferSize >= unalignedBytes) {\n        splitSize = (bufferSize - unalignedBytes) / splitCount;\n        splitSize = splitSize & ~(alignment-1);\n    }\n\n    if (ppBuffersOut != NULL) {\n        size_t i;\n        for (i = 0; i < splitCount; ++i) {\n            ppBuffersOut[i] = (ma_uint8*)(pBufferAligned + (splitSize*i));\n        }\n    }\n\n    if (pSplitSizeOut) {\n        *pSplitSizeOut = splitSize;\n    }\n}\n\n\n/******************************************************************************\n\nAtomics\n\n******************************************************************************/\n#if defined(_WIN32) && !defined(__GNUC__)\n#define ma_memory_barrier()            MemoryBarrier()\n#define ma_atomic_exchange_32(a, b)    InterlockedExchange((LONG*)a, (LONG)b)\n#define ma_atomic_exchange_64(a, b)    InterlockedExchange64((LONGLONG*)a, (LONGLONG)b)\n#define ma_atomic_increment_32(a)      InterlockedIncrement((LONG*)a)\n#define ma_atomic_decrement_32(a)      InterlockedDecrement((LONG*)a)\n#else\n#define ma_memory_barrier()            __sync_synchronize()\n#define ma_atomic_exchange_32(a, b)    (void)__sync_lock_test_and_set(a, b); __sync_synchronize()\n#define ma_atomic_exchange_64(a, b)    (void)__sync_lock_test_and_set(a, b); __sync_synchronize()\n#define ma_atomic_increment_32(a)      __sync_add_and_fetch(a, 1)\n#define ma_atomic_decrement_32(a)      __sync_sub_and_fetch(a, 1)\n#endif\n\n#ifdef MA_64BIT\n#define ma_atomic_exchange_ptr ma_atomic_exchange_64\n#endif\n#ifdef MA_32BIT\n#define ma_atomic_exchange_ptr ma_atomic_exchange_32\n#endif\n\n\nma_uint32 ma_get_standard_sample_rate_priority_index(ma_uint32 sampleRate)   /* Lower = higher priority */\n{\n    ma_uint32 i;\n    for (i = 0; i < ma_countof(g_maStandardSampleRatePriorities); ++i) {\n        if (g_maStandardSampleRatePriorities[i] == sampleRate) {\n            return i;\n        }\n    }\n\n    return (ma_uint32)-1;\n}\n\nma_uint64 ma_calculate_frame_count_after_src(ma_uint32 sampleRateOut, ma_uint32 sampleRateIn, ma_uint64 frameCountIn)\n{\n    double    srcRatio       = (double)sampleRateOut / sampleRateIn;\n    double    frameCountOutF = (ma_int64)frameCountIn * srcRatio; /* Cast to int64 required for VC6. */\n    ma_uint64 frameCountOut  = (ma_uint64)frameCountOutF;\n\n    /* If the output frame count is fractional, make sure we add an extra frame to ensure there's enough room for that last sample. */\n    if ((frameCountOutF - (ma_int64)frameCountOut) > 0.0) {\n        frameCountOut += 1;\n    }\n\n    return frameCountOut;\n}\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nDEVICE I/O\n==========\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n#ifndef MA_NO_DEVICE_IO\n/*\nUnfortunately using runtime linking for pthreads causes problems. This has occurred for me when testing on FreeBSD. When\nusing runtime linking, deadlocks can occur (for me it happens when loading data from fread()). It turns out that doing\ncompile-time linking fixes this. I'm not sure why this happens, but the safest way I can think of to fix this is to simply\ndisable runtime linking by default. To enable runtime linking, #define this before the implementation of this file. I am\nnot officially supporting this, but I'm leaving it here in case it's useful for somebody, somewhere.\n*/\n/*#define MA_USE_RUNTIME_LINKING_FOR_PTHREAD*/\n\n/* Disable run-time linking on certain backends. */\n#ifndef MA_NO_RUNTIME_LINKING\n    #if defined(MA_ANDROID) || defined(MA_EMSCRIPTEN)\n        #define MA_NO_RUNTIME_LINKING\n    #endif\n#endif\n\n/*\nCheck if we have the necessary development packages for each backend at the top so we can use this to determine whether or not\ncertain unused functions and variables can be excluded from the build to avoid warnings.\n*/\n#ifdef MA_ENABLE_WASAPI\n    #define MA_HAS_WASAPI      /* Every compiler should support WASAPI */\n#endif\n#ifdef MA_ENABLE_DSOUND\n    #define MA_HAS_DSOUND      /* Every compiler should support DirectSound. */\n#endif\n#ifdef MA_ENABLE_WINMM\n    #define MA_HAS_WINMM       /* Every compiler I'm aware of supports WinMM. */\n#endif\n#ifdef MA_ENABLE_ALSA\n    #define MA_HAS_ALSA\n    #ifdef MA_NO_RUNTIME_LINKING\n        #ifdef __has_include\n            #if !__has_include(<alsa/asoundlib.h>)\n                #undef MA_HAS_ALSA\n            #endif\n        #endif\n    #endif\n#endif\n#ifdef MA_ENABLE_PULSEAUDIO\n    #define MA_HAS_PULSEAUDIO\n    #ifdef MA_NO_RUNTIME_LINKING\n        #ifdef __has_include\n            #if !__has_include(<pulse/pulseaudio.h>)\n                #undef MA_HAS_PULSEAUDIO\n            #endif\n        #endif\n    #endif\n#endif\n#ifdef MA_ENABLE_JACK\n    #define MA_HAS_JACK\n    #ifdef MA_NO_RUNTIME_LINKING\n        #ifdef __has_include\n            #if !__has_include(<jack/jack.h>)\n                #undef MA_HAS_JACK\n            #endif\n        #endif\n    #endif\n#endif\n#ifdef MA_ENABLE_COREAUDIO\n    #define MA_HAS_COREAUDIO\n#endif\n#ifdef MA_ENABLE_SNDIO\n    #define MA_HAS_SNDIO\n#endif\n#ifdef MA_ENABLE_AUDIO4\n    #define MA_HAS_AUDIO4\n#endif\n#ifdef MA_ENABLE_OSS\n    #define MA_HAS_OSS\n#endif\n#ifdef MA_ENABLE_AAUDIO\n    #define MA_HAS_AAUDIO\n#endif\n#ifdef MA_ENABLE_OPENSL\n    #define MA_HAS_OPENSL\n#endif\n#ifdef MA_ENABLE_WEBAUDIO\n    #define MA_HAS_WEBAUDIO\n#endif\n#ifdef MA_ENABLE_NULL\n    #define MA_HAS_NULL    /* Everything supports the null backend. */\n#endif\n\nconst char* ma_get_backend_name(ma_backend backend)\n{\n    switch (backend)\n    {\n        case ma_backend_wasapi:     return \"WASAPI\";\n        case ma_backend_dsound:     return \"DirectSound\";\n        case ma_backend_winmm:      return \"WinMM\";\n        case ma_backend_coreaudio:  return \"Core Audio\";\n        case ma_backend_sndio:      return \"sndio\";\n        case ma_backend_audio4:     return \"audio(4)\";\n        case ma_backend_oss:        return \"OSS\";\n        case ma_backend_pulseaudio: return \"PulseAudio\";\n        case ma_backend_alsa:       return \"ALSA\";\n        case ma_backend_jack:       return \"JACK\";\n        case ma_backend_aaudio:     return \"AAudio\";\n        case ma_backend_opensl:     return \"OpenSL|ES\";\n        case ma_backend_webaudio:   return \"Web Audio\";\n        case ma_backend_null:       return \"Null\";\n        default:                     return \"Unknown\";\n    }\n}\n\n\n\n#ifdef MA_WIN32\n    #define MA_THREADCALL WINAPI\n    typedef unsigned long ma_thread_result;\n#else\n    #define MA_THREADCALL\n    typedef void* ma_thread_result;\n#endif\ntypedef ma_thread_result (MA_THREADCALL * ma_thread_entry_proc)(void* pData);\n\n#ifdef MA_WIN32\ntypedef HRESULT (WINAPI * MA_PFN_CoInitializeEx)(LPVOID pvReserved, DWORD  dwCoInit);\ntypedef void    (WINAPI * MA_PFN_CoUninitialize)();\ntypedef HRESULT (WINAPI * MA_PFN_CoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);\ntypedef void    (WINAPI * MA_PFN_CoTaskMemFree)(LPVOID pv);\ntypedef HRESULT (WINAPI * MA_PFN_PropVariantClear)(PROPVARIANT *pvar);\ntypedef int     (WINAPI * MA_PFN_StringFromGUID2)(const GUID* const rguid, LPOLESTR lpsz, int cchMax);\n\ntypedef HWND (WINAPI * MA_PFN_GetForegroundWindow)();\ntypedef HWND (WINAPI * MA_PFN_GetDesktopWindow)();\n\n/* Microsoft documents these APIs as returning LSTATUS, but the Win32 API shipping with some compilers do not define it. It's just a LONG. */\ntypedef LONG (WINAPI * MA_PFN_RegOpenKeyExA)(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);\ntypedef LONG (WINAPI * MA_PFN_RegCloseKey)(HKEY hKey);\ntypedef LONG (WINAPI * MA_PFN_RegQueryValueExA)(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);\n#endif\n\n\n#define MA_STATE_UNINITIALIZED     0\n#define MA_STATE_STOPPED           1   /* The device's default state after initialization. */\n#define MA_STATE_STARTED           2   /* The worker thread is in it's main loop waiting for the driver to request or deliver audio data. */\n#define MA_STATE_STARTING          3   /* Transitioning from a stopped state to started. */\n#define MA_STATE_STOPPING          4   /* Transitioning from a started state to stopped. */\n\n#define MA_DEFAULT_PLAYBACK_DEVICE_NAME    \"Default Playback Device\"\n#define MA_DEFAULT_CAPTURE_DEVICE_NAME     \"Default Capture Device\"\n\n\nconst char* ma_log_level_to_string(ma_uint32 logLevel)\n{\n    switch (logLevel)\n    {\n        case MA_LOG_LEVEL_VERBOSE: return \"\";\n        case MA_LOG_LEVEL_INFO:    return \"INFO\";\n        case MA_LOG_LEVEL_WARNING: return \"WARNING\";\n        case MA_LOG_LEVEL_ERROR:   return \"ERROR\";\n        default:                   return \"ERROR\";\n    }\n}\n\n/* Posts a log message. */\nvoid ma_log(ma_context* pContext, ma_device* pDevice, ma_uint32 logLevel, const char* message)\n{\n    if (pContext == NULL) {\n        return;\n    }\n    \n#if defined(MA_LOG_LEVEL)\n    if (logLevel <= MA_LOG_LEVEL) {\n        ma_log_proc onLog;\n\n    #if defined(MA_DEBUG_OUTPUT)\n        if (logLevel <= MA_LOG_LEVEL) {\n            printf(\"%s: %s\\n\", ma_log_level_to_string(logLevel), message);\n        }\n    #endif\n    \n        onLog = pContext->logCallback;\n        if (onLog) {\n            onLog(pContext, pDevice, logLevel, message);\n        }\n    }\n#endif\n}\n\n/* Posts an log message. Throw a breakpoint in here if you're needing to debug. The return value is always \"resultCode\". */\nma_result ma_context_post_error(ma_context* pContext, ma_device* pDevice, ma_uint32 logLevel, const char* message, ma_result resultCode)\n{\n    /* Derive the context from the device if necessary. */\n    if (pContext == NULL) {\n        if (pDevice != NULL) {\n            pContext = pDevice->pContext;\n        }\n    }\n\n    ma_log(pContext, pDevice, logLevel, message);\n    return resultCode;\n}\n\nma_result ma_post_error(ma_device* pDevice, ma_uint32 logLevel, const char* message, ma_result resultCode)\n{\n    return ma_context_post_error(NULL, pDevice, logLevel, message, resultCode);\n}\n\n\n/*******************************************************************************\n\nTiming\n\n*******************************************************************************/\n#ifdef MA_WIN32\nLARGE_INTEGER g_ma_TimerFrequency = {{0}};\nvoid ma_timer_init(ma_timer* pTimer)\n{\n    LARGE_INTEGER counter;\n\n    if (g_ma_TimerFrequency.QuadPart == 0) {\n        QueryPerformanceFrequency(&g_ma_TimerFrequency);\n    }\n\n    QueryPerformanceCounter(&counter);\n    pTimer->counter = counter.QuadPart;\n}\n\ndouble ma_timer_get_time_in_seconds(ma_timer* pTimer)\n{\n    LARGE_INTEGER counter;\n    if (!QueryPerformanceCounter(&counter)) {\n        return 0;\n    }\n\n    return (double)(counter.QuadPart - pTimer->counter) / g_ma_TimerFrequency.QuadPart;\n}\n#elif defined(MA_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200)\nma_uint64 g_ma_TimerFrequency = 0;\nvoid ma_timer_init(ma_timer* pTimer)\n{\n    mach_timebase_info_data_t baseTime;\n    mach_timebase_info(&baseTime);\n    g_ma_TimerFrequency = (baseTime.denom * 1e9) / baseTime.numer;\n\n    pTimer->counter = mach_absolute_time();\n}\n\ndouble ma_timer_get_time_in_seconds(ma_timer* pTimer)\n{\n    ma_uint64 newTimeCounter = mach_absolute_time();\n    ma_uint64 oldTimeCounter = pTimer->counter;\n\n    return (newTimeCounter - oldTimeCounter) / g_ma_TimerFrequency;\n}\n#elif defined(MA_EMSCRIPTEN)\nvoid ma_timer_init(ma_timer* pTimer)\n{\n    pTimer->counterD = emscripten_get_now();\n}\n\ndouble ma_timer_get_time_in_seconds(ma_timer* pTimer)\n{\n    return (emscripten_get_now() - pTimer->counterD) / 1000;    /* Emscripten is in milliseconds. */\n}\n#else\n#if _POSIX_C_SOURCE >= 199309L\n#if defined(CLOCK_MONOTONIC)\n    #define MA_CLOCK_ID CLOCK_MONOTONIC\n#else\n    #define MA_CLOCK_ID CLOCK_REALTIME\n#endif\n\nvoid ma_timer_init(ma_timer* pTimer)\n{\n    struct timespec newTime;\n    clock_gettime(MA_CLOCK_ID, &newTime);\n\n    pTimer->counter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec;\n}\n\ndouble ma_timer_get_time_in_seconds(ma_timer* pTimer)\n{\n    ma_uint64 newTimeCounter;\n    ma_uint64 oldTimeCounter;\n\n    struct timespec newTime;\n    clock_gettime(MA_CLOCK_ID, &newTime);\n\n    newTimeCounter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec;\n    oldTimeCounter = pTimer->counter;\n\n    return (newTimeCounter - oldTimeCounter) / 1000000000.0;\n}\n#else\nvoid ma_timer_init(ma_timer* pTimer)\n{\n    struct timeval newTime;\n    gettimeofday(&newTime, NULL);\n\n    pTimer->counter = (newTime.tv_sec * 1000000) + newTime.tv_usec;\n}\n\ndouble ma_timer_get_time_in_seconds(ma_timer* pTimer)\n{\n    ma_uint64 newTimeCounter;\n    ma_uint64 oldTimeCounter;\n\n    struct timeval newTime;\n    gettimeofday(&newTime, NULL);\n\n    newTimeCounter = (newTime.tv_sec * 1000000) + newTime.tv_usec;\n    oldTimeCounter = pTimer->counter;\n\n    return (newTimeCounter - oldTimeCounter) / 1000000.0;\n}\n#endif\n#endif\n\n\n/*******************************************************************************\n\nDynamic Linking\n\n*******************************************************************************/\nma_handle ma_dlopen(ma_context* pContext, const char* filename)\n{\n    ma_handle handle;\n\n#if MA_LOG_LEVEL >= MA_LOG_LEVEL_VERBOSE\n    if (pContext != NULL) {\n        char message[256];\n        ma_strappend(message, sizeof(message), \"Loading library: \", filename);\n        ma_log(pContext, NULL, MA_LOG_LEVEL_VERBOSE, message);\n    }\n#endif\n\n#ifdef _WIN32\n#ifdef MA_WIN32_DESKTOP\n    handle = (ma_handle)LoadLibraryA(filename);\n#else\n    /* *sigh* It appears there is no ANSI version of LoadPackagedLibrary()... */\n    WCHAR filenameW[4096];\n    if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, sizeof(filenameW)) == 0) {\n        handle = NULL;\n    } else {\n        handle = (ma_handle)LoadPackagedLibrary(filenameW, 0);\n    }\n#endif\n#else\n    handle = (ma_handle)dlopen(filename, RTLD_NOW);\n#endif\n\n    /*\n    I'm not considering failure to load a library an error nor a warning because seamlessly falling through to a lower-priority\n    backend is a deliberate design choice. Instead I'm logging it as an informational message.\n    */\n#if MA_LOG_LEVEL >= MA_LOG_LEVEL_INFO\n    if (handle == NULL) {\n        char message[256];\n        ma_strappend(message, sizeof(message), \"Failed to load library: \", filename);\n        ma_log(pContext, NULL, MA_LOG_LEVEL_INFO, message);\n    }\n#endif\n\n    (void)pContext; /* It's possible for pContext to be unused. */\n    return handle;\n}\n\nvoid ma_dlclose(ma_context* pContext, ma_handle handle)\n{\n#ifdef _WIN32\n    FreeLibrary((HMODULE)handle);\n#else\n    dlclose((void*)handle);\n#endif\n\n    (void)pContext;\n}\n\nma_proc ma_dlsym(ma_context* pContext, ma_handle handle, const char* symbol)\n{\n    ma_proc proc;\n\n#if MA_LOG_LEVEL >= MA_LOG_LEVEL_VERBOSE\n    if (pContext != NULL) {\n        char message[256];\n        ma_strappend(message, sizeof(message), \"Loading symbol: \", symbol);\n        ma_log(pContext, NULL, MA_LOG_LEVEL_VERBOSE, message);\n    }\n#endif\n\n#ifdef _WIN32\n    proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol);\n#else\n#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wpedantic\"\n#endif\n    proc = (ma_proc)dlsym((void*)handle, symbol);\n#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))\n    #pragma GCC diagnostic pop\n#endif\n#endif\n\n#if MA_LOG_LEVEL >= MA_LOG_LEVEL_WARNING\n    if (handle == NULL) {\n        char message[256];\n        ma_strappend(message, sizeof(message), \"Failed to load symbol: \", symbol);\n        ma_log(pContext, NULL, MA_LOG_LEVEL_WARNING, message);\n    }\n#endif\n\n    (void)pContext; /* It's possible for pContext to be unused. */\n    return proc;\n}\n\n\n/*******************************************************************************\n\nThreading\n\n*******************************************************************************/\n#ifdef MA_WIN32\nint ma_thread_priority_to_win32(ma_thread_priority priority)\n{\n    switch (priority) {\n        case ma_thread_priority_idle:     return THREAD_PRIORITY_IDLE;\n        case ma_thread_priority_lowest:   return THREAD_PRIORITY_LOWEST;\n        case ma_thread_priority_low:      return THREAD_PRIORITY_BELOW_NORMAL;\n        case ma_thread_priority_normal:   return THREAD_PRIORITY_NORMAL;\n        case ma_thread_priority_high:     return THREAD_PRIORITY_ABOVE_NORMAL;\n        case ma_thread_priority_highest:  return THREAD_PRIORITY_HIGHEST;\n        case ma_thread_priority_realtime: return THREAD_PRIORITY_TIME_CRITICAL;\n        default:                          return THREAD_PRIORITY_NORMAL;\n    }\n}\n\nma_result ma_thread_create__win32(ma_context* pContext, ma_thread* pThread, ma_thread_entry_proc entryProc, void* pData)\n{\n    pThread->win32.hThread = CreateThread(NULL, 0, entryProc, pData, 0, NULL);\n    if (pThread->win32.hThread == NULL) {\n        return MA_FAILED_TO_CREATE_THREAD;\n    }\n\n    SetThreadPriority((HANDLE)pThread->win32.hThread, ma_thread_priority_to_win32(pContext->threadPriority));\n\n    return MA_SUCCESS;\n}\n\nvoid ma_thread_wait__win32(ma_thread* pThread)\n{\n    WaitForSingleObject(pThread->win32.hThread, INFINITE);\n}\n\nvoid ma_sleep__win32(ma_uint32 milliseconds)\n{\n    Sleep((DWORD)milliseconds);\n}\n\n\nma_result ma_mutex_init__win32(ma_context* pContext, ma_mutex* pMutex)\n{\n    (void)pContext;\n\n    pMutex->win32.hMutex = CreateEventA(NULL, FALSE, TRUE, NULL);\n    if (pMutex->win32.hMutex == NULL) {\n        return MA_FAILED_TO_CREATE_MUTEX;\n    }\n\n    return MA_SUCCESS;\n}\n\nvoid ma_mutex_uninit__win32(ma_mutex* pMutex)\n{\n    CloseHandle(pMutex->win32.hMutex);\n}\n\nvoid ma_mutex_lock__win32(ma_mutex* pMutex)\n{\n    WaitForSingleObject(pMutex->win32.hMutex, INFINITE);\n}\n\nvoid ma_mutex_unlock__win32(ma_mutex* pMutex)\n{\n    SetEvent(pMutex->win32.hMutex);\n}\n\n\nma_result ma_event_init__win32(ma_context* pContext, ma_event* pEvent)\n{\n    (void)pContext;\n\n    pEvent->win32.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);\n    if (pEvent->win32.hEvent == NULL) {\n        return MA_FAILED_TO_CREATE_EVENT;\n    }\n\n    return MA_SUCCESS;\n}\n\nvoid ma_event_uninit__win32(ma_event* pEvent)\n{\n    CloseHandle(pEvent->win32.hEvent);\n}\n\nma_bool32 ma_event_wait__win32(ma_event* pEvent)\n{\n    return WaitForSingleObject(pEvent->win32.hEvent, INFINITE) == WAIT_OBJECT_0;\n}\n\nma_bool32 ma_event_signal__win32(ma_event* pEvent)\n{\n    return SetEvent(pEvent->win32.hEvent);\n}\n#endif\n\n\n#ifdef MA_POSIX\n#include <sched.h>\n\ntypedef int (* ma_pthread_create_proc)(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);\ntypedef int (* ma_pthread_join_proc)(pthread_t thread, void **retval);\ntypedef int (* ma_pthread_mutex_init_proc)(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr);\ntypedef int (* ma_pthread_mutex_destroy_proc)(pthread_mutex_t *__mutex);\ntypedef int (* ma_pthread_mutex_lock_proc)(pthread_mutex_t *__mutex);\ntypedef int (* ma_pthread_mutex_unlock_proc)(pthread_mutex_t *__mutex);\ntypedef int (* ma_pthread_cond_init_proc)(pthread_cond_t *__restrict __cond, const pthread_condattr_t *__restrict __cond_attr);\ntypedef int (* ma_pthread_cond_destroy_proc)(pthread_cond_t *__cond);\ntypedef int (* ma_pthread_cond_signal_proc)(pthread_cond_t *__cond);\ntypedef int (* ma_pthread_cond_wait_proc)(pthread_cond_t *__restrict __cond, pthread_mutex_t *__restrict __mutex);\ntypedef int (* ma_pthread_attr_init_proc)(pthread_attr_t *attr);\ntypedef int (* ma_pthread_attr_destroy_proc)(pthread_attr_t *attr);\ntypedef int (* ma_pthread_attr_setschedpolicy_proc)(pthread_attr_t *attr, int policy);\ntypedef int (* ma_pthread_attr_getschedparam_proc)(const pthread_attr_t *attr, struct sched_param *param);\ntypedef int (* ma_pthread_attr_setschedparam_proc)(pthread_attr_t *attr, const struct sched_param *param);\n\nma_result ma_thread_create__posix(ma_context* pContext, ma_thread* pThread, ma_thread_entry_proc entryProc, void* pData)\n{\n    int result;\n    pthread_attr_t* pAttr = NULL;\n\n#if !defined(__EMSCRIPTEN__)\n    /* Try setting the thread priority. It's not critical if anything fails here. */\n    pthread_attr_t attr;\n    if (((ma_pthread_attr_init_proc)pContext->posix.pthread_attr_init)(&attr) == 0) {\n        int scheduler = -1;\n        if (pContext->threadPriority == ma_thread_priority_idle) {\n#ifdef SCHED_IDLE\n            if (((ma_pthread_attr_setschedpolicy_proc)pContext->posix.pthread_attr_setschedpolicy)(&attr, SCHED_IDLE) == 0) {\n                scheduler = SCHED_IDLE;\n            }\n#endif\n        } else if (pContext->threadPriority == ma_thread_priority_realtime) {\n#ifdef SCHED_FIFO\n            if (((ma_pthread_attr_setschedpolicy_proc)pContext->posix.pthread_attr_setschedpolicy)(&attr, SCHED_FIFO) == 0) {\n                scheduler = SCHED_FIFO;\n            }\n#endif\n#ifdef MA_LINUX\n        } else {\n            scheduler = sched_getscheduler(0);\n#endif\n        }\n\n        if (scheduler != -1) {\n            int priorityMin = sched_get_priority_min(scheduler);\n            int priorityMax = sched_get_priority_max(scheduler);\n            int priorityStep = (priorityMax - priorityMin) / 7;  /* 7 = number of priorities supported by miniaudio. */\n\n            struct sched_param sched;\n            if (((ma_pthread_attr_getschedparam_proc)pContext->posix.pthread_attr_getschedparam)(&attr, &sched) == 0) {\n                if (pContext->threadPriority == ma_thread_priority_idle) {\n                    sched.sched_priority = priorityMin;\n                } else if (pContext->threadPriority == ma_thread_priority_realtime) {\n                    sched.sched_priority = priorityMax;\n                } else {\n                    sched.sched_priority += ((int)pContext->threadPriority + 5) * priorityStep;  /* +5 because the lowest priority is -5. */\n                    if (sched.sched_priority < priorityMin) {\n                        sched.sched_priority = priorityMin;\n                    }\n                    if (sched.sched_priority > priorityMax) {\n                        sched.sched_priority = priorityMax;\n                    }\n                }\n\n                if (((ma_pthread_attr_setschedparam_proc)pContext->posix.pthread_attr_setschedparam)(&attr, &sched) == 0) {\n                    pAttr = &attr;\n                }\n            }\n        }\n\n        ((ma_pthread_attr_destroy_proc)pContext->posix.pthread_attr_destroy)(&attr);\n    }\n#endif\n\n    result = ((ma_pthread_create_proc)pContext->posix.pthread_create)(&pThread->posix.thread, pAttr, entryProc, pData);\n    if (result != 0) {\n        return MA_FAILED_TO_CREATE_THREAD;\n    }\n\n    return MA_SUCCESS;\n}\n\nvoid ma_thread_wait__posix(ma_thread* pThread)\n{\n    ((ma_pthread_join_proc)pThread->pContext->posix.pthread_join)(pThread->posix.thread, NULL);\n}\n\nvoid ma_sleep__posix(ma_uint32 milliseconds)\n{\n#ifdef MA_EMSCRIPTEN\n    (void)milliseconds;\n    ma_assert(MA_FALSE);  /* The Emscripten build should never sleep. */\n#else\n    #if _POSIX_C_SOURCE >= 199309L\n        struct timespec ts;\n        ts.tv_sec  = milliseconds / 1000000;\n        ts.tv_nsec = milliseconds % 1000000 * 1000000;\n        nanosleep(&ts, NULL);\n    #else\n        struct timeval tv;\n        tv.tv_sec  = milliseconds / 1000;\n        tv.tv_usec = milliseconds % 1000 * 1000;\n        select(0, NULL, NULL, NULL, &tv);\n    #endif\n#endif\n}\n\n\nma_result ma_mutex_init__posix(ma_context* pContext, ma_mutex* pMutex)\n{\n    int result = ((ma_pthread_mutex_init_proc)pContext->posix.pthread_mutex_init)(&pMutex->posix.mutex, NULL);\n    if (result != 0) {\n        return MA_FAILED_TO_CREATE_MUTEX;\n    }\n\n    return MA_SUCCESS;\n}\n\nvoid ma_mutex_uninit__posix(ma_mutex* pMutex)\n{\n    ((ma_pthread_mutex_destroy_proc)pMutex->pContext->posix.pthread_mutex_destroy)(&pMutex->posix.mutex);\n}\n\nvoid ma_mutex_lock__posix(ma_mutex* pMutex)\n{\n    ((ma_pthread_mutex_lock_proc)pMutex->pContext->posix.pthread_mutex_lock)(&pMutex->posix.mutex);\n}\n\nvoid ma_mutex_unlock__posix(ma_mutex* pMutex)\n{\n    ((ma_pthread_mutex_unlock_proc)pMutex->pContext->posix.pthread_mutex_unlock)(&pMutex->posix.mutex);\n}\n\n\nma_result ma_event_init__posix(ma_context* pContext, ma_event* pEvent)\n{\n    if (((ma_pthread_mutex_init_proc)pContext->posix.pthread_mutex_init)(&pEvent->posix.mutex, NULL) != 0) {\n        return MA_FAILED_TO_CREATE_MUTEX;\n    }\n\n    if (((ma_pthread_cond_init_proc)pContext->posix.pthread_cond_init)(&pEvent->posix.condition, NULL) != 0) {\n        return MA_FAILED_TO_CREATE_EVENT;\n    }\n\n    pEvent->posix.value = 0;\n    return MA_SUCCESS;\n}\n\nvoid ma_event_uninit__posix(ma_event* pEvent)\n{\n    ((ma_pthread_cond_destroy_proc)pEvent->pContext->posix.pthread_cond_destroy)(&pEvent->posix.condition);\n    ((ma_pthread_mutex_destroy_proc)pEvent->pContext->posix.pthread_mutex_destroy)(&pEvent->posix.mutex);\n}\n\nma_bool32 ma_event_wait__posix(ma_event* pEvent)\n{\n    ((ma_pthread_mutex_lock_proc)pEvent->pContext->posix.pthread_mutex_lock)(&pEvent->posix.mutex);\n    {\n        while (pEvent->posix.value == 0) {\n            ((ma_pthread_cond_wait_proc)pEvent->pContext->posix.pthread_cond_wait)(&pEvent->posix.condition, &pEvent->posix.mutex);\n        }\n        pEvent->posix.value = 0;  /* Auto-reset. */\n    }\n    ((ma_pthread_mutex_unlock_proc)pEvent->pContext->posix.pthread_mutex_unlock)(&pEvent->posix.mutex);\n\n    return MA_TRUE;\n}\n\nma_bool32 ma_event_signal__posix(ma_event* pEvent)\n{\n    ((ma_pthread_mutex_lock_proc)pEvent->pContext->posix.pthread_mutex_lock)(&pEvent->posix.mutex);\n    {\n        pEvent->posix.value = 1;\n        ((ma_pthread_cond_signal_proc)pEvent->pContext->posix.pthread_cond_signal)(&pEvent->posix.condition);\n    }\n    ((ma_pthread_mutex_unlock_proc)pEvent->pContext->posix.pthread_mutex_unlock)(&pEvent->posix.mutex);\n\n    return MA_TRUE;\n}\n#endif\n\nma_result ma_thread_create(ma_context* pContext, ma_thread* pThread, ma_thread_entry_proc entryProc, void* pData)\n{\n    if (pContext == NULL || pThread == NULL || entryProc == NULL) {\n        return MA_FALSE;\n    }\n\n    pThread->pContext = pContext;\n\n#ifdef MA_WIN32\n    return ma_thread_create__win32(pContext, pThread, entryProc, pData);\n#endif\n#ifdef MA_POSIX\n    return ma_thread_create__posix(pContext, pThread, entryProc, pData);\n#endif\n}\n\nvoid ma_thread_wait(ma_thread* pThread)\n{\n    if (pThread == NULL) {\n        return;\n    }\n\n#ifdef MA_WIN32\n    ma_thread_wait__win32(pThread);\n#endif\n#ifdef MA_POSIX\n    ma_thread_wait__posix(pThread);\n#endif\n}\n\nvoid ma_sleep(ma_uint32 milliseconds)\n{\n#ifdef MA_WIN32\n    ma_sleep__win32(milliseconds);\n#endif\n#ifdef MA_POSIX\n    ma_sleep__posix(milliseconds);\n#endif\n}\n\n\nma_result ma_mutex_init(ma_context* pContext, ma_mutex* pMutex)\n{\n    if (pContext == NULL || pMutex == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pMutex->pContext = pContext;\n\n#ifdef MA_WIN32\n    return ma_mutex_init__win32(pContext, pMutex);\n#endif\n#ifdef MA_POSIX\n    return ma_mutex_init__posix(pContext, pMutex);\n#endif\n}\n\nvoid ma_mutex_uninit(ma_mutex* pMutex)\n{\n    if (pMutex == NULL || pMutex->pContext == NULL) {\n        return;\n    }\n\n#ifdef MA_WIN32\n    ma_mutex_uninit__win32(pMutex);\n#endif\n#ifdef MA_POSIX\n    ma_mutex_uninit__posix(pMutex);\n#endif\n}\n\nvoid ma_mutex_lock(ma_mutex* pMutex)\n{\n    if (pMutex == NULL || pMutex->pContext == NULL) {\n        return;\n    }\n\n#ifdef MA_WIN32\n    ma_mutex_lock__win32(pMutex);\n#endif\n#ifdef MA_POSIX\n    ma_mutex_lock__posix(pMutex);\n#endif\n}\n\nvoid ma_mutex_unlock(ma_mutex* pMutex)\n{\n    if (pMutex == NULL || pMutex->pContext == NULL) {\n        return;\n}\n\n#ifdef MA_WIN32\n    ma_mutex_unlock__win32(pMutex);\n#endif\n#ifdef MA_POSIX\n    ma_mutex_unlock__posix(pMutex);\n#endif\n}\n\n\nma_result ma_event_init(ma_context* pContext, ma_event* pEvent)\n{\n    if (pContext == NULL || pEvent == NULL) {\n        return MA_FALSE;\n    }\n\n    pEvent->pContext = pContext;\n\n#ifdef MA_WIN32\n    return ma_event_init__win32(pContext, pEvent);\n#endif\n#ifdef MA_POSIX\n    return ma_event_init__posix(pContext, pEvent);\n#endif\n}\n\nvoid ma_event_uninit(ma_event* pEvent)\n{\n    if (pEvent == NULL || pEvent->pContext == NULL) {\n        return;\n    }\n\n#ifdef MA_WIN32\n    ma_event_uninit__win32(pEvent);\n#endif\n#ifdef MA_POSIX\n    ma_event_uninit__posix(pEvent);\n#endif\n}\n\nma_bool32 ma_event_wait(ma_event* pEvent)\n{\n    if (pEvent == NULL || pEvent->pContext == NULL) {\n        return MA_FALSE;\n    }\n\n#ifdef MA_WIN32\n    return ma_event_wait__win32(pEvent);\n#endif\n#ifdef MA_POSIX\n    return ma_event_wait__posix(pEvent);\n#endif\n}\n\nma_bool32 ma_event_signal(ma_event* pEvent)\n{\n    if (pEvent == NULL || pEvent->pContext == NULL) {\n        return MA_FALSE;\n    }\n\n#ifdef MA_WIN32\n    return ma_event_signal__win32(pEvent);\n#endif\n#ifdef MA_POSIX\n    return ma_event_signal__posix(pEvent);\n#endif\n}\n\n\nma_uint32 ma_get_best_sample_rate_within_range(ma_uint32 sampleRateMin, ma_uint32 sampleRateMax)\n{\n    /* Normalize the range in case we were given something stupid. */\n    if (sampleRateMin < MA_MIN_SAMPLE_RATE) {\n        sampleRateMin = MA_MIN_SAMPLE_RATE;\n    }\n    if (sampleRateMax > MA_MAX_SAMPLE_RATE) {\n        sampleRateMax = MA_MAX_SAMPLE_RATE;\n    }\n    if (sampleRateMin > sampleRateMax) {\n        sampleRateMin = sampleRateMax;\n    }\n\n    if (sampleRateMin == sampleRateMax) {\n        return sampleRateMax;\n    } else {\n        size_t iStandardRate;\n        for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) {\n            ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate];\n            if (standardRate >= sampleRateMin && standardRate <= sampleRateMax) {\n                return standardRate;\n            }\n        }\n    }\n\n    /* Should never get here. */\n    ma_assert(MA_FALSE);\n    return 0;\n}\n\nma_uint32 ma_get_closest_standard_sample_rate(ma_uint32 sampleRateIn)\n{\n    ma_uint32 closestRate = 0;\n    ma_uint32 closestDiff = 0xFFFFFFFF;\n    size_t iStandardRate;\n\n    for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) {\n        ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate];\n        ma_uint32 diff;\n\n        if (sampleRateIn > standardRate) {\n            diff = sampleRateIn - standardRate;\n        } else {\n            diff = standardRate - sampleRateIn;\n        }\n\n        if (diff == 0) {\n            return standardRate;    /* The input sample rate is a standard rate. */\n        }\n\n        if (closestDiff > diff) {\n            closestDiff = diff;\n            closestRate = standardRate;\n        }\n    }\n\n    return closestRate;\n}\n\n\nma_uint32 ma_scale_buffer_size(ma_uint32 baseBufferSize, float scale)\n{\n    return ma_max(1, (ma_uint32)(baseBufferSize*scale));\n}\n\nma_uint32 ma_calculate_buffer_size_in_milliseconds_from_frames(ma_uint32 bufferSizeInFrames, ma_uint32 sampleRate)\n{\n    return bufferSizeInFrames / (sampleRate/1000);\n}\n\nma_uint32 ma_calculate_buffer_size_in_frames_from_milliseconds(ma_uint32 bufferSizeInMilliseconds, ma_uint32 sampleRate)\n{\n    return bufferSizeInMilliseconds * (sampleRate/1000); \n}\n\nma_uint32 ma_get_default_buffer_size_in_milliseconds(ma_performance_profile performanceProfile)\n{\n    if (performanceProfile == ma_performance_profile_low_latency) {\n        return MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_LOW_LATENCY;\n    } else {\n        return MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_CONSERVATIVE;\n    }\n}\n\nma_uint32 ma_get_default_buffer_size_in_frames(ma_performance_profile performanceProfile, ma_uint32 sampleRate)\n{\n    ma_uint32 bufferSizeInMilliseconds;\n    ma_uint32 sampleRateMS;\n\n    bufferSizeInMilliseconds = ma_get_default_buffer_size_in_milliseconds(performanceProfile);\n    if (bufferSizeInMilliseconds == 0) {\n        bufferSizeInMilliseconds = 1;\n    }\n\n    sampleRateMS = (sampleRate/1000);\n    if (sampleRateMS == 0) {\n        sampleRateMS = 1;\n    }\n\n    return bufferSizeInMilliseconds * sampleRateMS;\n}\n\nma_uint32 ma_get_fragment_size_in_bytes(ma_uint32 bufferSizeInFrames, ma_uint32 periods, ma_format format, ma_uint32 channels)\n{\n    ma_uint32 fragmentSizeInFrames = bufferSizeInFrames / periods;\n    return fragmentSizeInFrames * ma_get_bytes_per_frame(format, channels);\n}\n\nvoid ma_zero_pcm_frames(void* p, ma_uint32 frameCount, ma_format format, ma_uint32 channels)\n{\n    ma_zero_memory(p, frameCount * ma_get_bytes_per_frame(format, channels));\n}\n\n\n\n/* The callback for reading from the client -> DSP -> device. */\nma_uint32 ma_device__on_read_from_client(ma_pcm_converter* pDSP, void* pFramesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_device_callback_proc onData;\n\n    ma_assert(pDevice != NULL);\n\n    ma_zero_pcm_frames(pFramesOut, frameCount, pDevice->playback.format, pDevice->playback.channels);\n\n    onData = pDevice->onData;\n    if (onData) {\n        onData(pDevice, pFramesOut, NULL, frameCount);\n        return frameCount;\n    }\n\n    (void)pDSP;\n    return 0;\n}\n\n/* The PCM converter callback for reading from a buffer. */\nma_uint32 ma_device__pcm_converter__on_read_from_buffer_capture(ma_pcm_converter* pConverter, void* pFramesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_uint32 framesToRead;\n    ma_uint32 bytesToRead;\n\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->capture._dspFrameCount == 0) {\n        return 0;   /* Nothing left. */\n    }\n\n    framesToRead = frameCount;\n    if (framesToRead > pDevice->capture._dspFrameCount) {\n        framesToRead = pDevice->capture._dspFrameCount;\n    }\n\n    bytesToRead = framesToRead * ma_get_bytes_per_frame(pConverter->formatConverterIn.config.formatIn, pConverter->channelRouter.config.channelsIn);\n    ma_copy_memory(pFramesOut, pDevice->capture._dspFrames, bytesToRead);\n    pDevice->capture._dspFrameCount -= framesToRead;\n    pDevice->capture._dspFrames     += bytesToRead;\n\n    return framesToRead;\n}\n\nma_uint32 ma_device__pcm_converter__on_read_from_buffer_playback(ma_pcm_converter* pConverter, void* pFramesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_uint32 framesToRead;\n    ma_uint32 bytesToRead;\n\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->playback._dspFrameCount == 0) {\n        return 0;   /* Nothing left. */\n    }\n\n    framesToRead = frameCount;\n    if (framesToRead > pDevice->playback._dspFrameCount) {\n        framesToRead = pDevice->playback._dspFrameCount;\n    }\n\n    bytesToRead = framesToRead * ma_get_bytes_per_frame(pConverter->formatConverterIn.config.formatIn, pConverter->channelRouter.config.channelsIn);\n    ma_copy_memory(pFramesOut, pDevice->playback._dspFrames, bytesToRead);\n    pDevice->playback._dspFrameCount -= framesToRead;\n    pDevice->playback._dspFrames     += bytesToRead;\n\n    return framesToRead;\n}\n\n\n\n/* A helper function for reading sample data from the client. */\nstatic MA_INLINE void ma_device__read_frames_from_client(ma_device* pDevice, ma_uint32 frameCount, void* pSamples)\n{\n    ma_device_callback_proc onData;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(frameCount > 0);\n    ma_assert(pSamples != NULL);\n\n    onData = pDevice->onData;\n    if (onData) {\n        if (pDevice->playback.converter.isPassthrough) {\n            ma_zero_pcm_frames(pSamples, frameCount, pDevice->playback.format, pDevice->playback.channels);\n            onData(pDevice, pSamples, NULL, frameCount);\n        } else {\n            ma_pcm_converter_read(&pDevice->playback.converter, pSamples, frameCount);\n        }\n    }\n}\n\n/* A helper for sending sample data to the client. */\nstatic MA_INLINE void ma_device__send_frames_to_client(ma_device* pDevice, ma_uint32 frameCount, const void* pSamples)\n{\n    ma_device_callback_proc onData;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(frameCount > 0);\n    ma_assert(pSamples != NULL);\n\n    onData = pDevice->onData;\n    if (onData) {\n        if (pDevice->capture.converter.isPassthrough) {\n            onData(pDevice, NULL, pSamples, frameCount);\n        } else {\n            ma_uint8 chunkBuffer[4096];\n            ma_uint32 chunkFrameCount;\n\n            pDevice->capture._dspFrameCount = frameCount;\n            pDevice->capture._dspFrames = (const ma_uint8*)pSamples;\n\n            chunkFrameCount = sizeof(chunkBuffer) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n\n            for (;;) {\n                ma_uint32 framesJustRead = (ma_uint32)ma_pcm_converter_read(&pDevice->capture.converter, chunkBuffer, chunkFrameCount);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                onData(pDevice, NULL, chunkBuffer, framesJustRead);\n\n                if (framesJustRead < chunkFrameCount) {\n                    break;\n                }\n            }\n        }\n    }\n}\n\nstatic MA_INLINE ma_result ma_device__handle_duplex_callback_capture(ma_device* pDevice, ma_uint32 frameCount, const void* pFramesInInternalFormat, ma_pcm_rb* pRB)\n{\n    ma_result result;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(frameCount > 0);\n    ma_assert(pFramesInInternalFormat != NULL);\n    ma_assert(pRB != NULL);\n    \n    pDevice->capture._dspFrameCount = (ma_uint32)frameCount;\n    pDevice->capture._dspFrames     = (const ma_uint8*)pFramesInInternalFormat;\n\n    /* Write to the ring buffer. The ring buffer is in the external format. */\n    for (;;) {\n        ma_uint32 framesProcessed;\n        ma_uint32 framesToProcess = 256;\n        void* pFramesInExternalFormat;\n\n        result = ma_pcm_rb_acquire_write(pRB, &framesToProcess, &pFramesInExternalFormat);\n        if (result != MA_SUCCESS) {\n            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to acquire capture PCM frames from ring buffer.\", result);\n            break;\n        }\n\n        if (framesToProcess == 0) {\n            if (ma_pcm_rb_pointer_disance(pRB) == (ma_int32)ma_pcm_rb_get_subbuffer_size(pRB)) {\n                break;  /* Overrun. Not enough room in the ring buffer for input frame. Excess frames are dropped. */\n            }\n        }\n\n        /* Convert. */\n        framesProcessed = (ma_uint32)ma_pcm_converter_read(&pDevice->capture.converter, pFramesInExternalFormat, framesToProcess);\n\n        result = ma_pcm_rb_commit_write(pRB, framesProcessed, pFramesInExternalFormat);\n        if (result != MA_SUCCESS) {\n            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to commit capture PCM frames to ring buffer.\", result);\n            break;\n        }\n\n        if (framesProcessed < framesToProcess) {\n            break;  /* Done. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE ma_result ma_device__handle_duplex_callback_playback(ma_device* pDevice, ma_uint32 frameCount, void* pFramesInInternalFormat, ma_pcm_rb* pRB)\n{\n    ma_result result;\n    ma_uint8 playbackFramesInExternalFormat[4096];\n    ma_uint8 silentInputFrames[4096];\n    ma_uint32 totalFramesToReadFromClient;\n    ma_uint32 totalFramesReadFromClient;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(frameCount > 0);\n    ma_assert(pFramesInInternalFormat != NULL);\n    ma_assert(pRB != NULL);\n    \n    /*\n    Sitting in the ring buffer should be captured data from the capture callback in external format. If there's not enough data in there for\n    the whole frameCount frames we just use silence instead for the input data.\n    */\n    ma_zero_memory(silentInputFrames, sizeof(silentInputFrames));\n\n    /* We need to calculate how many output frames are required to be read from the client to completely fill frameCount internal frames. */\n    totalFramesToReadFromClient = (ma_uint32)ma_calculate_frame_count_after_src(pDevice->sampleRate, pDevice->playback.internalSampleRate, frameCount); /* ma_pcm_converter_get_required_input_frame_count(&pDevice->playback.converter, (ma_uint32)frameCount); */\n    totalFramesReadFromClient = 0;\n    while (totalFramesReadFromClient < totalFramesToReadFromClient && ma_device_is_started(pDevice)) {\n        ma_uint32 framesRemainingFromClient;\n        ma_uint32 framesToProcessFromClient;\n        ma_uint32 inputFrameCount;\n        void* pInputFrames;\n\n        framesRemainingFromClient = (totalFramesToReadFromClient - totalFramesReadFromClient);\n        framesToProcessFromClient = sizeof(playbackFramesInExternalFormat) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n        if (framesToProcessFromClient > framesRemainingFromClient) {\n            framesToProcessFromClient = framesRemainingFromClient;\n        }\n\n        /* We need to grab captured samples before firing the callback. If there's not enough input samples we just pass silence. */\n        inputFrameCount = framesToProcessFromClient;\n        result = ma_pcm_rb_acquire_read(pRB, &inputFrameCount, &pInputFrames);\n        if (result == MA_SUCCESS) {\n            if (inputFrameCount > 0) {\n                /* Use actual input frames. */\n                pDevice->onData(pDevice, playbackFramesInExternalFormat, pInputFrames, inputFrameCount);\n            } else {\n                if (ma_pcm_rb_pointer_disance(pRB) == 0) {\n                    break;  /* Underrun. */\n                }\n            }\n            \n            /* We're done with the captured samples. */\n            result = ma_pcm_rb_commit_read(pRB, inputFrameCount, pInputFrames);\n            if (result != MA_SUCCESS) {\n                break; /* Don't know what to do here... Just abandon ship. */\n            }\n        } else {\n            /* Use silent input frames. */\n            inputFrameCount = ma_min(\n                sizeof(playbackFramesInExternalFormat) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels),\n                sizeof(silentInputFrames)              / ma_get_bytes_per_frame(pDevice->capture.format,  pDevice->capture.channels)\n            );\n\n            pDevice->onData(pDevice, playbackFramesInExternalFormat, silentInputFrames, inputFrameCount);\n        }\n\n        /* We have samples in external format so now we need to convert to internal format and output to the device. */\n        pDevice->playback._dspFrameCount = inputFrameCount;\n        pDevice->playback._dspFrames     = (const ma_uint8*)playbackFramesInExternalFormat;\n        ma_pcm_converter_read(&pDevice->playback.converter, pFramesInInternalFormat, inputFrameCount);\n\n        totalFramesReadFromClient += inputFrameCount;\n        pFramesInInternalFormat = ma_offset_ptr(pFramesInInternalFormat, inputFrameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    }\n\n    return MA_SUCCESS;\n}\n\n/* A helper for changing the state of the device. */\nstatic MA_INLINE void ma_device__set_state(ma_device* pDevice, ma_uint32 newState)\n{\n    ma_atomic_exchange_32(&pDevice->state, newState);\n}\n\n/* A helper for getting the state of the device. */\nstatic MA_INLINE ma_uint32 ma_device__get_state(ma_device* pDevice)\n{\n    return pDevice->state;\n}\n\n/* A helper for determining whether or not the device is running in async mode. */\nstatic MA_INLINE ma_bool32 ma_device__is_async(ma_device* pDevice)\n{\n    return pDevice->onData != NULL;\n}\n\n\n#ifdef MA_WIN32\n    GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM        = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};\n    GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};\n    /*GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW       = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/\n    /*GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW      = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/\n#endif\n\n\nma_bool32 ma_context__device_id_equal(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n\n    if (pID0 == pID1) return MA_TRUE;\n\n    if ((pID0 == NULL && pID1 != NULL) ||\n        (pID0 != NULL && pID1 == NULL)) {\n        return MA_FALSE;\n    }\n\n    if (pContext->onDeviceIDEqual) {\n        return pContext->onDeviceIDEqual(pContext, pID0, pID1);\n    }\n\n    return MA_FALSE;\n}\n\n\ntypedef struct\n{\n    ma_device_type deviceType;\n    const ma_device_id* pDeviceID;\n    char* pName;\n    size_t nameBufferSize;\n    ma_bool32 foundDevice;\n} ma_context__try_get_device_name_by_id__enum_callback_data;\n\nma_bool32 ma_context__try_get_device_name_by_id__enum_callback(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pDeviceInfo, void* pUserData)\n{\n    ma_context__try_get_device_name_by_id__enum_callback_data* pData = (ma_context__try_get_device_name_by_id__enum_callback_data*)pUserData;\n    ma_assert(pData != NULL);\n\n    if (pData->deviceType == deviceType) {\n        if (pContext->onDeviceIDEqual(pContext, pData->pDeviceID, &pDeviceInfo->id)) {\n            ma_strncpy_s(pData->pName, pData->nameBufferSize, pDeviceInfo->name, (size_t)-1);\n            pData->foundDevice = MA_TRUE;\n        }\n    }\n\n    return !pData->foundDevice;\n}\n\n/*\nGeneric function for retrieving the name of a device by it's ID.\n\nThis function simply enumerates every device and then retrieves the name of the first device that has the same ID.\n*/\nma_result ma_context__try_get_device_name_by_id(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, char* pName, size_t nameBufferSize)\n{\n    ma_result result;\n    ma_context__try_get_device_name_by_id__enum_callback_data data;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pName != NULL);\n\n    if (pDeviceID == NULL) {\n        return MA_NO_DEVICE;\n    }\n\n    data.deviceType = deviceType;\n    data.pDeviceID = pDeviceID;\n    data.pName = pName;\n    data.nameBufferSize = nameBufferSize;\n    data.foundDevice = MA_FALSE;\n    result = ma_context_enumerate_devices(pContext, ma_context__try_get_device_name_by_id__enum_callback, &data);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (!data.foundDevice) {\n        return MA_NO_DEVICE;\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\n\nma_uint32 ma_get_format_priority_index(ma_format format) /* Lower = better. */\n{\n    ma_uint32 i;\n    for (i = 0; i < ma_countof(g_maFormatPriorities); ++i) {\n        if (g_maFormatPriorities[i] == format) {\n            return i;\n        }\n    }\n\n    /* Getting here means the format could not be found or is equal to ma_format_unknown. */\n    return (ma_uint32)-1;\n}\n\nvoid ma_device__post_init_setup(ma_device* pDevice, ma_device_type deviceType);\n\n\n/*******************************************************************************\n\nNull Backend\n\n*******************************************************************************/\n#ifdef MA_HAS_NULL\n\n#define MA_DEVICE_OP_NONE__NULL    0\n#define MA_DEVICE_OP_START__NULL   1\n#define MA_DEVICE_OP_SUSPEND__NULL 2\n#define MA_DEVICE_OP_KILL__NULL    3\n\nma_thread_result MA_THREADCALL ma_device_thread__null(void* pData)\n{\n    ma_device* pDevice = (ma_device*)pData;\n    ma_assert(pDevice != NULL);\n\n    for (;;) {  /* Keep the thread alive until the device is uninitialized. */\n        /* Wait for an operation to be requested. */\n        ma_event_wait(&pDevice->null_device.operationEvent);\n\n        /* At this point an event should have been triggered. */\n\n        /* Starting the device needs to put the thread into a loop. */\n        if (pDevice->null_device.operation == MA_DEVICE_OP_START__NULL) {\n            ma_atomic_exchange_32(&pDevice->null_device.operation, MA_DEVICE_OP_NONE__NULL);\n\n            /* Reset the timer just in case. */\n            ma_timer_init(&pDevice->null_device.timer);\n\n            /* Keep looping until an operation has been requested. */\n            while (pDevice->null_device.operation != MA_DEVICE_OP_NONE__NULL && pDevice->null_device.operation != MA_DEVICE_OP_START__NULL) {\n                ma_sleep(10); /* Don't hog the CPU. */\n            }\n\n            /* Getting here means a suspend or kill operation has been requested. */\n            ma_atomic_exchange_32(&pDevice->null_device.operationResult, MA_SUCCESS);\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            continue;\n        }\n\n        /* Suspending the device means we need to stop the timer and just continue the loop. */\n        if (pDevice->null_device.operation == MA_DEVICE_OP_SUSPEND__NULL) {\n            ma_atomic_exchange_32(&pDevice->null_device.operation, MA_DEVICE_OP_NONE__NULL);\n\n            /* We need to add the current run time to the prior run time, then reset the timer. */\n            pDevice->null_device.priorRunTime += ma_timer_get_time_in_seconds(&pDevice->null_device.timer);\n            ma_timer_init(&pDevice->null_device.timer);\n\n            /* We're done. */\n            ma_atomic_exchange_32(&pDevice->null_device.operationResult, MA_SUCCESS);\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            continue;\n        }\n\n        /* Killing the device means we need to get out of this loop so that this thread can terminate. */\n        if (pDevice->null_device.operation == MA_DEVICE_OP_KILL__NULL) {\n            ma_atomic_exchange_32(&pDevice->null_device.operation, MA_DEVICE_OP_NONE__NULL);\n            ma_atomic_exchange_32(&pDevice->null_device.operationResult, MA_SUCCESS);\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            break;\n        }\n\n        /* Getting a signal on a \"none\" operation probably means an error. Return invalid operation. */\n        if (pDevice->null_device.operation == MA_DEVICE_OP_NONE__NULL) {\n            ma_assert(MA_FALSE);  /* <-- Trigger this in debug mode to ensure developers are aware they're doing something wrong (or there's a bug in a miniaudio). */\n            ma_atomic_exchange_32(&pDevice->null_device.operationResult, MA_INVALID_OPERATION);\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            continue;   /* Continue the loop. Don't terminate. */\n        }\n    }\n\n    return (ma_thread_result)0;\n}\n\nma_result ma_device_do_operation__null(ma_device* pDevice, ma_uint32 operation)\n{\n    ma_atomic_exchange_32(&pDevice->null_device.operation, operation);\n    if (!ma_event_signal(&pDevice->null_device.operationEvent)) {\n        return MA_ERROR;\n    }\n\n    if (!ma_event_wait(&pDevice->null_device.operationCompletionEvent)) {\n        return MA_ERROR;\n    }\n\n    return pDevice->null_device.operationResult;\n}\n\nma_uint64 ma_device_get_total_run_time_in_frames__null(ma_device* pDevice)\n{\n    ma_uint32 internalSampleRate;\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        internalSampleRate = pDevice->capture.internalSampleRate;\n    } else {\n        internalSampleRate = pDevice->playback.internalSampleRate;\n    }\n\n\n    return (ma_uint64)((pDevice->null_device.priorRunTime + ma_timer_get_time_in_seconds(&pDevice->null_device.timer)) * internalSampleRate);\n}\n\nma_bool32 ma_context_is_device_id_equal__null(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return pID0->nullbackend == pID1->nullbackend;\n}\n\nma_result ma_context_enumerate_devices__null(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), \"NULL Playback Device\", (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), \"NULL Capture Device\", (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__null(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_uint32 iFormat;\n\n    ma_assert(pContext != NULL);\n\n    if (pDeviceID != NULL && pDeviceID->nullbackend != 0) {\n        return MA_NO_DEVICE;   /* Don't know the device. */\n    }\n\n    /* Name / Description */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), \"NULL Playback Device\", (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), \"NULL Capture Device\", (size_t)-1);\n    }\n\n    /* Support everything on the null backend. */\n    pDeviceInfo->formatCount = ma_format_count - 1;    /* Minus one because we don't want to include ma_format_unknown. */\n    for (iFormat = 0; iFormat < pDeviceInfo->formatCount; ++iFormat) {\n        pDeviceInfo->formats[iFormat] = (ma_format)(iFormat + 1);  /* +1 to skip over ma_format_unknown. */\n    }\n\n    pDeviceInfo->minChannels   = 1;\n    pDeviceInfo->maxChannels   = MA_MAX_CHANNELS;\n    pDeviceInfo->minSampleRate = MA_SAMPLE_RATE_8000;\n    pDeviceInfo->maxSampleRate = MA_SAMPLE_RATE_384000;\n\n    (void)pContext;\n    (void)shareMode;\n    return MA_SUCCESS;\n}\n\n\nvoid ma_device_uninit__null(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    /* Keep it clean and wait for the device thread to finish before returning. */\n    ma_device_do_operation__null(pDevice, MA_DEVICE_OP_KILL__NULL);\n\n    /* At this point the loop in the device thread is as good as terminated so we can uninitialize our events. */\n    ma_event_uninit(&pDevice->null_device.operationCompletionEvent);\n    ma_event_uninit(&pDevice->null_device.operationEvent);\n}\n\nma_result ma_device_init__null(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_uint32 bufferSizeInFrames;\n\n    ma_assert(pDevice != NULL);\n\n    ma_zero_object(&pDevice->null_device);\n\n    bufferSizeInFrames = pConfig->bufferSizeInFrames;\n    if (bufferSizeInFrames == 0) {\n        bufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pConfig->sampleRate);\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_strncpy_s(pDevice->capture.name,  sizeof(pDevice->capture.name),  \"NULL Capture Device\",  (size_t)-1);\n        pDevice->capture.internalFormat             = pConfig->capture.format;\n        pDevice->capture.internalChannels           = pConfig->capture.channels;\n        ma_channel_map_copy(pDevice->capture.internalChannelMap, pConfig->capture.channelMap, pConfig->capture.channels);\n        pDevice->capture.internalBufferSizeInFrames = bufferSizeInFrames;\n        pDevice->capture.internalPeriods            = pConfig->periods;\n    }\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), \"NULL Playback Device\", (size_t)-1);\n        pDevice->playback.internalFormat             = pConfig->playback.format;\n        pDevice->playback.internalChannels           = pConfig->playback.channels;\n        ma_channel_map_copy(pDevice->playback.internalChannelMap, pConfig->playback.channelMap, pConfig->playback.channels);\n        pDevice->playback.internalBufferSizeInFrames = bufferSizeInFrames;\n        pDevice->playback.internalPeriods            = pConfig->periods;\n    }\n\n    /*\n    In order to get timing right, we need to create a thread that does nothing but keeps track of the timer. This timer is started when the\n    first period is \"written\" to it, and then stopped in ma_device_stop__null().\n    */\n    result = ma_event_init(pContext, &pDevice->null_device.operationEvent);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_event_init(pContext, &pDevice->null_device.operationCompletionEvent);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_thread_create(pContext, &pDevice->thread, ma_device_thread__null, pDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_start__null(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    ma_device_do_operation__null(pDevice, MA_DEVICE_OP_START__NULL);\n\n    ma_atomic_exchange_32(&pDevice->null_device.isStarted, MA_TRUE);\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__null(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    ma_device_do_operation__null(pDevice, MA_DEVICE_OP_SUSPEND__NULL);\n\n    ma_atomic_exchange_32(&pDevice->null_device.isStarted, MA_FALSE);\n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__null(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 totalPCMFramesProcessed;\n    ma_bool32 wasStartedOnEntry;\n\n    wasStartedOnEntry = pDevice->null_device.isStarted;\n\n    /* Keep going until everything has been read. */\n    totalPCMFramesProcessed = 0;\n    while (totalPCMFramesProcessed < frameCount) {\n        ma_uint64 targetFrame;\n\n        /* If there are any frames remaining in the current period, consume those first. */\n        if (pDevice->null_device.currentPeriodFramesRemainingPlayback > 0) {\n            ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed);\n            ma_uint32 framesToProcess = pDevice->null_device.currentPeriodFramesRemainingPlayback;\n            if (framesToProcess > framesRemaining) {\n                framesToProcess = framesRemaining;\n            }\n\n            /* We don't actually do anything with pPCMFrames, so just mark it as unused to prevent a warning. */\n            (void)pPCMFrames;\n\n            pDevice->null_device.currentPeriodFramesRemainingPlayback -= framesToProcess;\n            totalPCMFramesProcessed += framesToProcess;\n        }\n\n        /* If we've consumed the current period we'll need to mark it as such an ensure the device is started if it's not already. */\n        if (pDevice->null_device.currentPeriodFramesRemainingPlayback == 0) {\n            pDevice->null_device.currentPeriodFramesRemainingPlayback = 0;\n\n            if (!pDevice->null_device.isStarted && !wasStartedOnEntry) {\n                result = ma_device_start__null(pDevice);\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n            }\n        }\n\n        /* If we've consumed the whole buffer we can return now. */\n        ma_assert(totalPCMFramesProcessed <= frameCount);\n        if (totalPCMFramesProcessed == frameCount) {\n            break;\n        }\n\n        /* Getting here means we've still got more frames to consume, we but need to wait for it to become available. */\n        targetFrame = pDevice->null_device.lastProcessedFramePlayback;\n        for (;;) {\n            ma_uint64 currentFrame;\n\n            /* Stop waiting if the device has been stopped. */\n            if (!pDevice->null_device.isStarted) {\n                break;\n            }\n\n            currentFrame = ma_device_get_total_run_time_in_frames__null(pDevice);\n            if (currentFrame >= targetFrame) {\n                break;\n            }\n\n            /* Getting here means we haven't yet reached the target sample, so continue waiting. */\n            ma_sleep(10);\n        }\n\n        pDevice->null_device.lastProcessedFramePlayback          += pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods;\n        pDevice->null_device.currentPeriodFramesRemainingPlayback = pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods;\n    }\n\n    return result;\n}\n\nma_result ma_device_read__null(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 totalPCMFramesProcessed;\n\n    /* The device needs to be started immediately. */\n    if (!pDevice->null_device.isStarted) {\n        result = ma_device_start__null(pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /* Keep going until everything has been read. */\n    totalPCMFramesProcessed = 0;\n    while (totalPCMFramesProcessed < frameCount) {\n        ma_uint64 targetFrame;\n\n        /* If there are any frames remaining in the current period, consume those first. */\n        if (pDevice->null_device.currentPeriodFramesRemainingCapture > 0) {\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n            ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed);\n            ma_uint32 framesToProcess = pDevice->null_device.currentPeriodFramesRemainingCapture;\n            if (framesToProcess > framesRemaining) {\n                framesToProcess = framesRemaining;\n            }\n\n            /* We need to ensured the output buffer is zeroed. */\n            ma_zero_memory(ma_offset_ptr(pPCMFrames, totalPCMFramesProcessed*bpf), framesToProcess*bpf);\n\n            pDevice->null_device.currentPeriodFramesRemainingCapture -= framesToProcess;\n            totalPCMFramesProcessed += framesToProcess;\n        }\n\n        /* If we've consumed the current period we'll need to mark it as such an ensure the device is started if it's not already. */\n        if (pDevice->null_device.currentPeriodFramesRemainingCapture == 0) {\n            pDevice->null_device.currentPeriodFramesRemainingCapture = 0;\n        }\n\n        /* If we've consumed the whole buffer we can return now. */\n        ma_assert(totalPCMFramesProcessed <= frameCount);\n        if (totalPCMFramesProcessed == frameCount) {\n            break;\n        }\n\n        /* Getting here means we've still got more frames to consume, we but need to wait for it to become available. */\n        targetFrame = pDevice->null_device.lastProcessedFrameCapture + (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods);\n        for (;;) {\n            ma_uint64 currentFrame;\n\n            /* Stop waiting if the device has been stopped. */\n            if (!pDevice->null_device.isStarted) {\n                break;\n            }\n\n            currentFrame = ma_device_get_total_run_time_in_frames__null(pDevice);\n            if (currentFrame >= targetFrame) {\n                break;\n            }\n\n            /* Getting here means we haven't yet reached the target sample, so continue waiting. */\n            ma_sleep(10);\n        }\n\n        pDevice->null_device.lastProcessedFrameCapture          += pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods;\n        pDevice->null_device.currentPeriodFramesRemainingCapture = pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods;\n    }\n\n    return result;\n}\n\nma_result ma_context_uninit__null(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_null);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__null(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n    pContext->onUninit              = ma_context_uninit__null;\n    pContext->onDeviceIDEqual       = ma_context_is_device_id_equal__null;\n    pContext->onEnumDevices         = ma_context_enumerate_devices__null;\n    pContext->onGetDeviceInfo       = ma_context_get_device_info__null;\n    pContext->onDeviceInit          = ma_device_init__null;\n    pContext->onDeviceUninit        = ma_device_uninit__null;\n    pContext->onDeviceStart         = ma_device_start__null;\n    pContext->onDeviceStop          = ma_device_stop__null;\n    pContext->onDeviceWrite         = ma_device_write__null;\n    pContext->onDeviceRead          = ma_device_read__null;\n\n    /* The null backend always works. */\n    return MA_SUCCESS;\n}\n#endif\n\n\n/*******************************************************************************\n\nWIN32 COMMON\n\n*******************************************************************************/\n#if defined(MA_WIN32)\n#if defined(MA_WIN32_DESKTOP)\n    #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit)                          ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit)\n    #define ma_CoUninitialize(pContext)                                                ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)()\n    #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv)  ((MA_PFN_CoCreateInstance)pContext->win32.CoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv)\n    #define ma_CoTaskMemFree(pContext, pv)                                             ((MA_PFN_CoTaskMemFree)pContext->win32.CoTaskMemFree)(pv)\n    #define ma_PropVariantClear(pContext, pvar)                                        ((MA_PFN_PropVariantClear)pContext->win32.PropVariantClear)(pvar)\n#else\n    #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit)                          CoInitializeEx(pvReserved, dwCoInit)\n    #define ma_CoUninitialize(pContext)                                                CoUninitialize()\n    #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv)  CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv)\n    #define ma_CoTaskMemFree(pContext, pv)                                             CoTaskMemFree(pv)\n    #define ma_PropVariantClear(pContext, pvar)                                        PropVariantClear(pvar)\n#endif\n\n#if !defined(MAXULONG_PTR)\ntypedef size_t DWORD_PTR;\n#endif\n\n#if !defined(WAVE_FORMAT_44M08)\n#define WAVE_FORMAT_44M08 0x00000100\n#define WAVE_FORMAT_44S08 0x00000200\n#define WAVE_FORMAT_44M16 0x00000400\n#define WAVE_FORMAT_44S16 0x00000800\n#define WAVE_FORMAT_48M08 0x00001000\n#define WAVE_FORMAT_48S08 0x00002000\n#define WAVE_FORMAT_48M16 0x00004000\n#define WAVE_FORMAT_48S16 0x00008000\n#define WAVE_FORMAT_96M08 0x00010000\n#define WAVE_FORMAT_96S08 0x00020000\n#define WAVE_FORMAT_96M16 0x00040000\n#define WAVE_FORMAT_96S16 0x00080000\n#endif\n\n#ifndef SPEAKER_FRONT_LEFT\n#define SPEAKER_FRONT_LEFT            0x1\n#define SPEAKER_FRONT_RIGHT           0x2\n#define SPEAKER_FRONT_CENTER          0x4\n#define SPEAKER_LOW_FREQUENCY         0x8\n#define SPEAKER_BACK_LEFT             0x10\n#define SPEAKER_BACK_RIGHT            0x20\n#define SPEAKER_FRONT_LEFT_OF_CENTER  0x40\n#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80\n#define SPEAKER_BACK_CENTER           0x100\n#define SPEAKER_SIDE_LEFT             0x200\n#define SPEAKER_SIDE_RIGHT            0x400\n#define SPEAKER_TOP_CENTER            0x800\n#define SPEAKER_TOP_FRONT_LEFT        0x1000\n#define SPEAKER_TOP_FRONT_CENTER      0x2000\n#define SPEAKER_TOP_FRONT_RIGHT       0x4000\n#define SPEAKER_TOP_BACK_LEFT         0x8000\n#define SPEAKER_TOP_BACK_CENTER       0x10000\n#define SPEAKER_TOP_BACK_RIGHT        0x20000\n#endif\n\n/*\nThe SDK that comes with old versions of MSVC (VC6, for example) does not appear to define WAVEFORMATEXTENSIBLE. We\ndefine our own implementation in this case.\n*/\n#if (defined(_MSC_VER) && !defined(_WAVEFORMATEXTENSIBLE_)) || defined(__DMC__)\ntypedef struct\n{\n    WAVEFORMATEX Format;\n    union\n    {\n        WORD wValidBitsPerSample;\n        WORD wSamplesPerBlock;\n        WORD wReserved;\n    } Samples;\n    DWORD dwChannelMask;\n    GUID SubFormat;\n} WAVEFORMATEXTENSIBLE;\n#endif\n\n#ifndef WAVE_FORMAT_EXTENSIBLE\n#define WAVE_FORMAT_EXTENSIBLE  0xFFFE\n#endif\n\n#ifndef WAVE_FORMAT_IEEE_FLOAT\n#define WAVE_FORMAT_IEEE_FLOAT  0x0003\n#endif\n\nGUID MA_GUID_NULL = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};\n\n/* Converts an individual Win32-style channel identifier (SPEAKER_FRONT_LEFT, etc.) to miniaudio. */\nma_uint8 ma_channel_id_to_ma__win32(DWORD id)\n{\n    switch (id)\n    {\n        case SPEAKER_FRONT_LEFT:            return MA_CHANNEL_FRONT_LEFT;\n        case SPEAKER_FRONT_RIGHT:           return MA_CHANNEL_FRONT_RIGHT;\n        case SPEAKER_FRONT_CENTER:          return MA_CHANNEL_FRONT_CENTER;\n        case SPEAKER_LOW_FREQUENCY:         return MA_CHANNEL_LFE;\n        case SPEAKER_BACK_LEFT:             return MA_CHANNEL_BACK_LEFT;\n        case SPEAKER_BACK_RIGHT:            return MA_CHANNEL_BACK_RIGHT;\n        case SPEAKER_FRONT_LEFT_OF_CENTER:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case SPEAKER_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case SPEAKER_BACK_CENTER:           return MA_CHANNEL_BACK_CENTER;\n        case SPEAKER_SIDE_LEFT:             return MA_CHANNEL_SIDE_LEFT;\n        case SPEAKER_SIDE_RIGHT:            return MA_CHANNEL_SIDE_RIGHT;\n        case SPEAKER_TOP_CENTER:            return MA_CHANNEL_TOP_CENTER;\n        case SPEAKER_TOP_FRONT_LEFT:        return MA_CHANNEL_TOP_FRONT_LEFT;\n        case SPEAKER_TOP_FRONT_CENTER:      return MA_CHANNEL_TOP_FRONT_CENTER;\n        case SPEAKER_TOP_FRONT_RIGHT:       return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case SPEAKER_TOP_BACK_LEFT:         return MA_CHANNEL_TOP_BACK_LEFT;\n        case SPEAKER_TOP_BACK_CENTER:       return MA_CHANNEL_TOP_BACK_CENTER;\n        case SPEAKER_TOP_BACK_RIGHT:        return MA_CHANNEL_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts an individual miniaudio channel identifier (MA_CHANNEL_FRONT_LEFT, etc.) to Win32-style. */\nDWORD ma_channel_id_to_win32(DWORD id)\n{\n    switch (id)\n    {\n        case MA_CHANNEL_MONO:               return SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_FRONT_LEFT:         return SPEAKER_FRONT_LEFT;\n        case MA_CHANNEL_FRONT_RIGHT:        return SPEAKER_FRONT_RIGHT;\n        case MA_CHANNEL_FRONT_CENTER:       return SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_LFE:                return SPEAKER_LOW_FREQUENCY;\n        case MA_CHANNEL_BACK_LEFT:          return SPEAKER_BACK_LEFT;\n        case MA_CHANNEL_BACK_RIGHT:         return SPEAKER_BACK_RIGHT;\n        case MA_CHANNEL_FRONT_LEFT_CENTER:  return SPEAKER_FRONT_LEFT_OF_CENTER;\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return SPEAKER_FRONT_RIGHT_OF_CENTER;\n        case MA_CHANNEL_BACK_CENTER:        return SPEAKER_BACK_CENTER;\n        case MA_CHANNEL_SIDE_LEFT:          return SPEAKER_SIDE_LEFT;\n        case MA_CHANNEL_SIDE_RIGHT:         return SPEAKER_SIDE_RIGHT;\n        case MA_CHANNEL_TOP_CENTER:         return SPEAKER_TOP_CENTER;\n        case MA_CHANNEL_TOP_FRONT_LEFT:     return SPEAKER_TOP_FRONT_LEFT;\n        case MA_CHANNEL_TOP_FRONT_CENTER:   return SPEAKER_TOP_FRONT_CENTER;\n        case MA_CHANNEL_TOP_FRONT_RIGHT:    return SPEAKER_TOP_FRONT_RIGHT;\n        case MA_CHANNEL_TOP_BACK_LEFT:      return SPEAKER_TOP_BACK_LEFT;\n        case MA_CHANNEL_TOP_BACK_CENTER:    return SPEAKER_TOP_BACK_CENTER;\n        case MA_CHANNEL_TOP_BACK_RIGHT:     return SPEAKER_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts a channel mapping to a Win32-style channel mask. */\nDWORD ma_channel_map_to_channel_mask__win32(const ma_channel channelMap[MA_MAX_CHANNELS], ma_uint32 channels)\n{\n    DWORD dwChannelMask = 0;\n    ma_uint32 iChannel;\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        dwChannelMask |= ma_channel_id_to_win32(channelMap[iChannel]);\n    }\n\n    return dwChannelMask;\n}\n\n/* Converts a Win32-style channel mask to a miniaudio channel map. */\nvoid ma_channel_mask_to_channel_map__win32(DWORD dwChannelMask, ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    if (channels == 1 && dwChannelMask == 0) {\n        channelMap[0] = MA_CHANNEL_MONO;\n    } else if (channels == 2 && dwChannelMask == 0) {\n        channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n        channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n    } else {\n        if (channels == 1 && (dwChannelMask & SPEAKER_FRONT_CENTER) != 0) {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } else {\n            /* Just iterate over each bit. */\n            ma_uint32 iChannel = 0;\n            ma_uint32 iBit;\n\n            for (iBit = 0; iBit < 32; ++iBit) {\n                DWORD bitValue = (dwChannelMask & (1UL << iBit));\n                if (bitValue != 0) {\n                    /* The bit is set. */\n                    channelMap[iChannel] = ma_channel_id_to_ma__win32(bitValue);\n                    iChannel += 1;\n                }\n            }\n        }\n    }\n}\n\n#ifdef __cplusplus\nma_bool32 ma_is_guid_equal(const void* a, const void* b)\n{\n    return IsEqualGUID(*(const GUID*)a, *(const GUID*)b);\n}\n#else\n#define ma_is_guid_equal(a, b) IsEqualGUID((const GUID*)a, (const GUID*)b)\n#endif\n\nma_format ma_format_from_WAVEFORMATEX(const WAVEFORMATEX* pWF)\n{\n    ma_assert(pWF != NULL);\n\n    if (pWF->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n        const WAVEFORMATEXTENSIBLE* pWFEX = (const WAVEFORMATEXTENSIBLE*)pWF;\n        if (ma_is_guid_equal(&pWFEX->SubFormat, &MA_GUID_KSDATAFORMAT_SUBTYPE_PCM)) {\n            if (pWFEX->Samples.wValidBitsPerSample == 32) {\n                return ma_format_s32;\n            }\n            if (pWFEX->Samples.wValidBitsPerSample == 24) {\n                if (pWFEX->Format.wBitsPerSample == 32) {\n                    /*return ma_format_s24_32;*/\n                }\n                if (pWFEX->Format.wBitsPerSample == 24) {\n                    return ma_format_s24;\n                }\n            }\n            if (pWFEX->Samples.wValidBitsPerSample == 16) {\n                return ma_format_s16;\n            }\n            if (pWFEX->Samples.wValidBitsPerSample == 8) {\n                return ma_format_u8;\n            }\n        }\n        if (ma_is_guid_equal(&pWFEX->SubFormat, &MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) {\n            if (pWFEX->Samples.wValidBitsPerSample == 32) {\n                return ma_format_f32;\n            }\n            /*\n            if (pWFEX->Samples.wValidBitsPerSample == 64) {\n                return ma_format_f64;\n            }\n            */\n        }\n    } else {\n        if (pWF->wFormatTag == WAVE_FORMAT_PCM) {\n            if (pWF->wBitsPerSample == 32) {\n                return ma_format_s32;\n            }\n            if (pWF->wBitsPerSample == 24) {\n                return ma_format_s24;\n            }\n            if (pWF->wBitsPerSample == 16) {\n                return ma_format_s16;\n            }\n            if (pWF->wBitsPerSample == 8) {\n                return ma_format_u8;\n            }\n        }\n        if (pWF->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) {\n            if (pWF->wBitsPerSample == 32) {\n                return ma_format_f32;\n            }\n            if (pWF->wBitsPerSample == 64) {\n                /*return ma_format_f64;*/\n            }\n        }\n    }\n\n    return ma_format_unknown;\n}\n#endif\n\n\n/*******************************************************************************\n\nWASAPI Backend\n\n*******************************************************************************/\n#ifdef MA_HAS_WASAPI\n#if 0\n#if defined(_MSC_VER)\n    #pragma warning(push)\n    #pragma warning(disable:4091)   /* 'typedef ': ignored on left of '' when no variable is declared */\n#endif\n#include <audioclient.h>\n#include <mmdeviceapi.h>\n#if defined(_MSC_VER)\n    #pragma warning(pop)\n#endif\n#endif  /* 0 */\n\n\n/* Some compilers don't define VerifyVersionInfoW. Need to write this ourselves. */\n#define MA_WIN32_WINNT_VISTA    0x0600\n#define MA_VER_MINORVERSION     0x01\n#define MA_VER_MAJORVERSION     0x02\n#define MA_VER_SERVICEPACKMAJOR 0x20\n#define MA_VER_GREATER_EQUAL    0x03\n\ntypedef struct  {\n    DWORD dwOSVersionInfoSize;\n    DWORD dwMajorVersion;\n    DWORD dwMinorVersion;\n    DWORD dwBuildNumber;\n    DWORD dwPlatformId;\n    WCHAR szCSDVersion[128];\n    WORD  wServicePackMajor;\n    WORD  wServicePackMinor;\n    WORD  wSuiteMask;\n    BYTE  wProductType;\n    BYTE  wReserved;\n} ma_OSVERSIONINFOEXW;\n\ntypedef BOOL      (WINAPI * ma_PFNVerifyVersionInfoW) (ma_OSVERSIONINFOEXW* lpVersionInfo, DWORD dwTypeMask, DWORDLONG dwlConditionMask);\ntypedef ULONGLONG (WINAPI * ma_PFNVerSetConditionMask)(ULONGLONG dwlConditionMask, DWORD dwTypeBitMask, BYTE dwConditionMask);\n\n\n#ifndef PROPERTYKEY_DEFINED\n#define PROPERTYKEY_DEFINED\ntypedef struct\n{\n    GUID fmtid;\n    DWORD pid;\n} PROPERTYKEY;\n#endif\n\n/* Some compilers don't define PropVariantInit(). We just do this ourselves since it's just a memset(). */\nstatic MA_INLINE void ma_PropVariantInit(PROPVARIANT* pProp)\n{\n    ma_zero_object(pProp);\n}\n\n\nconst PROPERTYKEY MA_PKEY_Device_FriendlyName             = {{0xA45C254E, 0xDF1C, 0x4EFD, {0x80, 0x20, 0x67, 0xD1, 0x46, 0xA8, 0x50, 0xE0}}, 14};\nconst PROPERTYKEY MA_PKEY_AudioEngine_DeviceFormat        = {{0xF19F064D, 0x82C,  0x4E27, {0xBC, 0x73, 0x68, 0x82, 0xA1, 0xBB, 0x8E, 0x4C}},  0};\n\nconst IID MA_IID_IUnknown                                 = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; /* 00000000-0000-0000-C000-000000000046 */\nconst IID MA_IID_IAgileObject                             = {0x94EA2B94, 0xE9CC, 0x49E0, {0xC0, 0xFF, 0xEE, 0x64, 0xCA, 0x8F, 0x5B, 0x90}}; /* 94EA2B94-E9CC-49E0-C0FF-EE64CA8F5B90 */\n\nconst IID MA_IID_IAudioClient                             = {0x1CB9AD4C, 0xDBFA, 0x4C32, {0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2}}; /* 1CB9AD4C-DBFA-4C32-B178-C2F568A703B2 = __uuidof(IAudioClient) */\nconst IID MA_IID_IAudioClient2                            = {0x726778CD, 0xF60A, 0x4EDA, {0x82, 0xDE, 0xE4, 0x76, 0x10, 0xCD, 0x78, 0xAA}}; /* 726778CD-F60A-4EDA-82DE-E47610CD78AA = __uuidof(IAudioClient2) */\nconst IID MA_IID_IAudioClient3                            = {0x7ED4EE07, 0x8E67, 0x4CD4, {0x8C, 0x1A, 0x2B, 0x7A, 0x59, 0x87, 0xAD, 0x42}}; /* 7ED4EE07-8E67-4CD4-8C1A-2B7A5987AD42 = __uuidof(IAudioClient3) */\nconst IID MA_IID_IAudioRenderClient                       = {0xF294ACFC, 0x3146, 0x4483, {0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2}}; /* F294ACFC-3146-4483-A7BF-ADDCA7C260E2 = __uuidof(IAudioRenderClient) */\nconst IID MA_IID_IAudioCaptureClient                      = {0xC8ADBD64, 0xE71E, 0x48A0, {0xA4, 0xDE, 0x18, 0x5C, 0x39, 0x5C, 0xD3, 0x17}}; /* C8ADBD64-E71E-48A0-A4DE-185C395CD317 = __uuidof(IAudioCaptureClient) */\nconst IID MA_IID_IMMNotificationClient                    = {0x7991EEC9, 0x7E89, 0x4D85, {0x83, 0x90, 0x6C, 0x70, 0x3C, 0xEC, 0x60, 0xC0}}; /* 7991EEC9-7E89-4D85-8390-6C703CEC60C0 = __uuidof(IMMNotificationClient) */\n#ifndef MA_WIN32_DESKTOP\nconst IID MA_IID_DEVINTERFACE_AUDIO_RENDER                = {0xE6327CAD, 0xDCEC, 0x4949, {0xAE, 0x8A, 0x99, 0x1E, 0x97, 0x6A, 0x79, 0xD2}}; /* E6327CAD-DCEC-4949-AE8A-991E976A79D2 */\nconst IID MA_IID_DEVINTERFACE_AUDIO_CAPTURE               = {0x2EEF81BE, 0x33FA, 0x4800, {0x96, 0x70, 0x1C, 0xD4, 0x74, 0x97, 0x2C, 0x3F}}; /* 2EEF81BE-33FA-4800-9670-1CD474972C3F */\nconst IID MA_IID_IActivateAudioInterfaceCompletionHandler = {0x41D949AB, 0x9862, 0x444A, {0x80, 0xF6, 0xC2, 0x61, 0x33, 0x4D, 0xA5, 0xEB}}; /* 41D949AB-9862-444A-80F6-C261334DA5EB */\n#endif\n\nconst IID MA_CLSID_MMDeviceEnumerator_Instance            = {0xBCDE0395, 0xE52F, 0x467C, {0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}}; /* BCDE0395-E52F-467C-8E3D-C4579291692E = __uuidof(MMDeviceEnumerator) */\nconst IID MA_IID_IMMDeviceEnumerator_Instance             = {0xA95664D2, 0x9614, 0x4F35, {0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6}}; /* A95664D2-9614-4F35-A746-DE8DB63617E6 = __uuidof(IMMDeviceEnumerator) */\n#ifdef __cplusplus\n#define MA_CLSID_MMDeviceEnumerator MA_CLSID_MMDeviceEnumerator_Instance\n#define MA_IID_IMMDeviceEnumerator  MA_IID_IMMDeviceEnumerator_Instance\n#else\n#define MA_CLSID_MMDeviceEnumerator &MA_CLSID_MMDeviceEnumerator_Instance\n#define MA_IID_IMMDeviceEnumerator  &MA_IID_IMMDeviceEnumerator_Instance\n#endif\n\ntypedef struct ma_IUnknown                                 ma_IUnknown;\n#ifdef MA_WIN32_DESKTOP\n#define MA_MM_DEVICE_STATE_ACTIVE                          1\n#define MA_MM_DEVICE_STATE_DISABLED                        2\n#define MA_MM_DEVICE_STATE_NOTPRESENT                      4\n#define MA_MM_DEVICE_STATE_UNPLUGGED                       8\n\ntypedef struct ma_IMMDeviceEnumerator                      ma_IMMDeviceEnumerator;\ntypedef struct ma_IMMDeviceCollection                      ma_IMMDeviceCollection;\ntypedef struct ma_IMMDevice                                ma_IMMDevice;\n#else\ntypedef struct ma_IActivateAudioInterfaceCompletionHandler ma_IActivateAudioInterfaceCompletionHandler;\ntypedef struct ma_IActivateAudioInterfaceAsyncOperation    ma_IActivateAudioInterfaceAsyncOperation;\n#endif\ntypedef struct ma_IPropertyStore                           ma_IPropertyStore;\ntypedef struct ma_IAudioClient                             ma_IAudioClient;\ntypedef struct ma_IAudioClient2                            ma_IAudioClient2;\ntypedef struct ma_IAudioClient3                            ma_IAudioClient3;\ntypedef struct ma_IAudioRenderClient                       ma_IAudioRenderClient;\ntypedef struct ma_IAudioCaptureClient                      ma_IAudioCaptureClient;\n\ntypedef ma_int64                                           MA_REFERENCE_TIME;\n\n#define MA_AUDCLNT_STREAMFLAGS_CROSSPROCESS                0x00010000\n#define MA_AUDCLNT_STREAMFLAGS_LOOPBACK                    0x00020000\n#define MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK               0x00040000\n#define MA_AUDCLNT_STREAMFLAGS_NOPERSIST                   0x00080000\n#define MA_AUDCLNT_STREAMFLAGS_RATEADJUST                  0x00100000\n#define MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY         0x08000000\n#define MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM              0x80000000\n#define MA_AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED          0x10000000\n#define MA_AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE               0x20000000\n#define MA_AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED    0x40000000\n\n/* We only care about a few error codes. */\n#define MA_AUDCLNT_E_INVALID_DEVICE_PERIOD                 (-2004287456)\n#define MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED               (-2004287463)\n#define MA_AUDCLNT_S_BUFFER_EMPTY                          (143196161)\n#define MA_AUDCLNT_E_DEVICE_IN_USE                         (-2004287478)\n\ntypedef enum\n{\n    ma_eRender  = 0,\n    ma_eCapture = 1,\n    ma_eAll     = 2\n} ma_EDataFlow;\n\ntypedef enum\n{\n    ma_eConsole        = 0,\n    ma_eMultimedia     = 1,\n    ma_eCommunications = 2\n} ma_ERole;\n\ntypedef enum\n{\n    MA_AUDCLNT_SHAREMODE_SHARED,\n    MA_AUDCLNT_SHAREMODE_EXCLUSIVE\n} MA_AUDCLNT_SHAREMODE;\n\ntypedef enum\n{\n    MA_AudioCategory_Other = 0  /* <-- miniaudio is only caring about Other. */\n} MA_AUDIO_STREAM_CATEGORY;\n\ntypedef struct\n{\n    UINT32 cbSize;\n    BOOL bIsOffload;\n    MA_AUDIO_STREAM_CATEGORY eCategory;\n} ma_AudioClientProperties;\n\n/* IUnknown */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IUnknown* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IUnknown* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IUnknown* pThis);\n} ma_IUnknownVtbl;\nstruct ma_IUnknown\n{\n    ma_IUnknownVtbl* lpVtbl;\n};\nHRESULT ma_IUnknown_QueryInterface(ma_IUnknown* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IUnknown_AddRef(ma_IUnknown* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IUnknown_Release(ma_IUnknown* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n\n#ifdef MA_WIN32_DESKTOP\n    /* IMMNotificationClient */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMNotificationClient* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMNotificationClient* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMNotificationClient* pThis);\n\n        /* IMMNotificationClient */\n        HRESULT (STDMETHODCALLTYPE * OnDeviceStateChanged)  (ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, DWORD dwNewState);\n        HRESULT (STDMETHODCALLTYPE * OnDeviceAdded)         (ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID);\n        HRESULT (STDMETHODCALLTYPE * OnDeviceRemoved)       (ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID);\n        HRESULT (STDMETHODCALLTYPE * OnDefaultDeviceChanged)(ma_IMMNotificationClient* pThis, ma_EDataFlow dataFlow, ma_ERole role, LPCWSTR pDefaultDeviceID);\n        HRESULT (STDMETHODCALLTYPE * OnPropertyValueChanged)(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, const PROPERTYKEY key);\n    } ma_IMMNotificationClientVtbl;\n\n    /* IMMDeviceEnumerator */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDeviceEnumerator* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMDeviceEnumerator* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMDeviceEnumerator* pThis);\n\n        /* IMMDeviceEnumerator */\n        HRESULT (STDMETHODCALLTYPE * EnumAudioEndpoints)                    (ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, DWORD dwStateMask, ma_IMMDeviceCollection** ppDevices);\n        HRESULT (STDMETHODCALLTYPE * GetDefaultAudioEndpoint)               (ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, ma_ERole role, ma_IMMDevice** ppEndpoint);\n        HRESULT (STDMETHODCALLTYPE * GetDevice)                             (ma_IMMDeviceEnumerator* pThis, LPCWSTR pID, ma_IMMDevice** ppDevice);\n        HRESULT (STDMETHODCALLTYPE * RegisterEndpointNotificationCallback)  (ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient);\n        HRESULT (STDMETHODCALLTYPE * UnregisterEndpointNotificationCallback)(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient);\n    } ma_IMMDeviceEnumeratorVtbl;\n    struct ma_IMMDeviceEnumerator\n    {\n        ma_IMMDeviceEnumeratorVtbl* lpVtbl;\n    };\n    HRESULT ma_IMMDeviceEnumerator_QueryInterface(ma_IMMDeviceEnumerator* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    ULONG   ma_IMMDeviceEnumerator_AddRef(ma_IMMDeviceEnumerator* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    ULONG   ma_IMMDeviceEnumerator_Release(ma_IMMDeviceEnumerator* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    HRESULT ma_IMMDeviceEnumerator_EnumAudioEndpoints(ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, DWORD dwStateMask, ma_IMMDeviceCollection** ppDevices) { return pThis->lpVtbl->EnumAudioEndpoints(pThis, dataFlow, dwStateMask, ppDevices); }\n    HRESULT ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, ma_ERole role, ma_IMMDevice** ppEndpoint) { return pThis->lpVtbl->GetDefaultAudioEndpoint(pThis, dataFlow, role, ppEndpoint); }\n    HRESULT ma_IMMDeviceEnumerator_GetDevice(ma_IMMDeviceEnumerator* pThis, LPCWSTR pID, ma_IMMDevice** ppDevice)       { return pThis->lpVtbl->GetDevice(pThis, pID, ppDevice); }\n    HRESULT ma_IMMDeviceEnumerator_RegisterEndpointNotificationCallback(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient) { return pThis->lpVtbl->RegisterEndpointNotificationCallback(pThis, pClient); }\n    HRESULT ma_IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient) { return pThis->lpVtbl->UnregisterEndpointNotificationCallback(pThis, pClient); }\n\n\n    /* IMMDeviceCollection */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDeviceCollection* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMDeviceCollection* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMDeviceCollection* pThis);\n\n        /* IMMDeviceCollection */\n        HRESULT (STDMETHODCALLTYPE * GetCount)(ma_IMMDeviceCollection* pThis, UINT* pDevices);\n        HRESULT (STDMETHODCALLTYPE * Item)    (ma_IMMDeviceCollection* pThis, UINT nDevice, ma_IMMDevice** ppDevice);\n    } ma_IMMDeviceCollectionVtbl;\n    struct ma_IMMDeviceCollection\n    {\n        ma_IMMDeviceCollectionVtbl* lpVtbl;\n    };\n    HRESULT ma_IMMDeviceCollection_QueryInterface(ma_IMMDeviceCollection* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    ULONG   ma_IMMDeviceCollection_AddRef(ma_IMMDeviceCollection* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    ULONG   ma_IMMDeviceCollection_Release(ma_IMMDeviceCollection* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    HRESULT ma_IMMDeviceCollection_GetCount(ma_IMMDeviceCollection* pThis, UINT* pDevices)                               { return pThis->lpVtbl->GetCount(pThis, pDevices); }\n    HRESULT ma_IMMDeviceCollection_Item(ma_IMMDeviceCollection* pThis, UINT nDevice, ma_IMMDevice** ppDevice)           { return pThis->lpVtbl->Item(pThis, nDevice, ppDevice); }\n\n\n    /* IMMDevice */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDevice* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMDevice* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMDevice* pThis);\n\n        /* IMMDevice */\n        HRESULT (STDMETHODCALLTYPE * Activate)         (ma_IMMDevice* pThis, const IID* const iid, DWORD dwClsCtx, PROPVARIANT* pActivationParams, void** ppInterface);\n        HRESULT (STDMETHODCALLTYPE * OpenPropertyStore)(ma_IMMDevice* pThis, DWORD stgmAccess, ma_IPropertyStore** ppProperties);\n        HRESULT (STDMETHODCALLTYPE * GetId)            (ma_IMMDevice* pThis, LPWSTR *pID);\n        HRESULT (STDMETHODCALLTYPE * GetState)         (ma_IMMDevice* pThis, DWORD *pState);\n    } ma_IMMDeviceVtbl;\n    struct ma_IMMDevice\n    {\n        ma_IMMDeviceVtbl* lpVtbl;\n    };\n    HRESULT ma_IMMDevice_QueryInterface(ma_IMMDevice* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    ULONG   ma_IMMDevice_AddRef(ma_IMMDevice* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    ULONG   ma_IMMDevice_Release(ma_IMMDevice* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    HRESULT ma_IMMDevice_Activate(ma_IMMDevice* pThis, const IID* const iid, DWORD dwClsCtx, PROPVARIANT* pActivationParams, void** ppInterface) { return pThis->lpVtbl->Activate(pThis, iid, dwClsCtx, pActivationParams, ppInterface); }\n    HRESULT ma_IMMDevice_OpenPropertyStore(ma_IMMDevice* pThis, DWORD stgmAccess, ma_IPropertyStore** ppProperties) { return pThis->lpVtbl->OpenPropertyStore(pThis, stgmAccess, ppProperties); }\n    HRESULT ma_IMMDevice_GetId(ma_IMMDevice* pThis, LPWSTR *pID)                                     { return pThis->lpVtbl->GetId(pThis, pID); }\n    HRESULT ma_IMMDevice_GetState(ma_IMMDevice* pThis, DWORD *pState)                                { return pThis->lpVtbl->GetState(pThis, pState); }\n#else\n    /* IActivateAudioInterfaceAsyncOperation */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IActivateAudioInterfaceAsyncOperation* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IActivateAudioInterfaceAsyncOperation* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IActivateAudioInterfaceAsyncOperation* pThis);\n\n        /* IActivateAudioInterfaceAsyncOperation */\n        HRESULT (STDMETHODCALLTYPE * GetActivateResult)(ma_IActivateAudioInterfaceAsyncOperation* pThis, HRESULT *pActivateResult, ma_IUnknown** ppActivatedInterface);\n    } ma_IActivateAudioInterfaceAsyncOperationVtbl;\n    struct ma_IActivateAudioInterfaceAsyncOperation\n    {\n        ma_IActivateAudioInterfaceAsyncOperationVtbl* lpVtbl;\n    };\n    HRESULT ma_IActivateAudioInterfaceAsyncOperation_QueryInterface(ma_IActivateAudioInterfaceAsyncOperation* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    ULONG   ma_IActivateAudioInterfaceAsyncOperation_AddRef(ma_IActivateAudioInterfaceAsyncOperation* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    ULONG   ma_IActivateAudioInterfaceAsyncOperation_Release(ma_IActivateAudioInterfaceAsyncOperation* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    HRESULT ma_IActivateAudioInterfaceAsyncOperation_GetActivateResult(ma_IActivateAudioInterfaceAsyncOperation* pThis, HRESULT *pActivateResult, ma_IUnknown** ppActivatedInterface) { return pThis->lpVtbl->GetActivateResult(pThis, pActivateResult, ppActivatedInterface); }\n#endif\n\n/* IPropertyStore */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IPropertyStore* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IPropertyStore* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IPropertyStore* pThis);\n\n    /* IPropertyStore */\n    HRESULT (STDMETHODCALLTYPE * GetCount)(ma_IPropertyStore* pThis, DWORD* pPropCount);\n    HRESULT (STDMETHODCALLTYPE * GetAt)   (ma_IPropertyStore* pThis, DWORD propIndex, PROPERTYKEY* pPropKey);\n    HRESULT (STDMETHODCALLTYPE * GetValue)(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, PROPVARIANT* pPropVar);\n    HRESULT (STDMETHODCALLTYPE * SetValue)(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, const PROPVARIANT* const pPropVar);\n    HRESULT (STDMETHODCALLTYPE * Commit)  (ma_IPropertyStore* pThis);\n} ma_IPropertyStoreVtbl;\nstruct ma_IPropertyStore\n{\n    ma_IPropertyStoreVtbl* lpVtbl;\n};\nHRESULT ma_IPropertyStore_QueryInterface(ma_IPropertyStore* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IPropertyStore_AddRef(ma_IPropertyStore* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IPropertyStore_Release(ma_IPropertyStore* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IPropertyStore_GetCount(ma_IPropertyStore* pThis, DWORD* pPropCount)                            { return pThis->lpVtbl->GetCount(pThis, pPropCount); }\nHRESULT ma_IPropertyStore_GetAt(ma_IPropertyStore* pThis, DWORD propIndex, PROPERTYKEY* pPropKey)          { return pThis->lpVtbl->GetAt(pThis, propIndex, pPropKey); }\nHRESULT ma_IPropertyStore_GetValue(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, PROPVARIANT* pPropVar) { return pThis->lpVtbl->GetValue(pThis, pKey, pPropVar); }\nHRESULT ma_IPropertyStore_SetValue(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, const PROPVARIANT* const pPropVar) { return pThis->lpVtbl->SetValue(pThis, pKey, pPropVar); }\nHRESULT ma_IPropertyStore_Commit(ma_IPropertyStore* pThis)                                                 { return pThis->lpVtbl->Commit(pThis); }\n\n\n/* IAudioClient */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioClient* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioClient* pThis);\n\n    /* IAudioClient */\n    HRESULT (STDMETHODCALLTYPE * Initialize)       (ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSize)    (ma_IAudioClient* pThis, ma_uint32* pNumBufferFrames);\n    HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient* pThis, MA_REFERENCE_TIME* pLatency);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient* pThis, ma_uint32* pNumPaddingFrames);\n    HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch);\n    HRESULT (STDMETHODCALLTYPE * GetMixFormat)     (ma_IAudioClient* pThis, WAVEFORMATEX** ppDeviceFormat);\n    HRESULT (STDMETHODCALLTYPE * GetDevicePeriod)  (ma_IAudioClient* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod);\n    HRESULT (STDMETHODCALLTYPE * Start)            (ma_IAudioClient* pThis);\n    HRESULT (STDMETHODCALLTYPE * Stop)             (ma_IAudioClient* pThis);\n    HRESULT (STDMETHODCALLTYPE * Reset)            (ma_IAudioClient* pThis);\n    HRESULT (STDMETHODCALLTYPE * SetEventHandle)   (ma_IAudioClient* pThis, HANDLE eventHandle);\n    HRESULT (STDMETHODCALLTYPE * GetService)       (ma_IAudioClient* pThis, const IID* const riid, void** pp);\n} ma_IAudioClientVtbl;\nstruct ma_IAudioClient\n{\n    ma_IAudioClientVtbl* lpVtbl;\n};\nHRESULT ma_IAudioClient_QueryInterface(ma_IAudioClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IAudioClient_AddRef(ma_IAudioClient* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IAudioClient_Release(ma_IAudioClient* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IAudioClient_Initialize(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); }\nHRESULT ma_IAudioClient_GetBufferSize(ma_IAudioClient* pThis, ma_uint32* pNumBufferFrames)                { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); }\nHRESULT ma_IAudioClient_GetStreamLatency(ma_IAudioClient* pThis, MA_REFERENCE_TIME* pLatency)             { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); }\nHRESULT ma_IAudioClient_GetCurrentPadding(ma_IAudioClient* pThis, ma_uint32* pNumPaddingFrames)           { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); }\nHRESULT ma_IAudioClient_IsFormatSupported(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); }\nHRESULT ma_IAudioClient_GetMixFormat(ma_IAudioClient* pThis, WAVEFORMATEX** ppDeviceFormat)            { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); }\nHRESULT ma_IAudioClient_GetDevicePeriod(ma_IAudioClient* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); }\nHRESULT ma_IAudioClient_Start(ma_IAudioClient* pThis)                                                  { return pThis->lpVtbl->Start(pThis); }\nHRESULT ma_IAudioClient_Stop(ma_IAudioClient* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nHRESULT ma_IAudioClient_Reset(ma_IAudioClient* pThis)                                                  { return pThis->lpVtbl->Reset(pThis); }\nHRESULT ma_IAudioClient_SetEventHandle(ma_IAudioClient* pThis, HANDLE eventHandle)                     { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); }\nHRESULT ma_IAudioClient_GetService(ma_IAudioClient* pThis, const IID* const riid, void** pp)           { return pThis->lpVtbl->GetService(pThis, riid, pp); }\n\n/* IAudioClient2 */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient2* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioClient2* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioClient2* pThis);\n\n    /* IAudioClient */\n    HRESULT (STDMETHODCALLTYPE * Initialize)       (ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSize)    (ma_IAudioClient2* pThis, ma_uint32* pNumBufferFrames);\n    HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pLatency);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient2* pThis, ma_uint32* pNumPaddingFrames);\n    HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch);\n    HRESULT (STDMETHODCALLTYPE * GetMixFormat)     (ma_IAudioClient2* pThis, WAVEFORMATEX** ppDeviceFormat);\n    HRESULT (STDMETHODCALLTYPE * GetDevicePeriod)  (ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod);\n    HRESULT (STDMETHODCALLTYPE * Start)            (ma_IAudioClient2* pThis);\n    HRESULT (STDMETHODCALLTYPE * Stop)             (ma_IAudioClient2* pThis);\n    HRESULT (STDMETHODCALLTYPE * Reset)            (ma_IAudioClient2* pThis);\n    HRESULT (STDMETHODCALLTYPE * SetEventHandle)   (ma_IAudioClient2* pThis, HANDLE eventHandle);\n    HRESULT (STDMETHODCALLTYPE * GetService)       (ma_IAudioClient2* pThis, const IID* const riid, void** pp);\n\n    /* IAudioClient2 */\n    HRESULT (STDMETHODCALLTYPE * IsOffloadCapable)   (ma_IAudioClient2* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable);\n    HRESULT (STDMETHODCALLTYPE * SetClientProperties)(ma_IAudioClient2* pThis, const ma_AudioClientProperties* pProperties);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient2* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration);\n} ma_IAudioClient2Vtbl;\nstruct ma_IAudioClient2\n{\n    ma_IAudioClient2Vtbl* lpVtbl;\n};\nHRESULT ma_IAudioClient2_QueryInterface(ma_IAudioClient2* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IAudioClient2_AddRef(ma_IAudioClient2* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IAudioClient2_Release(ma_IAudioClient2* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IAudioClient2_Initialize(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); }\nHRESULT ma_IAudioClient2_GetBufferSize(ma_IAudioClient2* pThis, ma_uint32* pNumBufferFrames)                { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); }\nHRESULT ma_IAudioClient2_GetStreamLatency(ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pLatency)             { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); }\nHRESULT ma_IAudioClient2_GetCurrentPadding(ma_IAudioClient2* pThis, ma_uint32* pNumPaddingFrames)           { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); }\nHRESULT ma_IAudioClient2_IsFormatSupported(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); }\nHRESULT ma_IAudioClient2_GetMixFormat(ma_IAudioClient2* pThis, WAVEFORMATEX** ppDeviceFormat)            { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); }\nHRESULT ma_IAudioClient2_GetDevicePeriod(ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); }\nHRESULT ma_IAudioClient2_Start(ma_IAudioClient2* pThis)                                                  { return pThis->lpVtbl->Start(pThis); }\nHRESULT ma_IAudioClient2_Stop(ma_IAudioClient2* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nHRESULT ma_IAudioClient2_Reset(ma_IAudioClient2* pThis)                                                  { return pThis->lpVtbl->Reset(pThis); }\nHRESULT ma_IAudioClient2_SetEventHandle(ma_IAudioClient2* pThis, HANDLE eventHandle)                     { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); }\nHRESULT ma_IAudioClient2_GetService(ma_IAudioClient2* pThis, const IID* const riid, void** pp)           { return pThis->lpVtbl->GetService(pThis, riid, pp); }\nHRESULT ma_IAudioClient2_IsOffloadCapable(ma_IAudioClient2* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); }\nHRESULT ma_IAudioClient2_SetClientProperties(ma_IAudioClient2* pThis, const ma_AudioClientProperties* pProperties)           { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); }\nHRESULT ma_IAudioClient2_GetBufferSizeLimits(ma_IAudioClient2* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); }\n\n\n/* IAudioClient3 */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient3* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioClient3* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioClient3* pThis);\n\n    /* IAudioClient */\n    HRESULT (STDMETHODCALLTYPE * Initialize)       (ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSize)    (ma_IAudioClient3* pThis, ma_uint32* pNumBufferFrames);\n    HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pLatency);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient3* pThis, ma_uint32* pNumPaddingFrames);\n    HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch);\n    HRESULT (STDMETHODCALLTYPE * GetMixFormat)     (ma_IAudioClient3* pThis, WAVEFORMATEX** ppDeviceFormat);\n    HRESULT (STDMETHODCALLTYPE * GetDevicePeriod)  (ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod);\n    HRESULT (STDMETHODCALLTYPE * Start)            (ma_IAudioClient3* pThis);\n    HRESULT (STDMETHODCALLTYPE * Stop)             (ma_IAudioClient3* pThis);\n    HRESULT (STDMETHODCALLTYPE * Reset)            (ma_IAudioClient3* pThis);\n    HRESULT (STDMETHODCALLTYPE * SetEventHandle)   (ma_IAudioClient3* pThis, HANDLE eventHandle);\n    HRESULT (STDMETHODCALLTYPE * GetService)       (ma_IAudioClient3* pThis, const IID* const riid, void** pp);\n\n    /* IAudioClient2 */\n    HRESULT (STDMETHODCALLTYPE * IsOffloadCapable)   (ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable);\n    HRESULT (STDMETHODCALLTYPE * SetClientProperties)(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration);\n\n    /* IAudioClient3 */\n    HRESULT (STDMETHODCALLTYPE * GetSharedModeEnginePeriod)       (ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, UINT32* pDefaultPeriodInFrames, UINT32* pFundamentalPeriodInFrames, UINT32* pMinPeriodInFrames, UINT32* pMaxPeriodInFrames);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentSharedModeEnginePeriod)(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, UINT32* pCurrentPeriodInFrames);\n    HRESULT (STDMETHODCALLTYPE * InitializeSharedAudioStream)     (ma_IAudioClient3* pThis, DWORD streamFlags, UINT32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n} ma_IAudioClient3Vtbl;\nstruct ma_IAudioClient3\n{\n    ma_IAudioClient3Vtbl* lpVtbl;\n};\nHRESULT ma_IAudioClient3_QueryInterface(ma_IAudioClient3* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IAudioClient3_AddRef(ma_IAudioClient3* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IAudioClient3_Release(ma_IAudioClient3* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IAudioClient3_Initialize(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); }\nHRESULT ma_IAudioClient3_GetBufferSize(ma_IAudioClient3* pThis, ma_uint32* pNumBufferFrames)                { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); }\nHRESULT ma_IAudioClient3_GetStreamLatency(ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pLatency)             { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); }\nHRESULT ma_IAudioClient3_GetCurrentPadding(ma_IAudioClient3* pThis, ma_uint32* pNumPaddingFrames)           { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); }\nHRESULT ma_IAudioClient3_IsFormatSupported(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); }\nHRESULT ma_IAudioClient3_GetMixFormat(ma_IAudioClient3* pThis, WAVEFORMATEX** ppDeviceFormat)            { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); }\nHRESULT ma_IAudioClient3_GetDevicePeriod(ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); }\nHRESULT ma_IAudioClient3_Start(ma_IAudioClient3* pThis)                                                  { return pThis->lpVtbl->Start(pThis); }\nHRESULT ma_IAudioClient3_Stop(ma_IAudioClient3* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nHRESULT ma_IAudioClient3_Reset(ma_IAudioClient3* pThis)                                                  { return pThis->lpVtbl->Reset(pThis); }\nHRESULT ma_IAudioClient3_SetEventHandle(ma_IAudioClient3* pThis, HANDLE eventHandle)                     { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); }\nHRESULT ma_IAudioClient3_GetService(ma_IAudioClient3* pThis, const IID* const riid, void** pp)           { return pThis->lpVtbl->GetService(pThis, riid, pp); }\nHRESULT ma_IAudioClient3_IsOffloadCapable(ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); }\nHRESULT ma_IAudioClient3_SetClientProperties(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties)           { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); }\nHRESULT ma_IAudioClient3_GetBufferSizeLimits(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); }\nHRESULT ma_IAudioClient3_GetSharedModeEnginePeriod(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, UINT32* pDefaultPeriodInFrames, UINT32* pFundamentalPeriodInFrames, UINT32* pMinPeriodInFrames, UINT32* pMaxPeriodInFrames) { return pThis->lpVtbl->GetSharedModeEnginePeriod(pThis, pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); }\nHRESULT ma_IAudioClient3_GetCurrentSharedModeEnginePeriod(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, UINT32* pCurrentPeriodInFrames) { return pThis->lpVtbl->GetCurrentSharedModeEnginePeriod(pThis, ppFormat, pCurrentPeriodInFrames); }\nHRESULT ma_IAudioClient3_InitializeSharedAudioStream(ma_IAudioClient3* pThis, DWORD streamFlags, UINT32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGUID) { return pThis->lpVtbl->InitializeSharedAudioStream(pThis, streamFlags, periodInFrames, pFormat, pAudioSessionGUID); }\n\n\n/* IAudioRenderClient */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioRenderClient* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioRenderClient* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioRenderClient* pThis);\n\n    /* IAudioRenderClient */\n    HRESULT (STDMETHODCALLTYPE * GetBuffer)    (ma_IAudioRenderClient* pThis, ma_uint32 numFramesRequested, BYTE** ppData);\n    HRESULT (STDMETHODCALLTYPE * ReleaseBuffer)(ma_IAudioRenderClient* pThis, ma_uint32 numFramesWritten, DWORD dwFlags);\n} ma_IAudioRenderClientVtbl;\nstruct ma_IAudioRenderClient\n{\n    ma_IAudioRenderClientVtbl* lpVtbl;\n};\nHRESULT ma_IAudioRenderClient_QueryInterface(ma_IAudioRenderClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IAudioRenderClient_AddRef(ma_IAudioRenderClient* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IAudioRenderClient_Release(ma_IAudioRenderClient* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IAudioRenderClient_GetBuffer(ma_IAudioRenderClient* pThis, ma_uint32 numFramesRequested, BYTE** ppData)    { return pThis->lpVtbl->GetBuffer(pThis, numFramesRequested, ppData); }\nHRESULT ma_IAudioRenderClient_ReleaseBuffer(ma_IAudioRenderClient* pThis, ma_uint32 numFramesWritten, DWORD dwFlags)  { return pThis->lpVtbl->ReleaseBuffer(pThis, numFramesWritten, dwFlags); }\n\n\n/* IAudioCaptureClient */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioCaptureClient* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioCaptureClient* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioCaptureClient* pThis);\n\n    /* IAudioRenderClient */\n    HRESULT (STDMETHODCALLTYPE * GetBuffer)        (ma_IAudioCaptureClient* pThis, BYTE** ppData, ma_uint32* pNumFramesToRead, DWORD* pFlags, ma_uint64* pDevicePosition, ma_uint64* pQPCPosition);\n    HRESULT (STDMETHODCALLTYPE * ReleaseBuffer)    (ma_IAudioCaptureClient* pThis, ma_uint32 numFramesRead);\n    HRESULT (STDMETHODCALLTYPE * GetNextPacketSize)(ma_IAudioCaptureClient* pThis, ma_uint32* pNumFramesInNextPacket);\n} ma_IAudioCaptureClientVtbl;\nstruct ma_IAudioCaptureClient\n{\n    ma_IAudioCaptureClientVtbl* lpVtbl;\n};\nHRESULT ma_IAudioCaptureClient_QueryInterface(ma_IAudioCaptureClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IAudioCaptureClient_AddRef(ma_IAudioCaptureClient* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IAudioCaptureClient_Release(ma_IAudioCaptureClient* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IAudioCaptureClient_GetBuffer(ma_IAudioCaptureClient* pThis, BYTE** ppData, ma_uint32* pNumFramesToRead, DWORD* pFlags, ma_uint64* pDevicePosition, ma_uint64* pQPCPosition) { return pThis->lpVtbl->GetBuffer(pThis, ppData, pNumFramesToRead, pFlags, pDevicePosition, pQPCPosition); }\nHRESULT ma_IAudioCaptureClient_ReleaseBuffer(ma_IAudioCaptureClient* pThis, ma_uint32 numFramesRead)                    { return pThis->lpVtbl->ReleaseBuffer(pThis, numFramesRead); }\nHRESULT ma_IAudioCaptureClient_GetNextPacketSize(ma_IAudioCaptureClient* pThis, ma_uint32* pNumFramesInNextPacket)      { return pThis->lpVtbl->GetNextPacketSize(pThis, pNumFramesInNextPacket); }\n\n#ifndef MA_WIN32_DESKTOP\n#include <mmdeviceapi.h>\ntypedef struct ma_completion_handler_uwp ma_completion_handler_uwp;\n\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_completion_handler_uwp* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_completion_handler_uwp* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_completion_handler_uwp* pThis);\n\n    /* IActivateAudioInterfaceCompletionHandler */\n    HRESULT (STDMETHODCALLTYPE * ActivateCompleted)(ma_completion_handler_uwp* pThis, ma_IActivateAudioInterfaceAsyncOperation* pActivateOperation);\n} ma_completion_handler_uwp_vtbl;\nstruct ma_completion_handler_uwp\n{\n    ma_completion_handler_uwp_vtbl* lpVtbl;\n    ma_uint32 counter;\n    HANDLE hEvent;\n};\n\nHRESULT STDMETHODCALLTYPE ma_completion_handler_uwp_QueryInterface(ma_completion_handler_uwp* pThis, const IID* const riid, void** ppObject)\n{\n    /*\n    We need to \"implement\" IAgileObject which is just an indicator that's used internally by WASAPI for some multithreading management. To\n    \"implement\" this, we just make sure we return pThis when the IAgileObject is requested.\n    */\n    if (!ma_is_guid_equal(riid, &MA_IID_IUnknown) && !ma_is_guid_equal(riid, &MA_IID_IActivateAudioInterfaceCompletionHandler) && !ma_is_guid_equal(riid, &MA_IID_IAgileObject)) {\n        *ppObject = NULL;\n        return E_NOINTERFACE;\n    }\n\n    /* Getting here means the IID is IUnknown or IMMNotificationClient. */\n    *ppObject = (void*)pThis;\n    ((ma_completion_handler_uwp_vtbl*)pThis->lpVtbl)->AddRef(pThis);\n    return S_OK;\n}\n\nULONG STDMETHODCALLTYPE ma_completion_handler_uwp_AddRef(ma_completion_handler_uwp* pThis)\n{\n    return (ULONG)ma_atomic_increment_32(&pThis->counter);\n}\n\nULONG STDMETHODCALLTYPE ma_completion_handler_uwp_Release(ma_completion_handler_uwp* pThis)\n{\n    ma_uint32 newRefCount = ma_atomic_decrement_32(&pThis->counter);\n    if (newRefCount == 0) {\n        return 0;   /* We don't free anything here because we never allocate the object on the heap. */\n    }\n\n    return (ULONG)newRefCount;\n}\n\nHRESULT STDMETHODCALLTYPE ma_completion_handler_uwp_ActivateCompleted(ma_completion_handler_uwp* pThis, ma_IActivateAudioInterfaceAsyncOperation* pActivateOperation)\n{\n    (void)pActivateOperation;\n    SetEvent(pThis->hEvent);\n    return S_OK;\n}\n\n\nstatic ma_completion_handler_uwp_vtbl g_maCompletionHandlerVtblInstance = {\n    ma_completion_handler_uwp_QueryInterface,\n    ma_completion_handler_uwp_AddRef,\n    ma_completion_handler_uwp_Release,\n    ma_completion_handler_uwp_ActivateCompleted\n};\n\nma_result ma_completion_handler_uwp_init(ma_completion_handler_uwp* pHandler)\n{\n    ma_assert(pHandler != NULL);\n    ma_zero_object(pHandler);\n\n    pHandler->lpVtbl = &g_maCompletionHandlerVtblInstance;\n    pHandler->counter = 1;\n    pHandler->hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);\n    if (pHandler->hEvent == NULL) {\n        return MA_ERROR;\n    }\n\n    return MA_SUCCESS;\n}\n\nvoid ma_completion_handler_uwp_uninit(ma_completion_handler_uwp* pHandler)\n{\n    if (pHandler->hEvent != NULL) {\n        CloseHandle(pHandler->hEvent);\n    }\n}\n\nvoid ma_completion_handler_uwp_wait(ma_completion_handler_uwp* pHandler)\n{\n    WaitForSingleObject(pHandler->hEvent, INFINITE);\n}\n#endif  /* !MA_WIN32_DESKTOP */\n\n/* We need a virtual table for our notification client object that's used for detecting changes to the default device. */\n#ifdef MA_WIN32_DESKTOP\nHRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_QueryInterface(ma_IMMNotificationClient* pThis, const IID* const riid, void** ppObject)\n{\n    /*\n    We care about two interfaces - IUnknown and IMMNotificationClient. If the requested IID is something else\n    we just return E_NOINTERFACE. Otherwise we need to increment the reference counter and return S_OK.\n    */\n    if (!ma_is_guid_equal(riid, &MA_IID_IUnknown) && !ma_is_guid_equal(riid, &MA_IID_IMMNotificationClient)) {\n        *ppObject = NULL;\n        return E_NOINTERFACE;\n    }\n\n    /* Getting here means the IID is IUnknown or IMMNotificationClient. */\n    *ppObject = (void*)pThis;\n    ((ma_IMMNotificationClientVtbl*)pThis->lpVtbl)->AddRef(pThis);\n    return S_OK;\n}\n\nULONG STDMETHODCALLTYPE ma_IMMNotificationClient_AddRef(ma_IMMNotificationClient* pThis)\n{\n    return (ULONG)ma_atomic_increment_32(&pThis->counter);\n}\n\nULONG STDMETHODCALLTYPE ma_IMMNotificationClient_Release(ma_IMMNotificationClient* pThis)\n{\n    ma_uint32 newRefCount = ma_atomic_decrement_32(&pThis->counter);\n    if (newRefCount == 0) {\n        return 0;   /* We don't free anything here because we never allocate the object on the heap. */\n    }\n\n    return (ULONG)newRefCount;\n}\n\n\nHRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceStateChanged(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, DWORD dwNewState)\n{\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"IMMNotificationClient_OnDeviceStateChanged(pDeviceID=%S, dwNewState=%u)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\", (unsigned int)dwNewState);\n#endif\n\n    (void)pThis;\n    (void)pDeviceID;\n    (void)dwNewState;\n    return S_OK;\n}\n\nHRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceAdded(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID)\n{\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"IMMNotificationClient_OnDeviceAdded(pDeviceID=%S)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\");\n#endif\n\n    /* We don't need to worry about this event for our purposes. */\n    (void)pThis;\n    (void)pDeviceID;\n    return S_OK;\n}\n\nHRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceRemoved(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID)\n{\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"IMMNotificationClient_OnDeviceRemoved(pDeviceID=%S)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\");\n#endif\n\n    /* We don't need to worry about this event for our purposes. */\n    (void)pThis;\n    (void)pDeviceID;\n    return S_OK;\n}\n\nHRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDefaultDeviceChanged(ma_IMMNotificationClient* pThis, ma_EDataFlow dataFlow, ma_ERole role, LPCWSTR pDefaultDeviceID)\n{\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"IMMNotificationClient_OnDefaultDeviceChanged(dataFlow=%d, role=%d, pDefaultDeviceID=%S)\\n\", dataFlow, role, (pDefaultDeviceID != NULL) ? pDefaultDeviceID : L\"(NULL)\");\n#endif\n\n    /* We only ever use the eConsole role in miniaudio. */\n    if (role != ma_eConsole) {\n        return S_OK;\n    }\n\n    /* We only care about devices with the same data flow and role as the current device. */\n    if ((pThis->pDevice->type == ma_device_type_playback && dataFlow != ma_eRender) ||\n        (pThis->pDevice->type == ma_device_type_capture  && dataFlow != ma_eCapture)) {\n        return S_OK;\n    }\n\n    /*\n    Not currently supporting automatic stream routing in exclusive mode. This is not working correctly on my machine due to\n    AUDCLNT_E_DEVICE_IN_USE errors when reinitializing the device. If this is a bug in miniaudio, we can try re-enabling this once\n    it's fixed.\n    */\n    if ((dataFlow == ma_eRender  && pThis->pDevice->playback.shareMode == ma_share_mode_exclusive) ||\n        (dataFlow == ma_eCapture && pThis->pDevice->capture.shareMode  == ma_share_mode_exclusive)) {\n        return S_OK;\n    }\n\n    /*\n    We don't change the device here - we change it in the worker thread to keep synchronization simple. To do this I'm just setting a flag to\n    indicate that the default device has changed.\n    */\n    if (dataFlow == ma_eRender) {\n        ma_atomic_exchange_32(&pThis->pDevice->wasapi.hasDefaultPlaybackDeviceChanged, MA_TRUE);\n    }\n    if (dataFlow == ma_eCapture) {\n        ma_atomic_exchange_32(&pThis->pDevice->wasapi.hasDefaultCaptureDeviceChanged,  MA_TRUE);\n    }\n\n    (void)pDefaultDeviceID;\n    return S_OK;\n}\n\nHRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnPropertyValueChanged(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, const PROPERTYKEY key)\n{\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"IMMNotificationClient_OnPropertyValueChanged(pDeviceID=%S)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\");\n#endif\n\n    (void)pThis;\n    (void)pDeviceID;\n    (void)key;\n    return S_OK;\n}\n\nstatic ma_IMMNotificationClientVtbl g_maNotificationCientVtbl = {\n    ma_IMMNotificationClient_QueryInterface,\n    ma_IMMNotificationClient_AddRef,\n    ma_IMMNotificationClient_Release,\n    ma_IMMNotificationClient_OnDeviceStateChanged,\n    ma_IMMNotificationClient_OnDeviceAdded,\n    ma_IMMNotificationClient_OnDeviceRemoved,\n    ma_IMMNotificationClient_OnDefaultDeviceChanged,\n    ma_IMMNotificationClient_OnPropertyValueChanged\n};\n#endif  /* MA_WIN32_DESKTOP */\n\n#ifdef MA_WIN32_DESKTOP\ntypedef ma_IMMDevice ma_WASAPIDeviceInterface;\n#else\ntypedef ma_IUnknown ma_WASAPIDeviceInterface;\n#endif\n\n\n\nma_bool32 ma_context_is_device_id_equal__wasapi(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return memcmp(pID0->wasapi, pID1->wasapi, sizeof(pID0->wasapi)) == 0;\n}\n\nvoid ma_set_device_info_from_WAVEFORMATEX(const WAVEFORMATEX* pWF, ma_device_info* pInfo)\n{\n    ma_assert(pWF != NULL);\n    ma_assert(pInfo != NULL);\n\n    pInfo->formatCount   = 1;\n    pInfo->formats[0]    = ma_format_from_WAVEFORMATEX(pWF);\n    pInfo->minChannels   = pWF->nChannels;\n    pInfo->maxChannels   = pWF->nChannels;\n    pInfo->minSampleRate = pWF->nSamplesPerSec;\n    pInfo->maxSampleRate = pWF->nSamplesPerSec;\n}\n\nma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context* pContext, /*ma_IMMDevice**/void* pMMDevice, ma_IAudioClient* pAudioClient, ma_share_mode shareMode, ma_device_info* pInfo)\n{\n    ma_assert(pAudioClient != NULL);\n    ma_assert(pInfo != NULL);\n\n    /* We use a different technique to retrieve the device information depending on whether or not we are using shared or exclusive mode. */\n    if (shareMode == ma_share_mode_shared) {\n        /* Shared Mode. We use GetMixFormat() here. */\n        WAVEFORMATEX* pWF = NULL;\n        HRESULT hr = ma_IAudioClient_GetMixFormat((ma_IAudioClient*)pAudioClient, (WAVEFORMATEX**)&pWF);\n        if (SUCCEEDED(hr)) {\n            ma_set_device_info_from_WAVEFORMATEX(pWF, pInfo);\n            return MA_SUCCESS;\n        } else {\n            return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve mix format for device info retrieval.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n    } else {\n        /* Exlcusive Mode. We repeatedly call IsFormatSupported() here. This is not currently support on UWP. */\n#ifdef MA_WIN32_DESKTOP\n        /*\n        The first thing to do is get the format from PKEY_AudioEngine_DeviceFormat. This should give us a channel count we assume is\n        correct which will simplify our searching.\n        */\n        ma_IPropertyStore *pProperties;\n        HRESULT hr = ma_IMMDevice_OpenPropertyStore((ma_IMMDevice*)pMMDevice, STGM_READ, &pProperties);\n        if (SUCCEEDED(hr)) {\n            PROPVARIANT var;\n            ma_PropVariantInit(&var);\n\n            hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_AudioEngine_DeviceFormat, &var);\n            if (SUCCEEDED(hr)) {\n                WAVEFORMATEX* pWF = (WAVEFORMATEX*)var.blob.pBlobData;\n                ma_set_device_info_from_WAVEFORMATEX(pWF, pInfo);\n\n                /*\n                In my testing, the format returned by PKEY_AudioEngine_DeviceFormat is suitable for exclusive mode so we check this format\n                first. If this fails, fall back to a search.\n                */\n                hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pWF, NULL);\n                ma_PropVariantClear(pContext, &var);\n\n                if (FAILED(hr)) {\n                    /*\n                    The format returned by PKEY_AudioEngine_DeviceFormat is not supported, so fall back to a search. We assume the channel\n                    count returned by MA_PKEY_AudioEngine_DeviceFormat is valid and correct. For simplicity we're only returning one format.\n                    */\n                    ma_uint32 channels = pInfo->minChannels;\n                    ma_format formatsToSearch[] = {\n                        ma_format_s16,\n                        ma_format_s24,\n                        /*ma_format_s24_32,*/\n                        ma_format_f32,\n                        ma_format_s32,\n                        ma_format_u8\n                    };\n                    ma_channel defaultChannelMap[MA_MAX_CHANNELS];\n                    WAVEFORMATEXTENSIBLE wf;\n                    ma_bool32 found;\n                    ma_uint32 iFormat;\n\n                    ma_get_standard_channel_map(ma_standard_channel_map_microsoft, channels, defaultChannelMap);\n\n                    ma_zero_object(&wf);\n                    wf.Format.cbSize     = sizeof(wf);\n                    wf.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;\n                    wf.Format.nChannels  = (WORD)channels;\n                    wf.dwChannelMask     = ma_channel_map_to_channel_mask__win32(defaultChannelMap, channels);\n\n                    found = MA_FALSE;\n                    for (iFormat = 0; iFormat < ma_countof(formatsToSearch); ++iFormat) {\n                        ma_format format = formatsToSearch[iFormat];\n                        ma_uint32 iSampleRate;\n\n                        wf.Format.wBitsPerSample       = (WORD)ma_get_bytes_per_sample(format)*8;\n                        wf.Format.nBlockAlign          = (wf.Format.nChannels * wf.Format.wBitsPerSample) / 8;\n                        wf.Format.nAvgBytesPerSec      = wf.Format.nBlockAlign * wf.Format.nSamplesPerSec;\n                        wf.Samples.wValidBitsPerSample = /*(format == ma_format_s24_32) ? 24 :*/ wf.Format.wBitsPerSample;\n                        if (format == ma_format_f32) {\n                            wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;\n                        } else {\n                            wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM;\n                        }\n\n                        for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); ++iSampleRate) {\n                            wf.Format.nSamplesPerSec = g_maStandardSampleRatePriorities[iSampleRate];\n\n                            hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, (WAVEFORMATEX*)&wf, NULL);\n                            if (SUCCEEDED(hr)) {\n                                ma_set_device_info_from_WAVEFORMATEX((WAVEFORMATEX*)&wf, pInfo);\n                                found = MA_TRUE;\n                                break;\n                            }\n                        }\n\n                        if (found) {\n                            break;\n                        }\n                    }\n\n                    if (!found) {\n                        ma_IPropertyStore_Release(pProperties);\n                        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to find suitable device format for device info retrieval.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n                    }\n                }\n            } else {\n                ma_IPropertyStore_Release(pProperties);\n                return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve device format for device info retrieval.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n            }\n        } else {\n            return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to open property store for device info retrieval.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        return MA_SUCCESS;\n#else\n        /* Exclusive mode not fully supported in UWP right now. */\n        return MA_ERROR;\n#endif\n    }\n}\n\n#ifdef MA_WIN32_DESKTOP\nma_result ma_context_get_MMDevice__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IMMDevice** ppMMDevice)\n{\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n    HRESULT hr;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppMMDevice != NULL);\n\n    hr = ma_CoCreateInstance(pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n    if (FAILED(hr)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create IMMDeviceEnumerator.\", MA_FAILED_TO_INIT_BACKEND);\n    }\n\n    if (pDeviceID == NULL) {\n        hr = ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(pDeviceEnumerator, (deviceType == ma_device_type_playback) ? ma_eRender : ma_eCapture, ma_eConsole, ppMMDevice);\n    } else {\n        hr = ma_IMMDeviceEnumerator_GetDevice(pDeviceEnumerator, pDeviceID->wasapi, ppMMDevice);\n    }\n\n    ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n    if (FAILED(hr)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve IMMDevice.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info_from_MMDevice__wasapi(ma_context* pContext, ma_IMMDevice* pMMDevice, ma_share_mode shareMode, ma_bool32 onlySimpleInfo, ma_device_info* pInfo)\n{\n    LPWSTR id;\n    HRESULT hr;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pMMDevice != NULL);\n    ma_assert(pInfo != NULL);\n\n    /* ID. */\n    hr = ma_IMMDevice_GetId(pMMDevice, &id);\n    if (SUCCEEDED(hr)) {\n        size_t idlen = wcslen(id);\n        if (idlen+1 > ma_countof(pInfo->id.wasapi)) {\n            ma_CoTaskMemFree(pContext, id);\n            ma_assert(MA_FALSE);  /* NOTE: If this is triggered, please report it. It means the format of the ID must haved change and is too long to fit in our fixed sized buffer. */\n            return MA_ERROR;\n        }\n\n        ma_copy_memory(pInfo->id.wasapi, id, idlen * sizeof(wchar_t));\n        pInfo->id.wasapi[idlen] = '\\0';\n\n        ma_CoTaskMemFree(pContext, id);\n    }\n\n    {\n        ma_IPropertyStore *pProperties;\n        hr = ma_IMMDevice_OpenPropertyStore(pMMDevice, STGM_READ, &pProperties);\n        if (SUCCEEDED(hr)) {\n            PROPVARIANT var;\n\n            /* Description / Friendly Name */\n            ma_PropVariantInit(&var);\n            hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_Device_FriendlyName, &var);\n            if (SUCCEEDED(hr)) {\n                WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, pInfo->name, sizeof(pInfo->name), 0, FALSE);\n                ma_PropVariantClear(pContext, &var);\n            }\n\n            ma_IPropertyStore_Release(pProperties);\n        }\n    }\n\n    /* Format */\n    if (!onlySimpleInfo) {\n        ma_IAudioClient* pAudioClient;\n        hr = ma_IMMDevice_Activate(pMMDevice, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pAudioClient);\n        if (SUCCEEDED(hr)) {\n            ma_result result = ma_context_get_device_info_from_IAudioClient__wasapi(pContext, pMMDevice, pAudioClient, shareMode, pInfo);\n            \n            ma_IAudioClient_Release(pAudioClient);\n            return result;\n        } else {\n            return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to activate audio client for device info retrieval.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_enumerate_device_collection__wasapi(ma_context* pContext, ma_IMMDeviceCollection* pDeviceCollection, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    UINT deviceCount;\n    HRESULT hr;\n    ma_uint32 iDevice;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    hr = ma_IMMDeviceCollection_GetCount(pDeviceCollection, &deviceCount);\n    if (FAILED(hr)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to get playback device count.\", MA_NO_DEVICE);\n    }\n\n    for (iDevice = 0; iDevice < deviceCount; ++iDevice) {\n        ma_device_info deviceInfo;\n        ma_IMMDevice* pMMDevice;\n        \n        ma_zero_object(&deviceInfo);\n\n        hr = ma_IMMDeviceCollection_Item(pDeviceCollection, iDevice, &pMMDevice);\n        if (SUCCEEDED(hr)) {\n            ma_result result = ma_context_get_device_info_from_MMDevice__wasapi(pContext, pMMDevice, ma_share_mode_shared, MA_TRUE, &deviceInfo);   /* MA_TRUE = onlySimpleInfo. */\n\n            ma_IMMDevice_Release(pMMDevice);\n            if (result == MA_SUCCESS) {\n                ma_bool32 cbResult = callback(pContext, deviceType, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    break;\n                }\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n#ifdef MA_WIN32_DESKTOP\nma_result ma_context_get_IAudioClient_Desktop__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IAudioClient** ppAudioClient, ma_IMMDevice** ppMMDevice)\n{\n    ma_result result;\n    HRESULT hr;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppAudioClient != NULL);\n    ma_assert(ppMMDevice != NULL);\n\n    result = ma_context_get_MMDevice__wasapi(pContext, deviceType, pDeviceID, ppMMDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    hr = ma_IMMDevice_Activate(*ppMMDevice, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)ppAudioClient);\n    if (FAILED(hr)) {\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    return MA_SUCCESS;\n}\n#else\nma_result ma_context_get_IAudioClient_UWP__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IAudioClient** ppAudioClient, ma_IUnknown** ppActivatedInterface)\n{\n    ma_IActivateAudioInterfaceAsyncOperation *pAsyncOp = NULL;\n    ma_completion_handler_uwp completionHandler;\n    IID iid;\n    LPOLESTR iidStr;\n    HRESULT hr;\n    ma_result result;\n    HRESULT activateResult;\n    ma_IUnknown* pActivatedInterface;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppAudioClient != NULL);\n\n    if (pDeviceID != NULL) {\n        ma_copy_memory(&iid, pDeviceID->wasapi, sizeof(iid));\n    } else {\n        if (deviceType == ma_device_type_playback) {\n            iid = MA_IID_DEVINTERFACE_AUDIO_RENDER;\n        } else {\n            iid = MA_IID_DEVINTERFACE_AUDIO_CAPTURE;\n        }\n    }\n\n#if defined(__cplusplus)\n    hr = StringFromIID(iid, &iidStr);\n#else\n    hr = StringFromIID(&iid, &iidStr);\n#endif\n    if (FAILED(hr)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to convert device IID to string for ActivateAudioInterfaceAsync(). Out of memory.\", MA_OUT_OF_MEMORY);\n    }\n\n    result = ma_completion_handler_uwp_init(&completionHandler);\n    if (result != MA_SUCCESS) {\n        ma_CoTaskMemFree(pContext, iidStr);\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create event for waiting for ActivateAudioInterfaceAsync().\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n#if defined(__cplusplus)\n    hr = ActivateAudioInterfaceAsync(iidStr, MA_IID_IAudioClient, NULL, (IActivateAudioInterfaceCompletionHandler*)&completionHandler, (IActivateAudioInterfaceAsyncOperation**)&pAsyncOp);\n#else\n    hr = ActivateAudioInterfaceAsync(iidStr, &MA_IID_IAudioClient, NULL, (IActivateAudioInterfaceCompletionHandler*)&completionHandler, (IActivateAudioInterfaceAsyncOperation**)&pAsyncOp);\n#endif\n    if (FAILED(hr)) {\n        ma_completion_handler_uwp_uninit(&completionHandler);\n        ma_CoTaskMemFree(pContext, iidStr);\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] ActivateAudioInterfaceAsync() failed.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    ma_CoTaskMemFree(pContext, iidStr);\n\n    /* Wait for the async operation for finish. */\n    ma_completion_handler_uwp_wait(&completionHandler);\n    ma_completion_handler_uwp_uninit(&completionHandler);\n\n    hr = ma_IActivateAudioInterfaceAsyncOperation_GetActivateResult(pAsyncOp, &activateResult, &pActivatedInterface);\n    ma_IActivateAudioInterfaceAsyncOperation_Release(pAsyncOp);\n\n    if (FAILED(hr) || FAILED(activateResult)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to activate device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    /* Here is where we grab the IAudioClient interface. */\n    hr = ma_IUnknown_QueryInterface(pActivatedInterface, &MA_IID_IAudioClient, (void**)ppAudioClient);\n    if (FAILED(hr)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to query IAudioClient interface.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    if (ppActivatedInterface) {\n        *ppActivatedInterface = pActivatedInterface;\n    } else {\n        ma_IUnknown_Release(pActivatedInterface);\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\nma_result ma_context_get_IAudioClient__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IAudioClient** ppAudioClient, ma_WASAPIDeviceInterface** ppDeviceInterface)\n{\n#ifdef MA_WIN32_DESKTOP\n    return ma_context_get_IAudioClient_Desktop__wasapi(pContext, deviceType, pDeviceID, ppAudioClient, ppDeviceInterface);\n#else\n    return ma_context_get_IAudioClient_UWP__wasapi(pContext, deviceType, pDeviceID, ppAudioClient, ppDeviceInterface);\n#endif\n}\n\n\nma_result ma_context_enumerate_devices__wasapi(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    /* Different enumeration for desktop and UWP. */\n#ifdef MA_WIN32_DESKTOP\n    /* Desktop */\n    HRESULT hr;\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n    ma_IMMDeviceCollection* pDeviceCollection;\n\n    hr = ma_CoCreateInstance(pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n    if (FAILED(hr)) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create device enumerator.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    /* Playback. */\n    hr = ma_IMMDeviceEnumerator_EnumAudioEndpoints(pDeviceEnumerator, ma_eRender, MA_MM_DEVICE_STATE_ACTIVE, &pDeviceCollection);\n    if (SUCCEEDED(hr)) {\n        ma_context_enumerate_device_collection__wasapi(pContext, pDeviceCollection, ma_device_type_playback, callback, pUserData);\n        ma_IMMDeviceCollection_Release(pDeviceCollection);\n    }\n\n    /* Capture. */\n    hr = ma_IMMDeviceEnumerator_EnumAudioEndpoints(pDeviceEnumerator, ma_eCapture, MA_MM_DEVICE_STATE_ACTIVE, &pDeviceCollection);\n    if (SUCCEEDED(hr)) {\n        ma_context_enumerate_device_collection__wasapi(pContext, pDeviceCollection, ma_device_type_capture, callback, pUserData);\n        ma_IMMDeviceCollection_Release(pDeviceCollection);\n    }\n\n    ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n#else\n    /*\n    UWP\n    \n    The MMDevice API is only supported on desktop applications. For now, while I'm still figuring out how to properly enumerate\n    over devices without using MMDevice, I'm restricting devices to defaults.\n    \n    Hint: DeviceInformation::FindAllAsync() with DeviceClass.AudioCapture/AudioRender. https://blogs.windows.com/buildingapps/2014/05/15/real-time-audio-in-windows-store-and-windows-phone-apps/\n    */\n    if (callback) {\n        ma_bool32 cbResult = MA_TRUE;\n\n        /* Playback. */\n        if (cbResult) {\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n            cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n        }\n\n        /* Capture. */\n        if (cbResult) {\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n            cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n        }\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n#ifdef MA_WIN32_DESKTOP\n    ma_IMMDevice* pMMDevice = NULL;\n    ma_result result;\n    \n    result = ma_context_get_MMDevice__wasapi(pContext, deviceType, pDeviceID, &pMMDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_context_get_device_info_from_MMDevice__wasapi(pContext, pMMDevice, shareMode, MA_FALSE, pDeviceInfo);   /* MA_FALSE = !onlySimpleInfo. */\n\n    ma_IMMDevice_Release(pMMDevice);\n    return result;\n#else\n    ma_IAudioClient* pAudioClient;\n    ma_result result;\n\n    /* UWP currently only uses default devices. */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    /* Not currently supporting exclusive mode on UWP. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_ERROR;\n    }\n\n    result = ma_context_get_IAudioClient_UWP__wasapi(pContext, deviceType, pDeviceID, &pAudioClient, NULL);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_context_get_device_info_from_IAudioClient__wasapi(pContext, NULL, pAudioClient, shareMode, pDeviceInfo);\n\n    ma_IAudioClient_Release(pAudioClient);\n    return result;\n#endif\n}\n\nvoid ma_device_uninit__wasapi(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n#ifdef MA_WIN32_DESKTOP\n    if (pDevice->wasapi.pDeviceEnumerator) {\n        ((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator)->lpVtbl->UnregisterEndpointNotificationCallback((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator, &pDevice->wasapi.notificationClient);\n        ma_IMMDeviceEnumerator_Release((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator);\n    }\n#endif\n\n    if (pDevice->wasapi.pRenderClient) {\n        ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient);\n    }\n    if (pDevice->wasapi.pCaptureClient) {\n        ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n    }\n\n    if (pDevice->wasapi.pAudioClientPlayback) {\n        ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n    }\n    if (pDevice->wasapi.pAudioClientCapture) {\n        ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n    }\n\n    if (pDevice->wasapi.hEventPlayback) {\n        CloseHandle(pDevice->wasapi.hEventPlayback);\n    }\n    if (pDevice->wasapi.hEventCapture) {\n        CloseHandle(pDevice->wasapi.hEventCapture);\n    }\n}\n\n\ntypedef struct\n{\n    /* Input. */\n    ma_format formatIn;\n    ma_uint32 channelsIn;\n    ma_uint32 sampleRateIn;\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n    ma_uint32 bufferSizeInFramesIn;\n    ma_uint32 bufferSizeInMillisecondsIn;\n    ma_uint32 periodsIn;\n    ma_bool32 usingDefaultFormat;\n    ma_bool32 usingDefaultChannels;\n    ma_bool32 usingDefaultSampleRate;\n    ma_bool32 usingDefaultChannelMap;\n    ma_share_mode shareMode;\n\n    /* Output. */\n    ma_IAudioClient* pAudioClient;\n    ma_IAudioRenderClient* pRenderClient;\n    ma_IAudioCaptureClient* pCaptureClient;\n    ma_format formatOut;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateOut;\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_uint32 bufferSizeInFramesOut;\n    ma_uint32 periodSizeInFramesOut;\n    ma_uint32 periodsOut;\n    char deviceName[256];\n} ma_device_init_internal_data__wasapi;\n\nma_result ma_device_init_internal__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_init_internal_data__wasapi* pData)\n{\n    HRESULT hr;\n    ma_result result = MA_SUCCESS;\n    const char* errorMsg = \"\";\n    MA_AUDCLNT_SHAREMODE shareMode = MA_AUDCLNT_SHAREMODE_SHARED;\n    MA_REFERENCE_TIME bufferDurationInMicroseconds;\n    ma_bool32 wasInitializedUsingIAudioClient3 = MA_FALSE;\n    WAVEFORMATEXTENSIBLE wf;\n    ma_WASAPIDeviceInterface* pDeviceInterface = NULL;\n    ma_IAudioClient2* pAudioClient2;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pData != NULL);\n\n    /* This function is only used to initialize one device type: either playback or capture. Never full-duplex. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    pData->pAudioClient = NULL;\n    pData->pRenderClient = NULL;\n    pData->pCaptureClient = NULL;\n\n    result = ma_context_get_IAudioClient__wasapi(pContext, deviceType, pDeviceID, &pData->pAudioClient, &pDeviceInterface);\n    if (result != MA_SUCCESS) {\n        goto done;\n    }\n\n\n    /* Try enabling hardware offloading. */\n    hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient2, (void**)&pAudioClient2);\n    if (SUCCEEDED(hr)) {\n        BOOL isHardwareOffloadingSupported = 0;\n        hr = ma_IAudioClient2_IsOffloadCapable(pAudioClient2, MA_AudioCategory_Other, &isHardwareOffloadingSupported);\n        if (SUCCEEDED(hr) && isHardwareOffloadingSupported) {\n            ma_AudioClientProperties clientProperties;\n            ma_zero_object(&clientProperties);\n            clientProperties.cbSize = sizeof(clientProperties);\n            clientProperties.bIsOffload = 1;\n            clientProperties.eCategory = MA_AudioCategory_Other;\n            ma_IAudioClient2_SetClientProperties(pAudioClient2, &clientProperties);\n        }\n    }\n\n\n    /* Here is where we try to determine the best format to use with the device. If the client if wanting exclusive mode, first try finding the best format for that. If this fails, fall back to shared mode. */\n    result = MA_FORMAT_NOT_SUPPORTED;\n    if (pData->shareMode == ma_share_mode_exclusive) {\n    #ifdef MA_WIN32_DESKTOP\n        /* In exclusive mode on desktop we always use the backend's native format. */\n        ma_IPropertyStore* pStore = NULL;\n        hr = ma_IMMDevice_OpenPropertyStore(pDeviceInterface, STGM_READ, &pStore);\n        if (SUCCEEDED(hr)) {\n            PROPVARIANT prop;\n            ma_PropVariantInit(&prop);\n            hr = ma_IPropertyStore_GetValue(pStore, &MA_PKEY_AudioEngine_DeviceFormat, &prop);\n            if (SUCCEEDED(hr)) {\n                WAVEFORMATEX* pActualFormat = (WAVEFORMATEX*)prop.blob.pBlobData;\n                hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pData->pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pActualFormat, NULL);\n                if (SUCCEEDED(hr)) {\n                    ma_copy_memory(&wf, pActualFormat, sizeof(WAVEFORMATEXTENSIBLE));\n                }\n\n                ma_PropVariantClear(pContext, &prop);\n            }\n\n            ma_IPropertyStore_Release(pStore);\n        }\n    #else\n        /*\n        I do not know how to query the device's native format on UWP so for now I'm just disabling support for\n        exclusive mode. The alternative is to enumerate over different formats and check IsFormatSupported()\n        until you find one that works.\n        \n        TODO: Add support for exclusive mode to UWP.\n        */\n        hr = S_FALSE;\n    #endif\n\n        if (hr == S_OK) {\n            shareMode = MA_AUDCLNT_SHAREMODE_EXCLUSIVE;\n            result = MA_SUCCESS;\n        } else {\n            result = MA_SHARE_MODE_NOT_SUPPORTED;\n        }\n    } else {\n        /* In shared mode we are always using the format reported by the operating system. */\n        WAVEFORMATEXTENSIBLE* pNativeFormat = NULL;\n        hr = ma_IAudioClient_GetMixFormat((ma_IAudioClient*)pData->pAudioClient, (WAVEFORMATEX**)&pNativeFormat);\n        if (hr != S_OK) {\n            result = MA_FORMAT_NOT_SUPPORTED;\n        } else {\n            ma_copy_memory(&wf, pNativeFormat, sizeof(wf));\n            result = MA_SUCCESS;\n        }\n\n        ma_CoTaskMemFree(pContext, pNativeFormat);\n\n        shareMode = MA_AUDCLNT_SHAREMODE_SHARED;\n    }\n\n    /* Return an error if we still haven't found a format. */\n    if (result != MA_SUCCESS) {\n        errorMsg = \"[WASAPI] Failed to find best device mix format.\";\n        goto done;\n    }\n\n    pData->formatOut = ma_format_from_WAVEFORMATEX((WAVEFORMATEX*)&wf);\n    pData->channelsOut = wf.Format.nChannels;\n    pData->sampleRateOut = wf.Format.nSamplesPerSec;\n\n    /* Get the internal channel map based on the channel mask. */\n    ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pData->channelsOut, pData->channelMapOut);\n\n    /* If we're using a default buffer size we need to calculate it based on the efficiency of the system. */\n    pData->periodsOut = pData->periodsIn;\n    pData->bufferSizeInFramesOut = pData->bufferSizeInFramesIn;\n    if (pData->bufferSizeInFramesOut == 0) {\n        pData->bufferSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(pData->bufferSizeInMillisecondsIn, pData->sampleRateOut);\n    }\n\n    bufferDurationInMicroseconds = ((ma_uint64)pData->bufferSizeInFramesOut * 1000 * 1000) / pData->sampleRateOut;\n\n\n    /* Slightly different initialization for shared and exclusive modes. We try exclusive mode first, and if it fails, fall back to shared mode. */\n    if (shareMode == MA_AUDCLNT_SHAREMODE_EXCLUSIVE) {\n        MA_REFERENCE_TIME bufferDuration = (bufferDurationInMicroseconds / pData->periodsOut) * 10;\n\n        /*\n        If the periodicy is too small, Initialize() will fail with AUDCLNT_E_INVALID_DEVICE_PERIOD. In this case we should just keep increasing\n        it and trying it again.\n        */\n        hr = E_FAIL;\n        for (;;) {\n            hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK, bufferDuration, bufferDuration, (WAVEFORMATEX*)&wf, NULL);\n            if (hr == MA_AUDCLNT_E_INVALID_DEVICE_PERIOD) {\n                if (bufferDuration > 500*10000) {\n                    break;\n                } else {\n                    if (bufferDuration == 0) {  /* <-- Just a sanity check to prevent an infinit loop. Should never happen, but it makes me feel better. */\n                        break;\n                    }\n\n                    bufferDuration = bufferDuration * 2;\n                    continue;\n                }\n            } else {\n                break;\n            }\n        }\n        \n        if (hr == MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) {\n            UINT bufferSizeInFrames;\n            hr = ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pData->pAudioClient, &bufferSizeInFrames);\n            if (SUCCEEDED(hr)) {\n                bufferDuration = (MA_REFERENCE_TIME)((10000.0 * 1000 / wf.Format.nSamplesPerSec * bufferSizeInFrames) + 0.5);\n\n                /* Unfortunately we need to release and re-acquire the audio client according to MSDN. Seems silly - why not just call IAudioClient_Initialize() again?! */\n                ma_IAudioClient_Release((ma_IAudioClient*)pData->pAudioClient);\n\n            #ifdef MA_WIN32_DESKTOP\n                hr = ma_IMMDevice_Activate(pDeviceInterface, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pData->pAudioClient);\n            #else\n                hr = ma_IUnknown_QueryInterface(pDeviceInterface, &MA_IID_IAudioClient, (void**)&pData->pAudioClient);\n            #endif\n\n                if (SUCCEEDED(hr)) {\n                    hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK, bufferDuration, bufferDuration, (WAVEFORMATEX*)&wf, NULL);\n                }\n            }\n        }\n\n        if (FAILED(hr)) {\n            /* Failed to initialize in exclusive mode. Don't fall back to shared mode - instead tell the client about it. They can reinitialize in shared mode if they want. */\n            if (hr == E_ACCESSDENIED) {\n                errorMsg = \"[WASAPI] Failed to initialize device in exclusive mode. Access denied.\", result = MA_ACCESS_DENIED;\n            } else if (hr == MA_AUDCLNT_E_DEVICE_IN_USE) {\n                errorMsg = \"[WASAPI] Failed to initialize device in exclusive mode. Device in use.\", result = MA_DEVICE_BUSY;\n            } else {\n                errorMsg = \"[WASAPI] Failed to initialize device in exclusive mode.\"; result = MA_SHARE_MODE_NOT_SUPPORTED;\n            }\n            goto done;\n        }\n    }\n\n    if (shareMode == MA_AUDCLNT_SHAREMODE_SHARED) {\n        /* Low latency shared mode via IAudioClient3. */\n#ifndef MA_WASAPI_NO_LOW_LATENCY_SHARED_MODE\n        ma_IAudioClient3* pAudioClient3 = NULL;\n        hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient3, (void**)&pAudioClient3);\n        if (SUCCEEDED(hr)) {\n            UINT32 defaultPeriodInFrames;\n            UINT32 fundamentalPeriodInFrames;\n            UINT32 minPeriodInFrames;\n            UINT32 maxPeriodInFrames;\n            hr = ma_IAudioClient3_GetSharedModeEnginePeriod(pAudioClient3, (WAVEFORMATEX*)&wf, &defaultPeriodInFrames, &fundamentalPeriodInFrames, &minPeriodInFrames, &maxPeriodInFrames);\n            if (SUCCEEDED(hr)) {\n                UINT32 desiredPeriodInFrames = pData->bufferSizeInFramesOut / pData->periodsOut;\n                UINT32 actualPeriodInFrames  = desiredPeriodInFrames;\n\n                /* Make sure the period size is a multiple of fundamentalPeriodInFrames. */\n                actualPeriodInFrames = actualPeriodInFrames / fundamentalPeriodInFrames;\n                actualPeriodInFrames = actualPeriodInFrames * fundamentalPeriodInFrames;\n\n                /* The period needs to be clamped between minPeriodInFrames and maxPeriodInFrames. */\n                actualPeriodInFrames = ma_clamp(actualPeriodInFrames, minPeriodInFrames, maxPeriodInFrames);\n\n                /* If the client requested a largish buffer than we don't actually want to use low latency shared mode because it forces small buffers. */\n                if (actualPeriodInFrames >= desiredPeriodInFrames) {\n                    hr = ma_IAudioClient3_InitializeSharedAudioStream(pAudioClient3, MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK, actualPeriodInFrames, (WAVEFORMATEX*)&wf, NULL);\n                    if (SUCCEEDED(hr)) {\n                        wasInitializedUsingIAudioClient3 = MA_TRUE;\n                        pData->periodSizeInFramesOut = actualPeriodInFrames;\n                        pData->bufferSizeInFramesOut = actualPeriodInFrames * pData->periodsOut;\n                    }\n                }\n            }\n\n            ma_IAudioClient3_Release(pAudioClient3);\n            pAudioClient3 = NULL;\n        }\n#endif\n\n        /* If we don't have an IAudioClient3 then we need to use the normal initialization routine. */\n        if (!wasInitializedUsingIAudioClient3) {\n            MA_REFERENCE_TIME bufferDuration = bufferDurationInMicroseconds*10;\n            hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK, bufferDuration, 0, (WAVEFORMATEX*)&wf, NULL);\n            if (FAILED(hr)) {\n                if (hr == E_ACCESSDENIED) {\n                    errorMsg = \"[WASAPI] Failed to initialize device. Access denied.\", result = MA_ACCESS_DENIED;\n                } else if (hr == MA_AUDCLNT_E_DEVICE_IN_USE) {\n                    errorMsg = \"[WASAPI] Failed to initialize device. Device in use.\", result = MA_DEVICE_BUSY;\n                } else {\n                    errorMsg = \"[WASAPI] Failed to initialize device.\", result = MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n                }\n\n                goto done;\n            }\n        }\n    }\n\n    if (!wasInitializedUsingIAudioClient3) {\n        hr = ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pData->pAudioClient, &pData->bufferSizeInFramesOut);\n        if (FAILED(hr)) {\n            errorMsg = \"[WASAPI] Failed to get audio client's actual buffer size.\", result = MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            goto done;\n        }\n\n        pData->periodSizeInFramesOut = pData->bufferSizeInFramesOut / pData->periodsOut;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        hr = ma_IAudioClient_GetService((ma_IAudioClient*)pData->pAudioClient, &MA_IID_IAudioRenderClient, (void**)&pData->pRenderClient);\n    } else {\n        hr = ma_IAudioClient_GetService((ma_IAudioClient*)pData->pAudioClient, &MA_IID_IAudioCaptureClient, (void**)&pData->pCaptureClient);\n    }\n\n    if (FAILED(hr)) {\n        errorMsg = \"[WASAPI] Failed to get audio client service.\", result = MA_API_NOT_FOUND;\n        goto done;\n    }\n\n\n    /* Grab the name of the device. */\n#ifdef MA_WIN32_DESKTOP\n    {\n        ma_IPropertyStore *pProperties;\n        hr = ma_IMMDevice_OpenPropertyStore(pDeviceInterface, STGM_READ, &pProperties);\n        if (SUCCEEDED(hr)) {\n            PROPVARIANT varName;\n            ma_PropVariantInit(&varName);\n            hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_Device_FriendlyName, &varName);\n            if (SUCCEEDED(hr)) {\n                WideCharToMultiByte(CP_UTF8, 0, varName.pwszVal, -1, pData->deviceName, sizeof(pData->deviceName), 0, FALSE);\n                ma_PropVariantClear(pContext, &varName);\n            }\n\n            ma_IPropertyStore_Release(pProperties);\n        }\n    }\n#endif\n\ndone:\n    /* Clean up. */\n#ifdef MA_WIN32_DESKTOP\n    if (pDeviceInterface != NULL) {\n        ma_IMMDevice_Release(pDeviceInterface);\n    }\n#else\n    if (pDeviceInterface != NULL) {\n        ma_IUnknown_Release(pDeviceInterface);\n    }\n#endif\n\n    if (result != MA_SUCCESS) {\n        if (pData->pRenderClient) {\n            ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pData->pRenderClient);\n            pData->pRenderClient = NULL;\n        }\n        if (pData->pCaptureClient) {\n            ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pData->pCaptureClient);\n            pData->pCaptureClient = NULL;\n        }\n        if (pData->pAudioClient) {\n            ma_IAudioClient_Release((ma_IAudioClient*)pData->pAudioClient);\n            pData->pAudioClient = NULL;\n        }\n\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, errorMsg, result);\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\nma_result ma_device_reinit__wasapi(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_device_init_internal_data__wasapi data;\n    ma_result result;\n\n    ma_assert(pDevice != NULL);\n\n    /* We only re-initialize the playback or capture device. Never a full-duplex device. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        data.formatIn               = pDevice->capture.format;\n        data.channelsIn             = pDevice->capture.channels;\n        ma_copy_memory(data.channelMapIn, pDevice->capture.channelMap, sizeof(pDevice->capture.channelMap));\n        data.shareMode              = pDevice->capture.shareMode;\n        data.usingDefaultFormat     = pDevice->capture.usingDefaultFormat;\n        data.usingDefaultChannels   = pDevice->capture.usingDefaultChannels;\n        data.usingDefaultChannelMap = pDevice->capture.usingDefaultChannelMap;\n    } else {\n        data.formatIn               = pDevice->playback.format;\n        data.channelsIn             = pDevice->playback.channels;\n        ma_copy_memory(data.channelMapIn, pDevice->playback.channelMap, sizeof(pDevice->playback.channelMap));\n        data.shareMode              = pDevice->playback.shareMode;\n        data.usingDefaultFormat     = pDevice->playback.usingDefaultFormat;\n        data.usingDefaultChannels   = pDevice->playback.usingDefaultChannels;\n        data.usingDefaultChannelMap = pDevice->playback.usingDefaultChannelMap;\n    }\n    \n    data.sampleRateIn               = pDevice->sampleRate;\n    data.usingDefaultSampleRate     = pDevice->usingDefaultSampleRate;\n    data.bufferSizeInFramesIn       = pDevice->wasapi.originalBufferSizeInFrames;\n    data.bufferSizeInMillisecondsIn = pDevice->wasapi.originalBufferSizeInMilliseconds;\n    data.periodsIn                  = pDevice->wasapi.originalPeriods;\n    result = ma_device_init_internal__wasapi(pDevice->pContext, deviceType, NULL, &data);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* At this point we have some new objects ready to go. We need to uninitialize the previous ones and then set the new ones. */\n    if (deviceType == ma_device_type_capture) {\n        if (pDevice->wasapi.pCaptureClient) {\n            ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n            pDevice->wasapi.pCaptureClient = NULL;\n        }\n\n        if (pDevice->wasapi.pAudioClientCapture) {\n            ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n            pDevice->wasapi.pAudioClientCapture = NULL;\n        }\n\n        pDevice->wasapi.pAudioClientCapture         = data.pAudioClient;\n        pDevice->wasapi.pCaptureClient              = data.pCaptureClient;\n\n        pDevice->capture.internalFormat             = data.formatOut;\n        pDevice->capture.internalChannels           = data.channelsOut;\n        pDevice->capture.internalSampleRate         = data.sampleRateOut;\n        ma_copy_memory(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->capture.internalBufferSizeInFrames = data.bufferSizeInFramesOut;\n        pDevice->capture.internalPeriods            = data.periodsOut;\n        ma_strcpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), data.deviceName);\n\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture,  pDevice->wasapi.hEventCapture);\n\n        pDevice->wasapi.periodSizeInFramesCapture = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &pDevice->wasapi.actualBufferSizeInFramesCapture);\n\n        /* The device may be in a started state. If so we need to immediately restart it. */\n        if (pDevice->wasapi.isStartedCapture) {\n            HRESULT hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n            if (FAILED(hr)) {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal capture device after reinitialization.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n            }\n        }\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        if (pDevice->wasapi.pRenderClient) {\n            ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient);\n            pDevice->wasapi.pRenderClient = NULL;\n        }\n\n        if (pDevice->wasapi.pAudioClientPlayback) {\n            ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n            pDevice->wasapi.pAudioClientPlayback = NULL;\n        }\n\n        pDevice->wasapi.pAudioClientPlayback         = data.pAudioClient;\n        pDevice->wasapi.pRenderClient                = data.pRenderClient;\n\n        pDevice->playback.internalFormat             = data.formatOut;\n        pDevice->playback.internalChannels           = data.channelsOut;\n        pDevice->playback.internalSampleRate         = data.sampleRateOut;\n        ma_copy_memory(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->playback.internalBufferSizeInFrames = data.bufferSizeInFramesOut;\n        pDevice->playback.internalPeriods            = data.periodsOut;\n        ma_strcpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), data.deviceName);\n\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, pDevice->wasapi.hEventPlayback);\n\n        pDevice->wasapi.periodSizeInFramesPlayback = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &pDevice->wasapi.actualBufferSizeInFramesPlayback);\n\n        /* The device may be in a started state. If so we need to immediately restart it. */\n        if (pDevice->wasapi.isStartedPlayback) {\n            HRESULT hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n            if (FAILED(hr)) {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal playback device after reinitialization.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__wasapi(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result = MA_SUCCESS;\n\n    (void)pContext;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pDevice != NULL);\n\n    ma_zero_object(&pDevice->wasapi);\n    pDevice->wasapi.originalBufferSizeInFrames       = pConfig->bufferSizeInFrames;\n    pDevice->wasapi.originalBufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;\n    pDevice->wasapi.originalPeriods                  = pConfig->periods;\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__wasapi data;\n        data.formatIn                   = pConfig->capture.format;\n        data.channelsIn                 = pConfig->capture.channels;\n        data.sampleRateIn               = pConfig->sampleRate;\n        ma_copy_memory(data.channelMapIn, pConfig->capture.channelMap, sizeof(pConfig->capture.channelMap));\n        data.usingDefaultFormat         = pDevice->capture.usingDefaultFormat;\n        data.usingDefaultChannels       = pDevice->capture.usingDefaultChannels;\n        data.usingDefaultSampleRate     = pDevice->usingDefaultSampleRate;\n        data.usingDefaultChannelMap     = pDevice->capture.usingDefaultChannelMap;\n        data.shareMode                  = pConfig->capture.shareMode;\n        data.bufferSizeInFramesIn       = pConfig->bufferSizeInFrames;\n        data.bufferSizeInMillisecondsIn = pConfig->bufferSizeInMilliseconds;\n        data.periodsIn                  = pConfig->periods;\n\n        result = ma_device_init_internal__wasapi(pDevice->pContext, ma_device_type_capture, pConfig->capture.pDeviceID, &data);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pDevice->wasapi.pAudioClientCapture         = data.pAudioClient;\n        pDevice->wasapi.pCaptureClient              = data.pCaptureClient;\n\n        pDevice->capture.internalFormat             = data.formatOut;\n        pDevice->capture.internalChannels           = data.channelsOut;\n        pDevice->capture.internalSampleRate         = data.sampleRateOut;\n        ma_copy_memory(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->capture.internalBufferSizeInFrames = data.bufferSizeInFramesOut;\n        pDevice->capture.internalPeriods            = data.periodsOut;\n        ma_strcpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), data.deviceName);\n\n        /*\n        The event for capture needs to be manual reset for the same reason as playback. We keep the initial state set to unsignaled,\n        however, because we want to block until we actually have something for the first call to ma_device_read().\n        */\n        pDevice->wasapi.hEventCapture = CreateEventA(NULL, FALSE, FALSE, NULL);  /* Auto reset, unsignaled by default. */\n        if (pDevice->wasapi.hEventCapture == NULL) {\n            if (pDevice->wasapi.pCaptureClient != NULL) {\n                ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n                pDevice->wasapi.pCaptureClient = NULL;\n            }\n            if (pDevice->wasapi.pAudioClientCapture != NULL) {\n                ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                pDevice->wasapi.pAudioClientCapture = NULL;\n            }\n\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create event for capture.\", MA_FAILED_TO_CREATE_EVENT);\n        }\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, pDevice->wasapi.hEventCapture);\n\n        pDevice->wasapi.periodSizeInFramesCapture = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &pDevice->wasapi.actualBufferSizeInFramesCapture);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__wasapi data;\n        data.formatIn                   = pConfig->playback.format;\n        data.channelsIn                 = pConfig->playback.channels;\n        data.sampleRateIn               = pConfig->sampleRate;\n        ma_copy_memory(data.channelMapIn, pConfig->playback.channelMap, sizeof(pConfig->playback.channelMap));\n        data.usingDefaultFormat         = pDevice->playback.usingDefaultFormat;\n        data.usingDefaultChannels       = pDevice->playback.usingDefaultChannels;\n        data.usingDefaultSampleRate     = pDevice->usingDefaultSampleRate;\n        data.usingDefaultChannelMap     = pDevice->playback.usingDefaultChannelMap;\n        data.shareMode                  = pConfig->playback.shareMode;\n        data.bufferSizeInFramesIn       = pConfig->bufferSizeInFrames;\n        data.bufferSizeInMillisecondsIn = pConfig->bufferSizeInMilliseconds;\n        data.periodsIn                  = pConfig->periods;\n\n        result = ma_device_init_internal__wasapi(pDevice->pContext, ma_device_type_playback, pConfig->playback.pDeviceID, &data);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                if (pDevice->wasapi.pCaptureClient != NULL) {\n                    ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n                    pDevice->wasapi.pCaptureClient = NULL;\n                }\n                if (pDevice->wasapi.pAudioClientCapture != NULL) {\n                    ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                    pDevice->wasapi.pAudioClientCapture = NULL;\n                }\n\n                CloseHandle(pDevice->wasapi.hEventCapture);\n                pDevice->wasapi.hEventCapture = NULL;\n            }\n            return result;\n        }\n\n        pDevice->wasapi.pAudioClientPlayback         = data.pAudioClient;\n        pDevice->wasapi.pRenderClient                = data.pRenderClient;\n\n        pDevice->playback.internalFormat             = data.formatOut;\n        pDevice->playback.internalChannels           = data.channelsOut;\n        pDevice->playback.internalSampleRate         = data.sampleRateOut;\n        ma_copy_memory(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->playback.internalBufferSizeInFrames = data.bufferSizeInFramesOut;\n        pDevice->playback.internalPeriods            = data.periodsOut;\n        ma_strcpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), data.deviceName);\n\n        /*\n        The event for playback is needs to be manual reset because we want to explicitly control the fact that it becomes signalled\n        only after the whole available space has been filled, never before.\n\n        The playback event also needs to be initially set to a signaled state so that the first call to ma_device_write() is able\n        to get passed WaitForMultipleObjects().\n        */\n        pDevice->wasapi.hEventPlayback = CreateEventA(NULL, FALSE, TRUE, NULL);  /* Auto reset, signaled by default. */\n        if (pDevice->wasapi.hEventPlayback == NULL) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                if (pDevice->wasapi.pCaptureClient != NULL) {\n                    ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n                    pDevice->wasapi.pCaptureClient = NULL;\n                }\n                if (pDevice->wasapi.pAudioClientCapture != NULL) {\n                    ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                    pDevice->wasapi.pAudioClientCapture = NULL;\n                }\n\n                CloseHandle(pDevice->wasapi.hEventCapture);\n                pDevice->wasapi.hEventCapture = NULL;\n            }\n\n            if (pDevice->wasapi.pRenderClient != NULL) {\n                ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient);\n                pDevice->wasapi.pRenderClient = NULL;\n            }\n            if (pDevice->wasapi.pAudioClientPlayback != NULL) {\n                ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n                pDevice->wasapi.pAudioClientPlayback = NULL;\n            }\n\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create event for playback.\", MA_FAILED_TO_CREATE_EVENT);\n        }\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, pDevice->wasapi.hEventPlayback);\n\n        pDevice->wasapi.periodSizeInFramesPlayback = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &pDevice->wasapi.actualBufferSizeInFramesPlayback);\n    }\n\n    /*\n    We need to get notifications of when the default device changes. We do this through a device enumerator by\n    registering a IMMNotificationClient with it. We only care about this if it's the default device.\n    */\n#ifdef MA_WIN32_DESKTOP\n    {\n        ma_IMMDeviceEnumerator* pDeviceEnumerator;\n        HRESULT hr = ma_CoCreateInstance(pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n        if (FAILED(hr)) {\n            ma_device_uninit__wasapi(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create device enumerator.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        pDevice->wasapi.notificationClient.lpVtbl  = (void*)&g_maNotificationCientVtbl;\n        pDevice->wasapi.notificationClient.counter = 1;\n        pDevice->wasapi.notificationClient.pDevice = pDevice;\n\n        hr = pDeviceEnumerator->lpVtbl->RegisterEndpointNotificationCallback(pDeviceEnumerator, &pDevice->wasapi.notificationClient);\n        if (SUCCEEDED(hr)) {\n            pDevice->wasapi.pDeviceEnumerator = (ma_ptr)pDeviceEnumerator;\n        } else {\n            /* Not the end of the world if we fail to register the notification callback. We just won't support automatic stream routing. */\n            ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n        }\n    }\n#endif\n\n    ma_atomic_exchange_32(&pDevice->wasapi.isStartedCapture,  MA_FALSE);\n    ma_atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_FALSE);\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device__get_available_frames__wasapi(ma_device* pDevice, ma_IAudioClient* pAudioClient, ma_uint32* pFrameCount)\n{\n    ma_uint32 paddingFramesCount;\n    HRESULT hr;\n    ma_share_mode shareMode;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pFrameCount != NULL);\n    \n    *pFrameCount = 0;\n\n    if ((ma_ptr)pAudioClient != pDevice->wasapi.pAudioClientPlayback && (ma_ptr)pAudioClient != pDevice->wasapi.pAudioClientCapture) {\n        return MA_INVALID_OPERATION;\n    }\n\n    hr = ma_IAudioClient_GetCurrentPadding(pAudioClient, &paddingFramesCount);\n    if (FAILED(hr)) {\n        return MA_DEVICE_UNAVAILABLE;\n    }\n\n    /* Slightly different rules for exclusive and shared modes. */\n    shareMode = ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) ? pDevice->playback.shareMode : pDevice->capture.shareMode;\n    if (shareMode == ma_share_mode_exclusive) {\n        *pFrameCount = paddingFramesCount;\n    } else {\n        if ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) {\n            *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesPlayback - paddingFramesCount;\n        } else {\n            *pFrameCount = paddingFramesCount;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_bool32 ma_device_is_reroute_required__wasapi(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_assert(pDevice != NULL);\n\n    if (deviceType == ma_device_type_playback) {\n        return pDevice->wasapi.hasDefaultPlaybackDeviceChanged;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        return pDevice->wasapi.hasDefaultCaptureDeviceChanged;\n    }\n    \n    return MA_FALSE;\n}\n\nma_result ma_device_reroute__wasapi(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_result result;\n\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        ma_atomic_exchange_32(&pDevice->wasapi.hasDefaultPlaybackDeviceChanged, MA_FALSE);\n    }\n    if (deviceType == ma_device_type_capture) {\n        ma_atomic_exchange_32(&pDevice->wasapi.hasDefaultCaptureDeviceChanged,  MA_FALSE);\n    }\n    \n\n    #ifdef MA_DEBUG_OUTPUT\n        printf(\"=== CHANGING DEVICE ===\\n\");\n    #endif\n\n    result = ma_device_reinit__wasapi(pDevice, deviceType);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    ma_device__post_init_setup(pDevice, deviceType);\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_device_main_loop__wasapi(ma_device* pDevice)\n{\n    ma_result result;\n    HRESULT hr;\n    ma_bool32 exitLoop = MA_FALSE;\n    ma_uint32 framesWrittenToPlaybackDevice = 0;\n    ma_uint32 mappedBufferSizeInFramesCapture = 0;\n    ma_uint32 mappedBufferSizeInFramesPlayback = 0;\n    ma_uint32 mappedBufferFramesRemainingCapture = 0;\n    ma_uint32 mappedBufferFramesRemainingPlayback = 0;\n    BYTE* pMappedBufferCapture = NULL;\n    BYTE* pMappedBufferPlayback = NULL;\n    ma_uint32 bpfCapture = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    ma_uint32 bpfPlayback = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    ma_uint8  inputDataInExternalFormat[4096];\n    ma_uint32 inputDataInExternalFormatCap = sizeof(inputDataInExternalFormat) / bpfCapture;\n    ma_uint8  outputDataInExternalFormat[4096];\n    ma_uint32 outputDataInExternalFormatCap = sizeof(outputDataInExternalFormat) / bpfPlayback;\n\n    ma_assert(pDevice != NULL);\n\n    /* The playback device needs to be started immediately. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n        if (FAILED(hr)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal capture device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n        ma_atomic_exchange_32(&pDevice->wasapi.isStartedCapture, MA_TRUE);\n    }\n\n    while (ma_device__get_state(pDevice) == MA_STATE_STARTED && !exitLoop) {\n        /* We may need to reroute the device. */\n        if (ma_device_is_reroute_required__wasapi(pDevice, ma_device_type_playback)) {\n            result = ma_device_reroute__wasapi(pDevice, ma_device_type_playback);\n            if (result != MA_SUCCESS) {\n                exitLoop = MA_TRUE;\n                break;\n            }\n        }\n        if (ma_device_is_reroute_required__wasapi(pDevice, ma_device_type_capture)) {\n            result = ma_device_reroute__wasapi(pDevice, ma_device_type_capture);\n            if (result != MA_SUCCESS) {\n                exitLoop = MA_TRUE;\n                break;\n            }\n        }\n\n        switch (pDevice->type)\n        {\n            case ma_device_type_duplex:\n            {\n                ma_uint32 framesAvailableCapture;\n                ma_uint32 framesAvailablePlayback;\n                DWORD flagsCapture;    /* Passed to IAudioCaptureClient_GetBuffer(). */\n\n                /* The process is to map the playback buffer and fill it as quickly as possible from input data. */\n                if (pMappedBufferPlayback == NULL) {\n                    /* WASAPI is weird with exclusive mode. You need to wait on the event _before_ querying the available frames. */\n                    if (pDevice->playback.shareMode == ma_share_mode_exclusive) {\n                        if (WaitForSingleObject(pDevice->wasapi.hEventPlayback, INFINITE) == WAIT_FAILED) {\n                            return MA_ERROR;   /* Wait failed. */\n                        }\n                    }\n\n                    result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &framesAvailablePlayback);\n                    if (result != MA_SUCCESS) {\n                        return result;\n                    }\n\n                    /*printf(\"TRACE 1: framesAvailablePlayback=%d\\n\", framesAvailablePlayback);*/\n\n\n                    /* In exclusive mode, the frame count needs to exactly match the value returned by GetCurrentPadding(). */\n                    if (pDevice->playback.shareMode != ma_share_mode_exclusive) {\n                        if (framesAvailablePlayback >= pDevice->wasapi.periodSizeInFramesPlayback) {\n                            framesAvailablePlayback  = pDevice->wasapi.periodSizeInFramesPlayback;\n                        }\n                    }\n\n                    /* If there's no frames available in the playback device we need to wait for more. */\n                    if (framesAvailablePlayback == 0) {\n                        /* In exclusive mode we waited at the top. */\n                        if (pDevice->playback.shareMode != ma_share_mode_exclusive) {\n                            if (WaitForSingleObject(pDevice->wasapi.hEventPlayback, INFINITE) == WAIT_FAILED) {\n                                return MA_ERROR;   /* Wait failed. */\n                            }\n                        }\n\n                        continue;\n                    }\n\n                    /* We're ready to map the playback device's buffer. We don't release this until it's been entirely filled. */\n                    hr = ma_IAudioRenderClient_GetBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, framesAvailablePlayback, &pMappedBufferPlayback);\n                    if (FAILED(hr)) {\n                        ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve internal buffer from playback device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                        exitLoop = MA_TRUE;\n                        break;\n                    }\n\n                    mappedBufferSizeInFramesPlayback = framesAvailablePlayback;\n                    mappedBufferFramesRemainingPlayback = framesAvailablePlayback;\n                }\n\n                /* At this point we should have a buffer available for output. We need to keep writing input samples to it. */\n                for (;;) {\n                    /* Try grabbing some captured data if we haven't already got a mapped buffer. */\n                    if (pMappedBufferCapture == NULL) {\n                        if (pDevice->capture.shareMode == ma_share_mode_shared) {\n                            if (WaitForSingleObject(pDevice->wasapi.hEventCapture, INFINITE) == WAIT_FAILED) {\n                                return MA_ERROR;   /* Wait failed. */\n                            }\n                        }\n\n                        result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &framesAvailableCapture);\n                        if (result != MA_SUCCESS) {\n                            exitLoop = MA_TRUE;\n                            break;\n                        }\n\n                        /*printf(\"TRACE 2: framesAvailableCapture=%d\\n\", framesAvailableCapture);*/\n\n                        /* Wait for more if nothing is available. */\n                        if (framesAvailableCapture == 0) {\n                            /* In exclusive mode we waited at the top. */\n                            if (pDevice->capture.shareMode != ma_share_mode_shared) {\n                                if (WaitForSingleObject(pDevice->wasapi.hEventCapture, INFINITE) == WAIT_FAILED) {\n                                    return MA_ERROR;   /* Wait failed. */\n                                }\n                            }\n\n                            continue;\n                        }\n\n                        /* Getting here means there's data available for writing to the output device. */\n                        mappedBufferSizeInFramesCapture = framesAvailableCapture;\n                        hr = ma_IAudioCaptureClient_GetBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pMappedBufferCapture, &mappedBufferSizeInFramesCapture, &flagsCapture, NULL, NULL);\n                        if (FAILED(hr)) {\n                            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve internal buffer from capture device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                            exitLoop = MA_TRUE;\n                            break;\n                        }\n\n                        /* TODO: How do we handle the capture flags returned by GetBuffer()? In particular, AUDCLNT_BUFFERFLAGS_SILENT (1). */\n                    #ifdef MA_DEBUG_OUTPUT\n                        if (flagsCapture != 0) {\n                            printf(\"[WASAPI] Capture Flags: %d\\n\", flagsCapture);\n                        }\n                    #endif\n\n                        mappedBufferFramesRemainingCapture = mappedBufferSizeInFramesCapture;\n\n                        pDevice->capture._dspFrameCount = mappedBufferSizeInFramesCapture;\n                        pDevice->capture._dspFrames     = (const ma_uint8*)pMappedBufferCapture;\n                    }\n\n\n                    /* At this point we should have both input and output data available. We now need to post it to the convert the data and post it to the client. */\n                    for (;;) {\n                        BYTE* pRunningBufferCapture;\n                        BYTE* pRunningBufferPlayback;\n                        ma_uint32 framesToProcess;\n                        ma_uint32 framesProcessed;\n\n                        pRunningBufferCapture  = pMappedBufferCapture  + ((mappedBufferSizeInFramesCapture  - mappedBufferFramesRemainingCapture ) * bpfPlayback);\n                        pRunningBufferPlayback = pMappedBufferPlayback + ((mappedBufferSizeInFramesPlayback - mappedBufferFramesRemainingPlayback) * bpfPlayback);\n                        \n                        /* There may be some data sitting in the converter that needs to be processed first. Once this is exhaused, run the data callback again. */\n                        if (!pDevice->playback.converter.isPassthrough) {\n                            framesProcessed = (ma_uint32)ma_pcm_converter_read(&pDevice->playback.converter, pRunningBufferPlayback, mappedBufferFramesRemainingPlayback);\n                            if (framesProcessed > 0) {\n                                mappedBufferFramesRemainingPlayback -= framesProcessed;\n                                if (mappedBufferFramesRemainingPlayback == 0) {\n                                    break;\n                                }\n                            }\n                        }\n\n                        /*\n                        Getting here means we need to fire the callback. If format conversion is unnecessary, we can optimize this by passing the pointers to the internal\n                        buffers directly to the callback.\n                        */\n                        if (pDevice->capture.converter.isPassthrough && pDevice->playback.converter.isPassthrough) {\n                            /* Optimal path. We can pass mapped pointers directly to the callback. */\n                            framesToProcess = ma_min(mappedBufferFramesRemainingCapture, mappedBufferFramesRemainingPlayback);\n                            framesProcessed = framesToProcess;\n\n                            pDevice->onData(pDevice, pRunningBufferPlayback, pRunningBufferCapture, framesToProcess);\n\n                            mappedBufferFramesRemainingCapture  -= framesProcessed;\n                            mappedBufferFramesRemainingPlayback -= framesProcessed;\n\n                            if (mappedBufferFramesRemainingCapture == 0) {\n                                break;  /* Exhausted input data. */\n                            }\n                            if (mappedBufferFramesRemainingPlayback == 0) {\n                                break;  /* Exhausted output data. */\n                            }\n                        } else if (pDevice->capture.converter.isPassthrough) {\n                            /* The input buffer is a passthrough, but the playback buffer requires a conversion. */\n                            framesToProcess = ma_min(mappedBufferFramesRemainingCapture, outputDataInExternalFormatCap);\n                            framesProcessed = framesToProcess;\n\n                            pDevice->onData(pDevice, outputDataInExternalFormat, pRunningBufferCapture, framesToProcess);\n                            mappedBufferFramesRemainingCapture -= framesProcessed;\n\n                            pDevice->playback._dspFrameCount = framesProcessed;\n                            pDevice->playback._dspFrames     = (const ma_uint8*)outputDataInExternalFormat;\n\n                            if (mappedBufferFramesRemainingCapture == 0) {\n                                break;  /* Exhausted input data. */\n                            }\n                        } else if (pDevice->playback.converter.isPassthrough) {\n                            /* The input buffer requires conversion, the playback buffer is passthrough. */\n                            framesToProcess = ma_min(inputDataInExternalFormatCap, mappedBufferFramesRemainingPlayback);\n                            framesProcessed = (ma_uint32)ma_pcm_converter_read(&pDevice->capture.converter, inputDataInExternalFormat, framesToProcess);\n                            if (framesProcessed == 0) {\n                                /* Getting here means we've run out of input data. */\n                                mappedBufferFramesRemainingCapture = 0;\n                                break;\n                            }\n\n                            pDevice->onData(pDevice, pRunningBufferPlayback, inputDataInExternalFormat, framesProcessed);\n                            mappedBufferFramesRemainingPlayback -= framesProcessed;\n\n                            if (framesProcessed < framesToProcess) {\n                                mappedBufferFramesRemainingCapture = 0;\n                                break;  /* Exhausted input data. */\n                            }\n\n                            if (mappedBufferFramesRemainingPlayback == 0) {\n                                break;  /* Exhausted output data. */\n                            }\n                        } else {\n                            framesToProcess = ma_min(inputDataInExternalFormatCap, outputDataInExternalFormatCap);\n                            framesProcessed = (ma_uint32)ma_pcm_converter_read(&pDevice->capture.converter, inputDataInExternalFormat, framesToProcess);\n                            if (framesProcessed == 0) {\n                                /* Getting here means we've run out of input data. */\n                                mappedBufferFramesRemainingCapture = 0;\n                                break;\n                            }\n\n                            pDevice->onData(pDevice, outputDataInExternalFormat, inputDataInExternalFormat, framesProcessed);\n\n                            pDevice->playback._dspFrameCount = framesProcessed;\n                            pDevice->playback._dspFrames     = (const ma_uint8*)outputDataInExternalFormat;\n\n                            if (framesProcessed < framesToProcess) {\n                                /* Getting here means we've run out of input data. */\n                                mappedBufferFramesRemainingCapture = 0;\n                                break;\n                            }\n                        }\n                    }\n\n\n                    /* If at this point we've run out of capture data we need to release the buffer. */\n                    if (mappedBufferFramesRemainingCapture == 0 && pMappedBufferCapture != NULL) {\n                        hr = ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, mappedBufferSizeInFramesCapture);\n                        if (FAILED(hr)) {\n                            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to release internal buffer from capture device after reading from the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                            exitLoop = MA_TRUE;\n                            break;\n                        }\n\n                        /*printf(\"TRACE: Released capture buffer\\n\");*/\n\n                        pMappedBufferCapture = NULL;\n                        mappedBufferFramesRemainingCapture = 0;\n                        mappedBufferSizeInFramesCapture = 0;\n                    }\n\n                    /* Get out of this loop if we're run out of room in the playback buffer. */\n                    if (mappedBufferFramesRemainingPlayback == 0) {\n                        break;\n                    }\n                }\n\n\n                /* If at this point we've run out of data we need to release the buffer. */\n                if (mappedBufferFramesRemainingPlayback == 0 && pMappedBufferPlayback != NULL) {\n                    hr = ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, mappedBufferSizeInFramesPlayback, 0);\n                    if (FAILED(hr)) {\n                        ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to release internal buffer from playback device after writing to the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                        exitLoop = MA_TRUE;\n                        break;\n                    }\n\n                    /*printf(\"TRACE: Released playback buffer\\n\");*/\n                    framesWrittenToPlaybackDevice += mappedBufferSizeInFramesPlayback;\n\n                    pMappedBufferPlayback = NULL;\n                    mappedBufferFramesRemainingPlayback = 0;\n                    mappedBufferSizeInFramesPlayback = 0;\n                }\n\n                if (!pDevice->wasapi.isStartedPlayback) {\n                    if (pDevice->playback.shareMode == ma_share_mode_exclusive || framesWrittenToPlaybackDevice >= (pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)*2) {\n                        hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n                        if (FAILED(hr)) {\n                            ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                            ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal playback device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                        }\n                        ma_atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_TRUE);\n                    }\n                }\n            } break;\n\n\n\n            case ma_device_type_capture:\n            {\n                ma_uint32 framesAvailableCapture;\n                DWORD flagsCapture;    /* Passed to IAudioCaptureClient_GetBuffer(). */\n\n                /* Wait for data to become available first. */\n                if (WaitForSingleObject(pDevice->wasapi.hEventCapture, INFINITE) == WAIT_FAILED) {\n                    exitLoop = MA_TRUE;\n                    break;   /* Wait failed. */\n                }\n\n                /* See how many frames are available. Since we waited at the top, I don't think this should ever return 0. I'm checking for this anyway. */\n                result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &framesAvailableCapture);\n                if (result != MA_SUCCESS) {\n                    exitLoop = MA_TRUE;\n                    break;\n                }\n\n                if (framesAvailableCapture < pDevice->wasapi.periodSizeInFramesCapture) {\n                    continue;   /* Nothing available. Keep waiting. */\n                }\n\n                /* Map a the data buffer in preparation for sending to the client. */\n                mappedBufferSizeInFramesCapture = framesAvailableCapture;\n                hr = ma_IAudioCaptureClient_GetBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pMappedBufferCapture, &mappedBufferSizeInFramesCapture, &flagsCapture, NULL, NULL);\n                if (FAILED(hr)) {\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve internal buffer from capture device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                    exitLoop = MA_TRUE;\n                    break;\n                }\n\n                /* We should have a buffer at this point. */\n                ma_device__send_frames_to_client(pDevice, mappedBufferSizeInFramesCapture, pMappedBufferCapture);\n\n                /* At this point we're done with the buffer. */\n                hr = ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, mappedBufferSizeInFramesCapture);\n                pMappedBufferCapture = NULL;    /* <-- Important. Not doing this can result in an error once we leave this loop because it will use this to know whether or not a final ReleaseBuffer() needs to be called. */\n                mappedBufferSizeInFramesCapture = 0;\n                if (FAILED(hr)) {\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to release internal buffer from capture device after reading from the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                    exitLoop = MA_TRUE;\n                    break;\n                }\n            } break;\n\n\n\n            case ma_device_type_playback:\n            {\n                ma_uint32 framesAvailablePlayback;\n\n                /* Wait for space to become available first. */\n                if (WaitForSingleObject(pDevice->wasapi.hEventPlayback, INFINITE) == WAIT_FAILED) {\n                    exitLoop = MA_TRUE;\n                    break;   /* Wait failed. */\n                }\n\n                /* Check how much space is available. If this returns 0 we just keep waiting. */\n                result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &framesAvailablePlayback);\n                if (result != MA_SUCCESS) {\n                    exitLoop = MA_TRUE;\n                    break;\n                }\n\n                if (framesAvailablePlayback < pDevice->wasapi.periodSizeInFramesPlayback) {\n                    continue;   /* No space available. */\n                }\n\n                /* Map a the data buffer in preparation for the callback. */\n                hr = ma_IAudioRenderClient_GetBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, framesAvailablePlayback, &pMappedBufferPlayback);\n                if (FAILED(hr)) {\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve internal buffer from playback device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                    exitLoop = MA_TRUE;\n                    break;\n                }\n\n                /* We should have a buffer at this point. */\n                ma_device__read_frames_from_client(pDevice, framesAvailablePlayback, pMappedBufferPlayback);\n\n                /* At this point we're done writing to the device and we just need to release the buffer. */\n                hr = ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, framesAvailablePlayback, 0);\n                pMappedBufferPlayback = NULL;    /* <-- Important. Not doing this can result in an error once we leave this loop because it will use this to know whether or not a final ReleaseBuffer() needs to be called. */\n                mappedBufferSizeInFramesPlayback = 0;\n\n                if (FAILED(hr)) {\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to release internal buffer from playback device after writing to the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                    exitLoop = MA_TRUE;\n                    break;\n                }\n\n                framesWrittenToPlaybackDevice += framesAvailablePlayback;\n                if (!pDevice->wasapi.isStartedPlayback) {\n                    if (pDevice->playback.shareMode == ma_share_mode_exclusive || framesWrittenToPlaybackDevice >= (pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)*1) {\n                        hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n                        if (FAILED(hr)) {\n                            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal playback device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                            exitLoop = MA_TRUE;\n                            break;\n                        }\n                        ma_atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_TRUE);\n                    }\n                }\n            } break;\n\n            default: return MA_INVALID_ARGS;\n        }\n    }\n\n    /* Here is where the device needs to be stopped. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        /* Any mapped buffers need to be released. */\n        if (pMappedBufferCapture != NULL) {\n            hr = ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, mappedBufferSizeInFramesCapture);\n        }\n\n        hr = ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n        if (FAILED(hr)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to stop internal capture device.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        /* The audio client needs to be reset otherwise restarting will fail. */\n        hr = ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n        if (FAILED(hr)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to reset internal capture device.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        ma_atomic_exchange_32(&pDevice->wasapi.isStartedCapture, MA_FALSE);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* Any mapped buffers need to be released. */\n        if (pMappedBufferPlayback != NULL) {\n            hr = ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, mappedBufferSizeInFramesPlayback, 0);\n        }\n\n        /*\n        The buffer needs to be drained before stopping the device. Not doing this will result in the last few frames not getting output to\n        the speakers. This is a problem for very short sounds because it'll result in a significant potion of it not getting played.\n        */\n        if (pDevice->wasapi.isStartedPlayback) {\n            if (pDevice->playback.shareMode == ma_share_mode_exclusive) {\n                WaitForSingleObject(pDevice->wasapi.hEventPlayback, INFINITE);\n            } else {\n                ma_uint32 prevFramesAvaialablePlayback = (size_t)-1;\n                ma_uint32 framesAvailablePlayback;\n                for (;;) {\n                    result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &framesAvailablePlayback);\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n\n                    if (framesAvailablePlayback >= pDevice->wasapi.actualBufferSizeInFramesPlayback) {\n                        break;\n                    }\n\n                    /*\n                    Just a safety check to avoid an infinite loop. If this iteration results in a situation where the number of available frames\n                    has not changed, get out of the loop. I don't think this should ever happen, but I think it's nice to have just in case.\n                    */\n                    if (framesAvailablePlayback == prevFramesAvaialablePlayback) {\n                        break;\n                    }\n                    prevFramesAvaialablePlayback = framesAvailablePlayback;\n\n                    WaitForSingleObject(pDevice->wasapi.hEventPlayback, INFINITE);\n                    ResetEvent(pDevice->wasapi.hEventPlayback); /* Manual reset. */\n                }\n            }\n        }\n\n        hr = ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n        if (FAILED(hr)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to stop internal playback device.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        /* The audio client needs to be reset otherwise restarting will fail. */\n        hr = ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n        if (FAILED(hr)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to reset internal playback device.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        ma_atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_FALSE);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_uninit__wasapi(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_wasapi);\n    (void)pContext;\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__wasapi(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_result result = MA_SUCCESS;\n\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n#ifdef MA_WIN32_DESKTOP\n    /*\n    WASAPI is only supported in Vista SP1 and newer. The reason for SP1 and not the base version of Vista is that event-driven\n    exclusive mode does not work until SP1.\n\n    Unfortunately older compilers don't define these functions so we need to dynamically load them in order to avoid a lin error.\n    */\n    {\n        ma_OSVERSIONINFOEXW osvi;\n        ma_handle kernel32DLL;\n        ma_PFNVerifyVersionInfoW _VerifyVersionInfoW;\n        ma_PFNVerSetConditionMask _VerSetConditionMask;\n\n        kernel32DLL = ma_dlopen(pContext, \"kernel32.dll\");\n        if (kernel32DLL == NULL) {\n            return MA_NO_BACKEND;\n        }\n\n        _VerifyVersionInfoW = (ma_PFNVerifyVersionInfoW)ma_dlsym(pContext, kernel32DLL, \"VerifyVersionInfoW\");\n        _VerSetConditionMask = (ma_PFNVerSetConditionMask)ma_dlsym(pContext, kernel32DLL, \"VerSetConditionMask\");\n        if (_VerifyVersionInfoW == NULL || _VerSetConditionMask == NULL) {\n            ma_dlclose(pContext, kernel32DLL);\n            return MA_NO_BACKEND;\n        }\n\n        ma_zero_object(&osvi);\n        osvi.dwOSVersionInfoSize = sizeof(osvi);\n        osvi.dwMajorVersion = HIBYTE(MA_WIN32_WINNT_VISTA);\n        osvi.dwMinorVersion = LOBYTE(MA_WIN32_WINNT_VISTA);\n        osvi.wServicePackMajor = 1;\n        if (_VerifyVersionInfoW(&osvi, MA_VER_MAJORVERSION | MA_VER_MINORVERSION | MA_VER_SERVICEPACKMAJOR, _VerSetConditionMask(_VerSetConditionMask(_VerSetConditionMask(0, MA_VER_MAJORVERSION, MA_VER_GREATER_EQUAL), MA_VER_MINORVERSION, MA_VER_GREATER_EQUAL), MA_VER_SERVICEPACKMAJOR, MA_VER_GREATER_EQUAL))) {\n            result = MA_SUCCESS;\n        } else {\n            result = MA_NO_BACKEND;\n        }\n\n        ma_dlclose(pContext, kernel32DLL);\n    }\n#endif\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pContext->onUninit         = ma_context_uninit__wasapi;\n    pContext->onDeviceIDEqual  = ma_context_is_device_id_equal__wasapi;\n    pContext->onEnumDevices    = ma_context_enumerate_devices__wasapi;\n    pContext->onGetDeviceInfo  = ma_context_get_device_info__wasapi;\n    pContext->onDeviceInit     = ma_device_init__wasapi;\n    pContext->onDeviceUninit   = ma_device_uninit__wasapi;\n    pContext->onDeviceStart    = NULL; /* Not used. Started in onDeviceMainLoop. */\n    pContext->onDeviceStop     = NULL; /* Not used. Stopped in onDeviceMainLoop. */\n    pContext->onDeviceWrite    = NULL;\n    pContext->onDeviceRead     = NULL;\n    pContext->onDeviceMainLoop = ma_device_main_loop__wasapi;\n\n    return result;\n}\n#endif\n\n/******************************************************************************\n\nDirectSound Backend\n\n******************************************************************************/\n#ifdef MA_HAS_DSOUND\n/*#include <dsound.h>*/\n\nGUID MA_GUID_IID_DirectSoundNotify = {0xb0210783, 0x89cd, 0x11d0, {0xaf, 0x08, 0x00, 0xa0, 0xc9, 0x25, 0xcd, 0x16}};\n\n/* miniaudio only uses priority or exclusive modes. */\n#define MA_DSSCL_NORMAL                 1\n#define MA_DSSCL_PRIORITY               2\n#define MA_DSSCL_EXCLUSIVE              3\n#define MA_DSSCL_WRITEPRIMARY           4\n\n#define MA_DSCAPS_PRIMARYMONO           0x00000001\n#define MA_DSCAPS_PRIMARYSTEREO         0x00000002\n#define MA_DSCAPS_PRIMARY8BIT           0x00000004\n#define MA_DSCAPS_PRIMARY16BIT          0x00000008\n#define MA_DSCAPS_CONTINUOUSRATE        0x00000010\n#define MA_DSCAPS_EMULDRIVER            0x00000020\n#define MA_DSCAPS_CERTIFIED             0x00000040\n#define MA_DSCAPS_SECONDARYMONO         0x00000100\n#define MA_DSCAPS_SECONDARYSTEREO       0x00000200\n#define MA_DSCAPS_SECONDARY8BIT         0x00000400\n#define MA_DSCAPS_SECONDARY16BIT        0x00000800\n\n#define MA_DSBCAPS_PRIMARYBUFFER        0x00000001\n#define MA_DSBCAPS_STATIC               0x00000002\n#define MA_DSBCAPS_LOCHARDWARE          0x00000004\n#define MA_DSBCAPS_LOCSOFTWARE          0x00000008\n#define MA_DSBCAPS_CTRL3D               0x00000010\n#define MA_DSBCAPS_CTRLFREQUENCY        0x00000020\n#define MA_DSBCAPS_CTRLPAN              0x00000040\n#define MA_DSBCAPS_CTRLVOLUME           0x00000080\n#define MA_DSBCAPS_CTRLPOSITIONNOTIFY   0x00000100\n#define MA_DSBCAPS_CTRLFX               0x00000200\n#define MA_DSBCAPS_STICKYFOCUS          0x00004000\n#define MA_DSBCAPS_GLOBALFOCUS          0x00008000\n#define MA_DSBCAPS_GETCURRENTPOSITION2  0x00010000\n#define MA_DSBCAPS_MUTE3DATMAXDISTANCE  0x00020000\n#define MA_DSBCAPS_LOCDEFER             0x00040000\n#define MA_DSBCAPS_TRUEPLAYPOSITION     0x00080000\n\n#define MA_DSBPLAY_LOOPING              0x00000001\n#define MA_DSBPLAY_LOCHARDWARE          0x00000002\n#define MA_DSBPLAY_LOCSOFTWARE          0x00000004\n#define MA_DSBPLAY_TERMINATEBY_TIME     0x00000008\n#define MA_DSBPLAY_TERMINATEBY_DISTANCE 0x00000010\n#define MA_DSBPLAY_TERMINATEBY_PRIORITY 0x00000020\n\n#define MA_DSCBSTART_LOOPING            0x00000001\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwReserved;\n    WAVEFORMATEX* lpwfxFormat;\n    GUID guid3DAlgorithm;\n} MA_DSBUFFERDESC;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwReserved;\n    WAVEFORMATEX* lpwfxFormat;\n    DWORD dwFXCount;\n    void* lpDSCFXDesc;  /* <-- miniaudio doesn't use this, so set to void*. */\n} MA_DSCBUFFERDESC;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwMinSecondarySampleRate;\n    DWORD dwMaxSecondarySampleRate;\n    DWORD dwPrimaryBuffers;\n    DWORD dwMaxHwMixingAllBuffers;\n    DWORD dwMaxHwMixingStaticBuffers;\n    DWORD dwMaxHwMixingStreamingBuffers;\n    DWORD dwFreeHwMixingAllBuffers;\n    DWORD dwFreeHwMixingStaticBuffers;\n    DWORD dwFreeHwMixingStreamingBuffers;\n    DWORD dwMaxHw3DAllBuffers;\n    DWORD dwMaxHw3DStaticBuffers;\n    DWORD dwMaxHw3DStreamingBuffers;\n    DWORD dwFreeHw3DAllBuffers;\n    DWORD dwFreeHw3DStaticBuffers;\n    DWORD dwFreeHw3DStreamingBuffers;\n    DWORD dwTotalHwMemBytes;\n    DWORD dwFreeHwMemBytes;\n    DWORD dwMaxContigFreeHwMemBytes;\n    DWORD dwUnlockTransferRateHwBuffers;\n    DWORD dwPlayCpuOverheadSwBuffers;\n    DWORD dwReserved1;\n    DWORD dwReserved2;\n} MA_DSCAPS;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwUnlockTransferRate;\n    DWORD dwPlayCpuOverhead;\n} MA_DSBCAPS;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwFormats;\n    DWORD dwChannels;\n} MA_DSCCAPS;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwReserved;\n} MA_DSCBCAPS;\n\ntypedef struct\n{\n    DWORD  dwOffset;\n    HANDLE hEventNotify;\n} MA_DSBPOSITIONNOTIFY;\n\ntypedef struct ma_IDirectSound              ma_IDirectSound;\ntypedef struct ma_IDirectSoundBuffer        ma_IDirectSoundBuffer;\ntypedef struct ma_IDirectSoundCapture       ma_IDirectSoundCapture;\ntypedef struct ma_IDirectSoundCaptureBuffer ma_IDirectSoundCaptureBuffer;\ntypedef struct ma_IDirectSoundNotify        ma_IDirectSoundNotify;\n\n\n/*\nCOM objects. The way these work is that you have a vtable (a list of function pointers, kind of\nlike how C++ works internally), and then you have a structure with a single member, which is a\npointer to the vtable. The vtable is where the methods of the object are defined. Methods need\nto be in a specific order, and parent classes need to have their methods declared first.\n*/\n\n/* IDirectSound */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSound* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSound* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSound* pThis);\n\n    /* IDirectSound */\n    HRESULT (STDMETHODCALLTYPE * CreateSoundBuffer)   (ma_IDirectSound* pThis, const MA_DSBUFFERDESC* pDSBufferDesc, ma_IDirectSoundBuffer** ppDSBuffer, void* pUnkOuter);\n    HRESULT (STDMETHODCALLTYPE * GetCaps)             (ma_IDirectSound* pThis, MA_DSCAPS* pDSCaps);\n    HRESULT (STDMETHODCALLTYPE * DuplicateSoundBuffer)(ma_IDirectSound* pThis, ma_IDirectSoundBuffer* pDSBufferOriginal, ma_IDirectSoundBuffer** ppDSBufferDuplicate);\n    HRESULT (STDMETHODCALLTYPE * SetCooperativeLevel) (ma_IDirectSound* pThis, HWND hwnd, DWORD dwLevel);\n    HRESULT (STDMETHODCALLTYPE * Compact)             (ma_IDirectSound* pThis);\n    HRESULT (STDMETHODCALLTYPE * GetSpeakerConfig)    (ma_IDirectSound* pThis, DWORD* pSpeakerConfig);\n    HRESULT (STDMETHODCALLTYPE * SetSpeakerConfig)    (ma_IDirectSound* pThis, DWORD dwSpeakerConfig);\n    HRESULT (STDMETHODCALLTYPE * Initialize)          (ma_IDirectSound* pThis, const GUID* pGuidDevice);\n} ma_IDirectSoundVtbl;\nstruct ma_IDirectSound\n{\n    ma_IDirectSoundVtbl* lpVtbl;\n};\nHRESULT ma_IDirectSound_QueryInterface(ma_IDirectSound* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IDirectSound_AddRef(ma_IDirectSound* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IDirectSound_Release(ma_IDirectSound* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IDirectSound_CreateSoundBuffer(ma_IDirectSound* pThis, const MA_DSBUFFERDESC* pDSBufferDesc, ma_IDirectSoundBuffer** ppDSBuffer, void* pUnkOuter) { return pThis->lpVtbl->CreateSoundBuffer(pThis, pDSBufferDesc, ppDSBuffer, pUnkOuter); }\nHRESULT ma_IDirectSound_GetCaps(ma_IDirectSound* pThis, MA_DSCAPS* pDSCaps)                           { return pThis->lpVtbl->GetCaps(pThis, pDSCaps); }\nHRESULT ma_IDirectSound_DuplicateSoundBuffer(ma_IDirectSound* pThis, ma_IDirectSoundBuffer* pDSBufferOriginal, ma_IDirectSoundBuffer** ppDSBufferDuplicate) { return pThis->lpVtbl->DuplicateSoundBuffer(pThis, pDSBufferOriginal, ppDSBufferDuplicate); }\nHRESULT ma_IDirectSound_SetCooperativeLevel(ma_IDirectSound* pThis, HWND hwnd, DWORD dwLevel)          { return pThis->lpVtbl->SetCooperativeLevel(pThis, hwnd, dwLevel); }\nHRESULT ma_IDirectSound_Compact(ma_IDirectSound* pThis)                                                { return pThis->lpVtbl->Compact(pThis); }\nHRESULT ma_IDirectSound_GetSpeakerConfig(ma_IDirectSound* pThis, DWORD* pSpeakerConfig)                { return pThis->lpVtbl->GetSpeakerConfig(pThis, pSpeakerConfig); }\nHRESULT ma_IDirectSound_SetSpeakerConfig(ma_IDirectSound* pThis, DWORD dwSpeakerConfig)                { return pThis->lpVtbl->SetSpeakerConfig(pThis, dwSpeakerConfig); }\nHRESULT ma_IDirectSound_Initialize(ma_IDirectSound* pThis, const GUID* pGuidDevice)                    { return pThis->lpVtbl->Initialize(pThis, pGuidDevice); }\n\n\n/* IDirectSoundBuffer */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundBuffer* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundBuffer* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundBuffer* pThis);\n\n    /* IDirectSoundBuffer */\n    HRESULT (STDMETHODCALLTYPE * GetCaps)           (ma_IDirectSoundBuffer* pThis, MA_DSBCAPS* pDSBufferCaps);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPosition)(ma_IDirectSoundBuffer* pThis, DWORD* pCurrentPlayCursor, DWORD* pCurrentWriteCursor);\n    HRESULT (STDMETHODCALLTYPE * GetFormat)         (ma_IDirectSoundBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten);\n    HRESULT (STDMETHODCALLTYPE * GetVolume)         (ma_IDirectSoundBuffer* pThis, LONG* pVolume);\n    HRESULT (STDMETHODCALLTYPE * GetPan)            (ma_IDirectSoundBuffer* pThis, LONG* pPan);\n    HRESULT (STDMETHODCALLTYPE * GetFrequency)      (ma_IDirectSoundBuffer* pThis, DWORD* pFrequency);\n    HRESULT (STDMETHODCALLTYPE * GetStatus)         (ma_IDirectSoundBuffer* pThis, DWORD* pStatus);\n    HRESULT (STDMETHODCALLTYPE * Initialize)        (ma_IDirectSoundBuffer* pThis, ma_IDirectSound* pDirectSound, const MA_DSBUFFERDESC* pDSBufferDesc);\n    HRESULT (STDMETHODCALLTYPE * Lock)              (ma_IDirectSoundBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * Play)              (ma_IDirectSoundBuffer* pThis, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * SetCurrentPosition)(ma_IDirectSoundBuffer* pThis, DWORD dwNewPosition);\n    HRESULT (STDMETHODCALLTYPE * SetFormat)         (ma_IDirectSoundBuffer* pThis, const WAVEFORMATEX* pFormat);\n    HRESULT (STDMETHODCALLTYPE * SetVolume)         (ma_IDirectSoundBuffer* pThis, LONG volume);\n    HRESULT (STDMETHODCALLTYPE * SetPan)            (ma_IDirectSoundBuffer* pThis, LONG pan);\n    HRESULT (STDMETHODCALLTYPE * SetFrequency)      (ma_IDirectSoundBuffer* pThis, DWORD dwFrequency);\n    HRESULT (STDMETHODCALLTYPE * Stop)              (ma_IDirectSoundBuffer* pThis);\n    HRESULT (STDMETHODCALLTYPE * Unlock)            (ma_IDirectSoundBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2);\n    HRESULT (STDMETHODCALLTYPE * Restore)           (ma_IDirectSoundBuffer* pThis);\n} ma_IDirectSoundBufferVtbl;\nstruct ma_IDirectSoundBuffer\n{\n    ma_IDirectSoundBufferVtbl* lpVtbl;\n};\nHRESULT ma_IDirectSoundBuffer_QueryInterface(ma_IDirectSoundBuffer* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IDirectSoundBuffer_AddRef(ma_IDirectSoundBuffer* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IDirectSoundBuffer_Release(ma_IDirectSoundBuffer* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IDirectSoundBuffer_GetCaps(ma_IDirectSoundBuffer* pThis, MA_DSBCAPS* pDSBufferCaps)                    { return pThis->lpVtbl->GetCaps(pThis, pDSBufferCaps); }\nHRESULT ma_IDirectSoundBuffer_GetCurrentPosition(ma_IDirectSoundBuffer* pThis, DWORD* pCurrentPlayCursor, DWORD* pCurrentWriteCursor) { return pThis->lpVtbl->GetCurrentPosition(pThis, pCurrentPlayCursor, pCurrentWriteCursor); }\nHRESULT ma_IDirectSoundBuffer_GetFormat(ma_IDirectSoundBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten) { return pThis->lpVtbl->GetFormat(pThis, pFormat, dwSizeAllocated, pSizeWritten); }\nHRESULT ma_IDirectSoundBuffer_GetVolume(ma_IDirectSoundBuffer* pThis, LONG* pVolume)                               { return pThis->lpVtbl->GetVolume(pThis, pVolume); }\nHRESULT ma_IDirectSoundBuffer_GetPan(ma_IDirectSoundBuffer* pThis, LONG* pPan)                                     { return pThis->lpVtbl->GetPan(pThis, pPan); }\nHRESULT ma_IDirectSoundBuffer_GetFrequency(ma_IDirectSoundBuffer* pThis, DWORD* pFrequency)                        { return pThis->lpVtbl->GetFrequency(pThis, pFrequency); }\nHRESULT ma_IDirectSoundBuffer_GetStatus(ma_IDirectSoundBuffer* pThis, DWORD* pStatus)                              { return pThis->lpVtbl->GetStatus(pThis, pStatus); }\nHRESULT ma_IDirectSoundBuffer_Initialize(ma_IDirectSoundBuffer* pThis, ma_IDirectSound* pDirectSound, const MA_DSBUFFERDESC* pDSBufferDesc) { return pThis->lpVtbl->Initialize(pThis, pDirectSound, pDSBufferDesc); }\nHRESULT ma_IDirectSoundBuffer_Lock(ma_IDirectSoundBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags) { return pThis->lpVtbl->Lock(pThis, dwOffset, dwBytes, ppAudioPtr1, pAudioBytes1, ppAudioPtr2, pAudioBytes2, dwFlags); }\nHRESULT ma_IDirectSoundBuffer_Play(ma_IDirectSoundBuffer* pThis, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) { return pThis->lpVtbl->Play(pThis, dwReserved1, dwPriority, dwFlags); }\nHRESULT ma_IDirectSoundBuffer_SetCurrentPosition(ma_IDirectSoundBuffer* pThis, DWORD dwNewPosition)                { return pThis->lpVtbl->SetCurrentPosition(pThis, dwNewPosition); }\nHRESULT ma_IDirectSoundBuffer_SetFormat(ma_IDirectSoundBuffer* pThis, const WAVEFORMATEX* pFormat)                 { return pThis->lpVtbl->SetFormat(pThis, pFormat); }\nHRESULT ma_IDirectSoundBuffer_SetVolume(ma_IDirectSoundBuffer* pThis, LONG volume)                                 { return pThis->lpVtbl->SetVolume(pThis, volume); }\nHRESULT ma_IDirectSoundBuffer_SetPan(ma_IDirectSoundBuffer* pThis, LONG pan)                                       { return pThis->lpVtbl->SetPan(pThis, pan); }\nHRESULT ma_IDirectSoundBuffer_SetFrequency(ma_IDirectSoundBuffer* pThis, DWORD dwFrequency)                        { return pThis->lpVtbl->SetFrequency(pThis, dwFrequency); }\nHRESULT ma_IDirectSoundBuffer_Stop(ma_IDirectSoundBuffer* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nHRESULT ma_IDirectSoundBuffer_Unlock(ma_IDirectSoundBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2) { return pThis->lpVtbl->Unlock(pThis, pAudioPtr1, dwAudioBytes1, pAudioPtr2, dwAudioBytes2); }\nHRESULT ma_IDirectSoundBuffer_Restore(ma_IDirectSoundBuffer* pThis)                                                { return pThis->lpVtbl->Restore(pThis); }\n\n\n/* IDirectSoundCapture */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundCapture* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundCapture* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundCapture* pThis);\n\n    /* IDirectSoundCapture */\n    HRESULT (STDMETHODCALLTYPE * CreateCaptureBuffer)(ma_IDirectSoundCapture* pThis, const MA_DSCBUFFERDESC* pDSCBufferDesc, ma_IDirectSoundCaptureBuffer** ppDSCBuffer, void* pUnkOuter);\n    HRESULT (STDMETHODCALLTYPE * GetCaps)            (ma_IDirectSoundCapture* pThis, MA_DSCCAPS* pDSCCaps);\n    HRESULT (STDMETHODCALLTYPE * Initialize)         (ma_IDirectSoundCapture* pThis, const GUID* pGuidDevice);\n} ma_IDirectSoundCaptureVtbl;\nstruct ma_IDirectSoundCapture\n{\n    ma_IDirectSoundCaptureVtbl* lpVtbl;\n};\nHRESULT ma_IDirectSoundCapture_QueryInterface(ma_IDirectSoundCapture* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IDirectSoundCapture_AddRef(ma_IDirectSoundCapture* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IDirectSoundCapture_Release(ma_IDirectSoundCapture* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IDirectSoundCapture_CreateCaptureBuffer(ma_IDirectSoundCapture* pThis, const MA_DSCBUFFERDESC* pDSCBufferDesc, ma_IDirectSoundCaptureBuffer** ppDSCBuffer, void* pUnkOuter) { return pThis->lpVtbl->CreateCaptureBuffer(pThis, pDSCBufferDesc, ppDSCBuffer, pUnkOuter); }\nHRESULT ma_IDirectSoundCapture_GetCaps            (ma_IDirectSoundCapture* pThis, MA_DSCCAPS* pDSCCaps)             { return pThis->lpVtbl->GetCaps(pThis, pDSCCaps); }\nHRESULT ma_IDirectSoundCapture_Initialize         (ma_IDirectSoundCapture* pThis, const GUID* pGuidDevice)           { return pThis->lpVtbl->Initialize(pThis, pGuidDevice); }\n\n\n/* IDirectSoundCaptureBuffer */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundCaptureBuffer* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundCaptureBuffer* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundCaptureBuffer* pThis);\n\n    /* IDirectSoundCaptureBuffer */\n    HRESULT (STDMETHODCALLTYPE * GetCaps)           (ma_IDirectSoundCaptureBuffer* pThis, MA_DSCBCAPS* pDSCBCaps);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPosition)(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pCapturePosition, DWORD* pReadPosition);\n    HRESULT (STDMETHODCALLTYPE * GetFormat)         (ma_IDirectSoundCaptureBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten);\n    HRESULT (STDMETHODCALLTYPE * GetStatus)         (ma_IDirectSoundCaptureBuffer* pThis, DWORD* pStatus);\n    HRESULT (STDMETHODCALLTYPE * Initialize)        (ma_IDirectSoundCaptureBuffer* pThis, ma_IDirectSoundCapture* pDirectSoundCapture, const MA_DSCBUFFERDESC* pDSCBufferDesc);\n    HRESULT (STDMETHODCALLTYPE * Lock)              (ma_IDirectSoundCaptureBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * Start)             (ma_IDirectSoundCaptureBuffer* pThis, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * Stop)              (ma_IDirectSoundCaptureBuffer* pThis);\n    HRESULT (STDMETHODCALLTYPE * Unlock)            (ma_IDirectSoundCaptureBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2);\n} ma_IDirectSoundCaptureBufferVtbl;\nstruct ma_IDirectSoundCaptureBuffer\n{\n    ma_IDirectSoundCaptureBufferVtbl* lpVtbl;\n};\nHRESULT ma_IDirectSoundCaptureBuffer_QueryInterface(ma_IDirectSoundCaptureBuffer* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IDirectSoundCaptureBuffer_AddRef(ma_IDirectSoundCaptureBuffer* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IDirectSoundCaptureBuffer_Release(ma_IDirectSoundCaptureBuffer* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IDirectSoundCaptureBuffer_GetCaps(ma_IDirectSoundCaptureBuffer* pThis, MA_DSCBCAPS* pDSCBCaps)                       { return pThis->lpVtbl->GetCaps(pThis, pDSCBCaps); }\nHRESULT ma_IDirectSoundCaptureBuffer_GetCurrentPosition(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pCapturePosition, DWORD* pReadPosition) { return pThis->lpVtbl->GetCurrentPosition(pThis, pCapturePosition, pReadPosition); }\nHRESULT ma_IDirectSoundCaptureBuffer_GetFormat(ma_IDirectSoundCaptureBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten) { return pThis->lpVtbl->GetFormat(pThis, pFormat, dwSizeAllocated, pSizeWritten); }\nHRESULT ma_IDirectSoundCaptureBuffer_GetStatus(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pStatus)                              { return pThis->lpVtbl->GetStatus(pThis, pStatus); }\nHRESULT ma_IDirectSoundCaptureBuffer_Initialize(ma_IDirectSoundCaptureBuffer* pThis, ma_IDirectSoundCapture* pDirectSoundCapture, const MA_DSCBUFFERDESC* pDSCBufferDesc) { return pThis->lpVtbl->Initialize(pThis, pDirectSoundCapture, pDSCBufferDesc); }\nHRESULT ma_IDirectSoundCaptureBuffer_Lock(ma_IDirectSoundCaptureBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags) { return pThis->lpVtbl->Lock(pThis, dwOffset, dwBytes, ppAudioPtr1, pAudioBytes1, ppAudioPtr2, pAudioBytes2, dwFlags); }\nHRESULT ma_IDirectSoundCaptureBuffer_Start(ma_IDirectSoundCaptureBuffer* pThis, DWORD dwFlags)                                   { return pThis->lpVtbl->Start(pThis, dwFlags); }\nHRESULT ma_IDirectSoundCaptureBuffer_Stop(ma_IDirectSoundCaptureBuffer* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nHRESULT ma_IDirectSoundCaptureBuffer_Unlock(ma_IDirectSoundCaptureBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2) { return pThis->lpVtbl->Unlock(pThis, pAudioPtr1, dwAudioBytes1, pAudioPtr2, dwAudioBytes2); }\n\n\n/* IDirectSoundNotify */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundNotify* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundNotify* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundNotify* pThis);\n\n    /* IDirectSoundNotify */\n    HRESULT (STDMETHODCALLTYPE * SetNotificationPositions)(ma_IDirectSoundNotify* pThis, DWORD dwPositionNotifies, const MA_DSBPOSITIONNOTIFY* pPositionNotifies);\n} ma_IDirectSoundNotifyVtbl;\nstruct ma_IDirectSoundNotify\n{\n    ma_IDirectSoundNotifyVtbl* lpVtbl;\n};\nHRESULT ma_IDirectSoundNotify_QueryInterface(ma_IDirectSoundNotify* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nULONG   ma_IDirectSoundNotify_AddRef(ma_IDirectSoundNotify* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nULONG   ma_IDirectSoundNotify_Release(ma_IDirectSoundNotify* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nHRESULT ma_IDirectSoundNotify_SetNotificationPositions(ma_IDirectSoundNotify* pThis, DWORD dwPositionNotifies, const MA_DSBPOSITIONNOTIFY* pPositionNotifies) { return pThis->lpVtbl->SetNotificationPositions(pThis, dwPositionNotifies, pPositionNotifies); }\n\n\ntypedef BOOL    (CALLBACK * ma_DSEnumCallbackAProc)             (LPGUID pDeviceGUID, LPCSTR pDeviceDescription, LPCSTR pModule, LPVOID pContext);\ntypedef HRESULT (WINAPI   * ma_DirectSoundCreateProc)           (const GUID* pcGuidDevice, ma_IDirectSound** ppDS8, LPUNKNOWN pUnkOuter);\ntypedef HRESULT (WINAPI   * ma_DirectSoundEnumerateAProc)       (ma_DSEnumCallbackAProc pDSEnumCallback, LPVOID pContext);\ntypedef HRESULT (WINAPI   * ma_DirectSoundCaptureCreateProc)    (const GUID* pcGuidDevice, ma_IDirectSoundCapture** ppDSC8, LPUNKNOWN pUnkOuter);\ntypedef HRESULT (WINAPI   * ma_DirectSoundCaptureEnumerateAProc)(ma_DSEnumCallbackAProc pDSEnumCallback, LPVOID pContext);\n\n\n/*\nRetrieves the channel count and channel map for the given speaker configuration. If the speaker configuration is unknown,\nthe channel count and channel map will be left unmodified.\n*/\nvoid ma_get_channels_from_speaker_config__dsound(DWORD speakerConfig, WORD* pChannelsOut, DWORD* pChannelMapOut)\n{\n    WORD  channels;\n    DWORD channelMap;\n\n    channels = 0;\n    if (pChannelsOut != NULL) {\n        channels = *pChannelsOut;\n    }\n\n    channelMap = 0;\n    if (pChannelMapOut != NULL) {\n        channelMap = *pChannelMapOut;\n    }\n\n    /*\n    The speaker configuration is a combination of speaker config and speaker geometry. The lower 8 bits is what we care about. The upper\n    16 bits is for the geometry.\n    */\n    switch ((BYTE)(speakerConfig)) {\n        case 1 /*DSSPEAKER_HEADPHONE*/:                          channels = 2; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break;\n        case 2 /*DSSPEAKER_MONO*/:                               channels = 1; channelMap = SPEAKER_FRONT_CENTER; break;\n        case 3 /*DSSPEAKER_QUAD*/:                               channels = 4; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break;\n        case 4 /*DSSPEAKER_STEREO*/:                             channels = 2; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break;\n        case 5 /*DSSPEAKER_SURROUND*/:                           channels = 4; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER; break;\n        case 6 /*DSSPEAKER_5POINT1_BACK*/ /*DSSPEAKER_5POINT1*/: channels = 6; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break;\n        case 7 /*DSSPEAKER_7POINT1_WIDE*/ /*DSSPEAKER_7POINT1*/: channels = 8; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER; break;\n        case 8 /*DSSPEAKER_7POINT1_SURROUND*/:                   channels = 8; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; break;\n        case 9 /*DSSPEAKER_5POINT1_SURROUND*/:                   channels = 6; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; break;\n        default: break;\n    }\n\n    if (pChannelsOut != NULL) {\n        *pChannelsOut = channels;\n    }\n\n    if (pChannelMapOut != NULL) {\n        *pChannelMapOut = channelMap;\n    }\n}\n\n\nma_result ma_context_create_IDirectSound__dsound(ma_context* pContext, ma_share_mode shareMode, const ma_device_id* pDeviceID, ma_IDirectSound** ppDirectSound)\n{\n    ma_IDirectSound* pDirectSound;\n    HWND hWnd;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppDirectSound != NULL);\n\n    *ppDirectSound = NULL;\n    pDirectSound = NULL;\n\n    if (FAILED(((ma_DirectSoundCreateProc)pContext->dsound.DirectSoundCreate)((pDeviceID == NULL) ? NULL : (const GUID*)pDeviceID->dsound, &pDirectSound, NULL))) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[DirectSound] DirectSoundCreate() failed for playback device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    /* The cooperative level must be set before doing anything else. */\n    hWnd = ((MA_PFN_GetForegroundWindow)pContext->win32.GetForegroundWindow)();\n    if (hWnd == NULL) {\n        hWnd = ((MA_PFN_GetDesktopWindow)pContext->win32.GetDesktopWindow)();\n    }\n    if (FAILED(ma_IDirectSound_SetCooperativeLevel(pDirectSound, hWnd, (shareMode == ma_share_mode_exclusive) ? MA_DSSCL_EXCLUSIVE : MA_DSSCL_PRIORITY))) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_SetCooperateiveLevel() failed for playback device.\", MA_SHARE_MODE_NOT_SUPPORTED);\n    }\n\n    *ppDirectSound = pDirectSound;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_create_IDirectSoundCapture__dsound(ma_context* pContext, ma_share_mode shareMode, const ma_device_id* pDeviceID, ma_IDirectSoundCapture** ppDirectSoundCapture)\n{\n    ma_IDirectSoundCapture* pDirectSoundCapture;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppDirectSoundCapture != NULL);\n\n    /* DirectSound does not support exclusive mode for capture. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    *ppDirectSoundCapture = NULL;\n    pDirectSoundCapture = NULL;\n\n    if (FAILED(((ma_DirectSoundCaptureCreateProc)pContext->dsound.DirectSoundCaptureCreate)((pDeviceID == NULL) ? NULL : (const GUID*)pDeviceID->dsound, &pDirectSoundCapture, NULL))) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[DirectSound] DirectSoundCaptureCreate() failed for capture device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    *ppDirectSoundCapture = pDirectSoundCapture;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_format_info_for_IDirectSoundCapture__dsound(ma_context* pContext, ma_IDirectSoundCapture* pDirectSoundCapture, WORD* pChannels, WORD* pBitsPerSample, DWORD* pSampleRate)\n{\n    MA_DSCCAPS caps;\n    WORD bitsPerSample;\n    DWORD sampleRate;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pDirectSoundCapture != NULL);\n\n    if (pChannels) {\n        *pChannels = 0;\n    }\n    if (pBitsPerSample) {\n        *pBitsPerSample = 0;\n    }\n    if (pSampleRate) {\n        *pSampleRate = 0;\n    }\n\n    ma_zero_object(&caps);\n    caps.dwSize = sizeof(caps);\n    if (FAILED(ma_IDirectSoundCapture_GetCaps(pDirectSoundCapture, &caps))) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCapture_GetCaps() failed for capture device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    if (pChannels) {\n        *pChannels = (WORD)caps.dwChannels;\n    }\n\n    /* The device can support multiple formats. We just go through the different formats in order of priority and pick the first one. This the same type of system as the WinMM backend. */\n    bitsPerSample = 16;\n    sampleRate = 48000;\n\n    if (caps.dwChannels == 1) {\n        if ((caps.dwFormats & WAVE_FORMAT_48M16) != 0) {\n            sampleRate = 48000;\n        } else if ((caps.dwFormats & WAVE_FORMAT_44M16) != 0) {\n            sampleRate = 44100;\n        } else if ((caps.dwFormats & WAVE_FORMAT_2M16) != 0) {\n            sampleRate = 22050;\n        } else if ((caps.dwFormats & WAVE_FORMAT_1M16) != 0) {\n            sampleRate = 11025;\n        } else if ((caps.dwFormats & WAVE_FORMAT_96M16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((caps.dwFormats & WAVE_FORMAT_48M08) != 0) {\n                sampleRate = 48000;\n            } else if ((caps.dwFormats & WAVE_FORMAT_44M08) != 0) {\n                sampleRate = 44100;\n            } else if ((caps.dwFormats & WAVE_FORMAT_2M08) != 0) {\n                sampleRate = 22050;\n            } else if ((caps.dwFormats & WAVE_FORMAT_1M08) != 0) {\n                sampleRate = 11025;\n            } else if ((caps.dwFormats & WAVE_FORMAT_96M08) != 0) {\n                sampleRate = 96000;\n            } else {\n                bitsPerSample = 16;  /* Didn't find it. Just fall back to 16-bit. */\n            }\n        }\n    } else if (caps.dwChannels == 2) {\n        if ((caps.dwFormats & WAVE_FORMAT_48S16) != 0) {\n            sampleRate = 48000;\n        } else if ((caps.dwFormats & WAVE_FORMAT_44S16) != 0) {\n            sampleRate = 44100;\n        } else if ((caps.dwFormats & WAVE_FORMAT_2S16) != 0) {\n            sampleRate = 22050;\n        } else if ((caps.dwFormats & WAVE_FORMAT_1S16) != 0) {\n            sampleRate = 11025;\n        } else if ((caps.dwFormats & WAVE_FORMAT_96S16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((caps.dwFormats & WAVE_FORMAT_48S08) != 0) {\n                sampleRate = 48000;\n            } else if ((caps.dwFormats & WAVE_FORMAT_44S08) != 0) {\n                sampleRate = 44100;\n            } else if ((caps.dwFormats & WAVE_FORMAT_2S08) != 0) {\n                sampleRate = 22050;\n            } else if ((caps.dwFormats & WAVE_FORMAT_1S08) != 0) {\n                sampleRate = 11025;\n            } else if ((caps.dwFormats & WAVE_FORMAT_96S08) != 0) {\n                sampleRate = 96000;\n            } else {\n                bitsPerSample = 16;  /* Didn't find it. Just fall back to 16-bit. */\n            }\n        }\n    }\n\n    if (pBitsPerSample) {\n        *pBitsPerSample = bitsPerSample;\n    }\n    if (pSampleRate) {\n        *pSampleRate = sampleRate;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_bool32 ma_context_is_device_id_equal__dsound(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return memcmp(pID0->dsound, pID1->dsound, sizeof(pID0->dsound)) == 0;\n}\n\n\ntypedef struct\n{\n    ma_context* pContext;\n    ma_device_type deviceType;\n    ma_enum_devices_callback_proc callback;\n    void* pUserData;\n    ma_bool32 terminated;\n} ma_context_enumerate_devices_callback_data__dsound;\n\nBOOL CALLBACK ma_context_enumerate_devices_callback__dsound(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)\n{\n    ma_context_enumerate_devices_callback_data__dsound* pData = (ma_context_enumerate_devices_callback_data__dsound*)lpContext;\n    ma_device_info deviceInfo;    \n\n    ma_zero_object(&deviceInfo);\n\n    /* ID. */\n    if (lpGuid != NULL) {\n        ma_copy_memory(deviceInfo.id.dsound, lpGuid, 16);\n    } else {\n        ma_zero_memory(deviceInfo.id.dsound, 16);\n    }\n\n    /* Name / Description */\n    ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), lpcstrDescription, (size_t)-1);\n\n\n    /* Call the callback function, but make sure we stop enumerating if the callee requested so. */\n    ma_assert(pData != NULL);\n    pData->terminated = !pData->callback(pData->pContext, pData->deviceType, &deviceInfo, pData->pUserData);\n    if (pData->terminated) {\n        return FALSE;   /* Stop enumeration. */\n    } else {\n        return TRUE;    /* Continue enumeration. */\n    }\n\n    (void)lpcstrModule;\n}\n\nma_result ma_context_enumerate_devices__dsound(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_context_enumerate_devices_callback_data__dsound data;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    data.pContext = pContext;\n    data.callback = callback;\n    data.pUserData = pUserData;\n    data.terminated = MA_FALSE;\n\n    /* Playback. */\n    if (!data.terminated) {\n        data.deviceType = ma_device_type_playback;\n        ((ma_DirectSoundEnumerateAProc)pContext->dsound.DirectSoundEnumerateA)(ma_context_enumerate_devices_callback__dsound, &data);\n    }\n\n    /* Capture. */\n    if (!data.terminated) {\n        data.deviceType = ma_device_type_capture;\n        ((ma_DirectSoundCaptureEnumerateAProc)pContext->dsound.DirectSoundCaptureEnumerateA)(ma_context_enumerate_devices_callback__dsound, &data);\n    }\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    const ma_device_id* pDeviceID;\n    ma_device_info* pDeviceInfo;\n    ma_bool32 found;\n} ma_context_get_device_info_callback_data__dsound;\n\nBOOL CALLBACK ma_context_get_device_info_callback__dsound(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)\n{\n    ma_context_get_device_info_callback_data__dsound* pData = (ma_context_get_device_info_callback_data__dsound*)lpContext;\n    ma_assert(pData != NULL);\n\n    if ((pData->pDeviceID == NULL || ma_is_guid_equal(pData->pDeviceID->dsound, &MA_GUID_NULL)) && (lpGuid == NULL || ma_is_guid_equal(lpGuid, &MA_GUID_NULL))) {\n        /* Default device. */\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1);\n        pData->found = MA_TRUE;\n        return FALSE;   /* Stop enumeration. */\n    } else {\n        /* Not the default device. */\n        if (lpGuid != NULL) {\n            if (memcmp(pData->pDeviceID->dsound, lpGuid, sizeof(pData->pDeviceID->dsound)) == 0) {\n                ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1);\n                pData->found = MA_TRUE;\n                return FALSE;   /* Stop enumeration. */\n            }\n        }\n    }\n\n    (void)lpcstrModule;\n    return TRUE;\n}\n\nma_result ma_context_get_device_info__dsound(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    /* Exclusive mode and capture not supported with DirectSound. */\n    if (deviceType == ma_device_type_capture && shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if (pDeviceID != NULL) {\n        ma_context_get_device_info_callback_data__dsound data;\n\n        /* ID. */\n        ma_copy_memory(pDeviceInfo->id.dsound, pDeviceID->dsound, 16);\n\n        /* Name / Description. This is retrieved by enumerating over each device until we find that one that matches the input ID. */\n        data.pDeviceID = pDeviceID;\n        data.pDeviceInfo = pDeviceInfo;\n        data.found = MA_FALSE;\n        if (deviceType == ma_device_type_playback) {\n            ((ma_DirectSoundEnumerateAProc)pContext->dsound.DirectSoundEnumerateA)(ma_context_get_device_info_callback__dsound, &data);\n        } else {\n            ((ma_DirectSoundCaptureEnumerateAProc)pContext->dsound.DirectSoundCaptureEnumerateA)(ma_context_get_device_info_callback__dsound, &data);\n        }\n\n        if (!data.found) {\n            return MA_NO_DEVICE;\n        }\n    } else {\n        /* I don't think there's a way to get the name of the default device with DirectSound. In this case we just need to use defaults. */\n\n        /* ID */\n        ma_zero_memory(pDeviceInfo->id.dsound, 16);\n\n        /* Name / Description */\n        if (deviceType == ma_device_type_playback) {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        } else {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        }\n    }\n\n    /* Retrieving detailed information is slightly different depending on the device type. */\n    if (deviceType == ma_device_type_playback) {\n        /* Playback. */\n        ma_IDirectSound* pDirectSound;\n        ma_result result;\n        MA_DSCAPS caps;\n        ma_uint32 iFormat;\n\n        result = ma_context_create_IDirectSound__dsound(pContext, shareMode, pDeviceID, &pDirectSound);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        ma_zero_object(&caps);\n        caps.dwSize = sizeof(caps);\n        if (FAILED(ma_IDirectSound_GetCaps(pDirectSound, &caps))) {\n            return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_GetCaps() failed for playback device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) {\n            /* It supports at least stereo, but could support more. */\n            WORD channels = 2;\n\n            /* Look at the speaker configuration to get a better idea on the channel count. */\n            DWORD speakerConfig;\n            if (SUCCEEDED(ma_IDirectSound_GetSpeakerConfig(pDirectSound, &speakerConfig))) {\n                ma_get_channels_from_speaker_config__dsound(speakerConfig, &channels, NULL);\n            }\n\n            pDeviceInfo->minChannels = channels;\n            pDeviceInfo->maxChannels = channels;\n        } else {\n            /* It does not support stereo, which means we are stuck with mono. */\n            pDeviceInfo->minChannels = 1;\n            pDeviceInfo->maxChannels = 1;\n        }\n\n        /* Sample rate. */\n        if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) {\n            pDeviceInfo->minSampleRate = caps.dwMinSecondarySampleRate;\n            pDeviceInfo->maxSampleRate = caps.dwMaxSecondarySampleRate;\n\n            /*\n            On my machine the min and max sample rates can return 100 and 200000 respectively. I'd rather these be within\n            the range of our standard sample rates so I'm clamping.\n            */\n            if (caps.dwMinSecondarySampleRate < MA_MIN_SAMPLE_RATE && caps.dwMaxSecondarySampleRate >= MA_MIN_SAMPLE_RATE) {\n                pDeviceInfo->minSampleRate = MA_MIN_SAMPLE_RATE;\n            }\n            if (caps.dwMaxSecondarySampleRate > MA_MAX_SAMPLE_RATE && caps.dwMinSecondarySampleRate <= MA_MAX_SAMPLE_RATE) {\n                pDeviceInfo->maxSampleRate = MA_MAX_SAMPLE_RATE;\n            }\n        } else {\n            /* Only supports a single sample rate. Set both min an max to the same thing. Do not clamp within the standard rates. */\n            pDeviceInfo->minSampleRate = caps.dwMaxSecondarySampleRate;\n            pDeviceInfo->maxSampleRate = caps.dwMaxSecondarySampleRate;\n        }\n\n        /* DirectSound can support all formats. */\n        pDeviceInfo->formatCount = ma_format_count - 1;    /* Minus one because we don't want to include ma_format_unknown. */\n        for (iFormat = 0; iFormat < pDeviceInfo->formatCount; ++iFormat) {\n            pDeviceInfo->formats[iFormat] = (ma_format)(iFormat + 1);  /* +1 to skip over ma_format_unknown. */\n        }\n\n        ma_IDirectSound_Release(pDirectSound);\n    } else {\n        /*\n        Capture. This is a little different to playback due to the say the supported formats are reported. Technically capture\n        devices can support a number of different formats, but for simplicity and consistency with ma_device_init() I'm just\n        reporting the best format.\n        */\n        ma_IDirectSoundCapture* pDirectSoundCapture;\n        ma_result result;\n        WORD channels;\n        WORD bitsPerSample;\n        DWORD sampleRate;\n\n        result = ma_context_create_IDirectSoundCapture__dsound(pContext, shareMode, pDeviceID, &pDirectSoundCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pContext, pDirectSoundCapture, &channels, &bitsPerSample, &sampleRate);\n        if (result != MA_SUCCESS) {\n            ma_IDirectSoundCapture_Release(pDirectSoundCapture);\n            return result;\n        }\n\n        pDeviceInfo->minChannels = channels;\n        pDeviceInfo->maxChannels = channels;\n        pDeviceInfo->minSampleRate = sampleRate;\n        pDeviceInfo->maxSampleRate = sampleRate;\n        pDeviceInfo->formatCount = 1;\n        if (bitsPerSample == 8) {\n            pDeviceInfo->formats[0] = ma_format_u8;\n        } else if (bitsPerSample == 16) {\n            pDeviceInfo->formats[0] = ma_format_s16;\n        } else if (bitsPerSample == 24) {\n            pDeviceInfo->formats[0] = ma_format_s24;\n        } else if (bitsPerSample == 32) {\n            pDeviceInfo->formats[0] = ma_format_s32;\n        } else {\n            ma_IDirectSoundCapture_Release(pDirectSoundCapture);\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        ma_IDirectSoundCapture_Release(pDirectSoundCapture);\n    }\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    ma_uint32 deviceCount;\n    ma_uint32 infoCount;\n    ma_device_info* pInfo;\n} ma_device_enum_data__dsound;\n\nBOOL CALLBACK ma_enum_devices_callback__dsound(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)\n{\n    ma_device_enum_data__dsound* pData = (ma_device_enum_data__dsound*)lpContext;\n    ma_assert(pData != NULL);\n\n    if (pData->pInfo != NULL) {\n        if (pData->infoCount > 0) {\n            ma_zero_object(pData->pInfo);\n            ma_strncpy_s(pData->pInfo->name, sizeof(pData->pInfo->name), lpcstrDescription, (size_t)-1);\n\n            if (lpGuid != NULL) {\n                ma_copy_memory(pData->pInfo->id.dsound, lpGuid, 16);\n            } else {\n                ma_zero_memory(pData->pInfo->id.dsound, 16);\n            }\n\n            pData->pInfo += 1;\n            pData->infoCount -= 1;\n            pData->deviceCount += 1;\n        }\n    } else {\n        pData->deviceCount += 1;\n    }\n\n    (void)lpcstrModule;\n    return TRUE;\n}\n\nvoid ma_device_uninit__dsound(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->dsound.pCaptureBuffer != NULL) {\n        ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n    }\n    if (pDevice->dsound.pCapture != NULL) {\n        ma_IDirectSoundCapture_Release((ma_IDirectSoundCapture*)pDevice->dsound.pCapture);\n    }\n\n    if (pDevice->dsound.pPlaybackBuffer != NULL) {\n        ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer);\n    }\n    if (pDevice->dsound.pPlaybackPrimaryBuffer != NULL) {\n        ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer);\n    }\n    if (pDevice->dsound.pPlayback != NULL) {\n        ma_IDirectSound_Release((ma_IDirectSound*)pDevice->dsound.pPlayback);\n    }\n}\n\nma_result ma_config_to_WAVEFORMATEXTENSIBLE(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* pChannelMap, WAVEFORMATEXTENSIBLE* pWF)\n{\n    GUID subformat;\n\n    switch (format)\n    {\n        case ma_format_u8:\n        case ma_format_s16:\n        case ma_format_s24:\n        /*case ma_format_s24_32:*/\n        case ma_format_s32:\n        {\n            subformat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM;\n        } break;\n\n        case ma_format_f32:\n        {\n            subformat = MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;\n        } break;\n\n        default:\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    ma_zero_object(pWF);\n    pWF->Format.cbSize               = sizeof(*pWF);\n    pWF->Format.wFormatTag           = WAVE_FORMAT_EXTENSIBLE;\n    pWF->Format.nChannels            = (WORD)channels;\n    pWF->Format.nSamplesPerSec       = (DWORD)sampleRate;\n    pWF->Format.wBitsPerSample       = (WORD)ma_get_bytes_per_sample(format)*8;\n    pWF->Format.nBlockAlign          = (pWF->Format.nChannels * pWF->Format.wBitsPerSample) / 8;\n    pWF->Format.nAvgBytesPerSec      = pWF->Format.nBlockAlign * pWF->Format.nSamplesPerSec;\n    pWF->Samples.wValidBitsPerSample = pWF->Format.wBitsPerSample;\n    pWF->dwChannelMask               = ma_channel_map_to_channel_mask__win32(pChannelMap, channels);\n    pWF->SubFormat                   = subformat;\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__dsound(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_uint32 bufferSizeInMilliseconds;\n\n    ma_assert(pDevice != NULL);\n    ma_zero_object(&pDevice->dsound);\n\n    bufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;\n    if (bufferSizeInMilliseconds == 0) {\n        bufferSizeInMilliseconds = ma_calculate_buffer_size_in_milliseconds_from_frames(pConfig->bufferSizeInFrames, pConfig->sampleRate);\n    }\n    \n    /* DirectSound should use a latency of about 20ms per period for low latency mode. */\n    if (pDevice->usingDefaultBufferSize) {\n        if (pConfig->performanceProfile == ma_performance_profile_low_latency) {\n            bufferSizeInMilliseconds =  20 * pConfig->periods;\n        } else {\n            bufferSizeInMilliseconds = 200 * pConfig->periods;\n        }\n    }\n\n    /* DirectSound breaks down with tiny buffer sizes (bad glitching and silent output). I am therefore restricting the size of the buffer to a minimum of 20 milliseconds. */\n    if ((bufferSizeInMilliseconds/pConfig->periods) < 20) {\n        bufferSizeInMilliseconds = pConfig->periods * 20;\n    }\n\n    /*\n    Unfortunately DirectSound uses different APIs and data structures for playback and catpure devices. We need to initialize\n    the capture device first because we'll want to match it's buffer size and period count on the playback side if we're using\n    full-duplex mode.\n    */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        WAVEFORMATEXTENSIBLE wf;\n        MA_DSCBUFFERDESC descDS;\n        ma_uint32 bufferSizeInFrames;\n        char rawdata[1024]; /* <-- Ugly hack to avoid a malloc() due to a crappy DirectSound API. */\n        WAVEFORMATEXTENSIBLE* pActualFormat;\n\n        result = ma_config_to_WAVEFORMATEXTENSIBLE(pConfig->capture.format, pConfig->capture.channels, pConfig->sampleRate, pConfig->capture.channelMap, &wf);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_context_create_IDirectSoundCapture__dsound(pContext, pConfig->capture.shareMode, pConfig->capture.pDeviceID, (ma_IDirectSoundCapture**)&pDevice->dsound.pCapture);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__dsound(pDevice);\n            return result;\n        }\n\n        result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pContext, (ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &wf.Format.nChannels, &wf.Format.wBitsPerSample, &wf.Format.nSamplesPerSec);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__dsound(pDevice);\n            return result;\n        }\n\n        wf.Format.nBlockAlign          = (wf.Format.nChannels * wf.Format.wBitsPerSample) / 8;\n        wf.Format.nAvgBytesPerSec      = wf.Format.nBlockAlign * wf.Format.nSamplesPerSec;\n        wf.Samples.wValidBitsPerSample = wf.Format.wBitsPerSample;\n        wf.SubFormat                   = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM;\n\n        /* The size of the buffer must be a clean multiple of the period count. */\n        bufferSizeInFrames = (ma_calculate_buffer_size_in_frames_from_milliseconds(bufferSizeInMilliseconds, wf.Format.nSamplesPerSec) / pConfig->periods) * pConfig->periods;\n\n        ma_zero_object(&descDS);\n        descDS.dwSize = sizeof(descDS);\n        descDS.dwFlags = 0;\n        descDS.dwBufferBytes = bufferSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, wf.Format.nChannels);\n        descDS.lpwfxFormat = (WAVEFORMATEX*)&wf;\n        if (FAILED(ma_IDirectSoundCapture_CreateCaptureBuffer((ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &descDS, (ma_IDirectSoundCaptureBuffer**)&pDevice->dsound.pCaptureBuffer, NULL))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCapture_CreateCaptureBuffer() failed for capture device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        /* Get the _actual_ properties of the buffer. */\n        pActualFormat = (WAVEFORMATEXTENSIBLE*)rawdata;\n        if (FAILED(ma_IDirectSoundCaptureBuffer_GetFormat((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, (WAVEFORMATEX*)pActualFormat, sizeof(rawdata), NULL))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to retrieve the actual format of the capture device's buffer.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n\n        pDevice->capture.internalFormat = ma_format_from_WAVEFORMATEX((WAVEFORMATEX*)pActualFormat);\n        pDevice->capture.internalChannels = pActualFormat->Format.nChannels;\n        pDevice->capture.internalSampleRate = pActualFormat->Format.nSamplesPerSec;\n\n        /* Get the internal channel map based on the channel mask. */\n        if (pActualFormat->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n            ma_channel_mask_to_channel_map__win32(pActualFormat->dwChannelMask, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n        } else {\n            ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n        }\n\n        /*\n        After getting the actual format the size of the buffer in frames may have actually changed. However, we want this to be as close to what the\n        user has asked for as possible, so let's go ahead and release the old capture buffer and create a new one in this case.\n        */\n        if (bufferSizeInFrames != (descDS.dwBufferBytes / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels))) {\n            descDS.dwBufferBytes = bufferSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, wf.Format.nChannels);\n            ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n\n            if (FAILED(ma_IDirectSoundCapture_CreateCaptureBuffer((ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &descDS, (ma_IDirectSoundCaptureBuffer**)&pDevice->dsound.pCaptureBuffer, NULL))) {\n                ma_device_uninit__dsound(pDevice);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Second attempt at IDirectSoundCapture_CreateCaptureBuffer() failed for capture device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n            }\n        }\n\n        /* DirectSound should give us a buffer exactly the size we asked for. */\n        pDevice->capture.internalBufferSizeInFrames = bufferSizeInFrames;\n        pDevice->capture.internalPeriods            = pConfig->periods;\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        WAVEFORMATEXTENSIBLE wf;\n        MA_DSBUFFERDESC descDSPrimary;\n        MA_DSCAPS caps;\n        char rawdata[1024]; /* <-- Ugly hack to avoid a malloc() due to a crappy DirectSound API. */\n        WAVEFORMATEXTENSIBLE* pActualFormat;\n        ma_uint32 bufferSizeInFrames;\n        MA_DSBUFFERDESC descDS;\n\n        result = ma_config_to_WAVEFORMATEXTENSIBLE(pConfig->playback.format, pConfig->playback.channels, pConfig->sampleRate, pConfig->playback.channelMap, &wf);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_context_create_IDirectSound__dsound(pContext, pConfig->playback.shareMode, pConfig->playback.pDeviceID, (ma_IDirectSound**)&pDevice->dsound.pPlayback);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__dsound(pDevice);\n            return result;\n        }\n\n        ma_zero_object(&descDSPrimary);\n        descDSPrimary.dwSize  = sizeof(MA_DSBUFFERDESC);\n        descDSPrimary.dwFlags = MA_DSBCAPS_PRIMARYBUFFER | MA_DSBCAPS_CTRLVOLUME;\n        if (FAILED(ma_IDirectSound_CreateSoundBuffer((ma_IDirectSound*)pDevice->dsound.pPlayback, &descDSPrimary, (ma_IDirectSoundBuffer**)&pDevice->dsound.pPlaybackPrimaryBuffer, NULL))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_CreateSoundBuffer() failed for playback device's primary buffer.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n\n        /* We may want to make some adjustments to the format if we are using defaults. */\n        ma_zero_object(&caps);\n        caps.dwSize = sizeof(caps);\n        if (FAILED(ma_IDirectSound_GetCaps((ma_IDirectSound*)pDevice->dsound.pPlayback, &caps))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_GetCaps() failed for playback device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (pDevice->playback.usingDefaultChannels) {\n            if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) {\n                DWORD speakerConfig;\n\n                /* It supports at least stereo, but could support more. */\n                wf.Format.nChannels = 2;\n\n                /* Look at the speaker configuration to get a better idea on the channel count. */\n                if (SUCCEEDED(ma_IDirectSound_GetSpeakerConfig((ma_IDirectSound*)pDevice->dsound.pPlayback, &speakerConfig))) {\n                    ma_get_channels_from_speaker_config__dsound(speakerConfig, &wf.Format.nChannels, &wf.dwChannelMask);\n                }\n            } else {\n                /* It does not support stereo, which means we are stuck with mono. */\n                wf.Format.nChannels = 1;\n            }\n        }\n\n        if (pDevice->usingDefaultSampleRate) {\n            /* We base the sample rate on the values returned by GetCaps(). */\n            if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) {\n                wf.Format.nSamplesPerSec = ma_get_best_sample_rate_within_range(caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate);\n            } else {\n                wf.Format.nSamplesPerSec = caps.dwMaxSecondarySampleRate;\n            }\n        }\n\n        wf.Format.nBlockAlign     = (wf.Format.nChannels * wf.Format.wBitsPerSample) / 8;\n        wf.Format.nAvgBytesPerSec = wf.Format.nBlockAlign * wf.Format.nSamplesPerSec;\n\n        /*\n        From MSDN:\n        \n        The method succeeds even if the hardware does not support the requested format; DirectSound sets the buffer to the closest\n        supported format. To determine whether this has happened, an application can call the GetFormat method for the primary buffer\n        and compare the result with the format that was requested with the SetFormat method.\n        */\n        if (FAILED(ma_IDirectSoundBuffer_SetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (WAVEFORMATEX*)&wf))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to set format of playback device's primary buffer.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n\n        /* Get the _actual_ properties of the buffer. */\n        pActualFormat = (WAVEFORMATEXTENSIBLE*)rawdata;\n        if (FAILED(ma_IDirectSoundBuffer_GetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (WAVEFORMATEX*)pActualFormat, sizeof(rawdata), NULL))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to retrieve the actual format of the playback device's primary buffer.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n\n        pDevice->playback.internalFormat = ma_format_from_WAVEFORMATEX((WAVEFORMATEX*)pActualFormat);\n        pDevice->playback.internalChannels = pActualFormat->Format.nChannels;\n        pDevice->playback.internalSampleRate = pActualFormat->Format.nSamplesPerSec;\n\n        /* Get the internal channel map based on the channel mask. */\n        if (pActualFormat->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n            ma_channel_mask_to_channel_map__win32(pActualFormat->dwChannelMask, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n        } else {\n            ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n        }\n\n        /* The size of the buffer must be a clean multiple of the period count. */\n        bufferSizeInFrames = (ma_calculate_buffer_size_in_frames_from_milliseconds(bufferSizeInMilliseconds, pDevice->playback.internalSampleRate) / pConfig->periods) * pConfig->periods;\n\n        /*\n        Meaning of dwFlags (from MSDN):\n        \n        DSBCAPS_CTRLPOSITIONNOTIFY\n          The buffer has position notification capability.\n        \n        DSBCAPS_GLOBALFOCUS\n          With this flag set, an application using DirectSound can continue to play its buffers if the user switches focus to\n          another application, even if the new application uses DirectSound.\n        \n        DSBCAPS_GETCURRENTPOSITION2\n          In the first version of DirectSound, the play cursor was significantly ahead of the actual playing sound on emulated\n          sound cards; it was directly behind the write cursor. Now, if the DSBCAPS_GETCURRENTPOSITION2 flag is specified, the\n          application can get a more accurate play cursor.\n        */\n        ma_zero_object(&descDS);\n        descDS.dwSize = sizeof(descDS);\n        descDS.dwFlags = MA_DSBCAPS_CTRLPOSITIONNOTIFY | MA_DSBCAPS_GLOBALFOCUS | MA_DSBCAPS_GETCURRENTPOSITION2;\n        descDS.dwBufferBytes = bufferSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n        descDS.lpwfxFormat = (WAVEFORMATEX*)&wf;\n        if (FAILED(ma_IDirectSound_CreateSoundBuffer((ma_IDirectSound*)pDevice->dsound.pPlayback, &descDS, (ma_IDirectSoundBuffer**)&pDevice->dsound.pPlaybackBuffer, NULL))) {\n            ma_device_uninit__dsound(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_CreateSoundBuffer() failed for playback device's secondary buffer.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        /* DirectSound should give us a buffer exactly the size we asked for. */\n        pDevice->playback.internalBufferSizeInFrames = bufferSizeInFrames;\n        pDevice->playback.internalPeriods            = pConfig->periods;\n    }\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\n\nma_result ma_device_main_loop__dsound(ma_device* pDevice)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 bpfCapture  = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    ma_uint32 bpfPlayback = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    HRESULT hr;\n    DWORD lockOffsetInBytesCapture;\n    DWORD lockSizeInBytesCapture;\n    DWORD mappedSizeInBytesCapture;\n    void* pMappedBufferCapture;\n    DWORD lockOffsetInBytesPlayback;\n    DWORD lockSizeInBytesPlayback;\n    DWORD mappedSizeInBytesPlayback;\n    void* pMappedBufferPlayback;\n    DWORD prevReadCursorInBytesCapture = 0;\n    DWORD prevPlayCursorInBytesPlayback = 0;\n    ma_bool32 physicalPlayCursorLoopFlagPlayback = 0;\n    DWORD virtualWriteCursorInBytesPlayback = 0;\n    ma_bool32 virtualWriteCursorLoopFlagPlayback = 0;\n    ma_bool32 isPlaybackDeviceStarted = MA_FALSE;\n    ma_uint32 framesWrittenToPlaybackDevice = 0;   /* For knowing whether or not the playback device needs to be started. */\n    ma_uint32 waitTimeInMilliseconds = 1;\n\n    ma_assert(pDevice != NULL);\n\n    /* The first thing to do is start the capture device. The playback device is only started after the first period is written. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (FAILED(ma_IDirectSoundCaptureBuffer_Start((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, MA_DSCBSTART_LOOPING))) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCaptureBuffer_Start() failed.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n    }\n    \n    while (ma_device__get_state(pDevice) == MA_STATE_STARTED) {\n        switch (pDevice->type)\n        {\n            case ma_device_type_duplex:\n            {\n                DWORD physicalCaptureCursorInBytes;\n                DWORD physicalReadCursorInBytes;\n                if (FAILED(ma_IDirectSoundCaptureBuffer_GetCurrentPosition((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, &physicalCaptureCursorInBytes, &physicalReadCursorInBytes))) {\n                    return MA_ERROR;\n                }\n\n                /* If nothing is available we just sleep for a bit and return from this iteration. */\n                if (physicalReadCursorInBytes == prevReadCursorInBytesCapture) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue; /* Nothing is available in the capture buffer. */\n                }\n\n                /*\n                The current position has moved. We need to map all of the captured samples and write them to the playback device, making sure\n                we don't return until every frame has been copied over.\n                */\n                if (prevReadCursorInBytesCapture < physicalReadCursorInBytes) {\n                    /* The capture position has not looped. This is the simple case. */\n                    lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                    lockSizeInBytesCapture   = (physicalReadCursorInBytes - prevReadCursorInBytesCapture);\n                } else {\n                    /*\n                    The capture position has looped. This is the more complex case. Map to the end of the buffer. If this does not return anything,\n                    do it again from the start.\n                    */\n                    if (prevReadCursorInBytesCapture < pDevice->capture.internalBufferSizeInFrames*bpfCapture) {\n                        /* Lock up to the end of the buffer. */\n                        lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                        lockSizeInBytesCapture   = (pDevice->capture.internalBufferSizeInFrames*bpfCapture) - prevReadCursorInBytesCapture;\n                    } else {\n                        /* Lock starting from the start of the buffer. */\n                        lockOffsetInBytesCapture = 0;\n                        lockSizeInBytesCapture   = physicalReadCursorInBytes;\n                    }\n                }\n\n                if (lockSizeInBytesCapture == 0) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue; /* Nothing is available in the capture buffer. */\n                }\n\n                hr = ma_IDirectSoundCaptureBuffer_Lock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, lockOffsetInBytesCapture, lockSizeInBytesCapture, &pMappedBufferCapture, &mappedSizeInBytesCapture, NULL, NULL, 0);\n                if (FAILED(hr)) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from capture device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                }\n\n\n                /* At this point we have some input data that we need to output. We do not return until every mapped frame of the input data is written to the playback device. */\n                pDevice->capture._dspFrameCount = mappedSizeInBytesCapture / bpfCapture;\n                pDevice->capture._dspFrames     = (const ma_uint8*)pMappedBufferCapture;\n                for (;;) {  /* Keep writing to the playback device. */\n                    ma_uint8  inputFramesInExternalFormat[4096];\n                    ma_uint32 inputFramesInExternalFormatCap = sizeof(inputFramesInExternalFormat) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n                    ma_uint32 inputFramesInExternalFormatCount;\n                    ma_uint8  outputFramesInExternalFormat[4096];\n                    ma_uint32 outputFramesInExternalFormatCap = sizeof(outputFramesInExternalFormat) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n\n                    inputFramesInExternalFormatCount = (ma_uint32)ma_pcm_converter_read(&pDevice->capture.converter, inputFramesInExternalFormat, ma_min(inputFramesInExternalFormatCap, outputFramesInExternalFormatCap));\n                    if (inputFramesInExternalFormatCount == 0) {\n                        break;  /* No more input data. */\n                    }\n\n                    pDevice->onData(pDevice, outputFramesInExternalFormat, inputFramesInExternalFormat, inputFramesInExternalFormatCount);\n\n                    /* At this point we have input and output data in external format. All we need to do now is convert it to the output format. This may take a few passes. */\n                    pDevice->playback._dspFrameCount = inputFramesInExternalFormatCount;\n                    pDevice->playback._dspFrames     = (const ma_uint8*)outputFramesInExternalFormat;\n                    for (;;) {\n                        ma_uint32 framesWrittenThisIteration;\n                        DWORD physicalPlayCursorInBytes;\n                        DWORD physicalWriteCursorInBytes;\n                        DWORD availableBytesPlayback;\n                        DWORD silentPaddingInBytes = 0; /* <-- Must be initialized to 0. */\n\n                        /* We need the physical play and write cursors. */\n                        if (FAILED(ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes))) {\n                            break;\n                        }\n\n                        if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) {\n                            physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback;\n                        }\n                        prevPlayCursorInBytesPlayback  = physicalPlayCursorInBytes;\n\n                        /* If there's any bytes available for writing we can do that now. The space between the virtual cursor position and play cursor. */\n                        if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                            /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */\n                            if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) {\n                                availableBytesPlayback  = (pDevice->playback.internalBufferSizeInFrames*bpfPlayback) - virtualWriteCursorInBytesPlayback;\n                                availableBytesPlayback += physicalPlayCursorInBytes;    /* Wrap around. */\n                            } else {\n                                /* This is an error. */\n                            #ifdef MA_DEBUG_OUTPUT\n                                printf(\"[DirectSound] (Duplex/Playback) WARNING: Play cursor has moved in front of the write cursor (same loop iterations). physicalPlayCursorInBytes=%d, virtualWriteCursorInBytes=%d.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                            #endif\n                                availableBytesPlayback = 0;\n                            }\n                        } else {\n                            /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */\n                            if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) {\n                                availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                            } else {\n                                /* This is an error. */\n                            #ifdef MA_DEBUG_OUTPUT\n                                printf(\"[DirectSound] (Duplex/Playback) WARNING: Write cursor has moved behind the play cursor (different loop iterations). physicalPlayCursorInBytes=%d, virtualWriteCursorInBytes=%d.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                            #endif\n                                availableBytesPlayback = 0;\n                            }\n                        }\n\n                    #ifdef MA_DEBUG_OUTPUT\n                        /*printf(\"[DirectSound] (Duplex/Playback) physicalPlayCursorInBytes=%d, availableBytesPlayback=%d\\n\", physicalPlayCursorInBytes, availableBytesPlayback);*/\n                    #endif\n\n                        /* If there's no room available for writing we need to wait for more. */\n                        if (availableBytesPlayback == 0) {\n                            /* If we haven't started the device yet, this will never get beyond 0. In this case we need to get the device started. */\n                            if (!isPlaybackDeviceStarted) {\n                                if (FAILED(ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING))) {\n                                    ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n                                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                                }\n                                isPlaybackDeviceStarted = MA_TRUE;\n                            } else {\n                                ma_sleep(waitTimeInMilliseconds);\n                                continue;\n                            }\n                        }\n\n\n                        /* Getting here means there room available somewhere. We limit this to either the end of the buffer or the physical play cursor, whichever is closest. */\n                        lockOffsetInBytesPlayback = virtualWriteCursorInBytesPlayback;\n                        if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                            /* Same loop iteration. Go up to the end of the buffer. */\n                            lockSizeInBytesPlayback = (pDevice->playback.internalBufferSizeInFrames*bpfPlayback) - virtualWriteCursorInBytesPlayback;\n                        } else {\n                            /* Different loop iterations. Go up to the physical play cursor. */\n                            lockSizeInBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                        }\n\n                        hr = ma_IDirectSoundBuffer_Lock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, lockOffsetInBytesPlayback, lockSizeInBytesPlayback, &pMappedBufferPlayback, &mappedSizeInBytesPlayback, NULL, NULL, 0);\n                        if (FAILED(hr)) {\n                            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from playback device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                            break;\n                        }\n\n                        /*\n                        Experiment: If the playback buffer is being starved, pad it with some silence to get it back in sync. This will cause a glitch, but it may prevent\n                        endless glitching due to it constantly running out of data.\n                        */\n                        if (isPlaybackDeviceStarted) {\n                            DWORD bytesQueuedForPlayback = (pDevice->playback.internalBufferSizeInFrames*bpfPlayback) - availableBytesPlayback;\n                            if (bytesQueuedForPlayback < ((pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)*bpfPlayback)) {\n                                silentPaddingInBytes = ((pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)*2*bpfPlayback) - bytesQueuedForPlayback;\n                                if (silentPaddingInBytes > lockSizeInBytesPlayback) {\n                                    silentPaddingInBytes = lockSizeInBytesPlayback;\n                                }\n\n                        #ifdef MA_DEBUG_OUTPUT\n                                printf(\"[DirectSound] (Duplex/Playback) Playback buffer starved. availableBytesPlayback=%d, silentPaddingInBytes=%d\\n\", availableBytesPlayback, silentPaddingInBytes);\n                        #endif\n                            }\n                        }\n\n                        /* At this point we have a buffer for output. */\n                        if (silentPaddingInBytes > 0) {\n                            ma_zero_memory(pMappedBufferPlayback, silentPaddingInBytes);\n                            framesWrittenThisIteration = silentPaddingInBytes/bpfPlayback;\n                        } else {\n                            framesWrittenThisIteration = (ma_uint32)ma_pcm_converter_read(&pDevice->playback.converter, pMappedBufferPlayback, mappedSizeInBytesPlayback/bpfPlayback);\n                        }\n                        \n\n                        hr = ma_IDirectSoundBuffer_Unlock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, pMappedBufferPlayback, framesWrittenThisIteration*bpfPlayback, NULL, 0);\n                        if (FAILED(hr)) {\n                            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from playback device after writing to the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                            break;\n                        }\n\n                        virtualWriteCursorInBytesPlayback += framesWrittenThisIteration*bpfPlayback;\n                        if ((virtualWriteCursorInBytesPlayback/bpfPlayback) == pDevice->playback.internalBufferSizeInFrames) {\n                            virtualWriteCursorInBytesPlayback  = 0;\n                            virtualWriteCursorLoopFlagPlayback = !virtualWriteCursorLoopFlagPlayback;\n                        }\n                        \n                        /*\n                        We may need to start the device. We want two full periods to be written before starting the playback device. Having an extra period adds\n                        a bit of a buffer to prevent the playback buffer from getting starved.\n                        */\n                        framesWrittenToPlaybackDevice += framesWrittenThisIteration;\n                        if (!isPlaybackDeviceStarted && framesWrittenToPlaybackDevice >= ((pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)*2)) {\n                            if (FAILED(ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING))) {\n                                ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n                                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                            }\n                            isPlaybackDeviceStarted = MA_TRUE;\n                        }\n\n                        if (framesWrittenThisIteration < mappedSizeInBytesPlayback/bpfPlayback) {\n                            break;  /* We're finished with the output data.*/\n                        }\n                    }\n\n                    if (inputFramesInExternalFormatCount < inputFramesInExternalFormatCap) {\n                        break;  /* We just consumed every input sample. */\n                    }\n                }\n\n\n                /* At this point we're done with the mapped portion of the capture buffer. */\n                hr = ma_IDirectSoundCaptureBuffer_Unlock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, pMappedBufferCapture, mappedSizeInBytesCapture, NULL, 0);\n                if (FAILED(hr)) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from capture device after reading from the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                }\n                prevReadCursorInBytesCapture = (lockOffsetInBytesCapture + mappedSizeInBytesCapture);\n            } break;\n\n\n\n            case ma_device_type_capture:\n            {\n                DWORD physicalCaptureCursorInBytes;\n                DWORD physicalReadCursorInBytes;\n                if (FAILED(ma_IDirectSoundCaptureBuffer_GetCurrentPosition((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, &physicalCaptureCursorInBytes, &physicalReadCursorInBytes))) {\n                    return MA_ERROR;\n                }\n\n                /* If the previous capture position is the same as the current position we need to wait a bit longer. */\n                if (prevReadCursorInBytesCapture == physicalReadCursorInBytes) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue;\n                }\n\n                /* Getting here means we have capture data available. */\n                if (prevReadCursorInBytesCapture < physicalReadCursorInBytes) {\n                    /* The capture position has not looped. This is the simple case. */\n                    lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                    lockSizeInBytesCapture   = (physicalReadCursorInBytes - prevReadCursorInBytesCapture);\n                } else {\n                    /*\n                    The capture position has looped. This is the more complex case. Map to the end of the buffer. If this does not return anything,\n                    do it again from the start.\n                    */\n                    if (prevReadCursorInBytesCapture < pDevice->capture.internalBufferSizeInFrames*bpfCapture) {\n                        /* Lock up to the end of the buffer. */\n                        lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                        lockSizeInBytesCapture   = (pDevice->capture.internalBufferSizeInFrames*bpfCapture) - prevReadCursorInBytesCapture;\n                    } else {\n                        /* Lock starting from the start of the buffer. */\n                        lockOffsetInBytesCapture = 0;\n                        lockSizeInBytesCapture   = physicalReadCursorInBytes;\n                    }\n                }\n\n            #ifdef MA_DEBUG_OUTPUT\n                /*printf(\"[DirectSound] (Capture) physicalCaptureCursorInBytes=%d, physicalReadCursorInBytes=%d\\n\", physicalCaptureCursorInBytes, physicalReadCursorInBytes);*/\n                /*printf(\"[DirectSound] (Capture) lockOffsetInBytesCapture=%d, lockSizeInBytesCapture=%d\\n\", lockOffsetInBytesCapture, lockSizeInBytesCapture);*/\n            #endif\n\n                if (lockSizeInBytesCapture < (pDevice->capture.internalBufferSizeInFrames/pDevice->capture.internalPeriods)) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue; /* Nothing is available in the capture buffer. */\n                }\n\n                hr = ma_IDirectSoundCaptureBuffer_Lock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, lockOffsetInBytesCapture, lockSizeInBytesCapture, &pMappedBufferCapture, &mappedSizeInBytesCapture, NULL, NULL, 0);\n                if (FAILED(hr)) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from capture device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                }\n\n            #ifdef MA_DEBUG_OUTPUT\n                if (lockSizeInBytesCapture != mappedSizeInBytesCapture) {\n                    printf(\"[DirectSound] (Capture) lockSizeInBytesCapture=%d != mappedSizeInBytesCapture=%d\\n\", lockSizeInBytesCapture, mappedSizeInBytesCapture);\n                }\n            #endif\n\n                ma_device__send_frames_to_client(pDevice, mappedSizeInBytesCapture/bpfCapture, pMappedBufferCapture);\n\n                hr = ma_IDirectSoundCaptureBuffer_Unlock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, pMappedBufferCapture, mappedSizeInBytesCapture, NULL, 0);\n                if (FAILED(hr)) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from capture device after reading from the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                }\n                prevReadCursorInBytesCapture = lockOffsetInBytesCapture + mappedSizeInBytesCapture;\n\n                if (prevReadCursorInBytesCapture == (pDevice->capture.internalBufferSizeInFrames*bpfCapture)) {\n                    prevReadCursorInBytesCapture = 0;\n                }\n            } break;\n\n\n\n            case ma_device_type_playback:\n            {\n                DWORD availableBytesPlayback;\n                DWORD physicalPlayCursorInBytes;\n                DWORD physicalWriteCursorInBytes;\n                if (FAILED(ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes))) {\n                    break;\n                }\n\n                if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) {\n                    physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback;\n                }\n                prevPlayCursorInBytesPlayback  = physicalPlayCursorInBytes;\n\n                /* If there's any bytes available for writing we can do that now. The space between the virtual cursor position and play cursor. */\n                if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                    /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback  = (pDevice->playback.internalBufferSizeInFrames*bpfPlayback) - virtualWriteCursorInBytesPlayback;\n                        availableBytesPlayback += physicalPlayCursorInBytes;    /* Wrap around. */\n                    } else {\n                        /* This is an error. */\n                    #ifdef MA_DEBUG_OUTPUT\n                        printf(\"[DirectSound] (Playback) WARNING: Play cursor has moved in front of the write cursor (same loop iterations). physicalPlayCursorInBytes=%d, virtualWriteCursorInBytes=%d.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                    #endif\n                        availableBytesPlayback = 0;\n                    }\n                } else {\n                    /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                    } else {\n                        /* This is an error. */\n                    #ifdef MA_DEBUG_OUTPUT\n                        printf(\"[DirectSound] (Playback) WARNING: Write cursor has moved behind the play cursor (different loop iterations). physicalPlayCursorInBytes=%d, virtualWriteCursorInBytes=%d.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                    #endif\n                        availableBytesPlayback = 0;\n                    }\n                }\n\n            #ifdef MA_DEBUG_OUTPUT\n                /*printf(\"[DirectSound] (Playback) physicalPlayCursorInBytes=%d, availableBytesPlayback=%d\\n\", physicalPlayCursorInBytes, availableBytesPlayback);*/\n            #endif\n\n                /* If there's no room available for writing we need to wait for more. */\n                if (availableBytesPlayback < (pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)) {\n                    /* If we haven't started the device yet, this will never get beyond 0. In this case we need to get the device started. */\n                    if (availableBytesPlayback == 0 && !isPlaybackDeviceStarted) {\n                        if (FAILED(ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING))) {\n                            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                        }\n                        isPlaybackDeviceStarted = MA_TRUE;\n                    } else {\n                        ma_sleep(waitTimeInMilliseconds);\n                        continue;\n                    }\n                }\n\n                /* Getting here means there room available somewhere. We limit this to either the end of the buffer or the physical play cursor, whichever is closest. */\n                lockOffsetInBytesPlayback = virtualWriteCursorInBytesPlayback;\n                if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                    /* Same loop iteration. Go up to the end of the buffer. */\n                    lockSizeInBytesPlayback = (pDevice->playback.internalBufferSizeInFrames*bpfPlayback) - virtualWriteCursorInBytesPlayback;\n                } else {\n                    /* Different loop iterations. Go up to the physical play cursor. */\n                    lockSizeInBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                }\n\n                hr = ma_IDirectSoundBuffer_Lock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, lockOffsetInBytesPlayback, lockSizeInBytesPlayback, &pMappedBufferPlayback, &mappedSizeInBytesPlayback, NULL, NULL, 0);\n                if (FAILED(hr)) {\n                    result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from playback device in preparation for writing to the device.\", MA_FAILED_TO_MAP_DEVICE_BUFFER);\n                    break;\n                }\n\n                /* At this point we have a buffer for output. */\n                ma_device__read_frames_from_client(pDevice, (mappedSizeInBytesPlayback/bpfPlayback), pMappedBufferPlayback);\n\n                hr = ma_IDirectSoundBuffer_Unlock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, pMappedBufferPlayback, mappedSizeInBytesPlayback, NULL, 0);\n                if (FAILED(hr)) {\n                    result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from playback device after writing to the device.\", MA_FAILED_TO_UNMAP_DEVICE_BUFFER);\n                    break;\n                }\n\n                virtualWriteCursorInBytesPlayback += mappedSizeInBytesPlayback;\n                if (virtualWriteCursorInBytesPlayback == pDevice->playback.internalBufferSizeInFrames*bpfPlayback) {\n                    virtualWriteCursorInBytesPlayback  = 0;\n                    virtualWriteCursorLoopFlagPlayback = !virtualWriteCursorLoopFlagPlayback;\n                }\n                        \n                /*\n                We may need to start the device. We want two full periods to be written before starting the playback device. Having an extra period adds\n                a bit of a buffer to prevent the playback buffer from getting starved.\n                */\n                framesWrittenToPlaybackDevice += mappedSizeInBytesPlayback/bpfPlayback;\n                if (!isPlaybackDeviceStarted && framesWrittenToPlaybackDevice >= (pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods)) {\n                    if (FAILED(ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING))) {\n                        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                    }\n                    isPlaybackDeviceStarted = MA_TRUE;\n                }\n            } break;\n\n\n            default: return MA_INVALID_ARGS;   /* Invalid device type. */\n        }\n\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /* Getting here means the device is being stopped. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (FAILED(ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer))) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCaptureBuffer_Stop() failed.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* The playback device should be drained before stopping. All we do is wait until the available bytes is equal to the size of the buffer. */\n        if (isPlaybackDeviceStarted) {\n            for (;;) {\n                DWORD availableBytesPlayback = 0;\n                DWORD physicalPlayCursorInBytes;\n                DWORD physicalWriteCursorInBytes;\n                if (FAILED(ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes))) {\n                    break;\n                }\n\n                if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) {\n                    physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback;\n                }\n                prevPlayCursorInBytesPlayback  = physicalPlayCursorInBytes;\n\n                if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                    /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback  = (pDevice->playback.internalBufferSizeInFrames*bpfPlayback) - virtualWriteCursorInBytesPlayback;\n                        availableBytesPlayback += physicalPlayCursorInBytes;    /* Wrap around. */\n                    } else {\n                        break;\n                    }\n                } else {\n                    /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                    } else {\n                        break;\n                    }\n                }\n\n                if (availableBytesPlayback >= (pDevice->playback.internalBufferSizeInFrames*bpfPlayback)) {\n                    break;\n                }\n\n                ma_sleep(waitTimeInMilliseconds);\n            }\n        }\n\n        if (FAILED(ma_IDirectSoundBuffer_Stop((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer))) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Stop() failed.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        ma_IDirectSoundBuffer_SetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_uninit__dsound(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_dsound);\n\n    ma_dlclose(pContext, pContext->dsound.hDSoundDLL);\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__dsound(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n    pContext->dsound.hDSoundDLL = ma_dlopen(pContext, \"dsound.dll\");\n    if (pContext->dsound.hDSoundDLL == NULL) {\n        return MA_API_NOT_FOUND;\n    }\n\n    pContext->dsound.DirectSoundCreate            = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, \"DirectSoundCreate\");\n    pContext->dsound.DirectSoundEnumerateA        = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, \"DirectSoundEnumerateA\");\n    pContext->dsound.DirectSoundCaptureCreate     = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, \"DirectSoundCaptureCreate\");\n    pContext->dsound.DirectSoundCaptureEnumerateA = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, \"DirectSoundCaptureEnumerateA\");\n\n    pContext->onUninit         = ma_context_uninit__dsound;\n    pContext->onDeviceIDEqual  = ma_context_is_device_id_equal__dsound;\n    pContext->onEnumDevices    = ma_context_enumerate_devices__dsound;\n    pContext->onGetDeviceInfo  = ma_context_get_device_info__dsound;\n    pContext->onDeviceInit     = ma_device_init__dsound;\n    pContext->onDeviceUninit   = ma_device_uninit__dsound;\n    pContext->onDeviceStart    = NULL;  /* Not used. Started in onDeviceMainLoop. */\n    pContext->onDeviceStop     = NULL;  /* Not used. Stopped in onDeviceMainLoop. */\n    pContext->onDeviceWrite    = NULL;\n    pContext->onDeviceRead     = NULL;\n    pContext->onDeviceMainLoop = ma_device_main_loop__dsound;\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n\n/******************************************************************************\n\nWinMM Backend\n\n******************************************************************************/\n#ifdef MA_HAS_WINMM\n\n/*\nSome older compilers don't have WAVEOUTCAPS2A and WAVEINCAPS2A, so we'll need to write this ourselves. These structures\nare exactly the same as the older ones but they have a few GUIDs for manufacturer/product/name identification. I'm keeping\nthe names the same as the Win32 library for consistency, but namespaced to avoid naming conflicts with the Win32 version.\n*/\ntypedef struct\n{\n    WORD wMid;\n    WORD wPid;\n    MMVERSION vDriverVersion;\n    CHAR szPname[MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    WORD wReserved1;\n    DWORD dwSupport;\n    GUID ManufacturerGuid;\n    GUID ProductGuid;\n    GUID NameGuid;\n} MA_WAVEOUTCAPS2A;\ntypedef struct\n{\n    WORD wMid;\n    WORD wPid;\n    MMVERSION vDriverVersion;\n    CHAR szPname[MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    WORD wReserved1;\n    GUID ManufacturerGuid;\n    GUID ProductGuid;\n    GUID NameGuid;\n} MA_WAVEINCAPS2A;\n\ntypedef UINT     (WINAPI * MA_PFN_waveOutGetNumDevs)(void);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutGetDevCapsA)(ma_uintptr uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutOpen)(LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutClose)(HWAVEOUT hwo);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutPrepareHeader)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutUnprepareHeader)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutWrite)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);\ntypedef MMRESULT (WINAPI * MA_PFN_waveOutReset)(HWAVEOUT hwo);\ntypedef UINT     (WINAPI * MA_PFN_waveInGetNumDevs)(void);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInGetDevCapsA)(ma_uintptr uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInOpen)(LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInClose)(HWAVEIN hwi);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInPrepareHeader)(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInUnprepareHeader)(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInAddBuffer)(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInStart)(HWAVEIN hwi);\ntypedef MMRESULT (WINAPI * MA_PFN_waveInReset)(HWAVEIN hwi);\n\nma_result ma_result_from_MMRESULT(MMRESULT resultMM)\n{\n    switch (resultMM) {\n        case MMSYSERR_NOERROR:      return MA_SUCCESS;\n        case MMSYSERR_BADDEVICEID:  return MA_INVALID_ARGS;\n        case MMSYSERR_INVALHANDLE:  return MA_INVALID_ARGS;\n        case MMSYSERR_NOMEM:        return MA_OUT_OF_MEMORY;\n        case MMSYSERR_INVALFLAG:    return MA_INVALID_ARGS;\n        case MMSYSERR_INVALPARAM:   return MA_INVALID_ARGS;\n        case MMSYSERR_HANDLEBUSY:   return MA_DEVICE_BUSY;\n        case MMSYSERR_ERROR:        return MA_ERROR;\n        default:                    return MA_ERROR;\n    }\n}\n\nchar* ma_find_last_character(char* str, char ch)\n{\n    char* last;\n\n    if (str == NULL) {\n        return NULL;\n    }\n\n    last = NULL;\n    while (*str != '\\0') {\n        if (*str == ch) {\n            last = str;\n        }\n\n        str += 1;\n    }\n\n    return last;\n}\n\n\n/*\nOur own \"WAVECAPS\" structure that contains generic information shared between WAVEOUTCAPS2 and WAVEINCAPS2 so\nwe can do things generically and typesafely. Names are being kept the same for consistency.\n*/\ntypedef struct\n{\n    CHAR szPname[MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    GUID NameGuid;\n} MA_WAVECAPSA;\n\nma_result ma_get_best_info_from_formats_flags__winmm(DWORD dwFormats, WORD channels, WORD* pBitsPerSample, DWORD* pSampleRate)\n{\n    WORD bitsPerSample = 0;\n    DWORD sampleRate = 0;\n\n    if (pBitsPerSample) {\n        *pBitsPerSample = 0;\n    }\n    if (pSampleRate) {\n        *pSampleRate = 0;\n    }\n\n    if (channels == 1) {\n        bitsPerSample = 16;\n        if ((dwFormats & WAVE_FORMAT_48M16) != 0) {\n            sampleRate = 48000;\n        } else if ((dwFormats & WAVE_FORMAT_44M16) != 0) {\n            sampleRate = 44100;\n        } else if ((dwFormats & WAVE_FORMAT_2M16) != 0) {\n            sampleRate = 22050;\n        } else if ((dwFormats & WAVE_FORMAT_1M16) != 0) {\n            sampleRate = 11025;\n        } else if ((dwFormats & WAVE_FORMAT_96M16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((dwFormats & WAVE_FORMAT_48M08) != 0) {\n                sampleRate = 48000;\n            } else if ((dwFormats & WAVE_FORMAT_44M08) != 0) {\n                sampleRate = 44100;\n            } else if ((dwFormats & WAVE_FORMAT_2M08) != 0) {\n                sampleRate = 22050;\n            } else if ((dwFormats & WAVE_FORMAT_1M08) != 0) {\n                sampleRate = 11025;\n            } else if ((dwFormats & WAVE_FORMAT_96M08) != 0) {\n                sampleRate = 96000;\n            } else {\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n    } else {\n        bitsPerSample = 16;\n        if ((dwFormats & WAVE_FORMAT_48S16) != 0) {\n            sampleRate = 48000;\n        } else if ((dwFormats & WAVE_FORMAT_44S16) != 0) {\n            sampleRate = 44100;\n        } else if ((dwFormats & WAVE_FORMAT_2S16) != 0) {\n            sampleRate = 22050;\n        } else if ((dwFormats & WAVE_FORMAT_1S16) != 0) {\n            sampleRate = 11025;\n        } else if ((dwFormats & WAVE_FORMAT_96S16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((dwFormats & WAVE_FORMAT_48S08) != 0) {\n                sampleRate = 48000;\n            } else if ((dwFormats & WAVE_FORMAT_44S08) != 0) {\n                sampleRate = 44100;\n            } else if ((dwFormats & WAVE_FORMAT_2S08) != 0) {\n                sampleRate = 22050;\n            } else if ((dwFormats & WAVE_FORMAT_1S08) != 0) {\n                sampleRate = 11025;\n            } else if ((dwFormats & WAVE_FORMAT_96S08) != 0) {\n                sampleRate = 96000;\n            } else {\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n    }\n\n    if (pBitsPerSample) {\n        *pBitsPerSample = bitsPerSample;\n    }\n    if (pSampleRate) {\n        *pSampleRate = sampleRate;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_formats_flags_to_WAVEFORMATEX__winmm(DWORD dwFormats, WORD channels, WAVEFORMATEX* pWF)\n{\n    ma_assert(pWF != NULL);\n\n    ma_zero_object(pWF);\n    pWF->cbSize     = sizeof(*pWF);\n    pWF->wFormatTag = WAVE_FORMAT_PCM;\n    pWF->nChannels  = (WORD)channels;\n    if (pWF->nChannels > 2) {\n        pWF->nChannels = 2;\n    }\n\n    if (channels == 1) {\n        pWF->wBitsPerSample = 16;\n        if ((dwFormats & WAVE_FORMAT_48M16) != 0) {\n            pWF->nSamplesPerSec = 48000;\n        } else if ((dwFormats & WAVE_FORMAT_44M16) != 0) {\n            pWF->nSamplesPerSec = 44100;\n        } else if ((dwFormats & WAVE_FORMAT_2M16) != 0) {\n            pWF->nSamplesPerSec = 22050;\n        } else if ((dwFormats & WAVE_FORMAT_1M16) != 0) {\n            pWF->nSamplesPerSec = 11025;\n        } else if ((dwFormats & WAVE_FORMAT_96M16) != 0) {\n            pWF->nSamplesPerSec = 96000;\n        } else {\n            pWF->wBitsPerSample = 8;\n            if ((dwFormats & WAVE_FORMAT_48M08) != 0) {\n                pWF->nSamplesPerSec = 48000;\n            } else if ((dwFormats & WAVE_FORMAT_44M08) != 0) {\n                pWF->nSamplesPerSec = 44100;\n            } else if ((dwFormats & WAVE_FORMAT_2M08) != 0) {\n                pWF->nSamplesPerSec = 22050;\n            } else if ((dwFormats & WAVE_FORMAT_1M08) != 0) {\n                pWF->nSamplesPerSec = 11025;\n            } else if ((dwFormats & WAVE_FORMAT_96M08) != 0) {\n                pWF->nSamplesPerSec = 96000;\n            } else {\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n    } else {\n        pWF->wBitsPerSample = 16;\n        if ((dwFormats & WAVE_FORMAT_48S16) != 0) {\n            pWF->nSamplesPerSec = 48000;\n        } else if ((dwFormats & WAVE_FORMAT_44S16) != 0) {\n            pWF->nSamplesPerSec = 44100;\n        } else if ((dwFormats & WAVE_FORMAT_2S16) != 0) {\n            pWF->nSamplesPerSec = 22050;\n        } else if ((dwFormats & WAVE_FORMAT_1S16) != 0) {\n            pWF->nSamplesPerSec = 11025;\n        } else if ((dwFormats & WAVE_FORMAT_96S16) != 0) {\n            pWF->nSamplesPerSec = 96000;\n        } else {\n            pWF->wBitsPerSample = 8;\n            if ((dwFormats & WAVE_FORMAT_48S08) != 0) {\n                pWF->nSamplesPerSec = 48000;\n            } else if ((dwFormats & WAVE_FORMAT_44S08) != 0) {\n                pWF->nSamplesPerSec = 44100;\n            } else if ((dwFormats & WAVE_FORMAT_2S08) != 0) {\n                pWF->nSamplesPerSec = 22050;\n            } else if ((dwFormats & WAVE_FORMAT_1S08) != 0) {\n                pWF->nSamplesPerSec = 11025;\n            } else if ((dwFormats & WAVE_FORMAT_96S08) != 0) {\n                pWF->nSamplesPerSec = 96000;\n            } else {\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n    }\n\n    pWF->nBlockAlign     = (pWF->nChannels * pWF->wBitsPerSample) / 8;\n    pWF->nAvgBytesPerSec = pWF->nBlockAlign * pWF->nSamplesPerSec;\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info_from_WAVECAPS(ma_context* pContext, MA_WAVECAPSA* pCaps, ma_device_info* pDeviceInfo)\n{\n    WORD bitsPerSample;\n    DWORD sampleRate;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pCaps != NULL);\n    ma_assert(pDeviceInfo != NULL);\n\n    /*\n    Name / Description\n    \n    Unfortunately the name specified in WAVE(OUT/IN)CAPS2 is limited to 31 characters. This results in an unprofessional looking\n    situation where the names of the devices are truncated. To help work around this, we need to look at the name GUID and try\n    looking in the registry for the full name. If we can't find it there, we need to just fall back to the default name.\n    */\n\n    /* Set the default to begin with. */\n    ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), pCaps->szPname, (size_t)-1);\n\n    /*\n    Now try the registry. There's a few things to consider here:\n    - The name GUID can be null, in which we case we just need to stick to the original 31 characters.\n    - If the name GUID is not present in the registry we'll also need to stick to the original 31 characters.\n    - I like consistency, so I want the returned device names to be consistent with those returned by WASAPI and DirectSound. The\n      problem, however is that WASAPI and DirectSound use \"<component> (<name>)\" format (such as \"Speakers (High Definition Audio)\"),\n      but WinMM does not specificy the component name. From my admittedly limited testing, I've notice the component name seems to\n      usually fit within the 31 characters of the fixed sized buffer, so what I'm going to do is parse that string for the component\n      name, and then concatenate the name from the registry.\n    */\n    if (!ma_is_guid_equal(&pCaps->NameGuid, &MA_GUID_NULL)) {\n        wchar_t guidStrW[256];\n        if (((MA_PFN_StringFromGUID2)pContext->win32.StringFromGUID2)(&pCaps->NameGuid, guidStrW, ma_countof(guidStrW)) > 0) {\n            char guidStr[256];\n            char keyStr[1024];\n            HKEY hKey;\n\n            WideCharToMultiByte(CP_UTF8, 0, guidStrW, -1, guidStr, sizeof(guidStr), 0, FALSE);\n\n            ma_strcpy_s(keyStr, sizeof(keyStr), \"SYSTEM\\\\CurrentControlSet\\\\Control\\\\MediaCategories\\\\\");\n            ma_strcat_s(keyStr, sizeof(keyStr), guidStr);\n\n            if (((MA_PFN_RegOpenKeyExA)pContext->win32.RegOpenKeyExA)(HKEY_LOCAL_MACHINE, keyStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\n                BYTE nameFromReg[512];\n                DWORD nameFromRegSize = sizeof(nameFromReg);\n                result = ((MA_PFN_RegQueryValueExA)pContext->win32.RegQueryValueExA)(hKey, \"Name\", 0, NULL, (LPBYTE)nameFromReg, (LPDWORD)&nameFromRegSize);\n                ((MA_PFN_RegCloseKey)pContext->win32.RegCloseKey)(hKey);\n\n                if (result == ERROR_SUCCESS) {\n                    /* We have the value from the registry, so now we need to construct the name string. */\n                    char name[1024];\n                    if (ma_strcpy_s(name, sizeof(name), pDeviceInfo->name) == 0) {\n                        char* nameBeg = ma_find_last_character(name, '(');\n                        if (nameBeg != NULL) {\n                            size_t leadingLen = (nameBeg - name);\n                            ma_strncpy_s(nameBeg + 1, sizeof(name) - leadingLen, (const char*)nameFromReg, (size_t)-1);\n\n                            /* The closing \")\", if it can fit. */\n                            if (leadingLen + nameFromRegSize < sizeof(name)-1) {\n                                ma_strcat_s(name, sizeof(name), \")\");\n                            }\n\n                            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), name, (size_t)-1);\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n\n    result = ma_get_best_info_from_formats_flags__winmm(pCaps->dwFormats, pCaps->wChannels, &bitsPerSample, &sampleRate);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDeviceInfo->minChannels = pCaps->wChannels;\n    pDeviceInfo->maxChannels = pCaps->wChannels;\n    pDeviceInfo->minSampleRate = sampleRate;\n    pDeviceInfo->maxSampleRate = sampleRate;\n    pDeviceInfo->formatCount = 1;\n    if (bitsPerSample == 8) {\n        pDeviceInfo->formats[0] = ma_format_u8;\n    } else if (bitsPerSample == 16) {\n        pDeviceInfo->formats[0] = ma_format_s16;\n    } else if (bitsPerSample == 24) {\n        pDeviceInfo->formats[0] = ma_format_s24;\n    } else if (bitsPerSample == 32) {\n        pDeviceInfo->formats[0] = ma_format_s32;\n    } else {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info_from_WAVEOUTCAPS2(ma_context* pContext, MA_WAVEOUTCAPS2A* pCaps, ma_device_info* pDeviceInfo)\n{\n    MA_WAVECAPSA caps;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pCaps != NULL);\n    ma_assert(pDeviceInfo != NULL);\n\n    ma_copy_memory(caps.szPname, pCaps->szPname, sizeof(caps.szPname));\n    caps.dwFormats = pCaps->dwFormats;\n    caps.wChannels = pCaps->wChannels;\n    caps.NameGuid = pCaps->NameGuid;\n    return ma_context_get_device_info_from_WAVECAPS(pContext, &caps, pDeviceInfo);\n}\n\nma_result ma_context_get_device_info_from_WAVEINCAPS2(ma_context* pContext, MA_WAVEINCAPS2A* pCaps, ma_device_info* pDeviceInfo)\n{\n    MA_WAVECAPSA caps;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pCaps != NULL);\n    ma_assert(pDeviceInfo != NULL);\n\n    ma_copy_memory(caps.szPname, pCaps->szPname, sizeof(caps.szPname));\n    caps.dwFormats = pCaps->dwFormats;\n    caps.wChannels = pCaps->wChannels;\n    caps.NameGuid = pCaps->NameGuid;\n    return ma_context_get_device_info_from_WAVECAPS(pContext, &caps, pDeviceInfo);\n}\n\n\nma_bool32 ma_context_is_device_id_equal__winmm(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return pID0->winmm == pID1->winmm;\n}\n\nma_result ma_context_enumerate_devices__winmm(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    UINT playbackDeviceCount;\n    UINT captureDeviceCount;\n    UINT iPlaybackDevice;\n    UINT iCaptureDevice;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    /* Playback. */\n    playbackDeviceCount = ((MA_PFN_waveOutGetNumDevs)pContext->winmm.waveOutGetNumDevs)();\n    for (iPlaybackDevice = 0; iPlaybackDevice < playbackDeviceCount; ++iPlaybackDevice) {\n        MMRESULT result;\n        MA_WAVEOUTCAPS2A caps;\n\n        ma_zero_object(&caps);\n\n        result = ((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(iPlaybackDevice, (WAVEOUTCAPSA*)&caps, sizeof(caps));\n        if (result == MMSYSERR_NOERROR) {\n            ma_device_info deviceInfo;\n\n            ma_zero_object(&deviceInfo);\n            deviceInfo.id.winmm = iPlaybackDevice;\n\n            if (ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) {\n                ma_bool32 cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    return MA_SUCCESS; /* Enumeration was stopped. */\n                }\n            }\n        }\n    }\n\n    /* Capture. */\n    captureDeviceCount = ((MA_PFN_waveInGetNumDevs)pContext->winmm.waveInGetNumDevs)();\n    for (iCaptureDevice = 0; iCaptureDevice < captureDeviceCount; ++iCaptureDevice) {\n        MMRESULT result;\n        MA_WAVEINCAPS2A caps;\n\n        ma_zero_object(&caps);\n\n        result = ((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(iCaptureDevice, (WAVEINCAPSA*)&caps, sizeof(caps));\n        if (result == MMSYSERR_NOERROR) {\n            ma_device_info deviceInfo;\n\n            ma_zero_object(&deviceInfo);\n            deviceInfo.id.winmm = iCaptureDevice;\n\n            if (ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) {\n                ma_bool32 cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    return MA_SUCCESS; /* Enumeration was stopped. */\n                }\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__winmm(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    UINT winMMDeviceID;\n\n    ma_assert(pContext != NULL);\n\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    winMMDeviceID = 0;\n    if (pDeviceID != NULL) {\n        winMMDeviceID = (UINT)pDeviceID->winmm;\n    }\n\n    pDeviceInfo->id.winmm = winMMDeviceID;\n\n    if (deviceType == ma_device_type_playback) {\n        MMRESULT result;\n        MA_WAVEOUTCAPS2A caps;\n\n        ma_zero_object(&caps);\n        \n        result = ((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(winMMDeviceID, (WAVEOUTCAPSA*)&caps, sizeof(caps));\n        if (result == MMSYSERR_NOERROR) {\n            return ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, pDeviceInfo);\n        }\n    } else {\n        MMRESULT result;\n        MA_WAVEINCAPS2A caps;\n\n        ma_zero_object(&caps);\n        \n        result = ((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(winMMDeviceID, (WAVEINCAPSA*)&caps, sizeof(caps));\n        if (result == MMSYSERR_NOERROR) {\n            return ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, pDeviceInfo);\n        }\n    }\n\n    return MA_NO_DEVICE;\n}\n\n\nvoid ma_device_uninit__winmm(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((MA_PFN_waveInClose)pDevice->pContext->winmm.waveInClose)((HWAVEIN)pDevice->winmm.hDeviceCapture);\n        CloseHandle((HANDLE)pDevice->winmm.hEventCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((MA_PFN_waveOutReset)pDevice->pContext->winmm.waveOutReset)((HWAVEOUT)pDevice->winmm.hDevicePlayback);\n        ((MA_PFN_waveOutClose)pDevice->pContext->winmm.waveOutClose)((HWAVEOUT)pDevice->winmm.hDevicePlayback);\n        CloseHandle((HANDLE)pDevice->winmm.hEventPlayback);\n    }\n\n    ma_free(pDevice->winmm._pHeapData);\n\n    ma_zero_object(&pDevice->winmm);   /* Safety. */\n}\n\nma_result ma_device_init__winmm(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    const char* errorMsg = \"\";\n    ma_result errorCode = MA_ERROR;\n    ma_result result = MA_SUCCESS;\n    ma_uint32 heapSize;\n    UINT winMMDeviceIDPlayback = 0;\n    UINT winMMDeviceIDCapture  = 0;\n    ma_uint32 bufferSizeInMilliseconds;\n\n    ma_assert(pDevice != NULL);\n    ma_zero_object(&pDevice->winmm);\n\n    /* No exlusive mode with WinMM. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    bufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;\n    if (bufferSizeInMilliseconds == 0) {\n        bufferSizeInMilliseconds = ma_calculate_buffer_size_in_milliseconds_from_frames(pConfig->bufferSizeInFrames, pConfig->sampleRate);\n    }\n    \n    /* WinMM has horrible latency. */\n    if (pDevice->usingDefaultBufferSize) {\n        if (pConfig->performanceProfile == ma_performance_profile_low_latency) {\n            bufferSizeInMilliseconds =  40 * pConfig->periods;\n        } else {\n            bufferSizeInMilliseconds = 400 * pConfig->periods;\n        }\n    }\n\n\n    if (pConfig->playback.pDeviceID != NULL) {\n        winMMDeviceIDPlayback = (UINT)pConfig->playback.pDeviceID->winmm;\n    }\n    if (pConfig->capture.pDeviceID != NULL) {\n        winMMDeviceIDCapture = (UINT)pConfig->capture.pDeviceID->winmm;\n    }\n\n    /* The capture device needs to be initialized first. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        WAVEINCAPSA caps;\n        WAVEFORMATEX wf;\n        MMRESULT resultMM;\n\n        /* We use an event to know when a new fragment needs to be enqueued. */\n        pDevice->winmm.hEventCapture = (ma_handle)CreateEvent(NULL, TRUE, TRUE, NULL);\n        if (pDevice->winmm.hEventCapture == NULL) {\n            errorMsg = \"[WinMM] Failed to create event for fragment enqueing for the capture device.\", errorCode = MA_FAILED_TO_CREATE_EVENT;\n            goto on_error;\n        }\n\n        /* The format should be based on the device's actual format. */\n        if (((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(winMMDeviceIDCapture, &caps, sizeof(caps)) != MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to retrieve internal device caps.\", errorCode = MA_FORMAT_NOT_SUPPORTED;\n            goto on_error;\n        }\n\n        result = ma_formats_flags_to_WAVEFORMATEX__winmm(caps.dwFormats, caps.wChannels, &wf);\n        if (result != MA_SUCCESS) {\n            errorMsg = \"[WinMM] Could not find appropriate format for internal device.\", errorCode = result;\n            goto on_error;\n        }\n\n        resultMM = ((MA_PFN_waveInOpen)pDevice->pContext->winmm.waveInOpen)((LPHWAVEIN)&pDevice->winmm.hDeviceCapture, winMMDeviceIDCapture, &wf, (DWORD_PTR)pDevice->winmm.hEventCapture, (DWORD_PTR)pDevice, CALLBACK_EVENT | WAVE_ALLOWSYNC);\n        if (resultMM != MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to open capture device.\", errorCode = MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            goto on_error;\n        }\n\n        pDevice->capture.internalFormat     = ma_format_from_WAVEFORMATEX(&wf);\n        pDevice->capture.internalChannels   = wf.nChannels;\n        pDevice->capture.internalSampleRate = wf.nSamplesPerSec;\n        ma_get_standard_channel_map(ma_standard_channel_map_microsoft, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n        pDevice->capture.internalPeriods = pConfig->periods;\n        pDevice->capture.internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(bufferSizeInMilliseconds, pDevice->capture.internalSampleRate);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        WAVEOUTCAPSA caps;\n        WAVEFORMATEX wf;\n        MMRESULT resultMM;\n\n        /* We use an event to know when a new fragment needs to be enqueued. */\n        pDevice->winmm.hEventPlayback = (ma_handle)CreateEvent(NULL, TRUE, TRUE, NULL);\n        if (pDevice->winmm.hEventPlayback == NULL) {\n            errorMsg = \"[WinMM] Failed to create event for fragment enqueing for the playback device.\", errorCode = MA_FAILED_TO_CREATE_EVENT;\n            goto on_error;\n        }\n\n        /* The format should be based on the device's actual format. */\n        if (((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(winMMDeviceIDPlayback, &caps, sizeof(caps)) != MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to retrieve internal device caps.\", errorCode = MA_FORMAT_NOT_SUPPORTED;\n            goto on_error;\n        }\n\n        result = ma_formats_flags_to_WAVEFORMATEX__winmm(caps.dwFormats, caps.wChannels, &wf);\n        if (result != MA_SUCCESS) {\n            errorMsg = \"[WinMM] Could not find appropriate format for internal device.\", errorCode = result;\n            goto on_error;\n        }\n\n        resultMM = ((MA_PFN_waveOutOpen)pContext->winmm.waveOutOpen)((LPHWAVEOUT)&pDevice->winmm.hDevicePlayback, winMMDeviceIDPlayback, &wf, (DWORD_PTR)pDevice->winmm.hEventPlayback, (DWORD_PTR)pDevice, CALLBACK_EVENT | WAVE_ALLOWSYNC);\n        if (resultMM != MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to open playback device.\", errorCode = MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            goto on_error;\n        }\n\n        pDevice->playback.internalFormat     = ma_format_from_WAVEFORMATEX(&wf);\n        pDevice->playback.internalChannels   = wf.nChannels;\n        pDevice->playback.internalSampleRate = wf.nSamplesPerSec;\n        ma_get_standard_channel_map(ma_standard_channel_map_microsoft, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n        pDevice->playback.internalPeriods = pConfig->periods;\n        pDevice->playback.internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(bufferSizeInMilliseconds, pDevice->playback.internalSampleRate);\n    }\n\n    /*\n    The heap allocated data is allocated like so:\n    \n    [Capture WAVEHDRs][Playback WAVEHDRs][Capture Intermediary Buffer][Playback Intermediary Buffer]\n    */\n    heapSize = 0;\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        heapSize += sizeof(WAVEHDR)*pDevice->capture.internalPeriods + (pDevice->capture.internalBufferSizeInFrames*ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    }\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        heapSize += sizeof(WAVEHDR)*pDevice->playback.internalPeriods + (pDevice->playback.internalBufferSizeInFrames*ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    }\n\n    pDevice->winmm._pHeapData = (ma_uint8*)ma_malloc(heapSize);\n    if (pDevice->winmm._pHeapData == NULL) {\n        errorMsg = \"[WinMM] Failed to allocate memory for the intermediary buffer.\", errorCode = MA_OUT_OF_MEMORY;\n        goto on_error;\n    }\n\n    ma_zero_memory(pDevice->winmm._pHeapData, heapSize);\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 iPeriod;\n\n        if (pConfig->deviceType == ma_device_type_capture) {\n            pDevice->winmm.pWAVEHDRCapture            = pDevice->winmm._pHeapData;\n            pDevice->winmm.pIntermediaryBufferCapture = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDevice->capture.internalPeriods));\n        } else {\n            pDevice->winmm.pWAVEHDRCapture            = pDevice->winmm._pHeapData;\n            pDevice->winmm.pIntermediaryBufferCapture = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDevice->capture.internalPeriods + pDevice->playback.internalPeriods));\n        }\n\n        /* Prepare headers. */\n        for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) {\n            ma_uint32 fragmentSizeInBytes = ma_get_fragment_size_in_bytes(pDevice->capture.internalBufferSizeInFrames, pDevice->capture.internalPeriods, pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].lpData         = (LPSTR)(pDevice->winmm.pIntermediaryBufferCapture + (fragmentSizeInBytes*iPeriod));\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwBufferLength = fragmentSizeInBytes;\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwFlags        = 0L;\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwLoops        = 0L;\n            ((MA_PFN_waveInPrepareHeader)pContext->winmm.waveInPrepareHeader)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(WAVEHDR));\n\n            /*\n            The user data of the WAVEHDR structure is a single flag the controls whether or not it is ready for writing. Consider it to be named \"isLocked\". A value of 0 means\n            it's unlocked and available for writing. A value of 1 means it's locked.\n            */\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwUser = 0;\n        }\n    }\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 iPeriod;\n\n        if (pConfig->deviceType == ma_device_type_playback) {\n            pDevice->winmm.pWAVEHDRPlayback            = pDevice->winmm._pHeapData;\n            pDevice->winmm.pIntermediaryBufferPlayback = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*pDevice->playback.internalPeriods);\n        } else {\n            pDevice->winmm.pWAVEHDRPlayback            = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDevice->capture.internalPeriods));\n            pDevice->winmm.pIntermediaryBufferPlayback = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDevice->capture.internalPeriods + pDevice->playback.internalPeriods)) + (pDevice->playback.internalBufferSizeInFrames*ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n        }\n\n        /* Prepare headers. */\n        for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; ++iPeriod) {\n            ma_uint32 fragmentSizeInBytes = ma_get_fragment_size_in_bytes(pDevice->playback.internalBufferSizeInFrames, pDevice->playback.internalPeriods, pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].lpData         = (LPSTR)(pDevice->winmm.pIntermediaryBufferPlayback + (fragmentSizeInBytes*iPeriod));\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwBufferLength = fragmentSizeInBytes;\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwFlags        = 0L;\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwLoops        = 0L;\n            ((MA_PFN_waveOutPrepareHeader)pContext->winmm.waveOutPrepareHeader)((HWAVEOUT)pDevice->winmm.hDevicePlayback, &((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod], sizeof(WAVEHDR));\n\n            /*\n            The user data of the WAVEHDR structure is a single flag the controls whether or not it is ready for writing. Consider it to be named \"isLocked\". A value of 0 means\n            it's unlocked and available for writing. A value of 1 means it's locked.\n            */\n            ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwUser = 0;\n        }\n    }\n\n    return MA_SUCCESS;\n\non_error:\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.pWAVEHDRCapture != NULL) {\n            ma_uint32 iPeriod;\n            for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) {\n                ((MA_PFN_waveInUnprepareHeader)pContext->winmm.waveInUnprepareHeader)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(WAVEHDR));\n            }\n        }\n\n        ((MA_PFN_waveInClose)pContext->winmm.waveInClose)((HWAVEIN)pDevice->winmm.hDeviceCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.pWAVEHDRCapture != NULL) {\n            ma_uint32 iPeriod;\n            for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; ++iPeriod) {\n                ((MA_PFN_waveOutUnprepareHeader)pContext->winmm.waveOutUnprepareHeader)((HWAVEOUT)pDevice->winmm.hDevicePlayback, &((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod], sizeof(WAVEHDR));\n            }\n        }\n\n        ((MA_PFN_waveOutClose)pContext->winmm.waveOutClose)((HWAVEOUT)pDevice->winmm.hDevicePlayback);\n    }\n\n    ma_free(pDevice->winmm._pHeapData);\n    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, errorMsg, errorCode);\n}\n\nma_result ma_device_stop__winmm(ma_device* pDevice)\n{\n    MMRESULT resultMM;\n\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.hDeviceCapture == NULL) {\n            return MA_INVALID_ARGS;\n        }\n\n        resultMM = ((MA_PFN_waveInReset)pDevice->pContext->winmm.waveInReset)((HWAVEIN)pDevice->winmm.hDeviceCapture);\n        if (resultMM != MMSYSERR_NOERROR) {\n            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WinMM] WARNING: Failed to reset capture device.\", ma_result_from_MMRESULT(resultMM));\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.hDevicePlayback == NULL) {\n            return MA_INVALID_ARGS;\n        }\n\n        resultMM = ((MA_PFN_waveOutReset)pDevice->pContext->winmm.waveOutReset)((HWAVEOUT)pDevice->winmm.hDevicePlayback);\n        if (resultMM != MMSYSERR_NOERROR) {\n            ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WinMM] WARNING: Failed to reset playback device.\", ma_result_from_MMRESULT(resultMM));\n        }\n    }\n\n    ma_atomic_exchange_32(&pDevice->winmm.isStarted, MA_FALSE);\n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__winmm(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_result result = MA_SUCCESS;\n    MMRESULT resultMM;\n    ma_uint32 totalFramesWritten;\n    WAVEHDR* pWAVEHDR;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pPCMFrames != NULL);\n\n    pWAVEHDR = (WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback;\n\n    /* Keep processing as much data as possible. */\n    totalFramesWritten = 0;\n    while (totalFramesWritten < frameCount) {\n        /* If the current header has some space available we need to write part of it. */\n        if (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser == 0) { /* 0 = unlocked. */\n            /*\n            This header has room in it. We copy as much of it as we can. If we end up fully consuming the buffer we need to\n            write it out and move on to the next iteration.\n            */\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n            ma_uint32 framesRemainingInHeader = (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwBufferLength/bpf) - pDevice->winmm.headerFramesConsumedPlayback;\n\n            ma_uint32 framesToCopy = ma_min(framesRemainingInHeader, (frameCount - totalFramesWritten));\n            const void* pSrc = ma_offset_ptr(pPCMFrames, totalFramesWritten*bpf);\n            void* pDst = ma_offset_ptr(pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].lpData, pDevice->winmm.headerFramesConsumedPlayback*bpf);\n            ma_copy_memory(pDst, pSrc, framesToCopy*bpf);\n\n            pDevice->winmm.headerFramesConsumedPlayback += framesToCopy;\n            totalFramesWritten += framesToCopy;\n\n            /* If we've consumed the buffer entirely we need to write it out to the device. */\n            if (pDevice->winmm.headerFramesConsumedPlayback == (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwBufferLength/bpf)) {\n                pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser = 1;            /* 1 = locked. */\n                pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwFlags &= ~WHDR_DONE; /* <-- Need to make sure the WHDR_DONE flag is unset. */\n\n                /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */\n                ResetEvent((HANDLE)pDevice->winmm.hEventPlayback);\n\n                /* The device will be started here. */\n                resultMM = ((MA_PFN_waveOutWrite)pDevice->pContext->winmm.waveOutWrite)((HWAVEOUT)pDevice->winmm.hDevicePlayback, &pWAVEHDR[pDevice->winmm.iNextHeaderPlayback], sizeof(WAVEHDR));\n                if (resultMM != MMSYSERR_NOERROR) {\n                    result = ma_result_from_MMRESULT(resultMM);\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WinMM] waveOutWrite() failed.\", result);\n                    break;\n                }\n                ma_atomic_exchange_32(&pDevice->winmm.isStarted, MA_TRUE);\n\n                /* Make sure we move to the next header. */\n                pDevice->winmm.iNextHeaderPlayback = (pDevice->winmm.iNextHeaderPlayback + 1) % pDevice->playback.internalPeriods;\n                pDevice->winmm.headerFramesConsumedPlayback = 0;\n            }\n\n            /* If at this point we have consumed the entire input buffer we can return. */\n            ma_assert(totalFramesWritten <= frameCount);\n            if (totalFramesWritten == frameCount) {\n                break;\n            }\n\n            /* Getting here means there's more to process. */\n            continue;\n        }\n\n        /* Getting here means there isn't enough room in the buffer and we need to wait for one to become available. */\n        if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventPlayback, INFINITE) != WAIT_OBJECT_0) {\n            result = MA_ERROR;\n            break;\n        }\n\n        /* Something happened. If the next buffer has been marked as done we need to reset a bit of state. */\n        if ((pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwFlags & WHDR_DONE) != 0) {\n            pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser = 0;    /* 0 = unlocked (make it available for writing). */\n            pDevice->winmm.headerFramesConsumedPlayback = 0;\n        }\n\n        /* If the device has been stopped we need to break. */\n        if (!pDevice->winmm.isStarted) {\n            break;\n        }\n    }\n\n    return result;\n}\n\nma_result ma_device_read__winmm(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_result result = MA_SUCCESS;\n    MMRESULT resultMM;\n    ma_uint32 totalFramesRead;\n    WAVEHDR* pWAVEHDR;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pPCMFrames != NULL);\n\n    pWAVEHDR = (WAVEHDR*)pDevice->winmm.pWAVEHDRCapture;\n\n    /* We want to start the device immediately. */\n    if (!pDevice->winmm.isStarted) {\n        ma_uint32 iPeriod;\n\n        /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */\n        ResetEvent((HANDLE)pDevice->winmm.hEventCapture);\n\n        /* To start the device we attach all of the buffers and then start it. As the buffers are filled with data we will get notifications. */\n        for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) {\n            resultMM = ((MA_PFN_waveInAddBuffer)pDevice->pContext->winmm.waveInAddBuffer)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((LPWAVEHDR)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(WAVEHDR));\n            if (resultMM != MMSYSERR_NOERROR) {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WinMM] Failed to attach input buffers to capture device in preparation for capture.\", ma_result_from_MMRESULT(resultMM));\n            }\n\n            /* Make sure all of the buffers start out locked. We don't want to access them until the backend tells us we can. */\n            pWAVEHDR[iPeriod].dwUser = 1;   /* 1 = locked. */\n        }\n\n        /* Capture devices need to be explicitly started, unlike playback devices. */\n        resultMM = ((MA_PFN_waveInStart)pDevice->pContext->winmm.waveInStart)((HWAVEIN)pDevice->winmm.hDeviceCapture);\n        if (resultMM != MMSYSERR_NOERROR) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WinMM] Failed to start backend device.\", ma_result_from_MMRESULT(resultMM));\n        }\n\n        ma_atomic_exchange_32(&pDevice->winmm.isStarted, MA_TRUE);\n    }\n\n    /* Keep processing as much data as possible. */\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n        /* If the current header has some space available we need to write part of it. */\n        if (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser == 0) { /* 0 = unlocked. */\n            /* The buffer is available for reading. If we fully consume it we need to add it back to the buffer. */\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n            ma_uint32 framesRemainingInHeader = (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwBufferLength/bpf) - pDevice->winmm.headerFramesConsumedCapture;\n\n            ma_uint32 framesToCopy = ma_min(framesRemainingInHeader, (frameCount - totalFramesRead));\n            const void* pSrc = ma_offset_ptr(pWAVEHDR[pDevice->winmm.iNextHeaderCapture].lpData, pDevice->winmm.headerFramesConsumedCapture*bpf);\n            void* pDst = ma_offset_ptr(pPCMFrames, totalFramesRead*bpf);\n            ma_copy_memory(pDst, pSrc, framesToCopy*bpf);\n\n            pDevice->winmm.headerFramesConsumedCapture += framesToCopy;\n            totalFramesRead += framesToCopy;\n\n            /* If we've consumed the buffer entirely we need to add it back to the device. */\n            if (pDevice->winmm.headerFramesConsumedCapture == (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwBufferLength/bpf)) {\n                pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser = 1;            /* 1 = locked. */\n                pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwFlags &= ~WHDR_DONE; /* <-- Need to make sure the WHDR_DONE flag is unset. */\n\n                /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */\n                ResetEvent((HANDLE)pDevice->winmm.hEventCapture);\n\n                /* The device will be started here. */\n                resultMM = ((MA_PFN_waveInAddBuffer)pDevice->pContext->winmm.waveInAddBuffer)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((LPWAVEHDR)pDevice->winmm.pWAVEHDRCapture)[pDevice->winmm.iNextHeaderCapture], sizeof(WAVEHDR));\n                if (resultMM != MMSYSERR_NOERROR) {\n                    result = ma_result_from_MMRESULT(resultMM);\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[WinMM] waveInAddBuffer() failed.\", result);\n                    break;\n                }\n\n                /* Make sure we move to the next header. */\n                pDevice->winmm.iNextHeaderCapture = (pDevice->winmm.iNextHeaderCapture + 1) % pDevice->capture.internalPeriods;\n                pDevice->winmm.headerFramesConsumedCapture = 0;\n            }\n\n            /* If at this point we have filled the entire input buffer we can return. */\n            ma_assert(totalFramesRead <= frameCount);\n            if (totalFramesRead == frameCount) {\n                break;\n            }\n\n            /* Getting here means there's more to process. */\n            continue;\n        }\n\n        /* Getting here means there isn't enough any data left to send to the client which means we need to wait for more. */\n        if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventCapture, INFINITE) != WAIT_OBJECT_0) {\n            result = MA_ERROR;\n            break;\n        }\n\n        /* Something happened. If the next buffer has been marked as done we need to reset a bit of state. */\n        if ((pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwFlags & WHDR_DONE) != 0) {\n            pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser = 0;    /* 0 = unlocked (make it available for reading). */\n            pDevice->winmm.headerFramesConsumedCapture = 0;\n        }\n\n        /* If the device has been stopped we need to break. */\n        if (!pDevice->winmm.isStarted) {\n            break;\n        }\n    }\n\n    return result;\n}\n\nma_result ma_context_uninit__winmm(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_winmm);\n\n    ma_dlclose(pContext, pContext->winmm.hWinMM);\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__winmm(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n    pContext->winmm.hWinMM = ma_dlopen(pContext, \"winmm.dll\");\n    if (pContext->winmm.hWinMM == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->winmm.waveOutGetNumDevs      = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutGetNumDevs\");\n    pContext->winmm.waveOutGetDevCapsA     = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutGetDevCapsA\");\n    pContext->winmm.waveOutOpen            = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutOpen\");\n    pContext->winmm.waveOutClose           = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutClose\");\n    pContext->winmm.waveOutPrepareHeader   = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutPrepareHeader\");\n    pContext->winmm.waveOutUnprepareHeader = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutUnprepareHeader\");\n    pContext->winmm.waveOutWrite           = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutWrite\");\n    pContext->winmm.waveOutReset           = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveOutReset\");\n    pContext->winmm.waveInGetNumDevs       = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInGetNumDevs\");\n    pContext->winmm.waveInGetDevCapsA      = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInGetDevCapsA\");\n    pContext->winmm.waveInOpen             = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInOpen\");\n    pContext->winmm.waveInClose            = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInClose\");\n    pContext->winmm.waveInPrepareHeader    = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInPrepareHeader\");\n    pContext->winmm.waveInUnprepareHeader  = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInUnprepareHeader\");\n    pContext->winmm.waveInAddBuffer        = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInAddBuffer\");\n    pContext->winmm.waveInStart            = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInStart\");\n    pContext->winmm.waveInReset            = ma_dlsym(pContext, pContext->winmm.hWinMM, \"waveInReset\");\n\n    pContext->onUninit        = ma_context_uninit__winmm;\n    pContext->onDeviceIDEqual = ma_context_is_device_id_equal__winmm;\n    pContext->onEnumDevices   = ma_context_enumerate_devices__winmm;\n    pContext->onGetDeviceInfo = ma_context_get_device_info__winmm;\n    pContext->onDeviceInit    = ma_device_init__winmm;\n    pContext->onDeviceUninit  = ma_device_uninit__winmm;\n    pContext->onDeviceStart   = NULL; /* Not used. Started in onDeviceWrite/onDeviceRead. */\n    pContext->onDeviceStop    = ma_device_stop__winmm;\n    pContext->onDeviceWrite   = ma_device_write__winmm;\n    pContext->onDeviceRead    = ma_device_read__winmm;\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n\n\n/******************************************************************************\n\nALSA Backend\n\n******************************************************************************/\n#ifdef MA_HAS_ALSA\n\n#ifdef MA_NO_RUNTIME_LINKING\n#include <alsa/asoundlib.h>\ntypedef snd_pcm_uframes_t                       ma_snd_pcm_uframes_t;\ntypedef snd_pcm_sframes_t                       ma_snd_pcm_sframes_t;\ntypedef snd_pcm_stream_t                        ma_snd_pcm_stream_t;\ntypedef snd_pcm_format_t                        ma_snd_pcm_format_t;\ntypedef snd_pcm_access_t                        ma_snd_pcm_access_t;\ntypedef snd_pcm_t                               ma_snd_pcm_t;\ntypedef snd_pcm_hw_params_t                     ma_snd_pcm_hw_params_t;\ntypedef snd_pcm_sw_params_t                     ma_snd_pcm_sw_params_t;\ntypedef snd_pcm_format_mask_t                   ma_snd_pcm_format_mask_t;\ntypedef snd_pcm_info_t                          ma_snd_pcm_info_t;\ntypedef snd_pcm_channel_area_t                  ma_snd_pcm_channel_area_t;\ntypedef snd_pcm_chmap_t                         ma_snd_pcm_chmap_t;\n\n/* snd_pcm_stream_t */\n#define MA_SND_PCM_STREAM_PLAYBACK              SND_PCM_STREAM_PLAYBACK\n#define MA_SND_PCM_STREAM_CAPTURE               SND_PCM_STREAM_CAPTURE\n\n/* snd_pcm_format_t */\n#define MA_SND_PCM_FORMAT_UNKNOWN               SND_PCM_FORMAT_UNKNOWN\n#define MA_SND_PCM_FORMAT_U8                    SND_PCM_FORMAT_U8\n#define MA_SND_PCM_FORMAT_S16_LE                SND_PCM_FORMAT_S16_LE\n#define MA_SND_PCM_FORMAT_S16_BE                SND_PCM_FORMAT_S16_BE\n#define MA_SND_PCM_FORMAT_S24_LE                SND_PCM_FORMAT_S24_LE\n#define MA_SND_PCM_FORMAT_S24_BE                SND_PCM_FORMAT_S24_BE\n#define MA_SND_PCM_FORMAT_S32_LE                SND_PCM_FORMAT_S32_LE\n#define MA_SND_PCM_FORMAT_S32_BE                SND_PCM_FORMAT_S32_BE\n#define MA_SND_PCM_FORMAT_FLOAT_LE              SND_PCM_FORMAT_FLOAT_LE\n#define MA_SND_PCM_FORMAT_FLOAT_BE              SND_PCM_FORMAT_FLOAT_BE\n#define MA_SND_PCM_FORMAT_FLOAT64_LE            SND_PCM_FORMAT_FLOAT64_LE\n#define MA_SND_PCM_FORMAT_FLOAT64_BE            SND_PCM_FORMAT_FLOAT64_BE\n#define MA_SND_PCM_FORMAT_MU_LAW                SND_PCM_FORMAT_MU_LAW\n#define MA_SND_PCM_FORMAT_A_LAW                 SND_PCM_FORMAT_A_LAW\n#define MA_SND_PCM_FORMAT_S24_3LE               SND_PCM_FORMAT_S24_3LE\n#define MA_SND_PCM_FORMAT_S24_3BE               SND_PCM_FORMAT_S24_3BE\n\n/* ma_snd_pcm_access_t */\n#define MA_SND_PCM_ACCESS_MMAP_INTERLEAVED      SND_PCM_ACCESS_MMAP_INTERLEAVED\n#define MA_SND_PCM_ACCESS_MMAP_NONINTERLEAVED   SND_PCM_ACCESS_MMAP_NONINTERLEAVED\n#define MA_SND_PCM_ACCESS_MMAP_COMPLEX          SND_PCM_ACCESS_MMAP_COMPLEX\n#define MA_SND_PCM_ACCESS_RW_INTERLEAVED        SND_PCM_ACCESS_RW_INTERLEAVED\n#define MA_SND_PCM_ACCESS_RW_NONINTERLEAVED     SND_PCM_ACCESS_RW_NONINTERLEAVED\n\n/* Channel positions. */\n#define MA_SND_CHMAP_UNKNOWN                    SND_CHMAP_UNKNOWN\n#define MA_SND_CHMAP_NA                         SND_CHMAP_NA\n#define MA_SND_CHMAP_MONO                       SND_CHMAP_MONO\n#define MA_SND_CHMAP_FL                         SND_CHMAP_FL\n#define MA_SND_CHMAP_FR                         SND_CHMAP_FR\n#define MA_SND_CHMAP_RL                         SND_CHMAP_RL\n#define MA_SND_CHMAP_RR                         SND_CHMAP_RR\n#define MA_SND_CHMAP_FC                         SND_CHMAP_FC\n#define MA_SND_CHMAP_LFE                        SND_CHMAP_LFE\n#define MA_SND_CHMAP_SL                         SND_CHMAP_SL\n#define MA_SND_CHMAP_SR                         SND_CHMAP_SR\n#define MA_SND_CHMAP_RC                         SND_CHMAP_RC\n#define MA_SND_CHMAP_FLC                        SND_CHMAP_FLC\n#define MA_SND_CHMAP_FRC                        SND_CHMAP_FRC\n#define MA_SND_CHMAP_RLC                        SND_CHMAP_RLC\n#define MA_SND_CHMAP_RRC                        SND_CHMAP_RRC\n#define MA_SND_CHMAP_FLW                        SND_CHMAP_FLW\n#define MA_SND_CHMAP_FRW                        SND_CHMAP_FRW\n#define MA_SND_CHMAP_FLH                        SND_CHMAP_FLH\n#define MA_SND_CHMAP_FCH                        SND_CHMAP_FCH\n#define MA_SND_CHMAP_FRH                        SND_CHMAP_FRH\n#define MA_SND_CHMAP_TC                         SND_CHMAP_TC\n#define MA_SND_CHMAP_TFL                        SND_CHMAP_TFL\n#define MA_SND_CHMAP_TFR                        SND_CHMAP_TFR\n#define MA_SND_CHMAP_TFC                        SND_CHMAP_TFC\n#define MA_SND_CHMAP_TRL                        SND_CHMAP_TRL\n#define MA_SND_CHMAP_TRR                        SND_CHMAP_TRR\n#define MA_SND_CHMAP_TRC                        SND_CHMAP_TRC\n#define MA_SND_CHMAP_TFLC                       SND_CHMAP_TFLC\n#define MA_SND_CHMAP_TFRC                       SND_CHMAP_TFRC\n#define MA_SND_CHMAP_TSL                        SND_CHMAP_TSL\n#define MA_SND_CHMAP_TSR                        SND_CHMAP_TSR\n#define MA_SND_CHMAP_LLFE                       SND_CHMAP_LLFE\n#define MA_SND_CHMAP_RLFE                       SND_CHMAP_RLFE\n#define MA_SND_CHMAP_BC                         SND_CHMAP_BC\n#define MA_SND_CHMAP_BLC                        SND_CHMAP_BLC\n#define MA_SND_CHMAP_BRC                        SND_CHMAP_BRC\n\n/* Open mode flags. */\n#define MA_SND_PCM_NO_AUTO_RESAMPLE             SND_PCM_NO_AUTO_RESAMPLE\n#define MA_SND_PCM_NO_AUTO_CHANNELS             SND_PCM_NO_AUTO_CHANNELS\n#define MA_SND_PCM_NO_AUTO_FORMAT               SND_PCM_NO_AUTO_FORMAT\n#else\n#include <errno.h>  /* For EPIPE, etc. */\ntypedef unsigned long                           ma_snd_pcm_uframes_t;\ntypedef long                                    ma_snd_pcm_sframes_t;\ntypedef int                                     ma_snd_pcm_stream_t;\ntypedef int                                     ma_snd_pcm_format_t;\ntypedef int                                     ma_snd_pcm_access_t;\ntypedef struct ma_snd_pcm_t                     ma_snd_pcm_t;\ntypedef struct ma_snd_pcm_hw_params_t           ma_snd_pcm_hw_params_t;\ntypedef struct ma_snd_pcm_sw_params_t           ma_snd_pcm_sw_params_t;\ntypedef struct ma_snd_pcm_format_mask_t         ma_snd_pcm_format_mask_t;\ntypedef struct ma_snd_pcm_info_t                ma_snd_pcm_info_t;\ntypedef struct\n{\n    void* addr;\n    unsigned int first;\n    unsigned int step;\n} ma_snd_pcm_channel_area_t;\ntypedef struct\n{\n    unsigned int channels;\n    unsigned int pos[1];\n} ma_snd_pcm_chmap_t;\n\n/* snd_pcm_state_t */\n#define MA_SND_PCM_STATE_OPEN                  0\n#define MA_SND_PCM_STATE_SETUP                 1\n#define MA_SND_PCM_STATE_PREPARED              2\n#define MA_SND_PCM_STATE_RUNNING               3\n#define MA_SND_PCM_STATE_XRUN                  4\n#define MA_SND_PCM_STATE_DRAINING              5\n#define MA_SND_PCM_STATE_PAUSED                6\n#define MA_SND_PCM_STATE_SUSPENDED             7\n#define MA_SND_PCM_STATE_DISCONNECTED          8\n\n/* snd_pcm_stream_t */\n#define MA_SND_PCM_STREAM_PLAYBACK             0\n#define MA_SND_PCM_STREAM_CAPTURE              1\n\n/* snd_pcm_format_t */\n#define MA_SND_PCM_FORMAT_UNKNOWN              -1\n#define MA_SND_PCM_FORMAT_U8                   1\n#define MA_SND_PCM_FORMAT_S16_LE               2\n#define MA_SND_PCM_FORMAT_S16_BE               3\n#define MA_SND_PCM_FORMAT_S24_LE               6\n#define MA_SND_PCM_FORMAT_S24_BE               7\n#define MA_SND_PCM_FORMAT_S32_LE               10\n#define MA_SND_PCM_FORMAT_S32_BE               11\n#define MA_SND_PCM_FORMAT_FLOAT_LE             14\n#define MA_SND_PCM_FORMAT_FLOAT_BE             15\n#define MA_SND_PCM_FORMAT_FLOAT64_LE           16\n#define MA_SND_PCM_FORMAT_FLOAT64_BE           17\n#define MA_SND_PCM_FORMAT_MU_LAW               20\n#define MA_SND_PCM_FORMAT_A_LAW                21\n#define MA_SND_PCM_FORMAT_S24_3LE              32\n#define MA_SND_PCM_FORMAT_S24_3BE              33\n\n/* snd_pcm_access_t */\n#define MA_SND_PCM_ACCESS_MMAP_INTERLEAVED     0\n#define MA_SND_PCM_ACCESS_MMAP_NONINTERLEAVED  1\n#define MA_SND_PCM_ACCESS_MMAP_COMPLEX         2\n#define MA_SND_PCM_ACCESS_RW_INTERLEAVED       3\n#define MA_SND_PCM_ACCESS_RW_NONINTERLEAVED    4\n\n/* Channel positions. */\n#define MA_SND_CHMAP_UNKNOWN                   0\n#define MA_SND_CHMAP_NA                        1\n#define MA_SND_CHMAP_MONO                      2\n#define MA_SND_CHMAP_FL                        3\n#define MA_SND_CHMAP_FR                        4\n#define MA_SND_CHMAP_RL                        5\n#define MA_SND_CHMAP_RR                        6\n#define MA_SND_CHMAP_FC                        7\n#define MA_SND_CHMAP_LFE                       8\n#define MA_SND_CHMAP_SL                        9\n#define MA_SND_CHMAP_SR                        10\n#define MA_SND_CHMAP_RC                        11\n#define MA_SND_CHMAP_FLC                       12\n#define MA_SND_CHMAP_FRC                       13\n#define MA_SND_CHMAP_RLC                       14\n#define MA_SND_CHMAP_RRC                       15\n#define MA_SND_CHMAP_FLW                       16\n#define MA_SND_CHMAP_FRW                       17\n#define MA_SND_CHMAP_FLH                       18\n#define MA_SND_CHMAP_FCH                       19\n#define MA_SND_CHMAP_FRH                       20\n#define MA_SND_CHMAP_TC                        21\n#define MA_SND_CHMAP_TFL                       22\n#define MA_SND_CHMAP_TFR                       23\n#define MA_SND_CHMAP_TFC                       24\n#define MA_SND_CHMAP_TRL                       25\n#define MA_SND_CHMAP_TRR                       26\n#define MA_SND_CHMAP_TRC                       27\n#define MA_SND_CHMAP_TFLC                      28\n#define MA_SND_CHMAP_TFRC                      29\n#define MA_SND_CHMAP_TSL                       30\n#define MA_SND_CHMAP_TSR                       31\n#define MA_SND_CHMAP_LLFE                      32\n#define MA_SND_CHMAP_RLFE                      33\n#define MA_SND_CHMAP_BC                        34\n#define MA_SND_CHMAP_BLC                       35\n#define MA_SND_CHMAP_BRC                       36\n\n/* Open mode flags. */\n#define MA_SND_PCM_NO_AUTO_RESAMPLE            0x00010000\n#define MA_SND_PCM_NO_AUTO_CHANNELS            0x00020000\n#define MA_SND_PCM_NO_AUTO_FORMAT              0x00040000\n#endif\n\ntypedef int                  (* ma_snd_pcm_open_proc)                          (ma_snd_pcm_t **pcm, const char *name, ma_snd_pcm_stream_t stream, int mode);\ntypedef int                  (* ma_snd_pcm_close_proc)                         (ma_snd_pcm_t *pcm);\ntypedef size_t               (* ma_snd_pcm_hw_params_sizeof_proc)              (void);\ntypedef int                  (* ma_snd_pcm_hw_params_any_proc)                 (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params);\ntypedef int                  (* ma_snd_pcm_hw_params_set_format_proc)          (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_format_first_proc)    (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t *format);\ntypedef void                 (* ma_snd_pcm_hw_params_get_format_mask_proc)     (ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_mask_t *mask);\ntypedef int                  (* ma_snd_pcm_hw_params_set_channels_near_proc)   (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_rate_resample_proc)   (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_rate_near_proc)       (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_set_buffer_size_near_proc)(ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_periods_near_proc)    (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_set_access_proc)          (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t _access);\ntypedef int                  (* ma_snd_pcm_hw_params_get_format_proc)          (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t *format);\ntypedef int                  (* ma_snd_pcm_hw_params_get_channels_proc)        (const ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_channels_min_proc)    (const ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_channels_max_proc)    (const ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_rate_proc)            (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_rate_min_proc)        (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_rate_max_proc)        (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_buffer_size_proc)     (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_periods_proc)         (const ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_access_proc)          (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t *_access);\ntypedef int                  (* ma_snd_pcm_hw_params_proc)                     (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params);\ntypedef size_t               (* ma_snd_pcm_sw_params_sizeof_proc)              (void);\ntypedef int                  (* ma_snd_pcm_sw_params_current_proc)             (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params);\ntypedef int                  (* ma_snd_pcm_sw_params_get_boundary_proc)        (ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t* val);\ntypedef int                  (* ma_snd_pcm_sw_params_set_avail_min_proc)       (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val);\ntypedef int                  (* ma_snd_pcm_sw_params_set_start_threshold_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val);\ntypedef int                  (* ma_snd_pcm_sw_params_set_stop_threshold_proc)  (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val);\ntypedef int                  (* ma_snd_pcm_sw_params_proc)                     (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params);\ntypedef size_t               (* ma_snd_pcm_format_mask_sizeof_proc)            (void);\ntypedef int                  (* ma_snd_pcm_format_mask_test_proc)              (const ma_snd_pcm_format_mask_t *mask, ma_snd_pcm_format_t val);\ntypedef ma_snd_pcm_chmap_t * (* ma_snd_pcm_get_chmap_proc)                     (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_state_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_prepare_proc)                       (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_start_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_drop_proc)                          (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_drain_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_device_name_hint_proc)                  (int card, const char *iface, void ***hints);\ntypedef char *               (* ma_snd_device_name_get_hint_proc)              (const void *hint, const char *id);\ntypedef int                  (* ma_snd_card_get_index_proc)                    (const char *name);\ntypedef int                  (* ma_snd_device_name_free_hint_proc)             (void **hints);\ntypedef int                  (* ma_snd_pcm_mmap_begin_proc)                    (ma_snd_pcm_t *pcm, const ma_snd_pcm_channel_area_t **areas, ma_snd_pcm_uframes_t *offset, ma_snd_pcm_uframes_t *frames);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_mmap_commit_proc)                   (ma_snd_pcm_t *pcm, ma_snd_pcm_uframes_t offset, ma_snd_pcm_uframes_t frames);\ntypedef int                  (* ma_snd_pcm_recover_proc)                       (ma_snd_pcm_t *pcm, int err, int silent);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_readi_proc)                         (ma_snd_pcm_t *pcm, void *buffer, ma_snd_pcm_uframes_t size);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_writei_proc)                        (ma_snd_pcm_t *pcm, const void *buffer, ma_snd_pcm_uframes_t size);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_avail_proc)                         (ma_snd_pcm_t *pcm);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_avail_update_proc)                  (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_wait_proc)                          (ma_snd_pcm_t *pcm, int timeout);\ntypedef int                  (* ma_snd_pcm_info_proc)                          (ma_snd_pcm_t *pcm, ma_snd_pcm_info_t* info);\ntypedef size_t               (* ma_snd_pcm_info_sizeof_proc)                   ();\ntypedef const char*          (* ma_snd_pcm_info_get_name_proc)                 (const ma_snd_pcm_info_t* info);\ntypedef int                  (* ma_snd_config_update_free_global_proc)         ();\n\n/* This array specifies each of the common devices that can be used for both playback and capture. */\nconst char* g_maCommonDeviceNamesALSA[] = {\n    \"default\",\n    \"null\",\n    \"pulse\",\n    \"jack\"\n};\n\n/* This array allows us to blacklist specific playback devices. */\nconst char* g_maBlacklistedPlaybackDeviceNamesALSA[] = {\n    \"\"\n};\n\n/* This array allows us to blacklist specific capture devices. */\nconst char* g_maBlacklistedCaptureDeviceNamesALSA[] = {\n    \"\"\n};\n\n\n/*\nThis array allows miniaudio to control device-specific default buffer sizes. This uses a scaling factor. Order is important. If\nany part of the string is present in the device's name, the associated scale will be used.\n*/\nstatic struct\n{\n    const char* name;\n    float scale;\n} g_maDefaultBufferSizeScalesALSA[] = {\n    {\"bcm2835 IEC958/HDMI\", 2.0f},\n    {\"bcm2835 ALSA\",        2.0f}\n};\n\nfloat ma_find_default_buffer_size_scale__alsa(const char* deviceName)\n{\n    size_t i;\n\n    if (deviceName == NULL) {\n        return 1;\n    }\n\n    for (i = 0; i < ma_countof(g_maDefaultBufferSizeScalesALSA); ++i) {\n        if (strstr(g_maDefaultBufferSizeScalesALSA[i].name, deviceName) != NULL) {\n            return g_maDefaultBufferSizeScalesALSA[i].scale;\n        }\n    }\n\n    return 1;\n}\n\nma_snd_pcm_format_t ma_convert_ma_format_to_alsa_format(ma_format format)\n{\n    ma_snd_pcm_format_t ALSAFormats[] = {\n        MA_SND_PCM_FORMAT_UNKNOWN,     /* ma_format_unknown */\n        MA_SND_PCM_FORMAT_U8,          /* ma_format_u8 */\n        MA_SND_PCM_FORMAT_S16_LE,      /* ma_format_s16 */\n        MA_SND_PCM_FORMAT_S24_3LE,     /* ma_format_s24 */\n        MA_SND_PCM_FORMAT_S32_LE,      /* ma_format_s32 */\n        MA_SND_PCM_FORMAT_FLOAT_LE     /* ma_format_f32 */\n    };\n\n    if (ma_is_big_endian()) {\n        ALSAFormats[0] = MA_SND_PCM_FORMAT_UNKNOWN;\n        ALSAFormats[1] = MA_SND_PCM_FORMAT_U8;\n        ALSAFormats[2] = MA_SND_PCM_FORMAT_S16_BE;\n        ALSAFormats[3] = MA_SND_PCM_FORMAT_S24_3BE;\n        ALSAFormats[4] = MA_SND_PCM_FORMAT_S32_BE;\n        ALSAFormats[5] = MA_SND_PCM_FORMAT_FLOAT_BE;\n    }\n\n    return ALSAFormats[format];\n}\n\nma_format ma_format_from_alsa(ma_snd_pcm_format_t formatALSA)\n{\n    if (ma_is_little_endian()) {\n        switch (formatALSA) {\n            case MA_SND_PCM_FORMAT_S16_LE:   return ma_format_s16;\n            case MA_SND_PCM_FORMAT_S24_3LE:  return ma_format_s24;\n            case MA_SND_PCM_FORMAT_S32_LE:   return ma_format_s32;\n            case MA_SND_PCM_FORMAT_FLOAT_LE: return ma_format_f32;\n            default: break;\n        }\n    } else {\n        switch (formatALSA) {\n            case MA_SND_PCM_FORMAT_S16_BE:   return ma_format_s16;\n            case MA_SND_PCM_FORMAT_S24_3BE:  return ma_format_s24;\n            case MA_SND_PCM_FORMAT_S32_BE:   return ma_format_s32;\n            case MA_SND_PCM_FORMAT_FLOAT_BE: return ma_format_f32;\n            default: break;\n        }\n    }\n\n    /* Endian agnostic. */\n    switch (formatALSA) {\n        case MA_SND_PCM_FORMAT_U8: return ma_format_u8;\n        default: return ma_format_unknown;\n    }\n}\n\nma_channel ma_convert_alsa_channel_position_to_ma_channel(unsigned int alsaChannelPos)\n{\n    switch (alsaChannelPos)\n    {\n        case MA_SND_CHMAP_MONO: return MA_CHANNEL_MONO;\n        case MA_SND_CHMAP_FL:   return MA_CHANNEL_FRONT_LEFT;\n        case MA_SND_CHMAP_FR:   return MA_CHANNEL_FRONT_RIGHT;\n        case MA_SND_CHMAP_RL:   return MA_CHANNEL_BACK_LEFT;\n        case MA_SND_CHMAP_RR:   return MA_CHANNEL_BACK_RIGHT;\n        case MA_SND_CHMAP_FC:   return MA_CHANNEL_FRONT_CENTER;\n        case MA_SND_CHMAP_LFE:  return MA_CHANNEL_LFE;\n        case MA_SND_CHMAP_SL:   return MA_CHANNEL_SIDE_LEFT;\n        case MA_SND_CHMAP_SR:   return MA_CHANNEL_SIDE_RIGHT;\n        case MA_SND_CHMAP_RC:   return MA_CHANNEL_BACK_CENTER;\n        case MA_SND_CHMAP_FLC:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case MA_SND_CHMAP_FRC:  return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case MA_SND_CHMAP_RLC:  return 0;\n        case MA_SND_CHMAP_RRC:  return 0;\n        case MA_SND_CHMAP_FLW:  return 0;\n        case MA_SND_CHMAP_FRW:  return 0;\n        case MA_SND_CHMAP_FLH:  return 0;\n        case MA_SND_CHMAP_FCH:  return 0;\n        case MA_SND_CHMAP_FRH:  return 0;\n        case MA_SND_CHMAP_TC:   return MA_CHANNEL_TOP_CENTER;\n        case MA_SND_CHMAP_TFL:  return MA_CHANNEL_TOP_FRONT_LEFT;\n        case MA_SND_CHMAP_TFR:  return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case MA_SND_CHMAP_TFC:  return MA_CHANNEL_TOP_FRONT_CENTER;\n        case MA_SND_CHMAP_TRL:  return MA_CHANNEL_TOP_BACK_LEFT;\n        case MA_SND_CHMAP_TRR:  return MA_CHANNEL_TOP_BACK_RIGHT;\n        case MA_SND_CHMAP_TRC:  return MA_CHANNEL_TOP_BACK_CENTER;\n        default: break;\n    }\n\n    return 0;\n}\n\nma_bool32 ma_is_common_device_name__alsa(const char* name)\n{\n    size_t iName;\n    for (iName = 0; iName < ma_countof(g_maCommonDeviceNamesALSA); ++iName) {\n        if (ma_strcmp(name, g_maCommonDeviceNamesALSA[iName]) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\n\nma_bool32 ma_is_playback_device_blacklisted__alsa(const char* name)\n{\n    size_t iName;\n    for (iName = 0; iName < ma_countof(g_maBlacklistedPlaybackDeviceNamesALSA); ++iName) {\n        if (ma_strcmp(name, g_maBlacklistedPlaybackDeviceNamesALSA[iName]) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\nma_bool32 ma_is_capture_device_blacklisted__alsa(const char* name)\n{\n    size_t iName;\n    for (iName = 0; iName < ma_countof(g_maBlacklistedCaptureDeviceNamesALSA); ++iName) {\n        if (ma_strcmp(name, g_maBlacklistedCaptureDeviceNamesALSA[iName]) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\nma_bool32 ma_is_device_blacklisted__alsa(ma_device_type deviceType, const char* name)\n{\n    if (deviceType == ma_device_type_playback) {\n        return ma_is_playback_device_blacklisted__alsa(name);\n    } else {\n        return ma_is_capture_device_blacklisted__alsa(name);\n    }\n}\n\n\nconst char* ma_find_char(const char* str, char c, int* index)\n{\n    int i = 0;\n    for (;;) {\n        if (str[i] == '\\0') {\n            if (index) *index = -1;\n            return NULL;\n        }\n\n        if (str[i] == c) {\n            if (index) *index = i;\n            return str + i;\n        }\n\n        i += 1;\n    }\n\n    /* Should never get here, but treat it as though the character was not found to make me feel better inside. */\n    if (index) *index = -1;\n    return NULL;\n}\n\nma_bool32 ma_is_device_name_in_hw_format__alsa(const char* hwid)\n{\n    /* This function is just checking whether or not hwid is in \"hw:%d,%d\" format. */\n\n    int commaPos;\n    const char* dev;\n    int i;\n\n    if (hwid == NULL) {\n        return MA_FALSE;\n    }\n\n    if (hwid[0] != 'h' || hwid[1] != 'w' || hwid[2] != ':') {\n        return MA_FALSE;\n    }\n\n    hwid += 3;\n\n    dev = ma_find_char(hwid, ',', &commaPos);\n    if (dev == NULL) {\n        return MA_FALSE;\n    } else {\n        dev += 1;   /* Skip past the \",\". */\n    }\n\n    /* Check if the part between the \":\" and the \",\" contains only numbers. If not, return false. */\n    for (i = 0; i < commaPos; ++i) {\n        if (hwid[i] < '0' || hwid[i] > '9') {\n            return MA_FALSE;\n        }\n    }\n\n    /* Check if everything after the \",\" is numeric. If not, return false. */\n    i = 0;\n    while (dev[i] != '\\0') {\n        if (dev[i] < '0' || dev[i] > '9') {\n            return MA_FALSE;\n        }\n        i += 1;\n    }\n\n    return MA_TRUE;\n}\n\nint ma_convert_device_name_to_hw_format__alsa(ma_context* pContext, char* dst, size_t dstSize, const char* src)  /* Returns 0 on success, non-0 on error. */\n{\n    /* src should look something like this: \"hw:CARD=I82801AAICH,DEV=0\" */\n\n    int colonPos;\n    int commaPos;\n    char card[256];\n    const char* dev;\n    int cardIndex;\n\n    if (dst == NULL) {\n        return -1;\n    }\n    if (dstSize < 7) {\n        return -1;     /* Absolute minimum size of the output buffer is 7 bytes. */\n    }\n\n    *dst = '\\0';    /* Safety. */\n    if (src == NULL) {\n        return -1;\n    }\n\n    /* If the input name is already in \"hw:%d,%d\" format, just return that verbatim. */\n    if (ma_is_device_name_in_hw_format__alsa(src)) {\n        return ma_strcpy_s(dst, dstSize, src);\n    }\n\n    src = ma_find_char(src, ':', &colonPos);\n    if (src == NULL) {\n        return -1;  /* Couldn't find a colon */\n    }\n\n    dev = ma_find_char(src, ',', &commaPos);\n    if (dev == NULL) {\n        dev = \"0\";\n        ma_strncpy_s(card, sizeof(card), src+6, (size_t)-1);   /* +6 = \":CARD=\" */\n    } else {\n        dev = dev + 5;  /* +5 = \",DEV=\" */\n        ma_strncpy_s(card, sizeof(card), src+6, commaPos-6);   /* +6 = \":CARD=\" */\n    }\n\n    cardIndex = ((ma_snd_card_get_index_proc)pContext->alsa.snd_card_get_index)(card);\n    if (cardIndex < 0) {\n        return -2;  /* Failed to retrieve the card index. */\n    }\n\n    /*printf(\"TESTING: CARD=%s,DEV=%s\\n\", card, dev); */\n\n\n    /* Construction. */\n    dst[0] = 'h'; dst[1] = 'w'; dst[2] = ':';\n    if (ma_itoa_s(cardIndex, dst+3, dstSize-3, 10) != 0) {\n        return -3;\n    }\n    if (ma_strcat_s(dst, dstSize, \",\") != 0) {\n        return -3;\n    }\n    if (ma_strcat_s(dst, dstSize, dev) != 0) {\n        return -3;\n    }\n\n    return 0;\n}\n\nma_bool32 ma_does_id_exist_in_list__alsa(ma_device_id* pUniqueIDs, ma_uint32 count, const char* pHWID)\n{\n    ma_uint32 i;\n\n    ma_assert(pHWID != NULL);\n\n    for (i = 0; i < count; ++i) {\n        if (ma_strcmp(pUniqueIDs[i].alsa, pHWID) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\n\nma_result ma_context_open_pcm__alsa(ma_context* pContext, ma_share_mode shareMode, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_snd_pcm_t** ppPCM)\n{\n    ma_snd_pcm_t* pPCM;\n    ma_snd_pcm_stream_t stream;\n    int openMode;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppPCM != NULL);\n\n    *ppPCM = NULL;\n    pPCM = NULL;\n\n    stream   = (deviceType == ma_device_type_playback) ? MA_SND_PCM_STREAM_PLAYBACK : MA_SND_PCM_STREAM_CAPTURE;\n    openMode = MA_SND_PCM_NO_AUTO_RESAMPLE | MA_SND_PCM_NO_AUTO_CHANNELS | MA_SND_PCM_NO_AUTO_FORMAT;\n\n    if (pDeviceID == NULL) {\n        ma_bool32 isDeviceOpen;\n        size_t i;\n\n        /*\n        We're opening the default device. I don't know if trying anything other than \"default\" is necessary, but it makes\n        me feel better to try as hard as we can get to get _something_ working.\n        */\n        const char* defaultDeviceNames[] = {\n            \"default\",\n            NULL,\n            NULL,\n            NULL,\n            NULL,\n            NULL,\n            NULL\n        };\n\n        if (shareMode == ma_share_mode_exclusive) {\n            defaultDeviceNames[1] = \"hw\";\n            defaultDeviceNames[2] = \"hw:0\";\n            defaultDeviceNames[3] = \"hw:0,0\";\n        } else {\n            if (deviceType == ma_device_type_playback) {\n                defaultDeviceNames[1] = \"dmix\";\n                defaultDeviceNames[2] = \"dmix:0\";\n                defaultDeviceNames[3] = \"dmix:0,0\";\n            } else {\n                defaultDeviceNames[1] = \"dsnoop\";\n                defaultDeviceNames[2] = \"dsnoop:0\";\n                defaultDeviceNames[3] = \"dsnoop:0,0\";\n            }\n            defaultDeviceNames[4] = \"hw\";\n            defaultDeviceNames[5] = \"hw:0\";\n            defaultDeviceNames[6] = \"hw:0,0\";\n        }\n\n        isDeviceOpen = MA_FALSE;\n        for (i = 0; i < ma_countof(defaultDeviceNames); ++i) {\n            if (defaultDeviceNames[i] != NULL && defaultDeviceNames[i][0] != '\\0') {\n                if (((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, defaultDeviceNames[i], stream, openMode) == 0) {\n                    isDeviceOpen = MA_TRUE;\n                    break;\n                }\n            }\n        }\n\n        if (!isDeviceOpen) {\n            return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_open() failed when trying to open an appropriate default device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n    } else {\n        /*\n        We're trying to open a specific device. There's a few things to consider here:\n        \n        miniaudio recongnizes a special format of device id that excludes the \"hw\", \"dmix\", etc. prefix. It looks like this: \":0,0\", \":0,1\", etc. When\n        an ID of this format is specified, it indicates to miniaudio that it can try different combinations of plugins (\"hw\", \"dmix\", etc.) until it\n        finds an appropriate one that works. This comes in very handy when trying to open a device in shared mode (\"dmix\"), vs exclusive mode (\"hw\").\n        */\n\n        /* May end up needing to make small adjustments to the ID, so make a copy. */\n        ma_device_id deviceID = *pDeviceID;\n        ma_bool32 isDeviceOpen = MA_FALSE;\n\n        if (deviceID.alsa[0] != ':') {\n            /* The ID is not in \":0,0\" format. Use the ID exactly as-is. */\n            if (((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, deviceID.alsa, stream, openMode) == 0) {\n                isDeviceOpen = MA_TRUE;\n            }\n        } else {\n            char hwid[256];\n\n            /* The ID is in \":0,0\" format. Try different plugins depending on the shared mode. */\n            if (deviceID.alsa[1] == '\\0') {\n                deviceID.alsa[0] = '\\0';  /* An ID of \":\" should be converted to \"\". */\n            }\n\n            if (shareMode == ma_share_mode_shared) {\n                if (deviceType == ma_device_type_playback) {\n                    ma_strcpy_s(hwid, sizeof(hwid), \"dmix\");\n                } else {\n                    ma_strcpy_s(hwid, sizeof(hwid), \"dsnoop\");\n                }\n\n                if (ma_strcat_s(hwid, sizeof(hwid), deviceID.alsa) == 0) {\n                    if (((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, hwid, stream, openMode) == 0) {\n                        isDeviceOpen = MA_TRUE;\n                    }\n                }\n            }\n\n            /* If at this point we still don't have an open device it means we're either preferencing exclusive mode or opening with \"dmix\"/\"dsnoop\" failed. */\n            if (!isDeviceOpen) {\n                ma_strcpy_s(hwid, sizeof(hwid), \"hw\");\n                if (ma_strcat_s(hwid, sizeof(hwid), deviceID.alsa) == 0) {\n                    if (((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, hwid, stream, openMode) == 0) {\n                        isDeviceOpen = MA_TRUE;\n                    }\n                }\n            }\n        }\n\n        if (!isDeviceOpen) {\n            return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_open() failed.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n    }\n\n    *ppPCM = pPCM;\n    return MA_SUCCESS;\n}\n\n\nma_bool32 ma_context_is_device_id_equal__alsa(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return ma_strcmp(pID0->alsa, pID1->alsa) == 0;\n}\n\nma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n    char** ppDeviceHints;\n    ma_device_id* pUniqueIDs = NULL;\n    ma_uint32 uniqueIDCount = 0;\n    char** ppNextDeviceHint;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    ma_mutex_lock(&pContext->alsa.internalDeviceEnumLock);\n\n    if (((ma_snd_device_name_hint_proc)pContext->alsa.snd_device_name_hint)(-1, \"pcm\", (void***)&ppDeviceHints) < 0) {\n        ma_mutex_unlock(&pContext->alsa.internalDeviceEnumLock);\n        return MA_NO_BACKEND;\n    }\n\n    ppNextDeviceHint = ppDeviceHints;\n    while (*ppNextDeviceHint != NULL) {\n        char* NAME = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"NAME\");\n        char* DESC = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"DESC\");\n        char* IOID = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"IOID\");\n        ma_device_type deviceType = ma_device_type_playback;\n        ma_bool32 stopEnumeration = MA_FALSE;\n        char hwid[sizeof(pUniqueIDs->alsa)];\n        ma_device_info deviceInfo;\n\n        if ((IOID == NULL || ma_strcmp(IOID, \"Output\") == 0)) {\n            deviceType = ma_device_type_playback;\n        }\n        if ((IOID != NULL && ma_strcmp(IOID, \"Input\" ) == 0)) {\n            deviceType = ma_device_type_capture;\n        }\n\n        if (NAME != NULL) {\n            if (pContext->alsa.useVerboseDeviceEnumeration) {\n                /* Verbose mode. Use the name exactly as-is. */\n                ma_strncpy_s(hwid, sizeof(hwid), NAME, (size_t)-1);\n            } else {\n                /* Simplified mode. Use \":%d,%d\" format. */\n                if (ma_convert_device_name_to_hw_format__alsa(pContext, hwid, sizeof(hwid), NAME) == 0) {\n                    /*\n                    At this point, hwid looks like \"hw:0,0\". In simplified enumeration mode, we actually want to strip off the\n                    plugin name so it looks like \":0,0\". The reason for this is that this special format is detected at device\n                    initialization time and is used as an indicator to try and use the most appropriate plugin depending on the\n                    device type and sharing mode.\n                    */\n                    char* dst = hwid;\n                    char* src = hwid+2;\n                    while ((*dst++ = *src++));\n                } else {\n                    /* Conversion to \"hw:%d,%d\" failed. Just use the name as-is. */\n                    ma_strncpy_s(hwid, sizeof(hwid), NAME, (size_t)-1);\n                }\n\n                if (ma_does_id_exist_in_list__alsa(pUniqueIDs, uniqueIDCount, hwid)) {\n                    goto next_device;   /* The device has already been enumerated. Move on to the next one. */\n                } else {\n                    /* The device has not yet been enumerated. Make sure it's added to our list so that it's not enumerated again. */\n                    ma_device_id* pNewUniqueIDs = (ma_device_id*)ma_realloc(pUniqueIDs, sizeof(*pUniqueIDs) * (uniqueIDCount + 1));\n                    if (pNewUniqueIDs == NULL) {\n                        goto next_device;   /* Failed to allocate memory. */\n                    }\n\n                    pUniqueIDs = pNewUniqueIDs;\n                    ma_copy_memory(pUniqueIDs[uniqueIDCount].alsa, hwid, sizeof(hwid));\n                    uniqueIDCount += 1;\n                }\n            }\n        } else {\n            ma_zero_memory(hwid, sizeof(hwid));\n        }\n\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.id.alsa, sizeof(deviceInfo.id.alsa), hwid, (size_t)-1);\n\n        /*\n        DESC is the friendly name. We treat this slightly differently depending on whether or not we are using verbose\n        device enumeration. In verbose mode we want to take the entire description so that the end-user can distinguish\n        between the subdevices of each card/dev pair. In simplified mode, however, we only want the first part of the\n        description.\n        \n        The value in DESC seems to be split into two lines, with the first line being the name of the device and the\n        second line being a description of the device. I don't like having the description be across two lines because\n        it makes formatting ugly and annoying. I'm therefore deciding to put it all on a single line with the second line\n        being put into parentheses. In simplified mode I'm just stripping the second line entirely.\n        */\n        if (DESC != NULL) {\n            int lfPos;\n            const char* line2 = ma_find_char(DESC, '\\n', &lfPos);\n            if (line2 != NULL) {\n                line2 += 1; /* Skip past the new-line character. */\n\n                if (pContext->alsa.useVerboseDeviceEnumeration) {\n                    /* Verbose mode. Put the second line in brackets. */\n                    ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, lfPos);\n                    ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), \" (\");\n                    ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), line2);\n                    ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), \")\");\n                } else {\n                    /* Simplified mode. Strip the second line entirely. */\n                    ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, lfPos);\n                }\n            } else {\n                /* There's no second line. Just copy the whole description. */\n                ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, (size_t)-1);\n            }\n        }\n\n        if (!ma_is_device_blacklisted__alsa(deviceType, NAME)) {\n            cbResult = callback(pContext, deviceType, &deviceInfo, pUserData);\n        }\n\n        /*\n        Some devices are both playback and capture, but they are only enumerated by ALSA once. We need to fire the callback\n        again for the other device type in this case. We do this for known devices.\n        */\n        if (cbResult) {\n            if (ma_is_common_device_name__alsa(NAME)) {\n                if (deviceType == ma_device_type_playback) {\n                    if (!ma_is_capture_device_blacklisted__alsa(NAME)) {\n                        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                    }\n                } else {\n                    if (!ma_is_playback_device_blacklisted__alsa(NAME)) {\n                        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                    }\n                }\n            }\n        }\n\n        if (cbResult == MA_FALSE) {\n            stopEnumeration = MA_TRUE;\n        }\n\n    next_device:\n        free(NAME);\n        free(DESC);\n        free(IOID);\n        ppNextDeviceHint += 1;\n\n        /* We need to stop enumeration if the callback returned false. */\n        if (stopEnumeration) {\n            break;\n        }\n    }\n\n    ma_free(pUniqueIDs);\n    ((ma_snd_device_name_free_hint_proc)pContext->alsa.snd_device_name_free_hint)((void**)ppDeviceHints);\n\n    ma_mutex_unlock(&pContext->alsa.internalDeviceEnumLock);\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    ma_device_type deviceType;\n    const ma_device_id* pDeviceID;\n    ma_share_mode shareMode;\n    ma_device_info* pDeviceInfo;\n    ma_bool32 foundDevice;\n} ma_context_get_device_info_enum_callback_data__alsa;\n\nma_bool32 ma_context_get_device_info_enum_callback__alsa(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pDeviceInfo, void* pUserData)\n{\n    ma_context_get_device_info_enum_callback_data__alsa* pData = (ma_context_get_device_info_enum_callback_data__alsa*)pUserData;\n    ma_assert(pData != NULL);\n\n    if (pData->pDeviceID == NULL && ma_strcmp(pDeviceInfo->id.alsa, \"default\") == 0) {\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pDeviceInfo->name, (size_t)-1);\n        pData->foundDevice = MA_TRUE;\n    } else {\n        if (pData->deviceType == deviceType && ma_context_is_device_id_equal__alsa(pContext, pData->pDeviceID, &pDeviceInfo->id)) {\n            ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pDeviceInfo->name, (size_t)-1);\n            pData->foundDevice = MA_TRUE;\n        }\n    }\n\n    /* Keep enumerating until we have found the device. */\n    return !pData->foundDevice;\n}\n\nma_result ma_context_get_device_info__alsa(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_context_get_device_info_enum_callback_data__alsa data;\n    ma_result result;\n    ma_snd_pcm_t* pPCM;\n    ma_snd_pcm_hw_params_t* pHWParams;\n    ma_snd_pcm_format_mask_t* pFormatMask;\n    int sampleRateDir = 0;\n\n    ma_assert(pContext != NULL);\n\n    /* We just enumerate to find basic information about the device. */\n    data.deviceType = deviceType;\n    data.pDeviceID = pDeviceID;\n    data.shareMode = shareMode;\n    data.pDeviceInfo = pDeviceInfo;\n    data.foundDevice = MA_FALSE;\n    result = ma_context_enumerate_devices__alsa(pContext, ma_context_get_device_info_enum_callback__alsa, &data);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (!data.foundDevice) {\n        return MA_NO_DEVICE;\n    }\n\n    /* For detailed info we need to open the device. */\n    result = ma_context_open_pcm__alsa(pContext, shareMode, deviceType, pDeviceID, &pPCM);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* We need to initialize a HW parameters object in order to know what formats are supported. */\n    pHWParams = (ma_snd_pcm_hw_params_t*)calloc(1, ((ma_snd_pcm_hw_params_sizeof_proc)pContext->alsa.snd_pcm_hw_params_sizeof)());\n    if (pHWParams == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    if (((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams) < 0) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to initialize hardware parameters. snd_pcm_hw_params_any() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n    }\n\n    ((ma_snd_pcm_hw_params_get_channels_min_proc)pContext->alsa.snd_pcm_hw_params_get_channels_min)(pHWParams, &pDeviceInfo->minChannels);\n    ((ma_snd_pcm_hw_params_get_channels_max_proc)pContext->alsa.snd_pcm_hw_params_get_channels_max)(pHWParams, &pDeviceInfo->maxChannels);\n    ((ma_snd_pcm_hw_params_get_rate_min_proc)pContext->alsa.snd_pcm_hw_params_get_rate_min)(pHWParams, &pDeviceInfo->minSampleRate, &sampleRateDir);\n    ((ma_snd_pcm_hw_params_get_rate_max_proc)pContext->alsa.snd_pcm_hw_params_get_rate_max)(pHWParams, &pDeviceInfo->maxSampleRate, &sampleRateDir);\n\n    /* Formats. */\n    pFormatMask = (ma_snd_pcm_format_mask_t*)calloc(1, ((ma_snd_pcm_format_mask_sizeof_proc)pContext->alsa.snd_pcm_format_mask_sizeof)());\n    if (pFormatMask == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    ((ma_snd_pcm_hw_params_get_format_mask_proc)pContext->alsa.snd_pcm_hw_params_get_format_mask)(pHWParams, pFormatMask);\n\n    pDeviceInfo->formatCount = 0;\n    if (((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, MA_SND_PCM_FORMAT_U8)) {\n        pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_u8;\n    }\n    if (((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, MA_SND_PCM_FORMAT_S16_LE)) {\n        pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_s16;\n    }\n    if (((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, MA_SND_PCM_FORMAT_S24_3LE)) {\n        pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_s24;\n    }\n    if (((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, MA_SND_PCM_FORMAT_S32_LE)) {\n        pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_s32;\n    }\n    if (((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, MA_SND_PCM_FORMAT_FLOAT_LE)) {\n        pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_f32;\n    }\n\n    ma_free(pFormatMask);\n    ma_free(pHWParams);\n\n    ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM);\n    return MA_SUCCESS;\n}\n\n\n#if 0\n/*\nWaits for a number of frames to become available for either capture or playback. The return\nvalue is the number of frames available.\n\nThis will return early if the main loop is broken with ma_device__break_main_loop().\n*/\nma_uint32 ma_device__wait_for_frames__alsa(ma_device* pDevice, ma_bool32* pRequiresRestart)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pRequiresRestart) *pRequiresRestart = MA_FALSE;\n\n    /* I want it so that this function returns the period size in frames. We just wait until that number of frames are available and then return. */\n    ma_uint32 periodSizeInFrames = pDevice->bufferSizeInFrames / pDevice->periods;\n    while (!pDevice->alsa.breakFromMainLoop) {\n        ma_snd_pcm_sframes_t framesAvailable = ((ma_snd_pcm_avail_update_proc)pDevice->pContext->alsa.snd_pcm_avail_update)((ma_snd_pcm_t*)pDevice->alsa.pPCM);\n        if (framesAvailable < 0) {\n            if (framesAvailable == -EPIPE) {\n                if (((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCM, framesAvailable, MA_TRUE) < 0) {\n                    return 0;\n                }\n\n                /* A device recovery means a restart for mmap mode. */\n                if (pRequiresRestart) {\n                    *pRequiresRestart = MA_TRUE;\n                }\n\n                /* Try again, but if it fails this time just return an error. */\n                framesAvailable = ((ma_snd_pcm_avail_update_proc)pDevice->pContext->alsa.snd_pcm_avail_update)((ma_snd_pcm_t*)pDevice->alsa.pPCM);\n                if (framesAvailable < 0) {\n                    return 0;\n                }\n            }\n        }\n\n        if (framesAvailable >= periodSizeInFrames) {\n            return periodSizeInFrames;\n        }\n\n        if (framesAvailable < periodSizeInFrames) {\n            /* Less than a whole period is available so keep waiting. */\n            int waitResult = ((ma_snd_pcm_wait_proc)pDevice->pContext->alsa.snd_pcm_wait)((ma_snd_pcm_t*)pDevice->alsa.pPCM, -1);\n            if (waitResult < 0) {\n                if (waitResult == -EPIPE) {\n                    if (((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCM, waitResult, MA_TRUE) < 0) {\n                        return 0;\n                    }\n\n                    /* A device recovery means a restart for mmap mode. */\n                    if (pRequiresRestart) {\n                        *pRequiresRestart = MA_TRUE;\n                    }\n                }\n            }\n        }\n    }\n\n    /* We'll get here if the loop was terminated. Just return whatever's available. */\n    ma_snd_pcm_sframes_t framesAvailable = ((ma_snd_pcm_avail_update_proc)pDevice->pContext->alsa.snd_pcm_avail_update)((ma_snd_pcm_t*)pDevice->alsa.pPCM);\n    if (framesAvailable < 0) {\n        return 0;\n    }\n\n    return framesAvailable;\n}\n\nma_bool32 ma_device_read_from_client_and_write__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n    if (!ma_device_is_started(pDevice) && ma_device__get_state(pDevice) != MA_STATE_STARTING) {\n        return MA_FALSE;\n    }\n    if (pDevice->alsa.breakFromMainLoop) {\n        return MA_FALSE;\n    }\n\n    if (pDevice->alsa.isUsingMMap) {\n        /* mmap. */\n        ma_bool32 requiresRestart;\n        ma_uint32 framesAvailable = ma_device__wait_for_frames__alsa(pDevice, &requiresRestart);\n        if (framesAvailable == 0) {\n            return MA_FALSE;\n        }\n\n        /* Don't bother asking the client for more audio data if we're just stopping the device anyway. */\n        if (pDevice->alsa.breakFromMainLoop) {\n            return MA_FALSE;\n        }\n\n        const ma_snd_pcm_channel_area_t* pAreas;\n        ma_snd_pcm_uframes_t mappedOffset;\n        ma_snd_pcm_uframes_t mappedFrames = framesAvailable;\n        while (framesAvailable > 0) {\n            int result = ((ma_snd_pcm_mmap_begin_proc)pDevice->pContext->alsa.snd_pcm_mmap_begin)((ma_snd_pcm_t*)pDevice->alsa.pPCM, &pAreas, &mappedOffset, &mappedFrames);\n            if (result < 0) {\n                return MA_FALSE;\n            }\n\n            if (mappedFrames > 0) {\n                void* pBuffer = (ma_uint8*)pAreas[0].addr + ((pAreas[0].first + (mappedOffset * pAreas[0].step)) / 8);\n                ma_device__read_frames_from_client(pDevice, mappedFrames, pBuffer);\n            }\n\n            result = ((ma_snd_pcm_mmap_commit_proc)pDevice->pContext->alsa.snd_pcm_mmap_commit)((ma_snd_pcm_t*)pDevice->alsa.pPCM, mappedOffset, mappedFrames);\n            if (result < 0 || (ma_snd_pcm_uframes_t)result != mappedFrames) {\n                ((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCM, result, MA_TRUE);\n                return MA_FALSE;\n            }\n\n            if (requiresRestart) {\n                if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCM) < 0) {\n                    return MA_FALSE;\n                }\n            }\n\n            if (framesAvailable >= mappedFrames) {\n                framesAvailable -= mappedFrames;\n            } else {\n                framesAvailable = 0;\n            }\n        }\n    } else {\n        /* readi/writei. */\n        while (!pDevice->alsa.breakFromMainLoop) {\n            ma_uint32 framesAvailable = ma_device__wait_for_frames__alsa(pDevice, NULL);\n            if (framesAvailable == 0) {\n                continue;\n            }\n\n            /* Don't bother asking the client for more audio data if we're just stopping the device anyway. */\n            if (pDevice->alsa.breakFromMainLoop) {\n                return MA_FALSE;\n            }\n\n            ma_device__read_frames_from_client(pDevice, framesAvailable, pDevice->alsa.pIntermediaryBuffer);\n\n            ma_snd_pcm_sframes_t framesWritten = ((ma_snd_pcm_writei_proc)pDevice->pContext->alsa.snd_pcm_writei)((ma_snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);\n            if (framesWritten < 0) {\n                if (framesWritten == -EAGAIN) {\n                    continue;   /* Just keep trying... */\n                } else if (framesWritten == -EPIPE) {\n                    /* Underrun. Just recover and try writing again. */\n                    if (((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCM, framesWritten, MA_TRUE) < 0) {\n                        ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to recover device after underrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                        return MA_FALSE;\n                    }\n\n                    framesWritten = ((ma_snd_pcm_writei_proc)pDevice->pContext->alsa.snd_pcm_writei)((ma_snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);\n                    if (framesWritten < 0) {\n                        ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to write data to the internal device.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n                        return MA_FALSE;\n                    }\n\n                    break;  /* Success. */\n                } else {\n                    ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_writei() failed when writing initial data.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n                    return MA_FALSE;\n                }\n            } else {\n                break;  /* Success. */\n            }\n        }\n    }\n\n    return MA_TRUE;\n}\n\nma_bool32 ma_device_read_and_send_to_client__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n    if (!ma_device_is_started(pDevice)) {\n        return MA_FALSE;\n    }\n    if (pDevice->alsa.breakFromMainLoop) {\n        return MA_FALSE;\n    }\n\n    ma_uint32 framesToSend = 0;\n    void* pBuffer = NULL;\n    if (pDevice->alsa.pIntermediaryBuffer == NULL) {\n        /* mmap. */\n        ma_bool32 requiresRestart;\n        ma_uint32 framesAvailable = ma_device__wait_for_frames__alsa(pDevice, &requiresRestart);\n        if (framesAvailable == 0) {\n            return MA_FALSE;\n        }\n\n        const ma_snd_pcm_channel_area_t* pAreas;\n        ma_snd_pcm_uframes_t mappedOffset;\n        ma_snd_pcm_uframes_t mappedFrames = framesAvailable;\n        while (framesAvailable > 0) {\n            int result = ((ma_snd_pcm_mmap_begin_proc)pDevice->pContext->alsa.snd_pcm_mmap_begin)((ma_snd_pcm_t*)pDevice->alsa.pPCM, &pAreas, &mappedOffset, &mappedFrames);\n            if (result < 0) {\n                return MA_FALSE;\n            }\n\n            if (mappedFrames > 0) {\n                void* pBuffer = (ma_uint8*)pAreas[0].addr + ((pAreas[0].first + (mappedOffset * pAreas[0].step)) / 8);\n                ma_device__send_frames_to_client(pDevice, mappedFrames, pBuffer);\n            }\n\n            result = ((ma_snd_pcm_mmap_commit_proc)pDevice->pContext->alsa.snd_pcm_mmap_commit)((ma_snd_pcm_t*)pDevice->alsa.pPCM, mappedOffset, mappedFrames);\n            if (result < 0 || (ma_snd_pcm_uframes_t)result != mappedFrames) {\n                ((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCM, result, MA_TRUE);\n                return MA_FALSE;\n            }\n\n            if (requiresRestart) {\n                if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCM) < 0) {\n                    return MA_FALSE;\n                }\n            }\n\n            if (framesAvailable >= mappedFrames) {\n                framesAvailable -= mappedFrames;\n            } else {\n                framesAvailable = 0;\n            }\n        }\n    } else {\n        /* readi/writei. */\n        ma_snd_pcm_sframes_t framesRead = 0;\n        while (!pDevice->alsa.breakFromMainLoop) {\n            ma_uint32 framesAvailable = ma_device__wait_for_frames__alsa(pDevice, NULL);\n            if (framesAvailable == 0) {\n                continue;\n            }\n\n            framesRead = ((ma_snd_pcm_readi_proc)pDevice->pContext->alsa.snd_pcm_readi)((ma_snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);\n            if (framesRead < 0) {\n                if (framesRead == -EAGAIN) {\n                    continue;   /* Just keep trying... */\n                } else if (framesRead == -EPIPE) {\n                    /* Overrun. Just recover and try reading again. */\n                    if (((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCM, framesRead, MA_TRUE) < 0) {\n                        ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to recover device after overrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                        return MA_FALSE;\n                    }\n\n                    framesRead = ((ma_snd_pcm_readi_proc)pDevice->pContext->alsa.snd_pcm_readi)((ma_snd_pcm_t*)pDevice->alsa.pPCM, pDevice->alsa.pIntermediaryBuffer, framesAvailable);\n                    if (framesRead < 0) {\n                        ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to read data from the internal device.\", MA_FAILED_TO_READ_DATA_FROM_DEVICE);\n                        return MA_FALSE;\n                    }\n\n                    break;  /* Success. */\n                } else {\n                    return MA_FALSE;\n                }\n            } else {\n                break;  /* Success. */\n            }\n        }\n\n        framesToSend = framesRead;\n        pBuffer = pDevice->alsa.pIntermediaryBuffer;\n    }\n\n    if (framesToSend > 0) {\n        ma_device__send_frames_to_client(pDevice, framesToSend, pBuffer);\n    }\n\n    return MA_TRUE;\n}\n#endif /* 0 */\n\nvoid ma_device_uninit__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if ((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture);\n    }\n\n    if ((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback);\n    }\n}\n\nma_result ma_device_init_by_type__alsa(ma_context* pContext, const ma_device_config* pConfig, ma_device_type deviceType, ma_device* pDevice)\n{\n    ma_result result;\n    ma_snd_pcm_t* pPCM;\n    ma_bool32 isUsingMMap;\n    ma_snd_pcm_format_t formatALSA;\n    ma_share_mode shareMode;\n    ma_device_id* pDeviceID;\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_channel internalChannelMap[MA_MAX_CHANNELS];\n    ma_uint32 internalBufferSizeInFrames;\n    ma_uint32 internalPeriods;\n    ma_snd_pcm_hw_params_t* pHWParams;\n    ma_snd_pcm_sw_params_t* pSWParams;\n    ma_snd_pcm_uframes_t bufferBoundary;\n    float bufferSizeScaleFactor;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pConfig != NULL);\n    ma_assert(deviceType != ma_device_type_duplex); /* This function should only be called for playback _or_ capture, never duplex. */\n    ma_assert(pDevice != NULL);\n\n    formatALSA = ma_convert_ma_format_to_alsa_format((deviceType == ma_device_type_capture) ? pConfig->capture.format : pConfig->playback.format);\n    shareMode  = (deviceType == ma_device_type_capture) ? pConfig->capture.shareMode : pConfig->playback.shareMode;\n    pDeviceID  = (deviceType == ma_device_type_capture) ? pConfig->capture.pDeviceID : pConfig->playback.pDeviceID;\n\n    result = ma_context_open_pcm__alsa(pContext, shareMode, deviceType, pDeviceID, &pPCM);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* If using the default buffer size we may want to apply some device-specific scaling for known devices that have peculiar latency characteristics */\n    bufferSizeScaleFactor = 1;\n    if (pDevice->usingDefaultBufferSize) {\n        ma_snd_pcm_info_t* pInfo = (ma_snd_pcm_info_t*)calloc(1, ((ma_snd_pcm_info_sizeof_proc)pContext->alsa.snd_pcm_info_sizeof)());\n        if (pInfo == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        /* We may need to scale the size of the buffer depending on the device. */\n        if (((ma_snd_pcm_info_proc)pContext->alsa.snd_pcm_info)(pPCM, pInfo) == 0) {\n            const char* deviceName = ((ma_snd_pcm_info_get_name_proc)pContext->alsa.snd_pcm_info_get_name)(pInfo);\n            if (deviceName != NULL) {\n                if (ma_strcmp(deviceName, \"default\") == 0) {\n                    char** ppDeviceHints;\n                    char** ppNextDeviceHint;\n\n                    /* It's the default device. We need to use DESC from snd_device_name_hint(). */\n                    if (((ma_snd_device_name_hint_proc)pContext->alsa.snd_device_name_hint)(-1, \"pcm\", (void***)&ppDeviceHints) < 0) {\n                        ma_free(pInfo);\n                        return MA_NO_BACKEND;\n                    }\n\n                    ppNextDeviceHint = ppDeviceHints;\n                    while (*ppNextDeviceHint != NULL) {\n                        char* NAME = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"NAME\");\n                        char* DESC = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"DESC\");\n                        char* IOID = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"IOID\");\n\n                        ma_bool32 foundDevice = MA_FALSE;\n                        if ((deviceType == ma_device_type_playback && (IOID == NULL || ma_strcmp(IOID, \"Output\") == 0)) ||\n                            (deviceType == ma_device_type_capture  && (IOID != NULL && ma_strcmp(IOID, \"Input\" ) == 0))) {\n                            if (ma_strcmp(NAME, deviceName) == 0) {\n                                bufferSizeScaleFactor = ma_find_default_buffer_size_scale__alsa(DESC);\n                                foundDevice = MA_TRUE;\n                            }\n                        }\n\n                        free(NAME);\n                        free(DESC);\n                        free(IOID);\n                        ppNextDeviceHint += 1;\n\n                        if (foundDevice) {\n                            break;\n                        }\n                    }\n\n                    ((ma_snd_device_name_free_hint_proc)pContext->alsa.snd_device_name_free_hint)((void**)ppDeviceHints);\n                } else {\n                    bufferSizeScaleFactor = ma_find_default_buffer_size_scale__alsa(deviceName);\n                }\n            }\n        }\n\n        ma_free(pInfo);\n    }\n\n\n    /* Hardware parameters. */\n    pHWParams = (ma_snd_pcm_hw_params_t*)calloc(1, ((ma_snd_pcm_hw_params_sizeof_proc)pContext->alsa.snd_pcm_hw_params_sizeof)());\n    if (pHWParams == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    if (((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams) < 0) {\n        ma_free(pHWParams);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to initialize hardware parameters. snd_pcm_hw_params_any() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n    }\n\n    /* MMAP Mode. Try using interleaved MMAP access. If this fails, fall back to standard readi/writei. */\n    isUsingMMap = MA_FALSE;\n#if 0   /* NOTE: MMAP mode temporarily disabled. */\n    if (deviceType != ma_device_type_capture) {    /* <-- Disabling MMAP mode for capture devices because I apparently do not have a device that supports it which means I can't test it... Contributions welcome. */\n        if (!pConfig->alsa.noMMap && ma_device__is_async(pDevice)) {\n            if (((ma_snd_pcm_hw_params_set_access_proc)pContext->alsa.snd_pcm_hw_params_set_access)(pPCM, pHWParams, MA_SND_PCM_ACCESS_MMAP_INTERLEAVED) == 0) {\n                pDevice->alsa.isUsingMMap = MA_TRUE;\n            }\n        }\n    }\n#endif\n\n    if (!isUsingMMap) {\n        if (((ma_snd_pcm_hw_params_set_access_proc)pContext->alsa.snd_pcm_hw_params_set_access)(pPCM, pHWParams, MA_SND_PCM_ACCESS_RW_INTERLEAVED) < 0) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set access mode to neither SND_PCM_ACCESS_MMAP_INTERLEAVED nor SND_PCM_ACCESS_RW_INTERLEAVED. snd_pcm_hw_params_set_access() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    }\n\n    /*\n    Most important properties first. The documentation for OSS (yes, I know this is ALSA!) recommends format, channels, then sample rate. I can't\n    find any documentation for ALSA specifically, so I'm going to copy the recommendation for OSS.\n    */\n\n    /* Format. */\n    {\n        ma_snd_pcm_format_mask_t* pFormatMask;\n\n        /* Try getting every supported format first. */\n        pFormatMask = (ma_snd_pcm_format_mask_t*)calloc(1, ((ma_snd_pcm_format_mask_sizeof_proc)pContext->alsa.snd_pcm_format_mask_sizeof)());\n        if (pFormatMask == NULL) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        ((ma_snd_pcm_hw_params_get_format_mask_proc)pContext->alsa.snd_pcm_hw_params_get_format_mask)(pHWParams, pFormatMask);\n\n        /*\n        At this point we should have a list of supported formats, so now we need to find the best one. We first check if the requested format is\n        supported, and if so, use that one. If it's not supported, we just run though a list of formats and try to find the best one.\n        */\n        if (!((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, formatALSA)) {\n            size_t i;\n\n            /* The requested format is not supported so now try running through the list of formats and return the best one. */\n            ma_snd_pcm_format_t preferredFormatsALSA[] = {\n                MA_SND_PCM_FORMAT_S16_LE,      /* ma_format_s16 */\n                MA_SND_PCM_FORMAT_FLOAT_LE,    /* ma_format_f32 */\n                MA_SND_PCM_FORMAT_S32_LE,      /* ma_format_s32 */\n                MA_SND_PCM_FORMAT_S24_3LE,     /* ma_format_s24 */\n                MA_SND_PCM_FORMAT_U8           /* ma_format_u8 */\n            };\n\n            if (ma_is_big_endian()) {\n                preferredFormatsALSA[0] = MA_SND_PCM_FORMAT_S16_BE;\n                preferredFormatsALSA[1] = MA_SND_PCM_FORMAT_FLOAT_BE;\n                preferredFormatsALSA[2] = MA_SND_PCM_FORMAT_S32_BE;\n                preferredFormatsALSA[3] = MA_SND_PCM_FORMAT_S24_3BE;\n                preferredFormatsALSA[4] = MA_SND_PCM_FORMAT_U8;\n            }\n\n            formatALSA = MA_SND_PCM_FORMAT_UNKNOWN;\n            for (i = 0; i < (sizeof(preferredFormatsALSA) / sizeof(preferredFormatsALSA[0])); ++i) {\n                if (((ma_snd_pcm_format_mask_test_proc)pContext->alsa.snd_pcm_format_mask_test)(pFormatMask, preferredFormatsALSA[i])) {\n                    formatALSA = preferredFormatsALSA[i];\n                    break;\n                }\n            }\n\n            if (formatALSA == MA_SND_PCM_FORMAT_UNKNOWN) {\n                ma_free(pHWParams);\n                ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Format not supported. The device does not support any miniaudio formats.\", MA_FORMAT_NOT_SUPPORTED);\n            }\n        }\n\n        ma_free(pFormatMask);\n        pFormatMask = NULL;\n\n        if (((ma_snd_pcm_hw_params_set_format_proc)pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, formatALSA) < 0) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Format not supported. snd_pcm_hw_params_set_format() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n        \n        internalFormat = ma_format_from_alsa(formatALSA);\n        if (internalFormat == ma_format_unknown) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] The chosen format is not supported by miniaudio.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    }\n\n    /* Channels. */\n    {\n        unsigned int channels = (deviceType == ma_device_type_capture) ? pConfig->capture.channels : pConfig->playback.channels;\n        if (((ma_snd_pcm_hw_params_set_channels_near_proc)pContext->alsa.snd_pcm_hw_params_set_channels_near)(pPCM, pHWParams, &channels) < 0) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set channel count. snd_pcm_hw_params_set_channels_near() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n        internalChannels = (ma_uint32)channels;\n    }\n\n    /* Sample Rate */\n    {\n        unsigned int sampleRate;\n\n        /*\n        It appears there's either a bug in ALSA, a bug in some drivers, or I'm doing something silly; but having resampling enabled causes\n        problems with some device configurations when used in conjunction with MMAP access mode. To fix this problem we need to disable\n        resampling.\n        \n        To reproduce this problem, open the \"plug:dmix\" device, and set the sample rate to 44100. Internally, it looks like dmix uses a\n        sample rate of 48000. The hardware parameters will get set correctly with no errors, but it looks like the 44100 -> 48000 resampling\n        doesn't work properly - but only with MMAP access mode. You will notice skipping/crackling in the audio, and it'll run at a slightly\n        faster rate.\n        \n        miniaudio has built-in support for sample rate conversion (albeit low quality at the moment), so disabling resampling should be fine\n        for us. The only problem is that it won't be taking advantage of any kind of hardware-accelerated resampling and it won't be very\n        good quality until I get a chance to improve the quality of miniaudio's software sample rate conversion.\n        \n        I don't currently know if the dmix plugin is the only one with this error. Indeed, this is the only one I've been able to reproduce\n        this error with. In the future, we may want to restrict the disabling of resampling to only known bad plugins.\n        */\n        ((ma_snd_pcm_hw_params_set_rate_resample_proc)pContext->alsa.snd_pcm_hw_params_set_rate_resample)(pPCM, pHWParams, 0);\n\n        sampleRate = pConfig->sampleRate;\n        if (((ma_snd_pcm_hw_params_set_rate_near_proc)pContext->alsa.snd_pcm_hw_params_set_rate_near)(pPCM, pHWParams, &sampleRate, 0) < 0) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Sample rate not supported. snd_pcm_hw_params_set_rate_near() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n        internalSampleRate = (ma_uint32)sampleRate;\n    }\n\n    /* Buffer Size */\n    {\n        ma_snd_pcm_uframes_t actualBufferSizeInFrames = pConfig->bufferSizeInFrames;\n        if (actualBufferSizeInFrames == 0) {\n            actualBufferSizeInFrames = ma_scale_buffer_size(ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, internalSampleRate), bufferSizeScaleFactor);\n        }\n\n        if (((ma_snd_pcm_hw_params_set_buffer_size_near_proc)pContext->alsa.snd_pcm_hw_params_set_buffer_size_near)(pPCM, pHWParams, &actualBufferSizeInFrames) < 0) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set buffer size for device. snd_pcm_hw_params_set_buffer_size() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n        internalBufferSizeInFrames = actualBufferSizeInFrames;\n    }\n\n    /* Periods. */\n    {\n        ma_uint32 periods = pConfig->periods;\n        if (((ma_snd_pcm_hw_params_set_periods_near_proc)pContext->alsa.snd_pcm_hw_params_set_periods_near)(pPCM, pHWParams, &periods, NULL) < 0) {\n            ma_free(pHWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set period count. snd_pcm_hw_params_set_periods_near() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n        internalPeriods = periods;\n    }\n\n    /* Apply hardware parameters. */\n    if (((ma_snd_pcm_hw_params_proc)pContext->alsa.snd_pcm_hw_params)(pPCM, pHWParams) < 0) {\n        ma_free(pHWParams);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set hardware parameters. snd_pcm_hw_params() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n    }\n\n    ma_free(pHWParams);\n    pHWParams = NULL;\n\n\n    /* Software parameters. */\n    pSWParams = (ma_snd_pcm_sw_params_t*)calloc(1, ((ma_snd_pcm_sw_params_sizeof_proc)pContext->alsa.snd_pcm_sw_params_sizeof)());\n    if (pSWParams == NULL) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        return MA_OUT_OF_MEMORY;\n    }\n\n    if (((ma_snd_pcm_sw_params_current_proc)pContext->alsa.snd_pcm_sw_params_current)(pPCM, pSWParams) != 0) {\n        ma_free(pSWParams);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to initialize software parameters. snd_pcm_sw_params_current() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        if (((ma_snd_pcm_sw_params_set_avail_min_proc)pContext->alsa.snd_pcm_sw_params_set_avail_min)(pPCM, pSWParams, 1) != 0) {\n            ma_free(pSWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_sw_params_set_avail_min() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    } else {\n        if (((ma_snd_pcm_sw_params_set_avail_min_proc)pContext->alsa.snd_pcm_sw_params_set_avail_min)(pPCM, pSWParams, 1) != 0) {\n            ma_free(pSWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_sw_params_set_avail_min() failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    }\n    \n\n    if (((ma_snd_pcm_sw_params_get_boundary_proc)pContext->alsa.snd_pcm_sw_params_get_boundary)(pSWParams, &bufferBoundary) < 0) {\n        bufferBoundary = internalBufferSizeInFrames;\n    }\n\n    /*printf(\"TRACE: bufferBoundary=%ld\\n\", bufferBoundary);*/\n\n    if (deviceType == ma_device_type_playback && !isUsingMMap) {   /* Only playback devices in writei/readi mode need a start threshold. */\n        /*\n        Subtle detail here with the start threshold. When in playback-only mode (no full-duplex) we can set the start threshold to\n        the size of a period. But for full-duplex we need to set it such that it is at least two periods.\n        */\n        if (((ma_snd_pcm_sw_params_set_start_threshold_proc)pContext->alsa.snd_pcm_sw_params_set_start_threshold)(pPCM, pSWParams, internalBufferSizeInFrames) != 0) {\n            ma_free(pSWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set start threshold for playback device. snd_pcm_sw_params_set_start_threshold() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n        }\n        if (((ma_snd_pcm_sw_params_set_stop_threshold_proc)pContext->alsa.snd_pcm_sw_params_set_stop_threshold)(pPCM, pSWParams, bufferBoundary) != 0) { /* Set to boundary to loop instead of stop in the event of an xrun. */\n            ma_free(pSWParams);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set stop threshold for playback device. snd_pcm_sw_params_set_stop_threshold() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n        }\n    }\n\n    if (((ma_snd_pcm_sw_params_proc)pContext->alsa.snd_pcm_sw_params)(pPCM, pSWParams) != 0) {\n        ma_free(pSWParams);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set software parameters. snd_pcm_sw_params() failed.\", MA_FAILED_TO_CONFIGURE_BACKEND_DEVICE);\n    }\n\n    ma_free(pSWParams);\n    pSWParams = NULL;\n\n\n    /* Grab the internal channel map. For now we're not going to bother trying to change the channel map and instead just do it ourselves. */\n    {\n        ma_snd_pcm_chmap_t* pChmap = ((ma_snd_pcm_get_chmap_proc)pContext->alsa.snd_pcm_get_chmap)(pPCM);\n        if (pChmap != NULL) {\n            ma_uint32 iChannel;\n\n            /* There are cases where the returned channel map can have a different channel count than was returned by snd_pcm_hw_params_set_channels_near(). */\n            if (pChmap->channels >= internalChannels) {\n                /* Drop excess channels. */\n                for (iChannel = 0; iChannel < internalChannels; ++iChannel) {\n                    internalChannelMap[iChannel] = ma_convert_alsa_channel_position_to_ma_channel(pChmap->pos[iChannel]);\n                }\n            } else {\n                ma_uint32 i;\n\n                /*\n                Excess channels use defaults. Do an initial fill with defaults, overwrite the first pChmap->channels, validate to ensure there are no duplicate\n                channels. If validation fails, fall back to defaults.\n                */\n                ma_bool32 isValid = MA_TRUE;\n\n                /* Fill with defaults. */\n                ma_get_standard_channel_map(ma_standard_channel_map_alsa, internalChannels, internalChannelMap);\n\n                /* Overwrite first pChmap->channels channels. */\n                for (iChannel = 0; iChannel < pChmap->channels; ++iChannel) {\n                    internalChannelMap[iChannel] = ma_convert_alsa_channel_position_to_ma_channel(pChmap->pos[iChannel]);\n                }\n\n                /* Validate. */\n                for (i = 0; i < internalChannels && isValid; ++i) {\n                    ma_uint32 j;\n                    for (j = i+1; j < internalChannels; ++j) {\n                        if (internalChannelMap[i] == internalChannelMap[j]) {\n                            isValid = MA_FALSE;\n                            break;\n                        }\n                    }\n                }\n\n                /* If our channel map is invalid, fall back to defaults. */\n                if (!isValid) {\n                    ma_get_standard_channel_map(ma_standard_channel_map_alsa, internalChannels, internalChannelMap);\n                }\n            }\n\n            free(pChmap);\n            pChmap = NULL;\n        } else {\n            /* Could not retrieve the channel map. Fall back to a hard-coded assumption. */\n            ma_get_standard_channel_map(ma_standard_channel_map_alsa, internalChannels, internalChannelMap);\n        }\n    }\n\n\n    /* We're done. Prepare the device. */\n    if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)(pPCM) < 0) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to prepare device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n    }\n\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->alsa.pPCMCapture                    = (ma_ptr)pPCM;\n        pDevice->alsa.isUsingMMapCapture             = isUsingMMap;\n        pDevice->capture.internalFormat              = internalFormat;\n        pDevice->capture.internalChannels            = internalChannels;\n        pDevice->capture.internalSampleRate          = internalSampleRate;\n        ma_channel_map_copy(pDevice->capture.internalChannelMap, internalChannelMap, internalChannels);\n        pDevice->capture.internalBufferSizeInFrames  = internalBufferSizeInFrames;\n        pDevice->capture.internalPeriods             = internalPeriods;\n    } else {\n        pDevice->alsa.pPCMPlayback                   = (ma_ptr)pPCM;\n        pDevice->alsa.isUsingMMapPlayback            = isUsingMMap;\n        pDevice->playback.internalFormat             = internalFormat;\n        pDevice->playback.internalChannels           = internalChannels;\n        pDevice->playback.internalSampleRate         = internalSampleRate;\n        ma_channel_map_copy(pDevice->playback.internalChannelMap, internalChannelMap, internalChannels);\n        pDevice->playback.internalBufferSizeInFrames = internalBufferSizeInFrames;\n        pDevice->playback.internalPeriods            = internalPeriods;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__alsa(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    ma_zero_object(&pDevice->alsa);\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_by_type__alsa(pContext, pConfig, ma_device_type_capture, pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_by_type__alsa(pContext, pConfig, ma_device_type_playback, pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n#if 0\nma_result ma_device_start__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    /* Prepare the device first... */\n    if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCM) < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to prepare device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n    }\n\n    /*\n    ... and then grab an initial chunk from the client. After this is done, the device should\n    automatically start playing, since that's how we configured the software parameters.\n    */\n    if (pDevice->type == ma_device_type_playback) {\n        if (!ma_device_read_from_client_and_write__alsa(pDevice)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to write initial chunk of data to the playback device.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n        }\n\n        /* mmap mode requires an explicit start. */\n        if (pDevice->alsa.isUsingMMap) {\n            if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCM) < 0) {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start capture device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n            }\n        }\n    } else {\n        if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCM) < 0) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start capture device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n#endif /* 0 */\n\nma_result ma_device_stop__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_snd_pcm_drain_proc)pDevice->pContext->alsa.snd_pcm_drain)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture);\n\n        /* We need to prepare the device again, otherwise we won't be able to restart the device. */\n        if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) < 0) {\n    #ifdef MA_DEBUG_OUTPUT\n            printf(\"[ALSA] Failed to prepare capture device after stopping.\\n\");\n    #endif\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* Using drain instead of drop because ma_device_stop() is defined such that pending frames are processed before returning. */\n        ((ma_snd_pcm_drain_proc)pDevice->pContext->alsa.snd_pcm_drain)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback);\n\n        /* We need to prepare the device again, otherwise we won't be able to restart the device. */\n        if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) < 0) {\n    #ifdef MA_DEBUG_OUTPUT\n            printf(\"[ALSA] Failed to prepare playback device after stopping.\\n\");\n    #endif\n        }\n    }\n\n    \n    \n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__alsa(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_snd_pcm_sframes_t resultALSA;\n    ma_uint32 totalPCMFramesProcessed;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pPCMFrames != NULL);\n\n    /*printf(\"TRACE: Enter write()\\n\");*/\n\n    totalPCMFramesProcessed = 0;\n    while (totalPCMFramesProcessed < frameCount) {\n        const void* pSrc = ma_offset_ptr(pPCMFrames, totalPCMFramesProcessed * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n        ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed);\n\n        /*printf(\"TRACE: Writing %d frames (frameCount=%d)\\n\", framesRemaining, frameCount);*/\n\n        resultALSA = ((ma_snd_pcm_writei_proc)pDevice->pContext->alsa.snd_pcm_writei)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, pSrc, framesRemaining);\n        if (resultALSA < 0) {\n            if (resultALSA == -EAGAIN) {\n                /*printf(\"TRACE: EGAIN (write)\\n\");*/\n                continue;   /* Try again. */\n            } else if (resultALSA == -EPIPE) {\n                /*printf(\"TRACE: EPIPE (write)\\n\");*/\n\n                /* Underrun. Recover and try again. If this fails we need to return an error. */\n                if (((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, resultALSA, MA_TRUE) < 0) { /* MA_TRUE=silent (don't print anything on error). */\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to recover device after underrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                }\n\n                /*\n                In my testing I have had a situation where writei() does not automatically restart the device even though I've set it\n                up as such in the software parameters. What will happen is writei() will block indefinitely even though the number of\n                frames is well beyond the auto-start threshold. To work around this I've needed to add an explicit start here. Not sure\n                if this is me just being stupid and not recovering the device properly, but this definitely feels like something isn't\n                quite right here.\n                */\n                if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) < 0) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start device after underrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                }\n\n                resultALSA = ((ma_snd_pcm_writei_proc)pDevice->pContext->alsa.snd_pcm_writei)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, pSrc, framesRemaining);\n                if (resultALSA < 0) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to write data to device after underrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                }\n            }\n        }\n\n        totalPCMFramesProcessed += resultALSA;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_read__alsa(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_snd_pcm_sframes_t resultALSA;\n    ma_uint32 totalPCMFramesProcessed;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pPCMFrames != NULL);\n\n    /* We need to explicitly start the device if it isn't already. */\n    if (((ma_snd_pcm_state_proc)pDevice->pContext->alsa.snd_pcm_state)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) != MA_SND_PCM_STATE_RUNNING) {\n        if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) < 0) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start device in preparation for reading.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n    }\n\n    totalPCMFramesProcessed = 0;\n    while (totalPCMFramesProcessed < frameCount) {\n        void* pDst = ma_offset_ptr(pPCMFrames, totalPCMFramesProcessed * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n        ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed);\n\n        /*printf(\"TRACE: snd_pcm_readi(framesRemaining=%d)\\n\", framesRemaining);*/\n\n        resultALSA = ((ma_snd_pcm_readi_proc)pDevice->pContext->alsa.snd_pcm_readi)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, pDst, framesRemaining);\n        if (resultALSA < 0) {\n            if (resultALSA == -EAGAIN) {\n                /*printf(\"TRACE: EGAIN (read)\\n\");*/\n                continue;\n            } else if (resultALSA == -EPIPE) {\n                /*printf(\"TRACE: EPIPE (read)\\n\");*/\n\n                /* Overrun. Recover and try again. If this fails we need to return an error. */\n                if (((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, resultALSA, MA_TRUE) < 0) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to recover device after overrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                }\n\n                if (((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) < 0) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start device after underrun.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n                }\n\n                resultALSA = ((ma_snd_pcm_readi_proc)pDevice->pContext->alsa.snd_pcm_readi)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, pDst, framesRemaining);\n                if (resultALSA < 0) {\n                    return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to read data from the internal device.\", MA_FAILED_TO_READ_DATA_FROM_DEVICE);\n                }\n            }\n        }\n\n        totalPCMFramesProcessed += resultALSA;\n    }\n\n    return MA_SUCCESS;\n}\n\n#if 0\nma_result ma_device_break_main_loop__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    pDevice->alsa.breakFromMainLoop = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nma_result ma_device_main_loop__alsa(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    pDevice->alsa.breakFromMainLoop = MA_FALSE;\n    if (pDevice->type == ma_device_type_playback) {\n        /* Playback. Read from client, write to device. */\n        while (!pDevice->alsa.breakFromMainLoop && ma_device_read_from_client_and_write__alsa(pDevice)) {\n        }\n    } else {\n        /* Capture. Read from device, write to client. */\n        while (!pDevice->alsa.breakFromMainLoop && ma_device_read_and_send_to_client__alsa(pDevice)) {\n        }\n    }\n\n    return MA_SUCCESS;\n}\n#endif /* 0 */\n\nma_result ma_context_uninit__alsa(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_alsa);\n\n    /* Clean up memory for memory leak checkers. */\n    ((ma_snd_config_update_free_global_proc)pContext->alsa.snd_config_update_free_global)();\n\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_dlclose(pContext, pContext->alsa.asoundSO);\n#endif\n\n    ma_mutex_uninit(&pContext->alsa.internalDeviceEnumLock);\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__alsa(const ma_context_config* pConfig, ma_context* pContext)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libasoundNames[] = {\n        \"libasound.so.2\",\n        \"libasound.so\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libasoundNames); ++i) {\n        pContext->alsa.asoundSO = ma_dlopen(pContext, libasoundNames[i]);\n        if (pContext->alsa.asoundSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->alsa.asoundSO == NULL) {\n#ifdef MA_DEBUG_OUTPUT\n        printf(\"[ALSA] Failed to open shared object.\\n\");\n#endif\n        return MA_NO_BACKEND;\n    }\n\n    pContext->alsa.snd_pcm_open                           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_open\");\n    pContext->alsa.snd_pcm_close                          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_close\");\n    pContext->alsa.snd_pcm_hw_params_sizeof               = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_sizeof\");\n    pContext->alsa.snd_pcm_hw_params_any                  = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_any\");\n    pContext->alsa.snd_pcm_hw_params_set_format           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_format\");\n    pContext->alsa.snd_pcm_hw_params_set_format_first     = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_format_first\");\n    pContext->alsa.snd_pcm_hw_params_get_format_mask      = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_format_mask\");\n    pContext->alsa.snd_pcm_hw_params_set_channels_near    = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_channels_near\");\n    pContext->alsa.snd_pcm_hw_params_set_rate_resample    = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_rate_resample\");\n    pContext->alsa.snd_pcm_hw_params_set_rate_near        = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_rate_near\");\n    pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_buffer_size_near\");\n    pContext->alsa.snd_pcm_hw_params_set_periods_near     = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_periods_near\");\n    pContext->alsa.snd_pcm_hw_params_set_access           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_access\");\n    pContext->alsa.snd_pcm_hw_params_get_format           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_format\");\n    pContext->alsa.snd_pcm_hw_params_get_channels         = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_channels\");\n    pContext->alsa.snd_pcm_hw_params_get_channels_min     = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_channels_min\");\n    pContext->alsa.snd_pcm_hw_params_get_channels_max     = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_channels_max\");\n    pContext->alsa.snd_pcm_hw_params_get_rate             = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_rate\");\n    pContext->alsa.snd_pcm_hw_params_get_rate_min         = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_rate_min\");\n    pContext->alsa.snd_pcm_hw_params_get_rate_max         = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_rate_max\");\n    pContext->alsa.snd_pcm_hw_params_get_buffer_size      = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_buffer_size\");\n    pContext->alsa.snd_pcm_hw_params_get_periods          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_periods\");\n    pContext->alsa.snd_pcm_hw_params_get_access           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_access\");\n    pContext->alsa.snd_pcm_hw_params                      = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_hw_params\");\n    pContext->alsa.snd_pcm_sw_params_sizeof               = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params_sizeof\");\n    pContext->alsa.snd_pcm_sw_params_current              = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params_current\");\n    pContext->alsa.snd_pcm_sw_params_get_boundary         = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params_get_boundary\");\n    pContext->alsa.snd_pcm_sw_params_set_avail_min        = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params_set_avail_min\");\n    pContext->alsa.snd_pcm_sw_params_set_start_threshold  = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params_set_start_threshold\");\n    pContext->alsa.snd_pcm_sw_params_set_stop_threshold   = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params_set_stop_threshold\");\n    pContext->alsa.snd_pcm_sw_params                      = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_sw_params\");\n    pContext->alsa.snd_pcm_format_mask_sizeof             = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_format_mask_sizeof\");\n    pContext->alsa.snd_pcm_format_mask_test               = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_format_mask_test\");\n    pContext->alsa.snd_pcm_get_chmap                      = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_get_chmap\");\n    pContext->alsa.snd_pcm_state                          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_state\");\n    pContext->alsa.snd_pcm_prepare                        = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_prepare\");\n    pContext->alsa.snd_pcm_start                          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_start\");\n    pContext->alsa.snd_pcm_drop                           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_drop\");\n    pContext->alsa.snd_pcm_drain                          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_drain\");\n    pContext->alsa.snd_device_name_hint                   = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_device_name_hint\");\n    pContext->alsa.snd_device_name_get_hint               = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_device_name_get_hint\");\n    pContext->alsa.snd_card_get_index                     = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_card_get_index\");\n    pContext->alsa.snd_device_name_free_hint              = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_device_name_free_hint\");\n    pContext->alsa.snd_pcm_mmap_begin                     = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_mmap_begin\");\n    pContext->alsa.snd_pcm_mmap_commit                    = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_mmap_commit\");\n    pContext->alsa.snd_pcm_recover                        = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_recover\");\n    pContext->alsa.snd_pcm_readi                          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_readi\");\n    pContext->alsa.snd_pcm_writei                         = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_writei\");\n    pContext->alsa.snd_pcm_avail                          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_avail\");\n    pContext->alsa.snd_pcm_avail_update                   = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_avail_update\");\n    pContext->alsa.snd_pcm_wait                           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_wait\");\n    pContext->alsa.snd_pcm_info                           = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_info\");\n    pContext->alsa.snd_pcm_info_sizeof                    = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_info_sizeof\");\n    pContext->alsa.snd_pcm_info_get_name                  = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_pcm_info_get_name\");\n    pContext->alsa.snd_config_update_free_global          = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, \"snd_config_update_free_global\");\n#else\n    /* The system below is just for type safety. */\n    ma_snd_pcm_open_proc                           _snd_pcm_open                           = snd_pcm_open;\n    ma_snd_pcm_close_proc                          _snd_pcm_close                          = snd_pcm_close;\n    ma_snd_pcm_hw_params_sizeof_proc               _snd_pcm_hw_params_sizeof               = snd_pcm_hw_params_sizeof;\n    ma_snd_pcm_hw_params_any_proc                  _snd_pcm_hw_params_any                  = snd_pcm_hw_params_any;\n    ma_snd_pcm_hw_params_set_format_proc           _snd_pcm_hw_params_set_format           = snd_pcm_hw_params_set_format;\n    ma_snd_pcm_hw_params_set_format_first_proc     _snd_pcm_hw_params_set_format_first     = snd_pcm_hw_params_set_format_first;\n    ma_snd_pcm_hw_params_get_format_mask_proc      _snd_pcm_hw_params_get_format_mask      = snd_pcm_hw_params_get_format_mask;\n    ma_snd_pcm_hw_params_set_channels_near_proc    _snd_pcm_hw_params_set_channels_near    = snd_pcm_hw_params_set_channels_near;\n    ma_snd_pcm_hw_params_set_rate_resample_proc    _snd_pcm_hw_params_set_rate_resample    = snd_pcm_hw_params_set_rate_resample;\n    ma_snd_pcm_hw_params_set_rate_near_proc        _snd_pcm_hw_params_set_rate_near        = snd_pcm_hw_params_set_rate_near;\n    ma_snd_pcm_hw_params_set_buffer_size_near_proc _snd_pcm_hw_params_set_buffer_size_near = snd_pcm_hw_params_set_buffer_size_near;\n    ma_snd_pcm_hw_params_set_periods_near_proc     _snd_pcm_hw_params_set_periods_near     = snd_pcm_hw_params_set_periods_near;\n    ma_snd_pcm_hw_params_set_access_proc           _snd_pcm_hw_params_set_access           = snd_pcm_hw_params_set_access;\n    ma_snd_pcm_hw_params_get_format_proc           _snd_pcm_hw_params_get_format           = snd_pcm_hw_params_get_format;\n    ma_snd_pcm_hw_params_get_channels_proc         _snd_pcm_hw_params_get_channels         = snd_pcm_hw_params_get_channels;\n    ma_snd_pcm_hw_params_get_channels_min_proc     _snd_pcm_hw_params_get_channels_min     = snd_pcm_hw_params_get_channels_min;\n    ma_snd_pcm_hw_params_get_channels_max_proc     _snd_pcm_hw_params_get_channels_max     = snd_pcm_hw_params_get_channels_max;\n    ma_snd_pcm_hw_params_get_rate_proc             _snd_pcm_hw_params_get_rate             = snd_pcm_hw_params_get_rate;\n    ma_snd_pcm_hw_params_get_rate_min_proc         _snd_pcm_hw_params_get_rate_min         = snd_pcm_hw_params_get_rate_min;\n    ma_snd_pcm_hw_params_get_rate_max_proc         _snd_pcm_hw_params_get_rate_max         = snd_pcm_hw_params_get_rate_max;\n    ma_snd_pcm_hw_params_get_buffer_size_proc      _snd_pcm_hw_params_get_buffer_size      = snd_pcm_hw_params_get_buffer_size;\n    ma_snd_pcm_hw_params_get_periods_proc          _snd_pcm_hw_params_get_periods          = snd_pcm_hw_params_get_periods;\n    ma_snd_pcm_hw_params_get_access_proc           _snd_pcm_hw_params_get_access           = snd_pcm_hw_params_get_access;\n    ma_snd_pcm_hw_params_proc                      _snd_pcm_hw_params                      = snd_pcm_hw_params;\n    ma_snd_pcm_sw_params_sizeof_proc               _snd_pcm_sw_params_sizeof               = snd_pcm_sw_params_sizeof;\n    ma_snd_pcm_sw_params_current_proc              _snd_pcm_sw_params_current              = snd_pcm_sw_params_current;\n    ma_snd_pcm_sw_params_get_boundary_proc         _snd_pcm_sw_params_get_boundary         = snd_pcm_sw_params_get_boundary;\n    ma_snd_pcm_sw_params_set_avail_min_proc        _snd_pcm_sw_params_set_avail_min        = snd_pcm_sw_params_set_avail_min;\n    ma_snd_pcm_sw_params_set_start_threshold_proc  _snd_pcm_sw_params_set_start_threshold  = snd_pcm_sw_params_set_start_threshold;\n    ma_snd_pcm_sw_params_set_stop_threshold_proc   _snd_pcm_sw_params_set_stop_threshold   = snd_pcm_sw_params_set_stop_threshold;\n    ma_snd_pcm_sw_params_proc                      _snd_pcm_sw_params                      = snd_pcm_sw_params;\n    ma_snd_pcm_format_mask_sizeof_proc             _snd_pcm_format_mask_sizeof             = snd_pcm_format_mask_sizeof;\n    ma_snd_pcm_format_mask_test_proc               _snd_pcm_format_mask_test               = snd_pcm_format_mask_test;\n    ma_snd_pcm_get_chmap_proc                      _snd_pcm_get_chmap                      = snd_pcm_get_chmap;\n    ma_snd_pcm_state_proc                          _snd_pcm_state                          = snd_pcm_state;\n    ma_snd_pcm_prepare_proc                        _snd_pcm_prepare                        = snd_pcm_prepare;\n    ma_snd_pcm_start_proc                          _snd_pcm_start                          = snd_pcm_start;\n    ma_snd_pcm_drop_proc                           _snd_pcm_drop                           = snd_pcm_drop;\n    ma_snd_pcm_drain_proc                          _snd_pcm_drain                          = snd_pcm_drain;\n    ma_snd_device_name_hint_proc                   _snd_device_name_hint                   = snd_device_name_hint;\n    ma_snd_device_name_get_hint_proc               _snd_device_name_get_hint               = snd_device_name_get_hint;\n    ma_snd_card_get_index_proc                     _snd_card_get_index                     = snd_card_get_index;\n    ma_snd_device_name_free_hint_proc              _snd_device_name_free_hint              = snd_device_name_free_hint;\n    ma_snd_pcm_mmap_begin_proc                     _snd_pcm_mmap_begin                     = snd_pcm_mmap_begin;\n    ma_snd_pcm_mmap_commit_proc                    _snd_pcm_mmap_commit                    = snd_pcm_mmap_commit;\n    ma_snd_pcm_recover_proc                        _snd_pcm_recover                        = snd_pcm_recover;\n    ma_snd_pcm_readi_proc                          _snd_pcm_readi                          = snd_pcm_readi;\n    ma_snd_pcm_writei_proc                         _snd_pcm_writei                         = snd_pcm_writei;\n    ma_snd_pcm_avail_proc                          _snd_pcm_avail                          = snd_pcm_avail;\n    ma_snd_pcm_avail_update_proc                   _snd_pcm_avail_update                   = snd_pcm_avail_update;\n    ma_snd_pcm_wait_proc                           _snd_pcm_wait                           = snd_pcm_wait;\n    ma_snd_pcm_info_proc                           _snd_pcm_info                           = snd_pcm_info;\n    ma_snd_pcm_info_sizeof_proc                    _snd_pcm_info_sizeof                    = snd_pcm_info_sizeof;\n    ma_snd_pcm_info_get_name_proc                  _snd_pcm_info_get_name                  = snd_pcm_info_get_name;\n    ma_snd_config_update_free_global_proc          _snd_config_update_free_global          = snd_config_update_free_global;\n\n    pContext->alsa.snd_pcm_open                           = (ma_proc)_snd_pcm_open;\n    pContext->alsa.snd_pcm_close                          = (ma_proc)_snd_pcm_close;\n    pContext->alsa.snd_pcm_hw_params_sizeof               = (ma_proc)_snd_pcm_hw_params_sizeof;\n    pContext->alsa.snd_pcm_hw_params_any                  = (ma_proc)_snd_pcm_hw_params_any;\n    pContext->alsa.snd_pcm_hw_params_set_format           = (ma_proc)_snd_pcm_hw_params_set_format;\n    pContext->alsa.snd_pcm_hw_params_set_format_first     = (ma_proc)_snd_pcm_hw_params_set_format_first;\n    pContext->alsa.snd_pcm_hw_params_get_format_mask      = (ma_proc)_snd_pcm_hw_params_get_format_mask;\n    pContext->alsa.snd_pcm_hw_params_set_channels_near    = (ma_proc)_snd_pcm_hw_params_set_channels_near;\n    pContext->alsa.snd_pcm_hw_params_set_rate_resample    = (ma_proc)_snd_pcm_hw_params_set_rate_resample;\n    pContext->alsa.snd_pcm_hw_params_set_rate_near        = (ma_proc)_snd_pcm_hw_params_set_rate_near;\n    pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)_snd_pcm_hw_params_set_buffer_size_near;\n    pContext->alsa.snd_pcm_hw_params_set_periods_near     = (ma_proc)_snd_pcm_hw_params_set_periods_near;\n    pContext->alsa.snd_pcm_hw_params_set_access           = (ma_proc)_snd_pcm_hw_params_set_access;\n    pContext->alsa.snd_pcm_hw_params_get_format           = (ma_proc)_snd_pcm_hw_params_get_format;\n    pContext->alsa.snd_pcm_hw_params_get_channels         = (ma_proc)_snd_pcm_hw_params_get_channels;\n    pContext->alsa.snd_pcm_hw_params_get_channels_min     = (ma_proc)_snd_pcm_hw_params_get_channels_min;\n    pContext->alsa.snd_pcm_hw_params_get_channels_max     = (ma_proc)_snd_pcm_hw_params_get_channels_max;\n    pContext->alsa.snd_pcm_hw_params_get_rate             = (ma_proc)_snd_pcm_hw_params_get_rate;\n    pContext->alsa.snd_pcm_hw_params_get_buffer_size      = (ma_proc)_snd_pcm_hw_params_get_buffer_size;\n    pContext->alsa.snd_pcm_hw_params_get_periods          = (ma_proc)_snd_pcm_hw_params_get_periods;\n    pContext->alsa.snd_pcm_hw_params_get_access           = (ma_proc)_snd_pcm_hw_params_get_access;\n    pContext->alsa.snd_pcm_hw_params                      = (ma_proc)_snd_pcm_hw_params;\n    pContext->alsa.snd_pcm_sw_params_sizeof               = (ma_proc)_snd_pcm_sw_params_sizeof;\n    pContext->alsa.snd_pcm_sw_params_current              = (ma_proc)_snd_pcm_sw_params_current;\n    pContext->alsa.snd_pcm_sw_params_get_boundary         = (ma_proc)_snd_pcm_sw_params_get_boundary;\n    pContext->alsa.snd_pcm_sw_params_set_avail_min        = (ma_proc)_snd_pcm_sw_params_set_avail_min;\n    pContext->alsa.snd_pcm_sw_params_set_start_threshold  = (ma_proc)_snd_pcm_sw_params_set_start_threshold;\n    pContext->alsa.snd_pcm_sw_params_set_stop_threshold   = (ma_proc)_snd_pcm_sw_params_set_stop_threshold;\n    pContext->alsa.snd_pcm_sw_params                      = (ma_proc)_snd_pcm_sw_params;\n    pContext->alsa.snd_pcm_format_mask_sizeof             = (ma_proc)_snd_pcm_format_mask_sizeof;\n    pContext->alsa.snd_pcm_format_mask_test               = (ma_proc)_snd_pcm_format_mask_test;\n    pContext->alsa.snd_pcm_get_chmap                      = (ma_proc)_snd_pcm_get_chmap;\n    pContext->alsa.snd_pcm_state                          = (ma_proc)_snd_pcm_state;\n    pContext->alsa.snd_pcm_prepare                        = (ma_proc)_snd_pcm_prepare;\n    pContext->alsa.snd_pcm_start                          = (ma_proc)_snd_pcm_start;\n    pContext->alsa.snd_pcm_drop                           = (ma_proc)_snd_pcm_drop;\n    pContext->alsa.snd_pcm_drain                          = (ma_proc)_snd_pcm_drain;\n    pContext->alsa.snd_device_name_hint                   = (ma_proc)_snd_device_name_hint;\n    pContext->alsa.snd_device_name_get_hint               = (ma_proc)_snd_device_name_get_hint;\n    pContext->alsa.snd_card_get_index                     = (ma_proc)_snd_card_get_index;\n    pContext->alsa.snd_device_name_free_hint              = (ma_proc)_snd_device_name_free_hint;\n    pContext->alsa.snd_pcm_mmap_begin                     = (ma_proc)_snd_pcm_mmap_begin;\n    pContext->alsa.snd_pcm_mmap_commit                    = (ma_proc)_snd_pcm_mmap_commit;\n    pContext->alsa.snd_pcm_recover                        = (ma_proc)_snd_pcm_recover;\n    pContext->alsa.snd_pcm_readi                          = (ma_proc)_snd_pcm_readi;\n    pContext->alsa.snd_pcm_writei                         = (ma_proc)_snd_pcm_writei;\n    pContext->alsa.snd_pcm_avail                          = (ma_proc)_snd_pcm_avail;\n    pContext->alsa.snd_pcm_avail_update                   = (ma_proc)_snd_pcm_avail_update;\n    pContext->alsa.snd_pcm_wait                           = (ma_proc)_snd_pcm_wait;\n    pContext->alsa.snd_pcm_info                           = (ma_proc)_snd_pcm_info;\n    pContext->alsa.snd_pcm_info_sizeof                    = (ma_proc)_snd_pcm_info_sizeof;\n    pContext->alsa.snd_pcm_info_get_name                  = (ma_proc)_snd_pcm_info_get_name;\n    pContext->alsa.snd_config_update_free_global          = (ma_proc)_snd_config_update_free_global;\n#endif\n\n    pContext->alsa.useVerboseDeviceEnumeration = pConfig->alsa.useVerboseDeviceEnumeration;\n\n    if (ma_mutex_init(pContext, &pContext->alsa.internalDeviceEnumLock) != MA_SUCCESS) {\n        ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[ALSA] WARNING: Failed to initialize mutex for internal device enumeration.\", MA_ERROR);\n    }\n\n    pContext->onUninit              = ma_context_uninit__alsa;\n    pContext->onDeviceIDEqual       = ma_context_is_device_id_equal__alsa;\n    pContext->onEnumDevices         = ma_context_enumerate_devices__alsa;\n    pContext->onGetDeviceInfo       = ma_context_get_device_info__alsa;\n    pContext->onDeviceInit          = ma_device_init__alsa;\n    pContext->onDeviceUninit        = ma_device_uninit__alsa;\n    pContext->onDeviceStart         = NULL; /*ma_device_start__alsa;*/\n    pContext->onDeviceStop          = ma_device_stop__alsa;\n    pContext->onDeviceWrite         = ma_device_write__alsa;\n    pContext->onDeviceRead          = ma_device_read__alsa;\n\n    return MA_SUCCESS;\n}\n#endif  /* ALSA */\n\n\n\n/******************************************************************************\n\nPulseAudio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_PULSEAUDIO\n/*\nIt is assumed pulseaudio.h is available when compile-time linking is being used. We use this for type safety when using\ncompile time linking (we don't have this luxury when using runtime linking without headers).\n\nWhen using compile time linking, each of our ma_* equivalents should use the sames types as defined by the header. The\nreason for this is that it allow us to take advantage of proper type safety.\n*/\n#ifdef MA_NO_RUNTIME_LINKING\n#include <pulse/pulseaudio.h>\n\n#define MA_PA_OK                                       PA_OK\n#define MA_PA_ERR_ACCESS                               PA_ERR_ACCESS\n#define MA_PA_ERR_INVALID                              PA_ERR_INVALID\n#define MA_PA_ERR_NOENTITY                             PA_ERR_NOENTITY\n\n#define MA_PA_CHANNELS_MAX                             PA_CHANNELS_MAX\n#define MA_PA_RATE_MAX                                 PA_RATE_MAX\n\ntypedef pa_context_flags_t ma_pa_context_flags_t;\n#define MA_PA_CONTEXT_NOFLAGS                          PA_CONTEXT_NOFLAGS\n#define MA_PA_CONTEXT_NOAUTOSPAWN                      PA_CONTEXT_NOAUTOSPAWN\n#define MA_PA_CONTEXT_NOFAIL                           PA_CONTEXT_NOFAIL\n\ntypedef pa_stream_flags_t ma_pa_stream_flags_t;\n#define MA_PA_STREAM_NOFLAGS                           PA_STREAM_NOFLAGS\n#define MA_PA_STREAM_START_CORKED                      PA_STREAM_START_CORKED\n#define MA_PA_STREAM_INTERPOLATE_TIMING                PA_STREAM_INTERPOLATE_TIMING\n#define MA_PA_STREAM_NOT_MONOTONIC                     PA_STREAM_NOT_MONOTONIC\n#define MA_PA_STREAM_AUTO_TIMING_UPDATE                PA_STREAM_AUTO_TIMING_UPDATE\n#define MA_PA_STREAM_NO_REMAP_CHANNELS                 PA_STREAM_NO_REMAP_CHANNELS\n#define MA_PA_STREAM_NO_REMIX_CHANNELS                 PA_STREAM_NO_REMIX_CHANNELS\n#define MA_PA_STREAM_FIX_FORMAT                        PA_STREAM_FIX_FORMAT\n#define MA_PA_STREAM_FIX_RATE                          PA_STREAM_FIX_RATE\n#define MA_PA_STREAM_FIX_CHANNELS                      PA_STREAM_FIX_CHANNELS\n#define MA_PA_STREAM_DONT_MOVE                         PA_STREAM_DONT_MOVE\n#define MA_PA_STREAM_VARIABLE_RATE                     PA_STREAM_VARIABLE_RATE\n#define MA_PA_STREAM_PEAK_DETECT                       PA_STREAM_PEAK_DETECT\n#define MA_PA_STREAM_START_MUTED                       PA_STREAM_START_MUTED\n#define MA_PA_STREAM_ADJUST_LATENCY                    PA_STREAM_ADJUST_LATENCY\n#define MA_PA_STREAM_EARLY_REQUESTS                    PA_STREAM_EARLY_REQUESTS\n#define MA_PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND         PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND\n#define MA_PA_STREAM_START_UNMUTED                     PA_STREAM_START_UNMUTED\n#define MA_PA_STREAM_FAIL_ON_SUSPEND                   PA_STREAM_FAIL_ON_SUSPEND\n#define MA_PA_STREAM_RELATIVE_VOLUME                   PA_STREAM_RELATIVE_VOLUME\n#define MA_PA_STREAM_PASSTHROUGH                       PA_STREAM_PASSTHROUGH\n\ntypedef pa_sink_flags_t ma_pa_sink_flags_t;\n#define MA_PA_SINK_NOFLAGS                             PA_SINK_NOFLAGS\n#define MA_PA_SINK_HW_VOLUME_CTRL                      PA_SINK_HW_VOLUME_CTRL\n#define MA_PA_SINK_LATENCY                             PA_SINK_LATENCY\n#define MA_PA_SINK_HARDWARE                            PA_SINK_HARDWARE\n#define MA_PA_SINK_NETWORK                             PA_SINK_NETWORK\n#define MA_PA_SINK_HW_MUTE_CTRL                        PA_SINK_HW_MUTE_CTRL\n#define MA_PA_SINK_DECIBEL_VOLUME                      PA_SINK_DECIBEL_VOLUME\n#define MA_PA_SINK_FLAT_VOLUME                         PA_SINK_FLAT_VOLUME\n#define MA_PA_SINK_DYNAMIC_LATENCY                     PA_SINK_DYNAMIC_LATENCY\n#define MA_PA_SINK_SET_FORMATS                         PA_SINK_SET_FORMATS\n\ntypedef pa_source_flags_t ma_pa_source_flags_t;\n#define MA_PA_SOURCE_NOFLAGS                           PA_SOURCE_NOFLAGS\n#define MA_PA_SOURCE_HW_VOLUME_CTRL                    PA_SOURCE_HW_VOLUME_CTRL\n#define MA_PA_SOURCE_LATENCY                           PA_SOURCE_LATENCY\n#define MA_PA_SOURCE_HARDWARE                          PA_SOURCE_HARDWARE\n#define MA_PA_SOURCE_NETWORK                           PA_SOURCE_NETWORK\n#define MA_PA_SOURCE_HW_MUTE_CTRL                      PA_SOURCE_HW_MUTE_CTRL\n#define MA_PA_SOURCE_DECIBEL_VOLUME                    PA_SOURCE_DECIBEL_VOLUME\n#define MA_PA_SOURCE_DYNAMIC_LATENCY                   PA_SOURCE_DYNAMIC_LATENCY\n#define MA_PA_SOURCE_FLAT_VOLUME                       PA_SOURCE_FLAT_VOLUME\n\ntypedef pa_context_state_t ma_pa_context_state_t;\n#define MA_PA_CONTEXT_UNCONNECTED                      PA_CONTEXT_UNCONNECTED\n#define MA_PA_CONTEXT_CONNECTING                       PA_CONTEXT_CONNECTING\n#define MA_PA_CONTEXT_AUTHORIZING                      PA_CONTEXT_AUTHORIZING\n#define MA_PA_CONTEXT_SETTING_NAME                     PA_CONTEXT_SETTING_NAME\n#define MA_PA_CONTEXT_READY                            PA_CONTEXT_READY\n#define MA_PA_CONTEXT_FAILED                           PA_CONTEXT_FAILED\n#define MA_PA_CONTEXT_TERMINATED                       PA_CONTEXT_TERMINATED\n\ntypedef pa_stream_state_t ma_pa_stream_state_t;\n#define MA_PA_STREAM_UNCONNECTED                       PA_STREAM_UNCONNECTED\n#define MA_PA_STREAM_CREATING                          PA_STREAM_CREATING\n#define MA_PA_STREAM_READY                             PA_STREAM_READY\n#define MA_PA_STREAM_FAILED                            PA_STREAM_FAILED\n#define MA_PA_STREAM_TERMINATED                        PA_STREAM_TERMINATED\n\ntypedef pa_operation_state_t ma_pa_operation_state_t;\n#define MA_PA_OPERATION_RUNNING                        PA_OPERATION_RUNNING\n#define MA_PA_OPERATION_DONE                           PA_OPERATION_DONE\n#define MA_PA_OPERATION_CANCELLED                      PA_OPERATION_CANCELLED\n\ntypedef pa_sink_state_t ma_pa_sink_state_t;\n#define MA_PA_SINK_INVALID_STATE                       PA_SINK_INVALID_STATE\n#define MA_PA_SINK_RUNNING                             PA_SINK_RUNNING\n#define MA_PA_SINK_IDLE                                PA_SINK_IDLE\n#define MA_PA_SINK_SUSPENDED                           PA_SINK_SUSPENDED\n\ntypedef pa_source_state_t ma_pa_source_state_t;\n#define MA_PA_SOURCE_INVALID_STATE                     PA_SOURCE_INVALID_STATE\n#define MA_PA_SOURCE_RUNNING                           PA_SOURCE_RUNNING\n#define MA_PA_SOURCE_IDLE                              PA_SOURCE_IDLE\n#define MA_PA_SOURCE_SUSPENDED                         PA_SOURCE_SUSPENDED\n\ntypedef pa_seek_mode_t ma_pa_seek_mode_t;\n#define MA_PA_SEEK_RELATIVE                            PA_SEEK_RELATIVE\n#define MA_PA_SEEK_ABSOLUTE                            PA_SEEK_ABSOLUTE\n#define MA_PA_SEEK_RELATIVE_ON_READ                    PA_SEEK_RELATIVE_ON_READ\n#define MA_PA_SEEK_RELATIVE_END                        PA_SEEK_RELATIVE_END\n\ntypedef pa_channel_position_t ma_pa_channel_position_t;\n#define MA_PA_CHANNEL_POSITION_INVALID                 PA_CHANNEL_POSITION_INVALID\n#define MA_PA_CHANNEL_POSITION_MONO                    PA_CHANNEL_POSITION_MONO\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT              PA_CHANNEL_POSITION_FRONT_LEFT\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT             PA_CHANNEL_POSITION_FRONT_RIGHT\n#define MA_PA_CHANNEL_POSITION_FRONT_CENTER            PA_CHANNEL_POSITION_FRONT_CENTER\n#define MA_PA_CHANNEL_POSITION_REAR_CENTER             PA_CHANNEL_POSITION_REAR_CENTER\n#define MA_PA_CHANNEL_POSITION_REAR_LEFT               PA_CHANNEL_POSITION_REAR_LEFT\n#define MA_PA_CHANNEL_POSITION_REAR_RIGHT              PA_CHANNEL_POSITION_REAR_RIGHT\n#define MA_PA_CHANNEL_POSITION_LFE                     PA_CHANNEL_POSITION_LFE\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER    PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER   PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER\n#define MA_PA_CHANNEL_POSITION_SIDE_LEFT               PA_CHANNEL_POSITION_SIDE_LEFT\n#define MA_PA_CHANNEL_POSITION_SIDE_RIGHT              PA_CHANNEL_POSITION_SIDE_RIGHT\n#define MA_PA_CHANNEL_POSITION_AUX0                    PA_CHANNEL_POSITION_AUX0\n#define MA_PA_CHANNEL_POSITION_AUX1                    PA_CHANNEL_POSITION_AUX1\n#define MA_PA_CHANNEL_POSITION_AUX2                    PA_CHANNEL_POSITION_AUX2\n#define MA_PA_CHANNEL_POSITION_AUX3                    PA_CHANNEL_POSITION_AUX3\n#define MA_PA_CHANNEL_POSITION_AUX4                    PA_CHANNEL_POSITION_AUX4\n#define MA_PA_CHANNEL_POSITION_AUX5                    PA_CHANNEL_POSITION_AUX5\n#define MA_PA_CHANNEL_POSITION_AUX6                    PA_CHANNEL_POSITION_AUX6\n#define MA_PA_CHANNEL_POSITION_AUX7                    PA_CHANNEL_POSITION_AUX7\n#define MA_PA_CHANNEL_POSITION_AUX8                    PA_CHANNEL_POSITION_AUX8\n#define MA_PA_CHANNEL_POSITION_AUX9                    PA_CHANNEL_POSITION_AUX9\n#define MA_PA_CHANNEL_POSITION_AUX10                   PA_CHANNEL_POSITION_AUX10\n#define MA_PA_CHANNEL_POSITION_AUX11                   PA_CHANNEL_POSITION_AUX11\n#define MA_PA_CHANNEL_POSITION_AUX12                   PA_CHANNEL_POSITION_AUX12\n#define MA_PA_CHANNEL_POSITION_AUX13                   PA_CHANNEL_POSITION_AUX13\n#define MA_PA_CHANNEL_POSITION_AUX14                   PA_CHANNEL_POSITION_AUX14\n#define MA_PA_CHANNEL_POSITION_AUX15                   PA_CHANNEL_POSITION_AUX15\n#define MA_PA_CHANNEL_POSITION_AUX16                   PA_CHANNEL_POSITION_AUX16\n#define MA_PA_CHANNEL_POSITION_AUX17                   PA_CHANNEL_POSITION_AUX17\n#define MA_PA_CHANNEL_POSITION_AUX18                   PA_CHANNEL_POSITION_AUX18\n#define MA_PA_CHANNEL_POSITION_AUX19                   PA_CHANNEL_POSITION_AUX19\n#define MA_PA_CHANNEL_POSITION_AUX20                   PA_CHANNEL_POSITION_AUX20\n#define MA_PA_CHANNEL_POSITION_AUX21                   PA_CHANNEL_POSITION_AUX21\n#define MA_PA_CHANNEL_POSITION_AUX22                   PA_CHANNEL_POSITION_AUX22\n#define MA_PA_CHANNEL_POSITION_AUX23                   PA_CHANNEL_POSITION_AUX23\n#define MA_PA_CHANNEL_POSITION_AUX24                   PA_CHANNEL_POSITION_AUX24\n#define MA_PA_CHANNEL_POSITION_AUX25                   PA_CHANNEL_POSITION_AUX25\n#define MA_PA_CHANNEL_POSITION_AUX26                   PA_CHANNEL_POSITION_AUX26\n#define MA_PA_CHANNEL_POSITION_AUX27                   PA_CHANNEL_POSITION_AUX27\n#define MA_PA_CHANNEL_POSITION_AUX28                   PA_CHANNEL_POSITION_AUX28\n#define MA_PA_CHANNEL_POSITION_AUX29                   PA_CHANNEL_POSITION_AUX29\n#define MA_PA_CHANNEL_POSITION_AUX30                   PA_CHANNEL_POSITION_AUX30\n#define MA_PA_CHANNEL_POSITION_AUX31                   PA_CHANNEL_POSITION_AUX31\n#define MA_PA_CHANNEL_POSITION_TOP_CENTER              PA_CHANNEL_POSITION_TOP_CENTER\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT          PA_CHANNEL_POSITION_TOP_FRONT_LEFT\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT         PA_CHANNEL_POSITION_TOP_FRONT_RIGHT\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER        PA_CHANNEL_POSITION_TOP_FRONT_CENTER\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT           PA_CHANNEL_POSITION_TOP_REAR_LEFT\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT          PA_CHANNEL_POSITION_TOP_REAR_RIGHT\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER         PA_CHANNEL_POSITION_TOP_REAR_CENTER\n#define MA_PA_CHANNEL_POSITION_LEFT                    PA_CHANNEL_POSITION_LEFT\n#define MA_PA_CHANNEL_POSITION_RIGHT                   PA_CHANNEL_POSITION_RIGHT\n#define MA_PA_CHANNEL_POSITION_CENTER                  PA_CHANNEL_POSITION_CENTER\n#define MA_PA_CHANNEL_POSITION_SUBWOOFER               PA_CHANNEL_POSITION_SUBWOOFER\n\ntypedef pa_channel_map_def_t ma_pa_channel_map_def_t;\n#define MA_PA_CHANNEL_MAP_AIFF                         PA_CHANNEL_MAP_AIFF\n#define MA_PA_CHANNEL_MAP_ALSA                         PA_CHANNEL_MAP_ALSA\n#define MA_PA_CHANNEL_MAP_AUX                          PA_CHANNEL_MAP_AUX\n#define MA_PA_CHANNEL_MAP_WAVEEX                       PA_CHANNEL_MAP_WAVEEX\n#define MA_PA_CHANNEL_MAP_OSS                          PA_CHANNEL_MAP_OSS\n#define MA_PA_CHANNEL_MAP_DEFAULT                      PA_CHANNEL_MAP_DEFAULT\n\ntypedef pa_sample_format_t ma_pa_sample_format_t;\n#define MA_PA_SAMPLE_INVALID                           PA_SAMPLE_INVALID\n#define MA_PA_SAMPLE_U8                                PA_SAMPLE_U8\n#define MA_PA_SAMPLE_ALAW                              PA_SAMPLE_ALAW\n#define MA_PA_SAMPLE_ULAW                              PA_SAMPLE_ULAW\n#define MA_PA_SAMPLE_S16LE                             PA_SAMPLE_S16LE\n#define MA_PA_SAMPLE_S16BE                             PA_SAMPLE_S16BE\n#define MA_PA_SAMPLE_FLOAT32LE                         PA_SAMPLE_FLOAT32LE\n#define MA_PA_SAMPLE_FLOAT32BE                         PA_SAMPLE_FLOAT32BE\n#define MA_PA_SAMPLE_S32LE                             PA_SAMPLE_S32LE\n#define MA_PA_SAMPLE_S32BE                             PA_SAMPLE_S32BE\n#define MA_PA_SAMPLE_S24LE                             PA_SAMPLE_S24LE\n#define MA_PA_SAMPLE_S24BE                             PA_SAMPLE_S24BE\n#define MA_PA_SAMPLE_S24_32LE                          PA_SAMPLE_S24_32LE\n#define MA_PA_SAMPLE_S24_32BE                          PA_SAMPLE_S24_32BE\n\ntypedef pa_mainloop     ma_pa_mainloop;\ntypedef pa_mainloop_api ma_pa_mainloop_api;\ntypedef pa_context      ma_pa_context;\ntypedef pa_operation    ma_pa_operation;\ntypedef pa_stream       ma_pa_stream;\ntypedef pa_spawn_api    ma_pa_spawn_api;\ntypedef pa_buffer_attr  ma_pa_buffer_attr;\ntypedef pa_channel_map  ma_pa_channel_map;\ntypedef pa_cvolume      ma_pa_cvolume;\ntypedef pa_sample_spec  ma_pa_sample_spec;\ntypedef pa_sink_info    ma_pa_sink_info;\ntypedef pa_source_info  ma_pa_source_info;\n\ntypedef pa_context_notify_cb_t ma_pa_context_notify_cb_t;\ntypedef pa_sink_info_cb_t ma_pa_sink_info_cb_t;\ntypedef pa_source_info_cb_t ma_pa_source_info_cb_t;\ntypedef pa_stream_success_cb_t ma_pa_stream_success_cb_t;\ntypedef pa_stream_request_cb_t ma_pa_stream_request_cb_t;\ntypedef pa_free_cb_t ma_pa_free_cb_t;\n#else\n#define MA_PA_OK                                       0\n#define MA_PA_ERR_ACCESS                               1\n#define MA_PA_ERR_INVALID                              2\n#define MA_PA_ERR_NOENTITY                             5\n\n#define MA_PA_CHANNELS_MAX                             32\n#define MA_PA_RATE_MAX                                 384000\n\ntypedef int ma_pa_context_flags_t;\n#define MA_PA_CONTEXT_NOFLAGS                          0x00000000\n#define MA_PA_CONTEXT_NOAUTOSPAWN                      0x00000001\n#define MA_PA_CONTEXT_NOFAIL                           0x00000002\n\ntypedef int ma_pa_stream_flags_t;\n#define MA_PA_STREAM_NOFLAGS                           0x00000000\n#define MA_PA_STREAM_START_CORKED                      0x00000001\n#define MA_PA_STREAM_INTERPOLATE_TIMING                0x00000002\n#define MA_PA_STREAM_NOT_MONOTONIC                     0x00000004\n#define MA_PA_STREAM_AUTO_TIMING_UPDATE                0x00000008\n#define MA_PA_STREAM_NO_REMAP_CHANNELS                 0x00000010\n#define MA_PA_STREAM_NO_REMIX_CHANNELS                 0x00000020\n#define MA_PA_STREAM_FIX_FORMAT                        0x00000040\n#define MA_PA_STREAM_FIX_RATE                          0x00000080\n#define MA_PA_STREAM_FIX_CHANNELS                      0x00000100\n#define MA_PA_STREAM_DONT_MOVE                         0x00000200\n#define MA_PA_STREAM_VARIABLE_RATE                     0x00000400\n#define MA_PA_STREAM_PEAK_DETECT                       0x00000800\n#define MA_PA_STREAM_START_MUTED                       0x00001000\n#define MA_PA_STREAM_ADJUST_LATENCY                    0x00002000\n#define MA_PA_STREAM_EARLY_REQUESTS                    0x00004000\n#define MA_PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND         0x00008000\n#define MA_PA_STREAM_START_UNMUTED                     0x00010000\n#define MA_PA_STREAM_FAIL_ON_SUSPEND                   0x00020000\n#define MA_PA_STREAM_RELATIVE_VOLUME                   0x00040000\n#define MA_PA_STREAM_PASSTHROUGH                       0x00080000\n\ntypedef int ma_pa_sink_flags_t;\n#define MA_PA_SINK_NOFLAGS                             0x00000000\n#define MA_PA_SINK_HW_VOLUME_CTRL                      0x00000001\n#define MA_PA_SINK_LATENCY                             0x00000002\n#define MA_PA_SINK_HARDWARE                            0x00000004\n#define MA_PA_SINK_NETWORK                             0x00000008\n#define MA_PA_SINK_HW_MUTE_CTRL                        0x00000010\n#define MA_PA_SINK_DECIBEL_VOLUME                      0x00000020\n#define MA_PA_SINK_FLAT_VOLUME                         0x00000040\n#define MA_PA_SINK_DYNAMIC_LATENCY                     0x00000080\n#define MA_PA_SINK_SET_FORMATS                         0x00000100\n\ntypedef int ma_pa_source_flags_t;\n#define MA_PA_SOURCE_NOFLAGS                           0x00000000\n#define MA_PA_SOURCE_HW_VOLUME_CTRL                    0x00000001\n#define MA_PA_SOURCE_LATENCY                           0x00000002\n#define MA_PA_SOURCE_HARDWARE                          0x00000004\n#define MA_PA_SOURCE_NETWORK                           0x00000008\n#define MA_PA_SOURCE_HW_MUTE_CTRL                      0x00000010\n#define MA_PA_SOURCE_DECIBEL_VOLUME                    0x00000020\n#define MA_PA_SOURCE_DYNAMIC_LATENCY                   0x00000040\n#define MA_PA_SOURCE_FLAT_VOLUME                       0x00000080\n\ntypedef int ma_pa_context_state_t;\n#define MA_PA_CONTEXT_UNCONNECTED                      0\n#define MA_PA_CONTEXT_CONNECTING                       1\n#define MA_PA_CONTEXT_AUTHORIZING                      2\n#define MA_PA_CONTEXT_SETTING_NAME                     3\n#define MA_PA_CONTEXT_READY                            4\n#define MA_PA_CONTEXT_FAILED                           5\n#define MA_PA_CONTEXT_TERMINATED                       6\n\ntypedef int ma_pa_stream_state_t;\n#define MA_PA_STREAM_UNCONNECTED                       0\n#define MA_PA_STREAM_CREATING                          1\n#define MA_PA_STREAM_READY                             2\n#define MA_PA_STREAM_FAILED                            3\n#define MA_PA_STREAM_TERMINATED                        4\n\ntypedef int ma_pa_operation_state_t;\n#define MA_PA_OPERATION_RUNNING                        0\n#define MA_PA_OPERATION_DONE                           1\n#define MA_PA_OPERATION_CANCELLED                      2\n\ntypedef int ma_pa_sink_state_t;\n#define MA_PA_SINK_INVALID_STATE                       -1\n#define MA_PA_SINK_RUNNING                             0\n#define MA_PA_SINK_IDLE                                1\n#define MA_PA_SINK_SUSPENDED                           2\n\ntypedef int ma_pa_source_state_t;\n#define MA_PA_SOURCE_INVALID_STATE                     -1\n#define MA_PA_SOURCE_RUNNING                           0\n#define MA_PA_SOURCE_IDLE                              1\n#define MA_PA_SOURCE_SUSPENDED                         2\n\ntypedef int ma_pa_seek_mode_t;\n#define MA_PA_SEEK_RELATIVE                            0\n#define MA_PA_SEEK_ABSOLUTE                            1\n#define MA_PA_SEEK_RELATIVE_ON_READ                    2\n#define MA_PA_SEEK_RELATIVE_END                        3\n\ntypedef int ma_pa_channel_position_t;\n#define MA_PA_CHANNEL_POSITION_INVALID                 -1\n#define MA_PA_CHANNEL_POSITION_MONO                    0\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT              1\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT             2\n#define MA_PA_CHANNEL_POSITION_FRONT_CENTER            3\n#define MA_PA_CHANNEL_POSITION_REAR_CENTER             4\n#define MA_PA_CHANNEL_POSITION_REAR_LEFT               5\n#define MA_PA_CHANNEL_POSITION_REAR_RIGHT              6\n#define MA_PA_CHANNEL_POSITION_LFE                     7\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER    8\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER   9\n#define MA_PA_CHANNEL_POSITION_SIDE_LEFT               10\n#define MA_PA_CHANNEL_POSITION_SIDE_RIGHT              11\n#define MA_PA_CHANNEL_POSITION_AUX0                    12\n#define MA_PA_CHANNEL_POSITION_AUX1                    13\n#define MA_PA_CHANNEL_POSITION_AUX2                    14\n#define MA_PA_CHANNEL_POSITION_AUX3                    15\n#define MA_PA_CHANNEL_POSITION_AUX4                    16\n#define MA_PA_CHANNEL_POSITION_AUX5                    17\n#define MA_PA_CHANNEL_POSITION_AUX6                    18\n#define MA_PA_CHANNEL_POSITION_AUX7                    19\n#define MA_PA_CHANNEL_POSITION_AUX8                    20\n#define MA_PA_CHANNEL_POSITION_AUX9                    21\n#define MA_PA_CHANNEL_POSITION_AUX10                   22\n#define MA_PA_CHANNEL_POSITION_AUX11                   23\n#define MA_PA_CHANNEL_POSITION_AUX12                   24\n#define MA_PA_CHANNEL_POSITION_AUX13                   25\n#define MA_PA_CHANNEL_POSITION_AUX14                   26\n#define MA_PA_CHANNEL_POSITION_AUX15                   27\n#define MA_PA_CHANNEL_POSITION_AUX16                   28\n#define MA_PA_CHANNEL_POSITION_AUX17                   29\n#define MA_PA_CHANNEL_POSITION_AUX18                   30\n#define MA_PA_CHANNEL_POSITION_AUX19                   31\n#define MA_PA_CHANNEL_POSITION_AUX20                   32\n#define MA_PA_CHANNEL_POSITION_AUX21                   33\n#define MA_PA_CHANNEL_POSITION_AUX22                   34\n#define MA_PA_CHANNEL_POSITION_AUX23                   35\n#define MA_PA_CHANNEL_POSITION_AUX24                   36\n#define MA_PA_CHANNEL_POSITION_AUX25                   37\n#define MA_PA_CHANNEL_POSITION_AUX26                   38\n#define MA_PA_CHANNEL_POSITION_AUX27                   39\n#define MA_PA_CHANNEL_POSITION_AUX28                   40\n#define MA_PA_CHANNEL_POSITION_AUX29                   41\n#define MA_PA_CHANNEL_POSITION_AUX30                   42\n#define MA_PA_CHANNEL_POSITION_AUX31                   43\n#define MA_PA_CHANNEL_POSITION_TOP_CENTER              44\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT          45\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT         46\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER        47\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT           48\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT          49\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER         50\n#define MA_PA_CHANNEL_POSITION_LEFT                    MA_PA_CHANNEL_POSITION_FRONT_LEFT\n#define MA_PA_CHANNEL_POSITION_RIGHT                   MA_PA_CHANNEL_POSITION_FRONT_RIGHT\n#define MA_PA_CHANNEL_POSITION_CENTER                  MA_PA_CHANNEL_POSITION_FRONT_CENTER\n#define MA_PA_CHANNEL_POSITION_SUBWOOFER               MA_PA_CHANNEL_POSITION_LFE\n\ntypedef int ma_pa_channel_map_def_t;\n#define MA_PA_CHANNEL_MAP_AIFF                         0\n#define MA_PA_CHANNEL_MAP_ALSA                         1\n#define MA_PA_CHANNEL_MAP_AUX                          2\n#define MA_PA_CHANNEL_MAP_WAVEEX                       3\n#define MA_PA_CHANNEL_MAP_OSS                          4\n#define MA_PA_CHANNEL_MAP_DEFAULT                      MA_PA_CHANNEL_MAP_AIFF\n\ntypedef int ma_pa_sample_format_t;\n#define MA_PA_SAMPLE_INVALID                           -1\n#define MA_PA_SAMPLE_U8                                0\n#define MA_PA_SAMPLE_ALAW                              1\n#define MA_PA_SAMPLE_ULAW                              2\n#define MA_PA_SAMPLE_S16LE                             3\n#define MA_PA_SAMPLE_S16BE                             4\n#define MA_PA_SAMPLE_FLOAT32LE                         5\n#define MA_PA_SAMPLE_FLOAT32BE                         6\n#define MA_PA_SAMPLE_S32LE                             7\n#define MA_PA_SAMPLE_S32BE                             8\n#define MA_PA_SAMPLE_S24LE                             9\n#define MA_PA_SAMPLE_S24BE                             10\n#define MA_PA_SAMPLE_S24_32LE                          11\n#define MA_PA_SAMPLE_S24_32BE                          12\n\ntypedef struct ma_pa_mainloop     ma_pa_mainloop;\ntypedef struct ma_pa_mainloop_api ma_pa_mainloop_api;\ntypedef struct ma_pa_context      ma_pa_context;\ntypedef struct ma_pa_operation    ma_pa_operation;\ntypedef struct ma_pa_stream       ma_pa_stream;\ntypedef struct ma_pa_spawn_api    ma_pa_spawn_api;\n\ntypedef struct\n{\n    ma_uint32 maxlength;\n    ma_uint32 tlength;\n    ma_uint32 prebuf;\n    ma_uint32 minreq;\n    ma_uint32 fragsize;\n} ma_pa_buffer_attr;\n\ntypedef struct\n{\n    ma_uint8 channels;\n    ma_pa_channel_position_t map[MA_PA_CHANNELS_MAX];\n} ma_pa_channel_map;\n\ntypedef struct\n{\n    ma_uint8 channels;\n    ma_uint32 values[MA_PA_CHANNELS_MAX];\n} ma_pa_cvolume;\n\ntypedef struct\n{\n    ma_pa_sample_format_t format;\n    ma_uint32 rate;\n    ma_uint8 channels;\n} ma_pa_sample_spec;\n\ntypedef struct\n{\n    const char* name;\n    ma_uint32 index;\n    const char* description;\n    ma_pa_sample_spec sample_spec;\n    ma_pa_channel_map channel_map;\n    ma_uint32 owner_module;\n    ma_pa_cvolume volume;\n    int mute;\n    ma_uint32 monitor_source;\n    const char* monitor_source_name;\n    ma_uint64 latency;\n    const char* driver;\n    ma_pa_sink_flags_t flags;\n    void* proplist;\n    ma_uint64 configured_latency;\n    ma_uint32 base_volume;\n    ma_pa_sink_state_t state;\n    ma_uint32 n_volume_steps;\n    ma_uint32 card;\n    ma_uint32 n_ports;\n    void** ports;\n    void* active_port;\n    ma_uint8 n_formats;\n    void** formats;\n} ma_pa_sink_info;\n\ntypedef struct\n{\n    const char *name;\n    ma_uint32 index;\n    const char *description;\n    ma_pa_sample_spec sample_spec;\n    ma_pa_channel_map channel_map;\n    ma_uint32 owner_module;\n    ma_pa_cvolume volume;\n    int mute;\n    ma_uint32 monitor_of_sink;\n    const char *monitor_of_sink_name;\n    ma_uint64 latency;\n    const char *driver;\n    ma_pa_source_flags_t flags;\n    void* proplist;\n    ma_uint64 configured_latency;\n    ma_uint32 base_volume;\n    ma_pa_source_state_t state;\n    ma_uint32 n_volume_steps;\n    ma_uint32 card;\n    ma_uint32 n_ports;\n    void** ports;\n    void* active_port;\n    ma_uint8 n_formats;\n    void** formats;\n} ma_pa_source_info;\n\ntypedef void (* ma_pa_context_notify_cb_t)(ma_pa_context* c, void* userdata);\ntypedef void (* ma_pa_sink_info_cb_t)     (ma_pa_context* c, const ma_pa_sink_info* i, int eol, void* userdata);\ntypedef void (* ma_pa_source_info_cb_t)   (ma_pa_context* c, const ma_pa_source_info* i, int eol, void* userdata);\ntypedef void (* ma_pa_stream_success_cb_t)(ma_pa_stream* s, int success, void* userdata);\ntypedef void (* ma_pa_stream_request_cb_t)(ma_pa_stream* s, size_t nbytes, void* userdata);\ntypedef void (* ma_pa_free_cb_t)          (void* p);\n#endif\n\n\ntypedef ma_pa_mainloop*          (* ma_pa_mainloop_new_proc)                   ();\ntypedef void                     (* ma_pa_mainloop_free_proc)                  (ma_pa_mainloop* m);\ntypedef ma_pa_mainloop_api*      (* ma_pa_mainloop_get_api_proc)               (ma_pa_mainloop* m);\ntypedef int                      (* ma_pa_mainloop_iterate_proc)               (ma_pa_mainloop* m, int block, int* retval);\ntypedef void                     (* ma_pa_mainloop_wakeup_proc)                (ma_pa_mainloop* m);\ntypedef ma_pa_context*           (* ma_pa_context_new_proc)                    (ma_pa_mainloop_api* mainloop, const char* name);\ntypedef void                     (* ma_pa_context_unref_proc)                  (ma_pa_context* c);\ntypedef int                      (* ma_pa_context_connect_proc)                (ma_pa_context* c, const char* server, ma_pa_context_flags_t flags, const ma_pa_spawn_api* api);\ntypedef void                     (* ma_pa_context_disconnect_proc)             (ma_pa_context* c);\ntypedef void                     (* ma_pa_context_set_state_callback_proc)     (ma_pa_context* c, ma_pa_context_notify_cb_t cb, void* userdata);\ntypedef ma_pa_context_state_t    (* ma_pa_context_get_state_proc)              (ma_pa_context* c);\ntypedef ma_pa_operation*         (* ma_pa_context_get_sink_info_list_proc)     (ma_pa_context* c, ma_pa_sink_info_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_context_get_source_info_list_proc)   (ma_pa_context* c, ma_pa_source_info_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_context_get_sink_info_by_name_proc)  (ma_pa_context* c, const char* name, ma_pa_sink_info_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_context_get_source_info_by_name_proc)(ma_pa_context* c, const char* name, ma_pa_source_info_cb_t cb, void* userdata);\ntypedef void                     (* ma_pa_operation_unref_proc)                (ma_pa_operation* o);\ntypedef ma_pa_operation_state_t  (* ma_pa_operation_get_state_proc)            (ma_pa_operation* o);\ntypedef ma_pa_channel_map*       (* ma_pa_channel_map_init_extend_proc)        (ma_pa_channel_map* m, unsigned channels, ma_pa_channel_map_def_t def);\ntypedef int                      (* ma_pa_channel_map_valid_proc)              (const ma_pa_channel_map* m);\ntypedef int                      (* ma_pa_channel_map_compatible_proc)         (const ma_pa_channel_map* m, const ma_pa_sample_spec* ss);\ntypedef ma_pa_stream*            (* ma_pa_stream_new_proc)                     (ma_pa_context* c, const char* name, const ma_pa_sample_spec* ss, const ma_pa_channel_map* map);\ntypedef void                     (* ma_pa_stream_unref_proc)                   (ma_pa_stream* s);\ntypedef int                      (* ma_pa_stream_connect_playback_proc)        (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags, const ma_pa_cvolume* volume, ma_pa_stream* sync_stream);\ntypedef int                      (* ma_pa_stream_connect_record_proc)          (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags);\ntypedef int                      (* ma_pa_stream_disconnect_proc)              (ma_pa_stream* s);\ntypedef ma_pa_stream_state_t     (* ma_pa_stream_get_state_proc)               (ma_pa_stream* s);\ntypedef const ma_pa_sample_spec* (* ma_pa_stream_get_sample_spec_proc)         (ma_pa_stream* s);\ntypedef const ma_pa_channel_map* (* ma_pa_stream_get_channel_map_proc)         (ma_pa_stream* s);\ntypedef const ma_pa_buffer_attr* (* ma_pa_stream_get_buffer_attr_proc)         (ma_pa_stream* s);\ntypedef ma_pa_operation*         (* ma_pa_stream_set_buffer_attr_proc)         (ma_pa_stream* s, const ma_pa_buffer_attr* attr, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef const char*              (* ma_pa_stream_get_device_name_proc)         (ma_pa_stream* s);\ntypedef void                     (* ma_pa_stream_set_write_callback_proc)      (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata);\ntypedef void                     (* ma_pa_stream_set_read_callback_proc)       (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_stream_flush_proc)                   (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_stream_drain_proc)                   (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef int                      (* ma_pa_stream_is_corked_proc)               (ma_pa_stream* s);\ntypedef ma_pa_operation*         (* ma_pa_stream_cork_proc)                    (ma_pa_stream* s, int b, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_stream_trigger_proc)                 (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef int                      (* ma_pa_stream_begin_write_proc)             (ma_pa_stream* s, void** data, size_t* nbytes);\ntypedef int                      (* ma_pa_stream_write_proc)                   (ma_pa_stream* s, const void* data, size_t nbytes, ma_pa_free_cb_t free_cb, int64_t offset, ma_pa_seek_mode_t seek);\ntypedef int                      (* ma_pa_stream_peek_proc)                    (ma_pa_stream* s, const void** data, size_t* nbytes);\ntypedef int                      (* ma_pa_stream_drop_proc)                    (ma_pa_stream* s);\ntypedef size_t                   (* ma_pa_stream_writable_size_proc)           (ma_pa_stream* s);\ntypedef size_t                   (* ma_pa_stream_readable_size_proc)           (ma_pa_stream* s);\n\ntypedef struct\n{\n    ma_uint32 count;\n    ma_uint32 capacity;\n    ma_device_info* pInfo;\n} ma_pulse_device_enum_data;\n\nma_result ma_result_from_pulse(int result)\n{\n    switch (result) {\n        case MA_PA_OK:           return MA_SUCCESS;\n        case MA_PA_ERR_ACCESS:   return MA_ACCESS_DENIED;\n        case MA_PA_ERR_INVALID:  return MA_INVALID_ARGS;\n        case MA_PA_ERR_NOENTITY: return MA_NO_DEVICE;\n        default:                  return MA_ERROR;\n    }\n}\n\n#if 0\nma_pa_sample_format_t ma_format_to_pulse(ma_format format)\n{\n    if (ma_is_little_endian()) {\n        switch (format) {\n            case ma_format_s16: return MA_PA_SAMPLE_S16LE;\n            case ma_format_s24: return MA_PA_SAMPLE_S24LE;\n            case ma_format_s32: return MA_PA_SAMPLE_S32LE;\n            case ma_format_f32: return MA_PA_SAMPLE_FLOAT32LE;\n            default: break;\n        }\n    } else {\n        switch (format) {\n            case ma_format_s16: return MA_PA_SAMPLE_S16BE;\n            case ma_format_s24: return MA_PA_SAMPLE_S24BE;\n            case ma_format_s32: return MA_PA_SAMPLE_S32BE;\n            case ma_format_f32: return MA_PA_SAMPLE_FLOAT32BE;\n            default: break;\n        }\n    }\n\n    /* Endian agnostic. */\n    switch (format) {\n        case ma_format_u8: return MA_PA_SAMPLE_U8;\n        default: return MA_PA_SAMPLE_INVALID;\n    }\n}\n#endif\n\nma_format ma_format_from_pulse(ma_pa_sample_format_t format)\n{\n    if (ma_is_little_endian()) {\n        switch (format) {\n            case MA_PA_SAMPLE_S16LE:     return ma_format_s16;\n            case MA_PA_SAMPLE_S24LE:     return ma_format_s24;\n            case MA_PA_SAMPLE_S32LE:     return ma_format_s32;\n            case MA_PA_SAMPLE_FLOAT32LE: return ma_format_f32;\n            default: break;\n        }\n    } else {\n        switch (format) {\n            case MA_PA_SAMPLE_S16BE:     return ma_format_s16;\n            case MA_PA_SAMPLE_S24BE:     return ma_format_s24;\n            case MA_PA_SAMPLE_S32BE:     return ma_format_s32;\n            case MA_PA_SAMPLE_FLOAT32BE: return ma_format_f32;\n            default: break;\n        }\n    }\n\n    /* Endian agnostic. */\n    switch (format) {\n        case MA_PA_SAMPLE_U8: return ma_format_u8;\n        default: return ma_format_unknown;\n    }\n}\n\nma_channel ma_channel_position_from_pulse(ma_pa_channel_position_t position)\n{\n    switch (position)\n    {\n        case MA_PA_CHANNEL_POSITION_INVALID:               return MA_CHANNEL_NONE;\n        case MA_PA_CHANNEL_POSITION_MONO:                  return MA_CHANNEL_MONO;\n        case MA_PA_CHANNEL_POSITION_FRONT_LEFT:            return MA_CHANNEL_FRONT_LEFT;\n        case MA_PA_CHANNEL_POSITION_FRONT_RIGHT:           return MA_CHANNEL_FRONT_RIGHT;\n        case MA_PA_CHANNEL_POSITION_FRONT_CENTER:          return MA_CHANNEL_FRONT_CENTER;\n        case MA_PA_CHANNEL_POSITION_REAR_CENTER:           return MA_CHANNEL_BACK_CENTER;\n        case MA_PA_CHANNEL_POSITION_REAR_LEFT:             return MA_CHANNEL_BACK_LEFT;\n        case MA_PA_CHANNEL_POSITION_REAR_RIGHT:            return MA_CHANNEL_BACK_RIGHT;\n        case MA_PA_CHANNEL_POSITION_LFE:                   return MA_CHANNEL_LFE;\n        case MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case MA_PA_CHANNEL_POSITION_SIDE_LEFT:             return MA_CHANNEL_SIDE_LEFT;\n        case MA_PA_CHANNEL_POSITION_SIDE_RIGHT:            return MA_CHANNEL_SIDE_RIGHT;\n        case MA_PA_CHANNEL_POSITION_AUX0:                  return MA_CHANNEL_AUX_0;\n        case MA_PA_CHANNEL_POSITION_AUX1:                  return MA_CHANNEL_AUX_1;\n        case MA_PA_CHANNEL_POSITION_AUX2:                  return MA_CHANNEL_AUX_2;\n        case MA_PA_CHANNEL_POSITION_AUX3:                  return MA_CHANNEL_AUX_3;\n        case MA_PA_CHANNEL_POSITION_AUX4:                  return MA_CHANNEL_AUX_4;\n        case MA_PA_CHANNEL_POSITION_AUX5:                  return MA_CHANNEL_AUX_5;\n        case MA_PA_CHANNEL_POSITION_AUX6:                  return MA_CHANNEL_AUX_6;\n        case MA_PA_CHANNEL_POSITION_AUX7:                  return MA_CHANNEL_AUX_7;\n        case MA_PA_CHANNEL_POSITION_AUX8:                  return MA_CHANNEL_AUX_8;\n        case MA_PA_CHANNEL_POSITION_AUX9:                  return MA_CHANNEL_AUX_9;\n        case MA_PA_CHANNEL_POSITION_AUX10:                 return MA_CHANNEL_AUX_10;\n        case MA_PA_CHANNEL_POSITION_AUX11:                 return MA_CHANNEL_AUX_11;\n        case MA_PA_CHANNEL_POSITION_AUX12:                 return MA_CHANNEL_AUX_12;\n        case MA_PA_CHANNEL_POSITION_AUX13:                 return MA_CHANNEL_AUX_13;\n        case MA_PA_CHANNEL_POSITION_AUX14:                 return MA_CHANNEL_AUX_14;\n        case MA_PA_CHANNEL_POSITION_AUX15:                 return MA_CHANNEL_AUX_15;\n        case MA_PA_CHANNEL_POSITION_AUX16:                 return MA_CHANNEL_AUX_16;\n        case MA_PA_CHANNEL_POSITION_AUX17:                 return MA_CHANNEL_AUX_17;\n        case MA_PA_CHANNEL_POSITION_AUX18:                 return MA_CHANNEL_AUX_18;\n        case MA_PA_CHANNEL_POSITION_AUX19:                 return MA_CHANNEL_AUX_19;\n        case MA_PA_CHANNEL_POSITION_AUX20:                 return MA_CHANNEL_AUX_20;\n        case MA_PA_CHANNEL_POSITION_AUX21:                 return MA_CHANNEL_AUX_21;\n        case MA_PA_CHANNEL_POSITION_AUX22:                 return MA_CHANNEL_AUX_22;\n        case MA_PA_CHANNEL_POSITION_AUX23:                 return MA_CHANNEL_AUX_23;\n        case MA_PA_CHANNEL_POSITION_AUX24:                 return MA_CHANNEL_AUX_24;\n        case MA_PA_CHANNEL_POSITION_AUX25:                 return MA_CHANNEL_AUX_25;\n        case MA_PA_CHANNEL_POSITION_AUX26:                 return MA_CHANNEL_AUX_26;\n        case MA_PA_CHANNEL_POSITION_AUX27:                 return MA_CHANNEL_AUX_27;\n        case MA_PA_CHANNEL_POSITION_AUX28:                 return MA_CHANNEL_AUX_28;\n        case MA_PA_CHANNEL_POSITION_AUX29:                 return MA_CHANNEL_AUX_29;\n        case MA_PA_CHANNEL_POSITION_AUX30:                 return MA_CHANNEL_AUX_30;\n        case MA_PA_CHANNEL_POSITION_AUX31:                 return MA_CHANNEL_AUX_31;\n        case MA_PA_CHANNEL_POSITION_TOP_CENTER:            return MA_CHANNEL_TOP_CENTER;\n        case MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT:        return MA_CHANNEL_TOP_FRONT_LEFT;\n        case MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT:       return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER:      return MA_CHANNEL_TOP_FRONT_CENTER;\n        case MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT:         return MA_CHANNEL_TOP_BACK_LEFT;\n        case MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT:        return MA_CHANNEL_TOP_BACK_RIGHT;\n        case MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER:       return MA_CHANNEL_TOP_BACK_CENTER;\n        default: return MA_CHANNEL_NONE;\n    }\n}\n\n#if 0\nma_pa_channel_position_t ma_channel_position_to_pulse(ma_channel position)\n{\n    switch (position)\n    {\n        case MA_CHANNEL_NONE:               return MA_PA_CHANNEL_POSITION_INVALID;\n        case MA_CHANNEL_FRONT_LEFT:         return MA_PA_CHANNEL_POSITION_FRONT_LEFT;\n        case MA_CHANNEL_FRONT_RIGHT:        return MA_PA_CHANNEL_POSITION_FRONT_RIGHT;\n        case MA_CHANNEL_FRONT_CENTER:       return MA_PA_CHANNEL_POSITION_FRONT_CENTER;\n        case MA_CHANNEL_LFE:                return MA_PA_CHANNEL_POSITION_LFE;\n        case MA_CHANNEL_BACK_LEFT:          return MA_PA_CHANNEL_POSITION_REAR_LEFT;\n        case MA_CHANNEL_BACK_RIGHT:         return MA_PA_CHANNEL_POSITION_REAR_RIGHT;\n        case MA_CHANNEL_FRONT_LEFT_CENTER:  return MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;\n        case MA_CHANNEL_BACK_CENTER:        return MA_PA_CHANNEL_POSITION_REAR_CENTER;\n        case MA_CHANNEL_SIDE_LEFT:          return MA_PA_CHANNEL_POSITION_SIDE_LEFT;\n        case MA_CHANNEL_SIDE_RIGHT:         return MA_PA_CHANNEL_POSITION_SIDE_RIGHT;\n        case MA_CHANNEL_TOP_CENTER:         return MA_PA_CHANNEL_POSITION_TOP_CENTER;\n        case MA_CHANNEL_TOP_FRONT_LEFT:     return MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT;\n        case MA_CHANNEL_TOP_FRONT_CENTER:   return MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER;\n        case MA_CHANNEL_TOP_FRONT_RIGHT:    return MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT;\n        case MA_CHANNEL_TOP_BACK_LEFT:      return MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT;\n        case MA_CHANNEL_TOP_BACK_CENTER:    return MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER;\n        case MA_CHANNEL_TOP_BACK_RIGHT:     return MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT;\n        case MA_CHANNEL_19:                 return MA_PA_CHANNEL_POSITION_AUX18;\n        case MA_CHANNEL_20:                 return MA_PA_CHANNEL_POSITION_AUX19;\n        case MA_CHANNEL_21:                 return MA_PA_CHANNEL_POSITION_AUX20;\n        case MA_CHANNEL_22:                 return MA_PA_CHANNEL_POSITION_AUX21;\n        case MA_CHANNEL_23:                 return MA_PA_CHANNEL_POSITION_AUX22;\n        case MA_CHANNEL_24:                 return MA_PA_CHANNEL_POSITION_AUX23;\n        case MA_CHANNEL_25:                 return MA_PA_CHANNEL_POSITION_AUX24;\n        case MA_CHANNEL_26:                 return MA_PA_CHANNEL_POSITION_AUX25;\n        case MA_CHANNEL_27:                 return MA_PA_CHANNEL_POSITION_AUX26;\n        case MA_CHANNEL_28:                 return MA_PA_CHANNEL_POSITION_AUX27;\n        case MA_CHANNEL_29:                 return MA_PA_CHANNEL_POSITION_AUX28;\n        case MA_CHANNEL_30:                 return MA_PA_CHANNEL_POSITION_AUX29;\n        case MA_CHANNEL_31:                 return MA_PA_CHANNEL_POSITION_AUX30;\n        case MA_CHANNEL_32:                 return MA_PA_CHANNEL_POSITION_AUX31;\n        default: return (ma_pa_channel_position_t)position;\n    }\n}\n#endif\n\nma_result ma_wait_for_operation__pulse(ma_context* pContext, ma_pa_mainloop* pMainLoop, ma_pa_operation* pOP)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pMainLoop != NULL);\n    ma_assert(pOP != NULL);\n\n    while (((ma_pa_operation_get_state_proc)pContext->pulse.pa_operation_get_state)(pOP) == MA_PA_OPERATION_RUNNING) {\n        int error = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)(pMainLoop, 1, NULL);\n        if (error < 0) {\n            return ma_result_from_pulse(error);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device__wait_for_operation__pulse(ma_device* pDevice, ma_pa_operation* pOP)\n{\n    ma_assert(pDevice != NULL);\n    ma_assert(pOP != NULL);\n\n    return ma_wait_for_operation__pulse(pDevice->pContext, (ma_pa_mainloop*)pDevice->pulse.pMainLoop, pOP);\n}\n\n\nma_bool32 ma_context_is_device_id_equal__pulse(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return ma_strcmp(pID0->pulse, pID1->pulse) == 0;\n}\n\n\ntypedef struct\n{\n    ma_context* pContext;\n    ma_enum_devices_callback_proc callback;\n    void* pUserData;\n    ma_bool32 isTerminated;\n} ma_context_enumerate_devices_callback_data__pulse;\n\nvoid ma_context_enumerate_devices_sink_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_sink_info* pSinkInfo, int endOfList, void* pUserData)\n{\n    ma_context_enumerate_devices_callback_data__pulse* pData = (ma_context_enumerate_devices_callback_data__pulse*)pUserData;\n    ma_device_info deviceInfo;\n\n    ma_assert(pData != NULL);\n\n    if (endOfList || pData->isTerminated) {\n        return;\n    }\n\n    ma_zero_object(&deviceInfo);\n\n    /* The name from PulseAudio is the ID for miniaudio. */\n    if (pSinkInfo->name != NULL) {\n        ma_strncpy_s(deviceInfo.id.pulse, sizeof(deviceInfo.id.pulse), pSinkInfo->name, (size_t)-1);\n    }\n\n    /* The description from PulseAudio is the name for miniaudio. */\n    if (pSinkInfo->description != NULL) {\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), pSinkInfo->description, (size_t)-1);\n    }\n\n    pData->isTerminated = !pData->callback(pData->pContext, ma_device_type_playback, &deviceInfo, pData->pUserData);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nvoid ma_context_enumerate_devices_source_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_source_info* pSinkInfo, int endOfList, void* pUserData)\n{\n    ma_context_enumerate_devices_callback_data__pulse* pData = (ma_context_enumerate_devices_callback_data__pulse*)pUserData;\n    ma_device_info deviceInfo;\n\n    ma_assert(pData != NULL);\n\n    if (endOfList || pData->isTerminated) {\n        return;\n    }\n\n    ma_zero_object(&deviceInfo);\n\n    /* The name from PulseAudio is the ID for miniaudio. */\n    if (pSinkInfo->name != NULL) {\n        ma_strncpy_s(deviceInfo.id.pulse, sizeof(deviceInfo.id.pulse), pSinkInfo->name, (size_t)-1);\n    }\n\n    /* The description from PulseAudio is the name for miniaudio. */\n    if (pSinkInfo->description != NULL) {\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), pSinkInfo->description, (size_t)-1);\n    }\n\n    pData->isTerminated = !pData->callback(pData->pContext, ma_device_type_capture, &deviceInfo, pData->pUserData);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nma_result ma_context_enumerate_devices__pulse(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_result result = MA_SUCCESS;\n    ma_context_enumerate_devices_callback_data__pulse callbackData;\n    ma_pa_operation* pOP = NULL;\n    ma_pa_mainloop* pMainLoop;\n    ma_pa_mainloop_api* pAPI;\n    ma_pa_context* pPulseContext;\n    int error;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    callbackData.pContext = pContext;\n    callbackData.callback = callback;\n    callbackData.pUserData = pUserData;\n    callbackData.isTerminated = MA_FALSE;\n\n    pMainLoop = ((ma_pa_mainloop_new_proc)pContext->pulse.pa_mainloop_new)();\n    if (pMainLoop == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pAPI = ((ma_pa_mainloop_get_api_proc)pContext->pulse.pa_mainloop_get_api)(pMainLoop);\n    if (pAPI == NULL) {\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pPulseContext = ((ma_pa_context_new_proc)pContext->pulse.pa_context_new)(pAPI, pContext->pulse.pApplicationName);\n    if (pPulseContext == NULL) {\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    error = ((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)(pPulseContext, pContext->pulse.pServerName, (pContext->pulse.tryAutoSpawn) ? 0 : MA_PA_CONTEXT_NOAUTOSPAWN, NULL);\n    if (error != MA_PA_OK) {\n        ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)(pPulseContext);\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        return ma_result_from_pulse(error);\n    }\n\n    for (;;) {\n        ma_pa_context_state_t state = ((ma_pa_context_get_state_proc)pContext->pulse.pa_context_get_state)(pPulseContext);\n        if (state == MA_PA_CONTEXT_READY) {\n            break;  /* Success. */\n        }\n        if (state == MA_PA_CONTEXT_CONNECTING || state == MA_PA_CONTEXT_AUTHORIZING || state == MA_PA_CONTEXT_SETTING_NAME) {\n            error = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)(pMainLoop, 1, NULL);\n            if (error < 0) {\n                result = ma_result_from_pulse(error);\n                goto done;\n            }\n\n#ifdef MA_DEBUG_OUTPUT\n            printf(\"[PulseAudio] pa_context_get_state() returned %d. Waiting.\\n\", state);\n#endif\n            continue;   /* Keep trying. */\n        }\n        if (state == MA_PA_CONTEXT_UNCONNECTED || state == MA_PA_CONTEXT_FAILED || state == MA_PA_CONTEXT_TERMINATED) {\n#ifdef MA_DEBUG_OUTPUT\n            printf(\"[PulseAudio] pa_context_get_state() returned %d. Failed.\\n\", state);\n#endif\n            goto done;  /* Failed. */\n        }\n    }\n\n\n    /* Playback. */\n    if (!callbackData.isTerminated) {\n        pOP = ((ma_pa_context_get_sink_info_list_proc)pContext->pulse.pa_context_get_sink_info_list)(pPulseContext, ma_context_enumerate_devices_sink_callback__pulse, &callbackData);\n        if (pOP == NULL) {\n            result = MA_ERROR;\n            goto done;\n        }\n\n        result = ma_wait_for_operation__pulse(pContext, pMainLoop, pOP);\n        ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n        if (result != MA_SUCCESS) {\n            goto done;\n        }\n    }\n\n\n    /* Capture. */\n    if (!callbackData.isTerminated) {\n        pOP = ((ma_pa_context_get_source_info_list_proc)pContext->pulse.pa_context_get_source_info_list)(pPulseContext, ma_context_enumerate_devices_source_callback__pulse, &callbackData);\n        if (pOP == NULL) {\n            result = MA_ERROR;\n            goto done;\n        }\n\n        result = ma_wait_for_operation__pulse(pContext, pMainLoop, pOP);\n        ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n        if (result != MA_SUCCESS) {\n            goto done;\n        }\n    }\n\ndone:\n    ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)(pPulseContext);\n    ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)(pPulseContext);\n    ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n    return result;\n}\n\n\ntypedef struct\n{\n    ma_device_info* pDeviceInfo;\n    ma_bool32 foundDevice;\n} ma_context_get_device_info_callback_data__pulse;\n\nvoid ma_context_get_device_info_sink_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_context_get_device_info_callback_data__pulse* pData = (ma_context_get_device_info_callback_data__pulse*)pUserData;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    ma_assert(pData != NULL);\n    pData->foundDevice = MA_TRUE;\n\n    if (pInfo->name != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->id.pulse, sizeof(pData->pDeviceInfo->id.pulse), pInfo->name, (size_t)-1);\n    }\n\n    if (pInfo->description != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pInfo->description, (size_t)-1);\n    }\n\n    pData->pDeviceInfo->minChannels   = pInfo->sample_spec.channels;\n    pData->pDeviceInfo->maxChannels   = pInfo->sample_spec.channels;\n    pData->pDeviceInfo->minSampleRate = pInfo->sample_spec.rate;\n    pData->pDeviceInfo->maxSampleRate = pInfo->sample_spec.rate;\n    pData->pDeviceInfo->formatCount = 1;\n    pData->pDeviceInfo->formats[0] = ma_format_from_pulse(pInfo->sample_spec.format);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nvoid ma_context_get_device_info_source_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_context_get_device_info_callback_data__pulse* pData = (ma_context_get_device_info_callback_data__pulse*)pUserData;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    ma_assert(pData != NULL);\n    pData->foundDevice = MA_TRUE;\n\n    if (pInfo->name != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->id.pulse, sizeof(pData->pDeviceInfo->id.pulse), pInfo->name, (size_t)-1);\n    }\n\n    if (pInfo->description != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pInfo->description, (size_t)-1);\n    }\n\n    pData->pDeviceInfo->minChannels = pInfo->sample_spec.channels;\n    pData->pDeviceInfo->maxChannels = pInfo->sample_spec.channels;\n    pData->pDeviceInfo->minSampleRate = pInfo->sample_spec.rate;\n    pData->pDeviceInfo->maxSampleRate = pInfo->sample_spec.rate;\n    pData->pDeviceInfo->formatCount = 1;\n    pData->pDeviceInfo->formats[0] = ma_format_from_pulse(pInfo->sample_spec.format);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nma_result ma_context_get_device_info__pulse(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_result result = MA_SUCCESS;\n    ma_context_get_device_info_callback_data__pulse callbackData;\n    ma_pa_operation* pOP = NULL;\n    ma_pa_mainloop* pMainLoop;\n    ma_pa_mainloop_api* pAPI;\n    ma_pa_context* pPulseContext;\n    int error;\n\n    ma_assert(pContext != NULL);\n\n    /* No exclusive mode with the PulseAudio backend. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    callbackData.pDeviceInfo = pDeviceInfo;\n    callbackData.foundDevice = MA_FALSE;\n\n    pMainLoop = ((ma_pa_mainloop_new_proc)pContext->pulse.pa_mainloop_new)();\n    if (pMainLoop == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pAPI = ((ma_pa_mainloop_get_api_proc)pContext->pulse.pa_mainloop_get_api)(pMainLoop);\n    if (pAPI == NULL) {\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pPulseContext = ((ma_pa_context_new_proc)pContext->pulse.pa_context_new)(pAPI, pContext->pulse.pApplicationName);\n    if (pPulseContext == NULL) {\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    error = ((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)(pPulseContext, pContext->pulse.pServerName, 0, NULL);\n    if (error != MA_PA_OK) {\n        ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)(pPulseContext);\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        return ma_result_from_pulse(error);\n    }\n\n    for (;;) {\n        ma_pa_context_state_t state = ((ma_pa_context_get_state_proc)pContext->pulse.pa_context_get_state)(pPulseContext);\n        if (state == MA_PA_CONTEXT_READY) {\n            break;  /* Success. */\n        }\n        if (state == MA_PA_CONTEXT_CONNECTING || state == MA_PA_CONTEXT_AUTHORIZING || state == MA_PA_CONTEXT_SETTING_NAME) {\n            error = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)(pMainLoop, 1, NULL);\n            if (error < 0) {\n                result = ma_result_from_pulse(error);\n                goto done;\n            }\n\n#ifdef MA_DEBUG_OUTPUT\n            printf(\"[PulseAudio] pa_context_get_state() returned %d. Waiting.\\n\", state);\n#endif\n            continue;   /* Keep trying. */\n        }\n        if (state == MA_PA_CONTEXT_UNCONNECTED || state == MA_PA_CONTEXT_FAILED || state == MA_PA_CONTEXT_TERMINATED) {\n#ifdef MA_DEBUG_OUTPUT\n            printf(\"[PulseAudio] pa_context_get_state() returned %d. Failed.\\n\", state);\n#endif\n            goto done;  /* Failed. */\n        }\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)(pPulseContext, pDeviceID->pulse, ma_context_get_device_info_sink_callback__pulse, &callbackData);\n    } else {\n        pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)(pPulseContext, pDeviceID->pulse, ma_context_get_device_info_source_callback__pulse, &callbackData);\n    }\n\n    if (pOP != NULL) {\n        ma_wait_for_operation__pulse(pContext, pMainLoop, pOP);\n        ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n    } else {\n        result = MA_ERROR;\n        goto done;\n    }\n\n    if (!callbackData.foundDevice) {\n        result = MA_NO_DEVICE;\n        goto done;\n    }\n\n\ndone:\n    ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)(pPulseContext);\n    ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)(pPulseContext);\n    ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n    return result;\n}\n\n\nvoid ma_pulse_device_state_callback(ma_pa_context* pPulseContext, void* pUserData)\n{\n    ma_device* pDevice;\n    ma_context* pContext;\n\n    pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    ma_assert(pContext != NULL);\n\n    pDevice->pulse.pulseContextState = ((ma_pa_context_get_state_proc)pContext->pulse.pa_context_get_state)(pPulseContext);\n}\n\nvoid ma_device_sink_info_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_pa_sink_info* pInfoOut;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    pInfoOut = (ma_pa_sink_info*)pUserData;\n    ma_assert(pInfoOut != NULL);\n\n    *pInfoOut = *pInfo;\n\n    (void)pPulseContext; /* Unused. */\n}\n\nvoid ma_device_source_info_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_pa_source_info* pInfoOut;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    pInfoOut = (ma_pa_source_info*)pUserData;\n    ma_assert(pInfoOut != NULL);\n\n    *pInfoOut = *pInfo;\n\n    (void)pPulseContext; /* Unused. */\n}\n\nvoid ma_device_sink_name_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_device* pDevice;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), pInfo->description, (size_t)-1);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nvoid ma_device_source_name_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_device* pDevice;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), pInfo->description, (size_t)-1);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nvoid ma_device_uninit__pulse(ma_device* pDevice)\n{\n    ma_context* pContext;\n\n    ma_assert(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    ma_assert(pContext != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n    }\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n    }\n\n    ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)((ma_pa_context*)pDevice->pulse.pPulseContext);\n    ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)pDevice->pulse.pPulseContext);\n    ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)pDevice->pulse.pMainLoop);\n}\n\nma_pa_buffer_attr ma_device__pa_buffer_attr_new(ma_uint32 bufferSizeInFrames, ma_uint32 periods, const ma_pa_sample_spec* ss)\n{\n    ma_pa_buffer_attr attr;\n    attr.maxlength = bufferSizeInFrames * ma_get_bytes_per_sample(ma_format_from_pulse(ss->format)) * ss->channels;\n    attr.tlength   = attr.maxlength / periods;\n    attr.prebuf    = (ma_uint32)-1;\n    attr.minreq    = attr.maxlength / periods;\n    attr.fragsize  = attr.maxlength / periods;\n\n    return attr;\n}\n\nma_pa_stream* ma_device__pa_stream_new__pulse(ma_device* pDevice, const char* pStreamName, const ma_pa_sample_spec* ss, const ma_pa_channel_map* cmap)\n{\n    static int g_StreamCounter = 0;\n    char actualStreamName[256];\n\n    if (pStreamName != NULL) {\n        ma_strncpy_s(actualStreamName, sizeof(actualStreamName), pStreamName, (size_t)-1);\n    } else {\n        ma_strcpy_s(actualStreamName, sizeof(actualStreamName), \"miniaudio:\");\n        ma_itoa_s(g_StreamCounter, actualStreamName + 8, sizeof(actualStreamName)-8, 10);  /* 8 = strlen(\"miniaudio:\") */\n    }\n    g_StreamCounter += 1;\n\n    return ((ma_pa_stream_new_proc)pDevice->pContext->pulse.pa_stream_new)((ma_pa_context*)pDevice->pulse.pPulseContext, actualStreamName, ss, cmap);\n}\n\nma_result ma_device_init__pulse(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result = MA_SUCCESS;\n    int error = 0;\n    const char* devPlayback = NULL;\n    const char* devCapture  = NULL;\n    ma_uint32 bufferSizeInMilliseconds;\n    ma_pa_sink_info sinkInfo;\n    ma_pa_source_info sourceInfo;\n    ma_pa_operation* pOP = NULL;\n    ma_pa_sample_spec ss;\n    ma_pa_channel_map cmap;\n    ma_pa_buffer_attr attr;\n    const ma_pa_sample_spec* pActualSS   = NULL;\n    const ma_pa_channel_map* pActualCMap = NULL;\n    const ma_pa_buffer_attr* pActualAttr = NULL;\n    ma_uint32 iChannel;\n    ma_pa_stream_flags_t streamFlags;\n\n    ma_assert(pDevice != NULL);\n    ma_zero_object(&pDevice->pulse);\n\n    /* No exclusive mode with the PulseAudio backend. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.pDeviceID != NULL) {\n        devPlayback = pConfig->playback.pDeviceID->pulse;\n    }\n    if ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.pDeviceID != NULL) {\n        devCapture = pConfig->capture.pDeviceID->pulse;\n    }\n\n    bufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;\n    if (bufferSizeInMilliseconds == 0) {\n        bufferSizeInMilliseconds = ma_calculate_buffer_size_in_milliseconds_from_frames(pConfig->bufferSizeInFrames, pConfig->sampleRate);\n    }\n\n    pDevice->pulse.pMainLoop = ((ma_pa_mainloop_new_proc)pContext->pulse.pa_mainloop_new)();\n    if (pDevice->pulse.pMainLoop == NULL) {\n        result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create main loop for device.\", MA_FAILED_TO_INIT_BACKEND);\n        goto on_error0;\n    }\n\n    pDevice->pulse.pAPI = ((ma_pa_mainloop_get_api_proc)pContext->pulse.pa_mainloop_get_api)((ma_pa_mainloop*)pDevice->pulse.pMainLoop);\n    if (pDevice->pulse.pAPI == NULL) {\n        result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to retrieve PulseAudio main loop.\", MA_FAILED_TO_INIT_BACKEND);\n        goto on_error1;\n    }\n\n    pDevice->pulse.pPulseContext = ((ma_pa_context_new_proc)pContext->pulse.pa_context_new)((ma_pa_mainloop_api*)pDevice->pulse.pAPI, pContext->pulse.pApplicationName);\n    if (pDevice->pulse.pPulseContext == NULL) {\n        result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create PulseAudio context for device.\", MA_FAILED_TO_INIT_BACKEND);\n        goto on_error1;\n    }\n\n    error = ((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)((ma_pa_context*)pDevice->pulse.pPulseContext, pContext->pulse.pServerName, (pContext->pulse.tryAutoSpawn) ? 0 : MA_PA_CONTEXT_NOAUTOSPAWN, NULL);\n    if (error != MA_PA_OK) {\n        result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to connect PulseAudio context.\", ma_result_from_pulse(error));\n        goto on_error2;\n    }\n\n\n    pDevice->pulse.pulseContextState = MA_PA_CONTEXT_UNCONNECTED;\n    ((ma_pa_context_set_state_callback_proc)pContext->pulse.pa_context_set_state_callback)((ma_pa_context*)pDevice->pulse.pPulseContext, ma_pulse_device_state_callback, pDevice);\n\n    /* Wait for PulseAudio to get itself ready before returning. */\n    for (;;) {\n        if (pDevice->pulse.pulseContextState == MA_PA_CONTEXT_READY) {\n            break;\n        }\n\n        /* An error may have occurred. */\n        if (pDevice->pulse.pulseContextState == MA_PA_CONTEXT_FAILED || pDevice->pulse.pulseContextState == MA_PA_CONTEXT_TERMINATED) {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] An error occurred while connecting the PulseAudio context.\", MA_ERROR);\n            goto on_error3;\n        }\n\n        error = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 1, NULL);\n        if (error < 0) {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] The PulseAudio main loop returned an error while connecting the PulseAudio context.\", ma_result_from_pulse(error));\n            goto on_error3;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)((ma_pa_context*)pDevice->pulse.pPulseContext, devCapture, ma_device_source_info_callback, &sourceInfo);\n        if (pOP != NULL) {\n            ma_device__wait_for_operation__pulse(pDevice, pOP);\n            ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n        } else {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to retrieve source info for capture device.\", ma_result_from_pulse(error));\n            goto on_error3;\n        }\n\n        ss = sourceInfo.sample_spec;\n        cmap = sourceInfo.channel_map;\n\n        pDevice->capture.internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(bufferSizeInMilliseconds, ss.rate);\n        pDevice->capture.internalPeriods            = pConfig->periods;\n\n        attr = ma_device__pa_buffer_attr_new(pDevice->capture.internalBufferSizeInFrames, pConfig->periods, &ss);\n    #ifdef MA_DEBUG_OUTPUT\n        printf(\"[PulseAudio] Capture attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; internalBufferSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDevice->capture.internalBufferSizeInFrames);\n    #endif\n\n        pDevice->pulse.pStreamCapture = ma_device__pa_stream_new__pulse(pDevice, pConfig->pulse.pStreamNameCapture, &ss, &cmap);\n        if (pDevice->pulse.pStreamCapture == NULL) {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create PulseAudio capture stream.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n            goto on_error3;\n        }\n\n        streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_FIX_FORMAT | MA_PA_STREAM_FIX_RATE | MA_PA_STREAM_FIX_CHANNELS;\n        if (devCapture != NULL) {\n            streamFlags |= MA_PA_STREAM_DONT_MOVE;\n        }\n\n        error = ((ma_pa_stream_connect_record_proc)pContext->pulse.pa_stream_connect_record)((ma_pa_stream*)pDevice->pulse.pStreamCapture, devCapture, &attr, streamFlags);\n        if (error != MA_PA_OK) {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to connect PulseAudio capture stream.\", ma_result_from_pulse(error));\n            goto on_error4;\n        }\n\n        while (((ma_pa_stream_get_state_proc)pContext->pulse.pa_stream_get_state)((ma_pa_stream*)pDevice->pulse.pStreamCapture) != MA_PA_STREAM_READY) {\n            error = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 1, NULL);\n            if (error < 0) {\n                result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] The PulseAudio main loop returned an error while connecting the PulseAudio capture stream.\", ma_result_from_pulse(error));\n                goto on_error5;\n            }\n        }\n\n        /* Internal format. */\n        pActualSS = ((ma_pa_stream_get_sample_spec_proc)pContext->pulse.pa_stream_get_sample_spec)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (pActualSS != NULL) {\n            /* If anything has changed between the requested and the actual sample spec, we need to update the buffer. */\n            if (ss.format != pActualSS->format || ss.channels != pActualSS->channels || ss.rate != pActualSS->rate) {\n                attr = ma_device__pa_buffer_attr_new(pDevice->capture.internalBufferSizeInFrames, pConfig->periods, pActualSS);\n\n                pOP = ((ma_pa_stream_set_buffer_attr_proc)pContext->pulse.pa_stream_set_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamCapture, &attr, NULL, NULL);\n                if (pOP != NULL) {\n                    ma_device__wait_for_operation__pulse(pDevice, pOP);\n                    ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n                }\n            }\n\n            ss = *pActualSS;\n        }\n\n        pDevice->capture.internalFormat     = ma_format_from_pulse(ss.format);\n        pDevice->capture.internalChannels   = ss.channels;\n        pDevice->capture.internalSampleRate = ss.rate;\n\n        /* Internal channel map. */\n        pActualCMap = ((ma_pa_stream_get_channel_map_proc)pContext->pulse.pa_stream_get_channel_map)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (pActualCMap != NULL) {\n            cmap = *pActualCMap;\n        }\n        for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) {\n            pDevice->capture.internalChannelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]);\n        }\n\n        /* Buffer. */\n        pActualAttr = ((ma_pa_stream_get_buffer_attr_proc)pContext->pulse.pa_stream_get_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (pActualAttr != NULL) {\n            attr = *pActualAttr;\n        }\n        pDevice->capture.internalBufferSizeInFrames = attr.maxlength / (ma_get_bytes_per_sample(pDevice->capture.internalFormat) * pDevice->capture.internalChannels);\n        pDevice->capture.internalPeriods            = attr.maxlength / attr.fragsize;\n    #ifdef MA_DEBUG_OUTPUT\n        printf(\"[PulseAudio] Capture actual attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; internalBufferSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDevice->capture.internalBufferSizeInFrames);\n    #endif\n\n        /* Name. */\n        devCapture = ((ma_pa_stream_get_device_name_proc)pContext->pulse.pa_stream_get_device_name)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (devCapture != NULL) {\n            ma_pa_operation* pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)((ma_pa_context*)pDevice->pulse.pPulseContext, devCapture, ma_device_source_name_callback, pDevice);\n            if (pOP != NULL) {\n                ma_device__wait_for_operation__pulse(pDevice, pOP);\n                ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n            }\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)((ma_pa_context*)pDevice->pulse.pPulseContext, devPlayback, ma_device_sink_info_callback, &sinkInfo);\n        if (pOP != NULL) {\n            ma_device__wait_for_operation__pulse(pDevice, pOP);\n            ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n        } else {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to retrieve sink info for playback device.\", ma_result_from_pulse(error));\n            goto on_error3;\n        }\n\n        ss = sinkInfo.sample_spec;\n        cmap = sinkInfo.channel_map;\n\n        pDevice->playback.internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(bufferSizeInMilliseconds, ss.rate);\n        pDevice->playback.internalPeriods            = pConfig->periods;\n\n        attr = ma_device__pa_buffer_attr_new(pDevice->playback.internalBufferSizeInFrames, pConfig->periods, &ss);\n    #ifdef MA_DEBUG_OUTPUT\n        printf(\"[PulseAudio] Playback attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; internalBufferSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDevice->playback.internalBufferSizeInFrames);\n    #endif\n\n        pDevice->pulse.pStreamPlayback = ma_device__pa_stream_new__pulse(pDevice, pConfig->pulse.pStreamNamePlayback, &ss, &cmap);\n        if (pDevice->pulse.pStreamPlayback == NULL) {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create PulseAudio playback stream.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n            goto on_error3;\n        }\n\n        streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_FIX_FORMAT | MA_PA_STREAM_FIX_RATE | MA_PA_STREAM_FIX_CHANNELS;\n        if (devPlayback != NULL) {\n            streamFlags |= MA_PA_STREAM_DONT_MOVE;\n        }\n\n        error = ((ma_pa_stream_connect_playback_proc)pContext->pulse.pa_stream_connect_playback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, devPlayback, &attr, streamFlags, NULL, NULL);\n        if (error != MA_PA_OK) {\n            result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to connect PulseAudio playback stream.\", ma_result_from_pulse(error));\n            goto on_error6;\n        }\n\n        while (((ma_pa_stream_get_state_proc)pContext->pulse.pa_stream_get_state)((ma_pa_stream*)pDevice->pulse.pStreamPlayback) != MA_PA_STREAM_READY) {\n            error = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 1, NULL);\n            if (error < 0) {\n                result = ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] The PulseAudio main loop returned an error while connecting the PulseAudio playback stream.\", ma_result_from_pulse(error));\n                goto on_error7;\n            }\n        }\n\n        /* Internal format. */\n        pActualSS = ((ma_pa_stream_get_sample_spec_proc)pContext->pulse.pa_stream_get_sample_spec)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (pActualSS != NULL) {\n            /* If anything has changed between the requested and the actual sample spec, we need to update the buffer. */\n            if (ss.format != pActualSS->format || ss.channels != pActualSS->channels || ss.rate != pActualSS->rate) {\n                attr = ma_device__pa_buffer_attr_new(pDevice->playback.internalBufferSizeInFrames, pConfig->periods, pActualSS);\n\n                pOP = ((ma_pa_stream_set_buffer_attr_proc)pContext->pulse.pa_stream_set_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, &attr, NULL, NULL);\n                if (pOP != NULL) {\n                    ma_device__wait_for_operation__pulse(pDevice, pOP);\n                    ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n                }\n            }\n\n            ss = *pActualSS;\n        }\n\n        pDevice->playback.internalFormat     = ma_format_from_pulse(ss.format);\n        pDevice->playback.internalChannels   = ss.channels;\n        pDevice->playback.internalSampleRate = ss.rate;\n\n        /* Internal channel map. */\n        pActualCMap = ((ma_pa_stream_get_channel_map_proc)pContext->pulse.pa_stream_get_channel_map)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (pActualCMap != NULL) {\n            cmap = *pActualCMap;\n        }\n        for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) {\n            pDevice->playback.internalChannelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]);\n        }\n\n        /* Buffer. */\n        pActualAttr = ((ma_pa_stream_get_buffer_attr_proc)pContext->pulse.pa_stream_get_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (pActualAttr != NULL) {\n            attr = *pActualAttr;\n        }\n        pDevice->playback.internalBufferSizeInFrames = attr.maxlength / (ma_get_bytes_per_sample(pDevice->playback.internalFormat) * pDevice->playback.internalChannels);\n        pDevice->playback.internalPeriods            = /*pConfig->periods;*/attr.maxlength / attr.tlength;\n    #ifdef MA_DEBUG_OUTPUT\n        printf(\"[PulseAudio] Playback actual attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; internalBufferSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDevice->playback.internalBufferSizeInFrames);\n    #endif\n\n        /* Name. */\n        devPlayback = ((ma_pa_stream_get_device_name_proc)pContext->pulse.pa_stream_get_device_name)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (devPlayback != NULL) {\n            ma_pa_operation* pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)((ma_pa_context*)pDevice->pulse.pPulseContext, devPlayback, ma_device_sink_name_callback, pDevice);\n            if (pOP != NULL) {\n                ma_device__wait_for_operation__pulse(pDevice, pOP);\n                ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n\n\non_error7:\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n    }\non_error6:\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n    }\non_error5:\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n    }\non_error4:\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n    }\non_error3: ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)((ma_pa_context*)pDevice->pulse.pPulseContext);\non_error2: ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)pDevice->pulse.pPulseContext);\non_error1: ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)pDevice->pulse.pMainLoop);\non_error0:\n    return result;\n}\n\n\nvoid ma_pulse_operation_complete_callback(ma_pa_stream* pStream, int success, void* pUserData)\n{\n    ma_bool32* pIsSuccessful = (ma_bool32*)pUserData;\n    ma_assert(pIsSuccessful != NULL);\n\n    *pIsSuccessful = (ma_bool32)success;\n\n    (void)pStream; /* Unused. */\n}\n\nma_result ma_device__cork_stream__pulse(ma_device* pDevice, ma_device_type deviceType, int cork)\n{\n    ma_context* pContext = pDevice->pContext;\n    ma_bool32 wasSuccessful;\n    ma_pa_stream* pStream;\n    ma_pa_operation* pOP;\n    ma_result result;\n\n    /* This should not be called with a duplex device type. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    wasSuccessful = MA_FALSE;\n\n    pStream = (ma_pa_stream*)((deviceType == ma_device_type_capture) ? pDevice->pulse.pStreamCapture : pDevice->pulse.pStreamPlayback);\n    ma_assert(pStream != NULL);\n\n    pOP = ((ma_pa_stream_cork_proc)pContext->pulse.pa_stream_cork)(pStream, cork, ma_pulse_operation_complete_callback, &wasSuccessful);\n    if (pOP == NULL) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to cork PulseAudio stream.\", (cork == 0) ? MA_FAILED_TO_START_BACKEND_DEVICE : MA_FAILED_TO_STOP_BACKEND_DEVICE);\n    }\n\n    result = ma_device__wait_for_operation__pulse(pDevice, pOP);\n    ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n\n    if (result != MA_SUCCESS) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] An error occurred while waiting for the PulseAudio stream to cork.\", result);\n    }\n\n    if (!wasSuccessful) {\n        if (cork) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to stop PulseAudio stream.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        } else {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to start PulseAudio stream.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__pulse(ma_device* pDevice)\n{\n    ma_result result;\n    ma_bool32 wasSuccessful;\n    ma_pa_operation* pOP;\n\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        result = ma_device__cork_stream__pulse(pDevice, ma_device_type_capture, 1);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* The stream needs to be drained if it's a playback device. */\n        pOP = ((ma_pa_stream_drain_proc)pDevice->pContext->pulse.pa_stream_drain)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_pulse_operation_complete_callback, &wasSuccessful);\n        if (pOP != NULL) {\n            ma_device__wait_for_operation__pulse(pDevice, pOP);\n            ((ma_pa_operation_unref_proc)pDevice->pContext->pulse.pa_operation_unref)(pOP);\n        }\n\n        result = ma_device__cork_stream__pulse(pDevice, ma_device_type_playback, 1);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__pulse(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_uint32 totalFramesWritten;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pPCMFrames != NULL);\n    ma_assert(frameCount > 0);\n\n    /* The stream needs to be uncorked first. */\n    if (((ma_pa_stream_is_corked_proc)pDevice->pContext->pulse.pa_stream_is_corked)((ma_pa_stream*)pDevice->pulse.pStreamPlayback)) {\n        ma_result result = ma_device__cork_stream__pulse(pDevice, ma_device_type_playback, 0);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    totalFramesWritten = 0;\n    while (totalFramesWritten < frameCount) {\n        /* Place the data into the mapped buffer if we have one. */\n        if (pDevice->pulse.pMappedBufferPlayback != NULL && pDevice->pulse.mappedBufferFramesRemainingPlayback > 0) {\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n            ma_uint32 mappedBufferFramesConsumed = pDevice->pulse.mappedBufferFramesCapacityPlayback - pDevice->pulse.mappedBufferFramesRemainingPlayback;\n\n            void* pDst = (ma_uint8*)pDevice->pulse.pMappedBufferPlayback + (mappedBufferFramesConsumed * bpf);\n            const void* pSrc = (const ma_uint8*)pPCMFrames + (totalFramesWritten * bpf);\n            ma_uint32  framesToCopy = ma_min(pDevice->pulse.mappedBufferFramesRemainingPlayback, (frameCount - totalFramesWritten));\n            ma_copy_memory(pDst, pSrc, framesToCopy * bpf);\n\n            pDevice->pulse.mappedBufferFramesRemainingPlayback -= framesToCopy;\n            totalFramesWritten += framesToCopy;\n        }\n\n        /*\n        Getting here means we've run out of data in the currently mapped chunk. We need to write this to the device and then try\n        mapping another chunk. If this fails we need to wait for space to become available.\n        */\n        if (pDevice->pulse.mappedBufferFramesCapacityPlayback > 0 && pDevice->pulse.mappedBufferFramesRemainingPlayback == 0) {\n            size_t nbytes = pDevice->pulse.mappedBufferFramesCapacityPlayback * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n\n            int error = ((ma_pa_stream_write_proc)pDevice->pContext->pulse.pa_stream_write)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, pDevice->pulse.pMappedBufferPlayback, nbytes, NULL, 0, MA_PA_SEEK_RELATIVE);\n            if (error < 0) {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to write data to the PulseAudio stream.\", ma_result_from_pulse(error));\n            }\n\n            pDevice->pulse.pMappedBufferPlayback = NULL;\n            pDevice->pulse.mappedBufferFramesRemainingPlayback = 0;\n            pDevice->pulse.mappedBufferFramesCapacityPlayback = 0;\n        }\n\n        ma_assert(totalFramesWritten <= frameCount);\n        if (totalFramesWritten == frameCount) {\n            break;\n        }\n\n        /* Getting here means we need to map a new buffer. If we don't have enough space we need to wait for more. */\n        for (;;) {\n            size_t writableSizeInBytes;\n\n            /* If the device has been corked, don't try to continue. */\n            if (((ma_pa_stream_is_corked_proc)pDevice->pContext->pulse.pa_stream_is_corked)((ma_pa_stream*)pDevice->pulse.pStreamPlayback)) {\n                break;\n            }\n\n            writableSizeInBytes = ((ma_pa_stream_writable_size_proc)pDevice->pContext->pulse.pa_stream_writable_size)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n            if (writableSizeInBytes != (size_t)-1) {\n                /*size_t periodSizeInBytes = (pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods) * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);*/\n                if (writableSizeInBytes > 0) {\n                    /* Data is avaialable. */\n                    size_t bytesToMap = writableSizeInBytes;\n                    int error = ((ma_pa_stream_begin_write_proc)pDevice->pContext->pulse.pa_stream_begin_write)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, &pDevice->pulse.pMappedBufferPlayback, &bytesToMap);\n                    if (error < 0) {\n                        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to map write buffer.\", ma_result_from_pulse(error));\n                    }\n\n                    pDevice->pulse.mappedBufferFramesCapacityPlayback  = bytesToMap / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                    pDevice->pulse.mappedBufferFramesRemainingPlayback = pDevice->pulse.mappedBufferFramesCapacityPlayback;\n\n                    break;\n                } else {\n                    /* No data available. Need to wait for more. */\n                    int error = ((ma_pa_mainloop_iterate_proc)pDevice->pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 1, NULL);\n                    if (error < 0) {\n                        return ma_result_from_pulse(error);\n                    }\n\n                    continue;\n                }\n            } else {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to query the stream's writable size.\", MA_ERROR);\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_read__pulse(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    ma_uint32 totalFramesRead;\n\n    ma_assert(pDevice != NULL);\n    ma_assert(pPCMFrames != NULL);\n    ma_assert(frameCount > 0);\n\n    /* The stream needs to be uncorked first. */\n    if (((ma_pa_stream_is_corked_proc)pDevice->pContext->pulse.pa_stream_is_corked)((ma_pa_stream*)pDevice->pulse.pStreamCapture)) {\n        ma_result result = ma_device__cork_stream__pulse(pDevice, ma_device_type_capture, 0);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n        if (ma_device__get_state(pDevice) != MA_STATE_STARTED) {\n            break;\n        }\n\n        /* If a buffer is mapped we need to write to that first. Once it's consumed we reset the event and unmap it. */\n        if (pDevice->pulse.pMappedBufferCapture != NULL && pDevice->pulse.mappedBufferFramesRemainingCapture > 0) {\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n            ma_uint32 mappedBufferFramesConsumed = pDevice->pulse.mappedBufferFramesCapacityCapture - pDevice->pulse.mappedBufferFramesRemainingCapture;\n\n            ma_uint32  framesToCopy = ma_min(pDevice->pulse.mappedBufferFramesRemainingCapture, (frameCount - totalFramesRead));\n            void* pDst = (ma_uint8*)pPCMFrames + (totalFramesRead * bpf);\n\n            /*\n            This little bit of logic here is specifically for PulseAudio and it's hole management. The buffer pointer will be set to NULL\n            when the current fragment is a hole. For a hole we just output silence.\n            */\n            if (pDevice->pulse.pMappedBufferCapture != NULL) {\n                const void* pSrc = (const ma_uint8*)pDevice->pulse.pMappedBufferCapture + (mappedBufferFramesConsumed * bpf);\n                ma_copy_memory(pDst, pSrc, framesToCopy * bpf);\n            } else {\n                ma_zero_memory(pDst, framesToCopy * bpf);\n            }\n\n            pDevice->pulse.mappedBufferFramesRemainingCapture -= framesToCopy;\n            totalFramesRead += framesToCopy;\n        }\n\n        /*\n        Getting here means we've run out of data in the currently mapped chunk. We need to drop this from the device and then try\n        mapping another chunk. If this fails we need to wait for data to become available.\n        */\n        if (pDevice->pulse.mappedBufferFramesCapacityCapture > 0 && pDevice->pulse.mappedBufferFramesRemainingCapture == 0) {\n            int error = ((ma_pa_stream_drop_proc)pDevice->pContext->pulse.pa_stream_drop)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n            if (error != 0) {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to drop fragment.\", ma_result_from_pulse(error));\n            }\n\n            pDevice->pulse.pMappedBufferCapture = NULL;\n            pDevice->pulse.mappedBufferFramesRemainingCapture = 0;\n            pDevice->pulse.mappedBufferFramesCapacityCapture = 0;\n        }\n\n        ma_assert(totalFramesRead <= frameCount);\n        if (totalFramesRead == frameCount) {\n            break;\n        }\n\n        /* Getting here means we need to map a new buffer. If we don't have enough data we wait for more. */\n        for (;;) {\n            size_t readableSizeInBytes;\n\n            if (ma_device__get_state(pDevice) != MA_STATE_STARTED) {\n                break;\n            }\n\n            /* If the device has been corked, don't try to continue. */\n            if (((ma_pa_stream_is_corked_proc)pDevice->pContext->pulse.pa_stream_is_corked)((ma_pa_stream*)pDevice->pulse.pStreamCapture)) {\n                break;\n            }\n\n            readableSizeInBytes = ((ma_pa_stream_readable_size_proc)pDevice->pContext->pulse.pa_stream_readable_size)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n            if (readableSizeInBytes != (size_t)-1) {\n                /*size_t periodSizeInBytes = (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods) * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);*/\n                if (readableSizeInBytes > 0) {\n                    /* Data is avaialable. */\n                    size_t bytesMapped = (size_t)-1;\n                    int error = ((ma_pa_stream_peek_proc)pDevice->pContext->pulse.pa_stream_peek)((ma_pa_stream*)pDevice->pulse.pStreamCapture, &pDevice->pulse.pMappedBufferCapture, &bytesMapped);\n                    if (error < 0) {\n                        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to peek capture buffer.\", ma_result_from_pulse(error));\n                    }\n\n                    if (pDevice->pulse.pMappedBufferCapture == NULL && bytesMapped == 0) {\n                        /* Nothing available. This shouldn't happen because we checked earlier with pa_stream_readable_size(). I'm going to throw an error in this case. */\n                        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Nothing available after peeking capture buffer.\", MA_ERROR);\n                    }\n\n                    pDevice->pulse.mappedBufferFramesCapacityCapture  = bytesMapped / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n                    pDevice->pulse.mappedBufferFramesRemainingCapture = pDevice->pulse.mappedBufferFramesCapacityCapture;\n\n                    break;\n                } else {\n                    /* No data available. Need to wait for more. */\n\n                    /*\n                    I have had reports of a deadlock in this part of the code. I have reproduced this when using the \"Built-in Audio Analogue Stereo\" device without\n                    an actual microphone connected. I'm experimenting here by not blocking in pa_mainloop_iterate() and instead sleep for a bit when there are no\n                    dispatches.\n                    */\n                    int error = ((ma_pa_mainloop_iterate_proc)pDevice->pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 0, NULL);\n                    if (error < 0) {\n                        return ma_result_from_pulse(error);\n                    }\n\n                    /* Sleep for a bit if nothing was dispatched. */\n                    if (error == 0) {\n                        ma_sleep(1);\n                    }\n\n                    continue;\n                }\n            } else {\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to query the stream's readable size.\", MA_ERROR);\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_context_uninit__pulse(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_pulseaudio);\n\n    ma_free(pContext->pulse.pServerName);\n    pContext->pulse.pServerName = NULL;\n\n    ma_free(pContext->pulse.pApplicationName);\n    pContext->pulse.pApplicationName = NULL;\n\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_dlclose(pContext, pContext->pulse.pulseSO);\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__pulse(const ma_context_config* pConfig, ma_context* pContext)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libpulseNames[] = {\n        \"libpulse.so\",\n        \"libpulse.so.0\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libpulseNames); ++i) {\n        pContext->pulse.pulseSO = ma_dlopen(pContext, libpulseNames[i]);\n        if (pContext->pulse.pulseSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->pulse.pulseSO == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->pulse.pa_mainloop_new                    = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_mainloop_new\");\n    pContext->pulse.pa_mainloop_free                   = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_mainloop_free\");\n    pContext->pulse.pa_mainloop_get_api                = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_mainloop_get_api\");\n    pContext->pulse.pa_mainloop_iterate                = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_mainloop_iterate\");\n    pContext->pulse.pa_mainloop_wakeup                 = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_mainloop_wakeup\");\n    pContext->pulse.pa_context_new                     = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_new\");\n    pContext->pulse.pa_context_unref                   = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_unref\");\n    pContext->pulse.pa_context_connect                 = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_connect\");\n    pContext->pulse.pa_context_disconnect              = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_disconnect\");\n    pContext->pulse.pa_context_set_state_callback      = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_set_state_callback\");\n    pContext->pulse.pa_context_get_state               = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_get_state\");\n    pContext->pulse.pa_context_get_sink_info_list      = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_get_sink_info_list\");\n    pContext->pulse.pa_context_get_source_info_list    = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_get_source_info_list\");\n    pContext->pulse.pa_context_get_sink_info_by_name   = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_get_sink_info_by_name\");\n    pContext->pulse.pa_context_get_source_info_by_name = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_context_get_source_info_by_name\");\n    pContext->pulse.pa_operation_unref                 = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_operation_unref\");\n    pContext->pulse.pa_operation_get_state             = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_operation_get_state\");\n    pContext->pulse.pa_channel_map_init_extend         = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_channel_map_init_extend\");\n    pContext->pulse.pa_channel_map_valid               = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_channel_map_valid\");\n    pContext->pulse.pa_channel_map_compatible          = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_channel_map_compatible\");\n    pContext->pulse.pa_stream_new                      = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_new\");\n    pContext->pulse.pa_stream_unref                    = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_unref\");\n    pContext->pulse.pa_stream_connect_playback         = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_connect_playback\");\n    pContext->pulse.pa_stream_connect_record           = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_connect_record\");\n    pContext->pulse.pa_stream_disconnect               = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_disconnect\");\n    pContext->pulse.pa_stream_get_state                = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_get_state\");\n    pContext->pulse.pa_stream_get_sample_spec          = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_get_sample_spec\");\n    pContext->pulse.pa_stream_get_channel_map          = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_get_channel_map\");\n    pContext->pulse.pa_stream_get_buffer_attr          = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_get_buffer_attr\");\n    pContext->pulse.pa_stream_set_buffer_attr          = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_set_buffer_attr\");\n    pContext->pulse.pa_stream_get_device_name          = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_get_device_name\");\n    pContext->pulse.pa_stream_set_write_callback       = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_set_write_callback\");\n    pContext->pulse.pa_stream_set_read_callback        = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_set_read_callback\");\n    pContext->pulse.pa_stream_flush                    = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_flush\");\n    pContext->pulse.pa_stream_drain                    = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_drain\");\n    pContext->pulse.pa_stream_is_corked                = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_is_corked\");\n    pContext->pulse.pa_stream_cork                     = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_cork\");\n    pContext->pulse.pa_stream_trigger                  = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_trigger\");\n    pContext->pulse.pa_stream_begin_write              = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_begin_write\");\n    pContext->pulse.pa_stream_write                    = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_write\");\n    pContext->pulse.pa_stream_peek                     = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_peek\");\n    pContext->pulse.pa_stream_drop                     = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_drop\");\n    pContext->pulse.pa_stream_writable_size            = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_writable_size\");\n    pContext->pulse.pa_stream_readable_size            = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, \"pa_stream_readable_size\");\n#else\n    /* This strange assignment system is just for type safety. */\n    ma_pa_mainloop_new_proc                    _pa_mainloop_new                   = pa_mainloop_new;\n    ma_pa_mainloop_free_proc                   _pa_mainloop_free                  = pa_mainloop_free;\n    ma_pa_mainloop_get_api_proc                _pa_mainloop_get_api               = pa_mainloop_get_api;\n    ma_pa_mainloop_iterate_proc                _pa_mainloop_iterate               = pa_mainloop_iterate;\n    ma_pa_mainloop_wakeup_proc                 _pa_mainloop_wakeup                = pa_mainloop_wakeup;\n    ma_pa_context_new_proc                     _pa_context_new                    = pa_context_new;\n    ma_pa_context_unref_proc                   _pa_context_unref                  = pa_context_unref;\n    ma_pa_context_connect_proc                 _pa_context_connect                = pa_context_connect;\n    ma_pa_context_disconnect_proc              _pa_context_disconnect             = pa_context_disconnect;\n    ma_pa_context_set_state_callback_proc      _pa_context_set_state_callback     = pa_context_set_state_callback;\n    ma_pa_context_get_state_proc               _pa_context_get_state              = pa_context_get_state;\n    ma_pa_context_get_sink_info_list_proc      _pa_context_get_sink_info_list     = pa_context_get_sink_info_list;\n    ma_pa_context_get_source_info_list_proc    _pa_context_get_source_info_list   = pa_context_get_source_info_list;\n    ma_pa_context_get_sink_info_by_name_proc   _pa_context_get_sink_info_by_name  = pa_context_get_sink_info_by_name;\n    ma_pa_context_get_source_info_by_name_proc _pa_context_get_source_info_by_name= pa_context_get_source_info_by_name;\n    ma_pa_operation_unref_proc                 _pa_operation_unref                = pa_operation_unref;\n    ma_pa_operation_get_state_proc             _pa_operation_get_state            = pa_operation_get_state;\n    ma_pa_channel_map_init_extend_proc         _pa_channel_map_init_extend        = pa_channel_map_init_extend;\n    ma_pa_channel_map_valid_proc               _pa_channel_map_valid              = pa_channel_map_valid;\n    ma_pa_channel_map_compatible_proc          _pa_channel_map_compatible         = pa_channel_map_compatible;\n    ma_pa_stream_new_proc                      _pa_stream_new                     = pa_stream_new;\n    ma_pa_stream_unref_proc                    _pa_stream_unref                   = pa_stream_unref;\n    ma_pa_stream_connect_playback_proc         _pa_stream_connect_playback        = pa_stream_connect_playback;\n    ma_pa_stream_connect_record_proc           _pa_stream_connect_record          = pa_stream_connect_record;\n    ma_pa_stream_disconnect_proc               _pa_stream_disconnect              = pa_stream_disconnect;\n    ma_pa_stream_get_state_proc                _pa_stream_get_state               = pa_stream_get_state;\n    ma_pa_stream_get_sample_spec_proc          _pa_stream_get_sample_spec         = pa_stream_get_sample_spec;\n    ma_pa_stream_get_channel_map_proc          _pa_stream_get_channel_map         = pa_stream_get_channel_map;\n    ma_pa_stream_get_buffer_attr_proc          _pa_stream_get_buffer_attr         = pa_stream_get_buffer_attr;\n    ma_pa_stream_set_buffer_attr_proc          _pa_stream_set_buffer_attr         = pa_stream_set_buffer_attr;\n    ma_pa_stream_get_device_name_proc          _pa_stream_get_device_name         = pa_stream_get_device_name;\n    ma_pa_stream_set_write_callback_proc       _pa_stream_set_write_callback      = pa_stream_set_write_callback;\n    ma_pa_stream_set_read_callback_proc        _pa_stream_set_read_callback       = pa_stream_set_read_callback;\n    ma_pa_stream_flush_proc                    _pa_stream_flush                   = pa_stream_flush;\n    ma_pa_stream_drain_proc                    _pa_stream_drain                   = pa_stream_drain;\n    ma_pa_stream_is_corked_proc                _pa_stream_is_corked               = pa_stream_is_corked;\n    ma_pa_stream_cork_proc                     _pa_stream_cork                    = pa_stream_cork;\n    ma_pa_stream_trigger_proc                  _pa_stream_trigger                 = pa_stream_trigger;\n    ma_pa_stream_begin_write_proc              _pa_stream_begin_write             = pa_stream_begin_write;\n    ma_pa_stream_write_proc                    _pa_stream_write                   = pa_stream_write;\n    ma_pa_stream_peek_proc                     _pa_stream_peek                    = pa_stream_peek;\n    ma_pa_stream_drop_proc                     _pa_stream_drop                    = pa_stream_drop;\n    ma_pa_stream_writable_size_proc            _pa_stream_writable_size           = pa_stream_writable_size;\n    ma_pa_stream_readable_size_proc            _pa_stream_readable_size           = pa_stream_readable_size;\n\n    pContext->pulse.pa_mainloop_new                    = (ma_proc)_pa_mainloop_new;\n    pContext->pulse.pa_mainloop_free                   = (ma_proc)_pa_mainloop_free;\n    pContext->pulse.pa_mainloop_get_api                = (ma_proc)_pa_mainloop_get_api;\n    pContext->pulse.pa_mainloop_iterate                = (ma_proc)_pa_mainloop_iterate;\n    pContext->pulse.pa_mainloop_wakeup                 = (ma_proc)_pa_mainloop_wakeup;\n    pContext->pulse.pa_context_new                     = (ma_proc)_pa_context_new;\n    pContext->pulse.pa_context_unref                   = (ma_proc)_pa_context_unref;\n    pContext->pulse.pa_context_connect                 = (ma_proc)_pa_context_connect;\n    pContext->pulse.pa_context_disconnect              = (ma_proc)_pa_context_disconnect;\n    pContext->pulse.pa_context_set_state_callback      = (ma_proc)_pa_context_set_state_callback;\n    pContext->pulse.pa_context_get_state               = (ma_proc)_pa_context_get_state;\n    pContext->pulse.pa_context_get_sink_info_list      = (ma_proc)_pa_context_get_sink_info_list;\n    pContext->pulse.pa_context_get_source_info_list    = (ma_proc)_pa_context_get_source_info_list;\n    pContext->pulse.pa_context_get_sink_info_by_name   = (ma_proc)_pa_context_get_sink_info_by_name;\n    pContext->pulse.pa_context_get_source_info_by_name = (ma_proc)_pa_context_get_source_info_by_name;\n    pContext->pulse.pa_operation_unref                 = (ma_proc)_pa_operation_unref;\n    pContext->pulse.pa_operation_get_state             = (ma_proc)_pa_operation_get_state;\n    pContext->pulse.pa_channel_map_init_extend         = (ma_proc)_pa_channel_map_init_extend;\n    pContext->pulse.pa_channel_map_valid               = (ma_proc)_pa_channel_map_valid;\n    pContext->pulse.pa_channel_map_compatible          = (ma_proc)_pa_channel_map_compatible;\n    pContext->pulse.pa_stream_new                      = (ma_proc)_pa_stream_new;\n    pContext->pulse.pa_stream_unref                    = (ma_proc)_pa_stream_unref;\n    pContext->pulse.pa_stream_connect_playback         = (ma_proc)_pa_stream_connect_playback;\n    pContext->pulse.pa_stream_connect_record           = (ma_proc)_pa_stream_connect_record;\n    pContext->pulse.pa_stream_disconnect               = (ma_proc)_pa_stream_disconnect;\n    pContext->pulse.pa_stream_get_state                = (ma_proc)_pa_stream_get_state;\n    pContext->pulse.pa_stream_get_sample_spec          = (ma_proc)_pa_stream_get_sample_spec;\n    pContext->pulse.pa_stream_get_channel_map          = (ma_proc)_pa_stream_get_channel_map;\n    pContext->pulse.pa_stream_get_buffer_attr          = (ma_proc)_pa_stream_get_buffer_attr;\n    pContext->pulse.pa_stream_set_buffer_attr          = (ma_proc)_pa_stream_set_buffer_attr;\n    pContext->pulse.pa_stream_get_device_name          = (ma_proc)_pa_stream_get_device_name;\n    pContext->pulse.pa_stream_set_write_callback       = (ma_proc)_pa_stream_set_write_callback;\n    pContext->pulse.pa_stream_set_read_callback        = (ma_proc)_pa_stream_set_read_callback;\n    pContext->pulse.pa_stream_flush                    = (ma_proc)_pa_stream_flush;\n    pContext->pulse.pa_stream_drain                    = (ma_proc)_pa_stream_drain;\n    pContext->pulse.pa_stream_is_corked                = (ma_proc)_pa_stream_is_corked;\n    pContext->pulse.pa_stream_cork                     = (ma_proc)_pa_stream_cork;\n    pContext->pulse.pa_stream_trigger                  = (ma_proc)_pa_stream_trigger;\n    pContext->pulse.pa_stream_begin_write              = (ma_proc)_pa_stream_begin_write;\n    pContext->pulse.pa_stream_write                    = (ma_proc)_pa_stream_write;\n    pContext->pulse.pa_stream_peek                     = (ma_proc)_pa_stream_peek;\n    pContext->pulse.pa_stream_drop                     = (ma_proc)_pa_stream_drop;\n    pContext->pulse.pa_stream_writable_size            = (ma_proc)_pa_stream_writable_size;\n    pContext->pulse.pa_stream_readable_size            = (ma_proc)_pa_stream_readable_size;\n#endif\n\n    pContext->onUninit         = ma_context_uninit__pulse;\n    pContext->onDeviceIDEqual  = ma_context_is_device_id_equal__pulse;\n    pContext->onEnumDevices    = ma_context_enumerate_devices__pulse;\n    pContext->onGetDeviceInfo  = ma_context_get_device_info__pulse;\n    pContext->onDeviceInit     = ma_device_init__pulse;\n    pContext->onDeviceUninit   = ma_device_uninit__pulse;\n    pContext->onDeviceStart    = NULL;\n    pContext->onDeviceStop     = ma_device_stop__pulse;\n    pContext->onDeviceWrite    = ma_device_write__pulse;\n    pContext->onDeviceRead     = ma_device_read__pulse;\n\n    if (pConfig->pulse.pApplicationName) {\n        pContext->pulse.pApplicationName = ma_copy_string(pConfig->pulse.pApplicationName);\n    }\n    if (pConfig->pulse.pServerName) {\n        pContext->pulse.pServerName = ma_copy_string(pConfig->pulse.pServerName);\n    }\n    pContext->pulse.tryAutoSpawn = pConfig->pulse.tryAutoSpawn;\n    \n    /*\n    Although we have found the libpulse library, it doesn't necessarily mean PulseAudio is useable. We need to initialize\n    and connect a dummy PulseAudio context to test PulseAudio's usability.\n    */\n    {\n        ma_pa_mainloop* pMainLoop;\n        ma_pa_mainloop_api* pAPI;\n        ma_pa_context* pPulseContext;\n        int error;\n\n        pMainLoop = ((ma_pa_mainloop_new_proc)pContext->pulse.pa_mainloop_new)();\n        if (pMainLoop == NULL) {\n            ma_free(pContext->pulse.pServerName);\n            ma_free(pContext->pulse.pApplicationName);\n        #ifndef MA_NO_RUNTIME_LINKING\n            ma_dlclose(pContext, pContext->pulse.pulseSO);\n        #endif\n            return MA_NO_BACKEND;\n        }\n\n        pAPI = ((ma_pa_mainloop_get_api_proc)pContext->pulse.pa_mainloop_get_api)(pMainLoop);\n        if (pAPI == NULL) {\n            ma_free(pContext->pulse.pServerName);\n            ma_free(pContext->pulse.pApplicationName);\n            ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        #ifndef MA_NO_RUNTIME_LINKING\n            ma_dlclose(pContext, pContext->pulse.pulseSO);\n        #endif\n            return MA_NO_BACKEND;\n        }\n\n        pPulseContext = ((ma_pa_context_new_proc)pContext->pulse.pa_context_new)(pAPI, pContext->pulse.pApplicationName);\n        if (pPulseContext == NULL) {\n            ma_free(pContext->pulse.pServerName);\n            ma_free(pContext->pulse.pApplicationName);\n            ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        #ifndef MA_NO_RUNTIME_LINKING\n            ma_dlclose(pContext, pContext->pulse.pulseSO);\n        #endif\n            return MA_NO_BACKEND;\n        }\n\n        error = ((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)(pPulseContext, pContext->pulse.pServerName, 0, NULL);\n        if (error != MA_PA_OK) {\n            ma_free(pContext->pulse.pServerName);\n            ma_free(pContext->pulse.pApplicationName);\n            ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)(pPulseContext);\n            ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n        #ifndef MA_NO_RUNTIME_LINKING\n            ma_dlclose(pContext, pContext->pulse.pulseSO);\n        #endif\n            return MA_NO_BACKEND;\n        }\n\n        ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)(pPulseContext);\n        ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)(pPulseContext);\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)(pMainLoop);\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n/******************************************************************************\n\nJACK Backend\n\n******************************************************************************/\n#ifdef MA_HAS_JACK\n\n/* It is assumed jack.h is available when compile-time linking is being used. */\n#ifdef MA_NO_RUNTIME_LINKING\n#include <jack/jack.h>\n\ntypedef jack_nframes_t              ma_jack_nframes_t;\ntypedef jack_options_t              ma_jack_options_t;\ntypedef jack_status_t               ma_jack_status_t;\ntypedef jack_client_t               ma_jack_client_t;\ntypedef jack_port_t                 ma_jack_port_t;\ntypedef JackProcessCallback         ma_JackProcessCallback;\ntypedef JackBufferSizeCallback      ma_JackBufferSizeCallback;\ntypedef JackShutdownCallback        ma_JackShutdownCallback;\n#define MA_JACK_DEFAULT_AUDIO_TYPE  JACK_DEFAULT_AUDIO_TYPE\n#define ma_JackNoStartServer        JackNoStartServer\n#define ma_JackPortIsInput          JackPortIsInput\n#define ma_JackPortIsOutput         JackPortIsOutput\n#define ma_JackPortIsPhysical       JackPortIsPhysical\n#else\ntypedef ma_uint32               ma_jack_nframes_t;\ntypedef int                     ma_jack_options_t;\ntypedef int                     ma_jack_status_t;\ntypedef struct ma_jack_client_t ma_jack_client_t;\ntypedef struct ma_jack_port_t   ma_jack_port_t;\ntypedef int  (* ma_JackProcessCallback)   (ma_jack_nframes_t nframes, void* arg);\ntypedef int  (* ma_JackBufferSizeCallback)(ma_jack_nframes_t nframes, void* arg);\ntypedef void (* ma_JackShutdownCallback)  (void* arg);\n#define MA_JACK_DEFAULT_AUDIO_TYPE \"32 bit float mono audio\"\n#define ma_JackNoStartServer       1\n#define ma_JackPortIsInput         1\n#define ma_JackPortIsOutput        2\n#define ma_JackPortIsPhysical      4\n#endif\n\ntypedef ma_jack_client_t* (* ma_jack_client_open_proc)             (const char* client_name, ma_jack_options_t options, ma_jack_status_t* status, ...);\ntypedef int               (* ma_jack_client_close_proc)            (ma_jack_client_t* client);\ntypedef int               (* ma_jack_client_name_size_proc)        ();\ntypedef int               (* ma_jack_set_process_callback_proc)    (ma_jack_client_t* client, ma_JackProcessCallback process_callback, void* arg);\ntypedef int               (* ma_jack_set_buffer_size_callback_proc)(ma_jack_client_t* client, ma_JackBufferSizeCallback bufsize_callback, void* arg);\ntypedef void              (* ma_jack_on_shutdown_proc)             (ma_jack_client_t* client, ma_JackShutdownCallback function, void* arg);\ntypedef ma_jack_nframes_t (* ma_jack_get_sample_rate_proc)         (ma_jack_client_t* client);\ntypedef ma_jack_nframes_t (* ma_jack_get_buffer_size_proc)         (ma_jack_client_t* client);\ntypedef const char**      (* ma_jack_get_ports_proc)               (ma_jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags);\ntypedef int               (* ma_jack_activate_proc)                (ma_jack_client_t* client);\ntypedef int               (* ma_jack_deactivate_proc)              (ma_jack_client_t* client);\ntypedef int               (* ma_jack_connect_proc)                 (ma_jack_client_t* client, const char* source_port, const char* destination_port);\ntypedef ma_jack_port_t*   (* ma_jack_port_register_proc)           (ma_jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);\ntypedef const char*       (* ma_jack_port_name_proc)               (const ma_jack_port_t* port);\ntypedef void*             (* ma_jack_port_get_buffer_proc)         (ma_jack_port_t* port, ma_jack_nframes_t nframes);\ntypedef void              (* ma_jack_free_proc)                    (void* ptr);\n\nma_result ma_context_open_client__jack(ma_context* pContext, ma_jack_client_t** ppClient)\n{\n    size_t maxClientNameSize;\n    char clientName[256];\n    ma_jack_status_t status;\n    ma_jack_client_t* pClient;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppClient != NULL);\n\n    if (ppClient) {\n        *ppClient = NULL;\n    }\n\n    maxClientNameSize = ((ma_jack_client_name_size_proc)pContext->jack.jack_client_name_size)(); /* Includes null terminator. */\n    ma_strncpy_s(clientName, ma_min(sizeof(clientName), maxClientNameSize), (pContext->jack.pClientName != NULL) ? pContext->jack.pClientName : \"miniaudio\", (size_t)-1);\n\n    pClient = ((ma_jack_client_open_proc)pContext->jack.jack_client_open)(clientName, (pContext->jack.tryStartServer) ? 0 : ma_JackNoStartServer, &status, NULL);\n    if (pClient == NULL) {\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    if (ppClient) {\n        *ppClient = pClient;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_bool32 ma_context_is_device_id_equal__jack(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return pID0->jack == pID1->jack;\n}\n\nma_result ma_context_enumerate_devices__jack(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__jack(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_jack_client_t* pClient;\n    ma_result result;\n    const char** ppPorts;\n\n    ma_assert(pContext != NULL);\n\n    /* No exclusive mode with the JACK backend. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if (pDeviceID != NULL && pDeviceID->jack != 0) {\n        return MA_NO_DEVICE;   /* Don't know the device. */\n    }\n\n    /* Name / Description */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    /* Jack only supports f32 and has a specific channel count and sample rate. */\n    pDeviceInfo->formatCount = 1;\n    pDeviceInfo->formats[0] = ma_format_f32;\n\n    /* The channel count and sample rate can only be determined by opening the device. */\n    result = ma_context_open_client__jack(pContext, &pClient);\n    if (result != MA_SUCCESS) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to open client.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    pDeviceInfo->minSampleRate = ((ma_jack_get_sample_rate_proc)pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pClient);\n    pDeviceInfo->maxSampleRate = pDeviceInfo->minSampleRate;\n\n    pDeviceInfo->minChannels = 0;\n    pDeviceInfo->maxChannels = 0;\n\n    ppPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pClient, NULL, NULL, ma_JackPortIsPhysical | ((deviceType == ma_device_type_playback) ? ma_JackPortIsInput : ma_JackPortIsOutput));\n    if (ppPorts == NULL) {\n        ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pClient);\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to query physical ports.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    while (ppPorts[pDeviceInfo->minChannels] != NULL) {\n        pDeviceInfo->minChannels += 1;\n        pDeviceInfo->maxChannels += 1;\n    }\n\n    ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts);\n    ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pClient);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\n\nvoid ma_device_uninit__jack(ma_device* pDevice)\n{\n    ma_context* pContext;\n\n    ma_assert(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    ma_assert(pContext != NULL);\n\n    if (pDevice->jack.pClient != NULL) {\n        ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pDevice->jack.pClient);\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_free(pDevice->jack.pIntermediaryBufferCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_free(pDevice->jack.pIntermediaryBufferPlayback);\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_pcm_rb_uninit(&pDevice->jack.duplexRB);\n    }\n}\n\nvoid ma_device__jack_shutdown_callback(void* pUserData)\n{\n    /* JACK died. Stop the device. */\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    ma_device_stop(pDevice);\n}\n\nint ma_device__jack_buffer_size_callback(ma_jack_nframes_t frameCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        float* pNewBuffer = (float*)ma_realloc(pDevice->jack.pIntermediaryBufferCapture, frameCount * (pDevice->capture.internalChannels * ma_get_bytes_per_sample(pDevice->capture.internalFormat)));\n        if (pNewBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pDevice->jack.pIntermediaryBufferCapture = pNewBuffer;\n        pDevice->playback.internalBufferSizeInFrames = frameCount * pDevice->capture.internalPeriods;\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        float* pNewBuffer = (float*)ma_realloc(pDevice->jack.pIntermediaryBufferPlayback, frameCount * (pDevice->playback.internalChannels * ma_get_bytes_per_sample(pDevice->playback.internalFormat)));\n        if (pNewBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pDevice->jack.pIntermediaryBufferPlayback = pNewBuffer;\n        pDevice->playback.internalBufferSizeInFrames = frameCount * pDevice->playback.internalPeriods;\n    }\n\n    return 0;\n}\n\nint ma_device__jack_process_callback(ma_jack_nframes_t frameCount, void* pUserData)\n{\n    ma_device* pDevice;\n    ma_context* pContext;\n    ma_uint32 iChannel;\n\n    pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    ma_assert(pContext != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        /* Channels need to be interleaved. */\n        for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) {\n            const float* pSrc = (const float*)((ma_jack_port_get_buffer_proc)pContext->jack.jack_port_get_buffer)((ma_jack_port_t*)pDevice->jack.pPortsCapture[iChannel], frameCount);\n            if (pSrc != NULL) {\n                float* pDst = pDevice->jack.pIntermediaryBufferCapture + iChannel;\n                ma_jack_nframes_t iFrame;\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    *pDst = *pSrc;\n\n                    pDst += pDevice->capture.internalChannels;\n                    pSrc += 1;\n                }\n            }\n        }\n\n        if (pDevice->type == ma_device_type_duplex) {\n            ma_device__handle_duplex_callback_capture(pDevice, frameCount, pDevice->jack.pIntermediaryBufferCapture, &pDevice->jack.duplexRB);\n        } else {\n            ma_device__send_frames_to_client(pDevice, frameCount, pDevice->jack.pIntermediaryBufferCapture);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->type == ma_device_type_duplex) {\n            ma_device__handle_duplex_callback_playback(pDevice, frameCount, pDevice->jack.pIntermediaryBufferPlayback, &pDevice->jack.duplexRB);\n        } else {\n            ma_device__read_frames_from_client(pDevice, frameCount, pDevice->jack.pIntermediaryBufferPlayback);\n        }\n\n        /* Channels need to be deinterleaved. */\n        for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) {\n            float* pDst = (float*)((ma_jack_port_get_buffer_proc)pContext->jack.jack_port_get_buffer)((ma_jack_port_t*)pDevice->jack.pPortsPlayback[iChannel], frameCount);\n            if (pDst != NULL) {\n                const float* pSrc = pDevice->jack.pIntermediaryBufferPlayback + iChannel;\n                ma_jack_nframes_t iFrame;\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    *pDst = *pSrc;\n\n                    pDst += 1;\n                    pSrc += pDevice->playback.internalChannels;\n                }\n            }\n        }\n    }\n\n    return 0;\n}\n\nma_result ma_device_init__jack(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_uint32 periods;\n    ma_uint32 bufferSizeInFrames;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pConfig != NULL);\n    ma_assert(pDevice != NULL);\n\n    /* Only supporting default devices with JACK. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.pDeviceID != NULL && pConfig->playback.pDeviceID->jack != 0) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.pDeviceID  != NULL && pConfig->capture.pDeviceID->jack  != 0)) {\n        return MA_NO_DEVICE;\n    }\n\n    /* No exclusive mode with the JACK backend. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* Open the client. */\n    result = ma_context_open_client__jack(pContext, (ma_jack_client_t**)&pDevice->jack.pClient);\n    if (result != MA_SUCCESS) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to open client.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    /* Callbacks. */\n    if (((ma_jack_set_process_callback_proc)pContext->jack.jack_set_process_callback)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_process_callback, pDevice) != 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to set process callback.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n    if (((ma_jack_set_buffer_size_callback_proc)pContext->jack.jack_set_buffer_size_callback)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_buffer_size_callback, pDevice) != 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to set buffer size callback.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    ((ma_jack_on_shutdown_proc)pContext->jack.jack_on_shutdown)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_shutdown_callback, pDevice);\n\n\n    /* The buffer size in frames can change. */\n    periods            = 2;\n    bufferSizeInFrames = ((ma_jack_get_buffer_size_proc)pContext->jack.jack_get_buffer_size)((ma_jack_client_t*)pDevice->jack.pClient) * periods;\n    \n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        const char** ppPorts;\n\n        pDevice->capture.internalFormat = ma_format_f32;\n        pDevice->capture.internalChannels = 0;\n        pDevice->capture.internalSampleRate = ((ma_jack_get_sample_rate_proc)pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pDevice->jack.pClient);\n        ma_get_standard_channel_map(ma_standard_channel_map_alsa, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n\n        ppPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, NULL, ma_JackPortIsPhysical | ma_JackPortIsOutput);\n        if (ppPorts == NULL) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to query physical ports.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        while (ppPorts[pDevice->capture.internalChannels] != NULL) {\n            char name[64];\n            ma_strcpy_s(name, sizeof(name), \"capture\");\n            ma_itoa_s((int)pDevice->capture.internalChannels, name+7, sizeof(name)-7, 10); /* 7 = length of \"capture\" */\n\n            pDevice->jack.pPortsCapture[pDevice->capture.internalChannels] = ((ma_jack_port_register_proc)pContext->jack.jack_port_register)((ma_jack_client_t*)pDevice->jack.pClient, name, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsInput, 0);\n            if (pDevice->jack.pPortsCapture[pDevice->capture.internalChannels] == NULL) {\n                ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts);\n                ma_device_uninit__jack(pDevice);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to register ports.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n            }\n\n            pDevice->capture.internalChannels += 1;\n        }\n\n        ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts);\n\n        pDevice->capture.internalBufferSizeInFrames = bufferSizeInFrames;\n        pDevice->capture.internalPeriods            = periods;\n\n        pDevice->jack.pIntermediaryBufferCapture = (float*)ma_malloc((pDevice->capture.internalBufferSizeInFrames/pDevice->capture.internalPeriods) * (pDevice->capture.internalChannels * ma_get_bytes_per_sample(pDevice->capture.internalFormat)));\n        if (pDevice->jack.pIntermediaryBufferCapture == NULL) {\n            ma_device_uninit__jack(pDevice);\n            return MA_OUT_OF_MEMORY;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        const char** ppPorts;\n\n        pDevice->playback.internalFormat = ma_format_f32;\n        pDevice->playback.internalChannels = 0;\n        pDevice->playback.internalSampleRate = ((ma_jack_get_sample_rate_proc)pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pDevice->jack.pClient);\n        ma_get_standard_channel_map(ma_standard_channel_map_alsa, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n\n        ppPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, NULL, ma_JackPortIsPhysical | ma_JackPortIsInput);\n        if (ppPorts == NULL) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to query physical ports.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        while (ppPorts[pDevice->playback.internalChannels] != NULL) {\n            char name[64];\n            ma_strcpy_s(name, sizeof(name), \"playback\");\n            ma_itoa_s((int)pDevice->playback.internalChannels, name+8, sizeof(name)-8, 10); /* 8 = length of \"playback\" */\n\n            pDevice->jack.pPortsPlayback[pDevice->playback.internalChannels] = ((ma_jack_port_register_proc)pContext->jack.jack_port_register)((ma_jack_client_t*)pDevice->jack.pClient, name, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsOutput, 0);\n            if (pDevice->jack.pPortsPlayback[pDevice->playback.internalChannels] == NULL) {\n                ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts);\n                ma_device_uninit__jack(pDevice);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to register ports.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n            }\n\n            pDevice->playback.internalChannels += 1;\n        }\n\n        ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts);\n\n        pDevice->playback.internalBufferSizeInFrames = bufferSizeInFrames;\n        pDevice->playback.internalPeriods            = periods;\n\n        pDevice->jack.pIntermediaryBufferPlayback = (float*)ma_malloc((pDevice->playback.internalBufferSizeInFrames/pDevice->playback.internalPeriods) * (pDevice->playback.internalChannels * ma_get_bytes_per_sample(pDevice->playback.internalFormat)));\n        if (pDevice->jack.pIntermediaryBufferPlayback == NULL) {\n            ma_device_uninit__jack(pDevice);\n            return MA_OUT_OF_MEMORY;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_uint32 rbSizeInFrames = (ma_uint32)ma_calculate_frame_count_after_src(pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalBufferSizeInFrames);\n        result = ma_pcm_rb_init(pDevice->capture.format, pDevice->capture.channels, rbSizeInFrames, NULL, &pDevice->jack.duplexRB);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__jack(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to initialize ring buffer.\", result);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_device_start__jack(ma_device* pDevice)\n{\n    ma_context* pContext = pDevice->pContext;\n    int resultJACK;\n    size_t i;\n\n    resultJACK = ((ma_jack_activate_proc)pContext->jack.jack_activate)((ma_jack_client_t*)pDevice->jack.pClient);\n    if (resultJACK != 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to activate the JACK client.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        const char** ppServerPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, NULL, ma_JackPortIsPhysical | ma_JackPortIsOutput);\n        if (ppServerPorts == NULL) {\n            ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to retrieve physical ports.\", MA_ERROR);\n        }\n\n        for (i = 0; ppServerPorts[i] != NULL; ++i) {\n            const char* pServerPort = ppServerPorts[i];\n            const char* pClientPort = ((ma_jack_port_name_proc)pContext->jack.jack_port_name)((ma_jack_port_t*)pDevice->jack.pPortsCapture[i]);\n\n            resultJACK = ((ma_jack_connect_proc)pContext->jack.jack_connect)((ma_jack_client_t*)pDevice->jack.pClient, pServerPort, pClientPort);\n            if (resultJACK != 0) {\n                ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n                ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to connect ports.\", MA_ERROR);\n            }\n        }\n\n        ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n    }\n    \n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        const char** ppServerPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, NULL, ma_JackPortIsPhysical | ma_JackPortIsInput);\n        if (ppServerPorts == NULL) {\n            ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to retrieve physical ports.\", MA_ERROR);\n        }\n\n        for (i = 0; ppServerPorts[i] != NULL; ++i) {\n            const char* pServerPort = ppServerPorts[i];\n            const char* pClientPort = ((ma_jack_port_name_proc)pContext->jack.jack_port_name)((ma_jack_port_t*)pDevice->jack.pPortsPlayback[i]);\n\n            resultJACK = ((ma_jack_connect_proc)pContext->jack.jack_connect)((ma_jack_client_t*)pDevice->jack.pClient, pClientPort, pServerPort);\n            if (resultJACK != 0) {\n                ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n                ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] Failed to connect ports.\", MA_ERROR);\n            }\n        }\n\n        ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__jack(ma_device* pDevice)\n{\n    ma_context* pContext = pDevice->pContext;\n    ma_stop_proc onStop;\n\n    if (((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient) != 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[JACK] An error occurred when deactivating the JACK client.\", MA_ERROR);\n    }\n    \n    onStop = pDevice->onStop;\n    if (onStop) {\n        onStop(pDevice);\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_context_uninit__jack(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_jack);\n\n    ma_free(pContext->jack.pClientName);\n    pContext->jack.pClientName = NULL;\n\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_dlclose(pContext, pContext->jack.jackSO);\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__jack(const ma_context_config* pConfig, ma_context* pContext)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libjackNames[] = {\n#ifdef MA_WIN32\n        \"libjack.dll\"\n#else\n        \"libjack.so\",\n        \"libjack.so.0\"\n#endif\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libjackNames); ++i) {\n        pContext->jack.jackSO = ma_dlopen(pContext, libjackNames[i]);\n        if (pContext->jack.jackSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->jack.jackSO == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->jack.jack_client_open              = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_client_open\");\n    pContext->jack.jack_client_close             = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_client_close\");\n    pContext->jack.jack_client_name_size         = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_client_name_size\");\n    pContext->jack.jack_set_process_callback     = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_set_process_callback\");\n    pContext->jack.jack_set_buffer_size_callback = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_set_buffer_size_callback\");\n    pContext->jack.jack_on_shutdown              = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_on_shutdown\");\n    pContext->jack.jack_get_sample_rate          = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_get_sample_rate\");\n    pContext->jack.jack_get_buffer_size          = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_get_buffer_size\");\n    pContext->jack.jack_get_ports                = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_get_ports\");\n    pContext->jack.jack_activate                 = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_activate\");\n    pContext->jack.jack_deactivate               = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_deactivate\");\n    pContext->jack.jack_connect                  = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_connect\");\n    pContext->jack.jack_port_register            = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_port_register\");\n    pContext->jack.jack_port_name                = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_port_name\");\n    pContext->jack.jack_port_get_buffer          = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_port_get_buffer\");\n    pContext->jack.jack_free                     = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, \"jack_free\");\n#else\n    /*\n    This strange assignment system is here just to ensure type safety of miniaudio's function pointer\n    types. If anything differs slightly the compiler should throw a warning.\n    */\n    ma_jack_client_open_proc              _jack_client_open              = jack_client_open;\n    ma_jack_client_close_proc             _jack_client_close             = jack_client_close;\n    ma_jack_client_name_size_proc         _jack_client_name_size         = jack_client_name_size;\n    ma_jack_set_process_callback_proc     _jack_set_process_callback     = jack_set_process_callback;\n    ma_jack_set_buffer_size_callback_proc _jack_set_buffer_size_callback = jack_set_buffer_size_callback;\n    ma_jack_on_shutdown_proc              _jack_on_shutdown              = jack_on_shutdown;\n    ma_jack_get_sample_rate_proc          _jack_get_sample_rate          = jack_get_sample_rate;\n    ma_jack_get_buffer_size_proc          _jack_get_buffer_size          = jack_get_buffer_size;\n    ma_jack_get_ports_proc                _jack_get_ports                = jack_get_ports;\n    ma_jack_activate_proc                 _jack_activate                 = jack_activate;\n    ma_jack_deactivate_proc               _jack_deactivate               = jack_deactivate;\n    ma_jack_connect_proc                  _jack_connect                  = jack_connect;\n    ma_jack_port_register_proc            _jack_port_register            = jack_port_register;\n    ma_jack_port_name_proc                _jack_port_name                = jack_port_name;\n    ma_jack_port_get_buffer_proc          _jack_port_get_buffer          = jack_port_get_buffer;\n    ma_jack_free_proc                     _jack_free                     = jack_free;\n\n    pContext->jack.jack_client_open              = (ma_proc)_jack_client_open;\n    pContext->jack.jack_client_close             = (ma_proc)_jack_client_close;\n    pContext->jack.jack_client_name_size         = (ma_proc)_jack_client_name_size;\n    pContext->jack.jack_set_process_callback     = (ma_proc)_jack_set_process_callback;\n    pContext->jack.jack_set_buffer_size_callback = (ma_proc)_jack_set_buffer_size_callback;\n    pContext->jack.jack_on_shutdown              = (ma_proc)_jack_on_shutdown;\n    pContext->jack.jack_get_sample_rate          = (ma_proc)_jack_get_sample_rate;\n    pContext->jack.jack_get_buffer_size          = (ma_proc)_jack_get_buffer_size;\n    pContext->jack.jack_get_ports                = (ma_proc)_jack_get_ports;\n    pContext->jack.jack_activate                 = (ma_proc)_jack_activate;\n    pContext->jack.jack_deactivate               = (ma_proc)_jack_deactivate;\n    pContext->jack.jack_connect                  = (ma_proc)_jack_connect;\n    pContext->jack.jack_port_register            = (ma_proc)_jack_port_register;\n    pContext->jack.jack_port_name                = (ma_proc)_jack_port_name;\n    pContext->jack.jack_port_get_buffer          = (ma_proc)_jack_port_get_buffer;\n    pContext->jack.jack_free                     = (ma_proc)_jack_free;\n#endif\n\n    pContext->isBackendAsynchronous = MA_TRUE;\n\n    pContext->onUninit        = ma_context_uninit__jack;\n    pContext->onDeviceIDEqual = ma_context_is_device_id_equal__jack;\n    pContext->onEnumDevices   = ma_context_enumerate_devices__jack;\n    pContext->onGetDeviceInfo = ma_context_get_device_info__jack;\n    pContext->onDeviceInit    = ma_device_init__jack;\n    pContext->onDeviceUninit  = ma_device_uninit__jack;\n    pContext->onDeviceStart   = ma_device_start__jack;\n    pContext->onDeviceStop    = ma_device_stop__jack;\n\n    if (pConfig->jack.pClientName != NULL) {\n        pContext->jack.pClientName = ma_copy_string(pConfig->jack.pClientName);\n    }\n    pContext->jack.tryStartServer = pConfig->jack.tryStartServer;\n\n    /*\n    Getting here means the JACK library is installed, but it doesn't necessarily mean it's usable. We need to quickly test this by connecting\n    a temporary client.\n    */\n    {\n        ma_jack_client_t* pDummyClient;\n        ma_result result = ma_context_open_client__jack(pContext, &pDummyClient);\n        if (result != MA_SUCCESS) {\n            ma_free(pContext->jack.pClientName);\n        #ifndef MA_NO_RUNTIME_LINKING\n            ma_dlclose(pContext, pContext->jack.jackSO);\n        #endif\n            return MA_NO_BACKEND;\n        }\n\n        ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pDummyClient);\n    }\n\n    return MA_SUCCESS;\n}\n#endif  /* JACK */\n\n\n\n/******************************************************************************\n\nCore Audio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_COREAUDIO\n#include <TargetConditionals.h>\n\n#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1\n    #define MA_APPLE_MOBILE\n#else\n    #define MA_APPLE_DESKTOP\n#endif\n\n#if defined(MA_APPLE_DESKTOP)\n#include <CoreAudio/CoreAudio.h>\n#else\n#include <AVFoundation/AVFoundation.h>\n#endif\n\n#include <AudioToolbox/AudioToolbox.h>\n\n/* CoreFoundation */\ntypedef Boolean (* ma_CFStringGetCString_proc)(CFStringRef theString, char* buffer, CFIndex bufferSize, CFStringEncoding encoding);\n\n/* CoreAudio */\n#if defined(MA_APPLE_DESKTOP)\ntypedef OSStatus (* ma_AudioObjectGetPropertyData_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* ioDataSize, void* outData);\ntypedef OSStatus (* ma_AudioObjectGetPropertyDataSize_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* outDataSize);\ntypedef OSStatus (* ma_AudioObjectSetPropertyData_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, const void* inData);\ntypedef OSStatus (* ma_AudioObjectAddPropertyListener_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData);\n#endif\n\n/* AudioToolbox */\ntypedef AudioComponent (* ma_AudioComponentFindNext_proc)(AudioComponent inComponent, const AudioComponentDescription* inDesc);\ntypedef OSStatus (* ma_AudioComponentInstanceDispose_proc)(AudioComponentInstance inInstance);\ntypedef OSStatus (* ma_AudioComponentInstanceNew_proc)(AudioComponent inComponent, AudioComponentInstance* outInstance);\ntypedef OSStatus (* ma_AudioOutputUnitStart_proc)(AudioUnit inUnit);\ntypedef OSStatus (* ma_AudioOutputUnitStop_proc)(AudioUnit inUnit);\ntypedef OSStatus (* ma_AudioUnitAddPropertyListener_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitPropertyListenerProc inProc, void* inProcUserData);\ntypedef OSStatus (* ma_AudioUnitGetPropertyInfo_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32* outDataSize, Boolean* outWriteable);\ntypedef OSStatus (* ma_AudioUnitGetProperty_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData, UInt32* ioDataSize);\ntypedef OSStatus (* ma_AudioUnitSetProperty_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize);\ntypedef OSStatus (* ma_AudioUnitInitialize_proc)(AudioUnit inUnit);\ntypedef OSStatus (* ma_AudioUnitRender_proc)(AudioUnit inUnit, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData);\n\n\n#define MA_COREAUDIO_OUTPUT_BUS    0\n#define MA_COREAUDIO_INPUT_BUS     1\n\nma_result ma_device_reinit_internal__coreaudio(ma_device* pDevice, ma_device_type deviceType, ma_bool32 disposePreviousAudioUnit);\n\n/*\nCore Audio\n\nSo far, Core Audio has been the worst backend to work with due to being both unintuitive and having almost no documentation\napart from comments in the headers (which admittedly are quite good). For my own purposes, and for anybody out there whose\nneeding to figure out how this darn thing works, I'm going to outline a few things here.\n\nSince miniaudio is a fairly low-level API, one of the things it needs is control over specific devices, and it needs to be\nable to identify whether or not it can be used as playback and/or capture. The AudioObject API is the only one I've seen\nthat supports this level of detail. There was some public domain sample code I stumbled across that used the AudioComponent\nand AudioUnit APIs, but I couldn't see anything that gave low-level control over device selection and capabilities (the\ndistinction between playback and capture in particular). Therefore, miniaudio is using the AudioObject API.\n\nMost (all?) functions in the AudioObject API take a AudioObjectID as it's input. This is the device identifier. When\nretrieving global information, such as the device list, you use kAudioObjectSystemObject. When retrieving device-specific\ndata, you pass in the ID for that device. In order to retrieve device-specific IDs you need to enumerate over each of the\ndevices. This is done using the AudioObjectGetPropertyDataSize() and AudioObjectGetPropertyData() APIs which seem to be\nthe central APIs for retrieving information about the system and specific devices.\n\nTo use the AudioObjectGetPropertyData() API you need to use the notion of a property address. A property address is a\nstructure with three variables and is used to identify which property you are getting or setting. The first is the \"selector\"\nwhich is basically the specific property that you're wanting to retrieve or set. The second is the \"scope\", which is\ntypically set to kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyScopeInput for input-specific properties and\nkAudioObjectPropertyScopeOutput for output-specific properties. The last is the \"element\" which is always set to\nkAudioObjectPropertyElementMaster in miniaudio's case. I don't know of any cases where this would be set to anything different.\n\nBack to the earlier issue of device retrieval, you first use the AudioObjectGetPropertyDataSize() API to retrieve the size\nof the raw data which is just a list of AudioDeviceID's. You use the kAudioObjectSystemObject AudioObjectID, and a property\naddress with the kAudioHardwarePropertyDevices selector and the kAudioObjectPropertyScopeGlobal scope. Once you have the\nsize, allocate a block of memory of that size and then call AudioObjectGetPropertyData(). The data is just a list of\nAudioDeviceID's so just do \"dataSize/sizeof(AudioDeviceID)\" to know the device count.\n*/\n\nma_result ma_result_from_OSStatus(OSStatus status)\n{\n    switch (status)\n    {\n        case noErr:                                   return MA_SUCCESS;\n    #if defined(MA_APPLE_DESKTOP)\n        case kAudioHardwareNotRunningError:           return MA_DEVICE_NOT_STARTED;\n        case kAudioHardwareUnspecifiedError:          return MA_ERROR;\n        case kAudioHardwareUnknownPropertyError:      return MA_INVALID_ARGS;\n        case kAudioHardwareBadPropertySizeError:      return MA_INVALID_OPERATION;\n        case kAudioHardwareIllegalOperationError:     return MA_INVALID_OPERATION;\n        case kAudioHardwareBadObjectError:            return MA_INVALID_ARGS;\n        case kAudioHardwareBadDeviceError:            return MA_INVALID_ARGS;\n        case kAudioHardwareBadStreamError:            return MA_INVALID_ARGS;\n        case kAudioHardwareUnsupportedOperationError: return MA_INVALID_OPERATION;\n        case kAudioDeviceUnsupportedFormatError:      return MA_FORMAT_NOT_SUPPORTED;\n        case kAudioDevicePermissionsError:            return MA_ACCESS_DENIED;\n    #endif\n        default:                                      return MA_ERROR;\n    }\n}\n\n#if 0\nma_channel ma_channel_from_AudioChannelBitmap(AudioChannelBitmap bit)\n{\n    switch (bit)\n    {\n        case kAudioChannelBit_Left:                 return MA_CHANNEL_LEFT;\n        case kAudioChannelBit_Right:                return MA_CHANNEL_RIGHT;\n        case kAudioChannelBit_Center:               return MA_CHANNEL_FRONT_CENTER;\n        case kAudioChannelBit_LFEScreen:            return MA_CHANNEL_LFE;\n        case kAudioChannelBit_LeftSurround:         return MA_CHANNEL_BACK_LEFT;\n        case kAudioChannelBit_RightSurround:        return MA_CHANNEL_BACK_RIGHT;\n        case kAudioChannelBit_LeftCenter:           return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case kAudioChannelBit_RightCenter:          return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case kAudioChannelBit_CenterSurround:       return MA_CHANNEL_BACK_CENTER;\n        case kAudioChannelBit_LeftSurroundDirect:   return MA_CHANNEL_SIDE_LEFT;\n        case kAudioChannelBit_RightSurroundDirect:  return MA_CHANNEL_SIDE_RIGHT;\n        case kAudioChannelBit_TopCenterSurround:    return MA_CHANNEL_TOP_CENTER;\n        case kAudioChannelBit_VerticalHeightLeft:   return MA_CHANNEL_TOP_FRONT_LEFT;\n        case kAudioChannelBit_VerticalHeightCenter: return MA_CHANNEL_TOP_FRONT_CENTER;\n        case kAudioChannelBit_VerticalHeightRight:  return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case kAudioChannelBit_TopBackLeft:          return MA_CHANNEL_TOP_BACK_LEFT;\n        case kAudioChannelBit_TopBackCenter:        return MA_CHANNEL_TOP_BACK_CENTER;\n        case kAudioChannelBit_TopBackRight:         return MA_CHANNEL_TOP_BACK_RIGHT;\n        default:                                    return MA_CHANNEL_NONE;\n    }\n}\n#endif\n\nma_channel ma_channel_from_AudioChannelLabel(AudioChannelLabel label)\n{\n    switch (label)\n    {\n        case kAudioChannelLabel_Unknown:              return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Unused:               return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_UseCoordinates:       return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Left:                 return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_Right:                return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_Center:               return MA_CHANNEL_FRONT_CENTER;\n        case kAudioChannelLabel_LFEScreen:            return MA_CHANNEL_LFE;\n        case kAudioChannelLabel_LeftSurround:         return MA_CHANNEL_BACK_LEFT;\n        case kAudioChannelLabel_RightSurround:        return MA_CHANNEL_BACK_RIGHT;\n        case kAudioChannelLabel_LeftCenter:           return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case kAudioChannelLabel_RightCenter:          return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case kAudioChannelLabel_CenterSurround:       return MA_CHANNEL_BACK_CENTER;\n        case kAudioChannelLabel_LeftSurroundDirect:   return MA_CHANNEL_SIDE_LEFT;\n        case kAudioChannelLabel_RightSurroundDirect:  return MA_CHANNEL_SIDE_RIGHT;\n        case kAudioChannelLabel_TopCenterSurround:    return MA_CHANNEL_TOP_CENTER;\n        case kAudioChannelLabel_VerticalHeightLeft:   return MA_CHANNEL_TOP_FRONT_LEFT;\n        case kAudioChannelLabel_VerticalHeightCenter: return MA_CHANNEL_TOP_FRONT_CENTER;\n        case kAudioChannelLabel_VerticalHeightRight:  return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case kAudioChannelLabel_TopBackLeft:          return MA_CHANNEL_TOP_BACK_LEFT;\n        case kAudioChannelLabel_TopBackCenter:        return MA_CHANNEL_TOP_BACK_CENTER;\n        case kAudioChannelLabel_TopBackRight:         return MA_CHANNEL_TOP_BACK_RIGHT;\n        case kAudioChannelLabel_RearSurroundLeft:     return MA_CHANNEL_BACK_LEFT;\n        case kAudioChannelLabel_RearSurroundRight:    return MA_CHANNEL_BACK_RIGHT;\n        case kAudioChannelLabel_LeftWide:             return MA_CHANNEL_SIDE_LEFT;\n        case kAudioChannelLabel_RightWide:            return MA_CHANNEL_SIDE_RIGHT;\n        case kAudioChannelLabel_LFE2:                 return MA_CHANNEL_LFE;\n        case kAudioChannelLabel_LeftTotal:            return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_RightTotal:           return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_HearingImpaired:      return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Narration:            return MA_CHANNEL_MONO;\n        case kAudioChannelLabel_Mono:                 return MA_CHANNEL_MONO;\n        case kAudioChannelLabel_DialogCentricMix:     return MA_CHANNEL_MONO;\n        case kAudioChannelLabel_CenterSurroundDirect: return MA_CHANNEL_BACK_CENTER;\n        case kAudioChannelLabel_Haptic:               return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_W:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_X:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_Y:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_Z:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_MS_Mid:               return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_MS_Side:              return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_XY_X:                 return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_XY_Y:                 return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_HeadphonesLeft:       return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_HeadphonesRight:      return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_ClickTrack:           return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_ForeignLanguage:      return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Discrete:             return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Discrete_0:           return MA_CHANNEL_AUX_0;\n        case kAudioChannelLabel_Discrete_1:           return MA_CHANNEL_AUX_1;\n        case kAudioChannelLabel_Discrete_2:           return MA_CHANNEL_AUX_2;\n        case kAudioChannelLabel_Discrete_3:           return MA_CHANNEL_AUX_3;\n        case kAudioChannelLabel_Discrete_4:           return MA_CHANNEL_AUX_4;\n        case kAudioChannelLabel_Discrete_5:           return MA_CHANNEL_AUX_5;\n        case kAudioChannelLabel_Discrete_6:           return MA_CHANNEL_AUX_6;\n        case kAudioChannelLabel_Discrete_7:           return MA_CHANNEL_AUX_7;\n        case kAudioChannelLabel_Discrete_8:           return MA_CHANNEL_AUX_8;\n        case kAudioChannelLabel_Discrete_9:           return MA_CHANNEL_AUX_9;\n        case kAudioChannelLabel_Discrete_10:          return MA_CHANNEL_AUX_10;\n        case kAudioChannelLabel_Discrete_11:          return MA_CHANNEL_AUX_11;\n        case kAudioChannelLabel_Discrete_12:          return MA_CHANNEL_AUX_12;\n        case kAudioChannelLabel_Discrete_13:          return MA_CHANNEL_AUX_13;\n        case kAudioChannelLabel_Discrete_14:          return MA_CHANNEL_AUX_14;\n        case kAudioChannelLabel_Discrete_15:          return MA_CHANNEL_AUX_15;\n        case kAudioChannelLabel_Discrete_65535:       return MA_CHANNEL_NONE;\n        \n    #if 0   /* Introduced in a later version of macOS. */\n        case kAudioChannelLabel_HOA_ACN:              return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_HOA_ACN_0:            return MA_CHANNEL_AUX_0;\n        case kAudioChannelLabel_HOA_ACN_1:            return MA_CHANNEL_AUX_1;\n        case kAudioChannelLabel_HOA_ACN_2:            return MA_CHANNEL_AUX_2;\n        case kAudioChannelLabel_HOA_ACN_3:            return MA_CHANNEL_AUX_3;\n        case kAudioChannelLabel_HOA_ACN_4:            return MA_CHANNEL_AUX_4;\n        case kAudioChannelLabel_HOA_ACN_5:            return MA_CHANNEL_AUX_5;\n        case kAudioChannelLabel_HOA_ACN_6:            return MA_CHANNEL_AUX_6;\n        case kAudioChannelLabel_HOA_ACN_7:            return MA_CHANNEL_AUX_7;\n        case kAudioChannelLabel_HOA_ACN_8:            return MA_CHANNEL_AUX_8;\n        case kAudioChannelLabel_HOA_ACN_9:            return MA_CHANNEL_AUX_9;\n        case kAudioChannelLabel_HOA_ACN_10:           return MA_CHANNEL_AUX_10;\n        case kAudioChannelLabel_HOA_ACN_11:           return MA_CHANNEL_AUX_11;\n        case kAudioChannelLabel_HOA_ACN_12:           return MA_CHANNEL_AUX_12;\n        case kAudioChannelLabel_HOA_ACN_13:           return MA_CHANNEL_AUX_13;\n        case kAudioChannelLabel_HOA_ACN_14:           return MA_CHANNEL_AUX_14;\n        case kAudioChannelLabel_HOA_ACN_15:           return MA_CHANNEL_AUX_15;\n        case kAudioChannelLabel_HOA_ACN_65024:        return MA_CHANNEL_NONE;\n    #endif\n        \n        default:                                      return MA_CHANNEL_NONE;\n    }\n}\n\nma_result ma_format_from_AudioStreamBasicDescription(const AudioStreamBasicDescription* pDescription, ma_format* pFormatOut)\n{\n    ma_assert(pDescription != NULL);\n    ma_assert(pFormatOut != NULL);\n    \n    *pFormatOut = ma_format_unknown;   /* Safety. */\n    \n    /* There's a few things miniaudio doesn't support. */\n    if (pDescription->mFormatID != kAudioFormatLinearPCM) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n    \n    /* We don't support any non-packed formats that are aligned high. */\n    if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsAlignedHigh) != 0) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    /* Only supporting native-endian. */\n    if ((ma_is_little_endian() && (pDescription->mFormatFlags & kAudioFormatFlagIsBigEndian) != 0) || (ma_is_big_endian() && (pDescription->mFormatFlags & kAudioFormatFlagIsBigEndian) == 0)) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n    \n    /* We are not currently supporting non-interleaved formats (this will be added in a future version of miniaudio). */\n    /*if ((pDescription->mFormatFlags & kAudioFormatFlagIsNonInterleaved) != 0) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }*/\n\n    if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsFloat) != 0) {\n        if (pDescription->mBitsPerChannel == 32) {\n            *pFormatOut = ma_format_f32;\n            return MA_SUCCESS;\n        }\n    } else {\n        if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) != 0) {\n            if (pDescription->mBitsPerChannel == 16) {\n                *pFormatOut = ma_format_s16;\n                return MA_SUCCESS;\n            } else if (pDescription->mBitsPerChannel == 24) {\n                if (pDescription->mBytesPerFrame == (pDescription->mBitsPerChannel/8 * pDescription->mChannelsPerFrame)) {\n                    *pFormatOut = ma_format_s24;\n                    return MA_SUCCESS;\n                } else {\n                    if (pDescription->mBytesPerFrame/pDescription->mChannelsPerFrame == sizeof(ma_int32)) {\n                        /* TODO: Implement ma_format_s24_32. */\n                        /**pFormatOut = ma_format_s24_32;*/\n                        /*return MA_SUCCESS;*/\n                        return MA_FORMAT_NOT_SUPPORTED;\n                    }\n                }\n            } else if (pDescription->mBitsPerChannel == 32) {\n                *pFormatOut = ma_format_s32;\n                return MA_SUCCESS;\n            }\n        } else {\n            if (pDescription->mBitsPerChannel == 8) {\n                *pFormatOut = ma_format_u8;\n                return MA_SUCCESS;\n            }\n        }\n    }\n    \n    /* Getting here means the format is not supported. */\n    return MA_FORMAT_NOT_SUPPORTED;\n}\n\nma_result ma_get_channel_map_from_AudioChannelLayout(AudioChannelLayout* pChannelLayout, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    ma_assert(pChannelLayout != NULL);\n    \n    if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) {\n        UInt32 iChannel;\n        for (iChannel = 0; iChannel < pChannelLayout->mNumberChannelDescriptions; ++iChannel) {\n            channelMap[iChannel] = ma_channel_from_AudioChannelLabel(pChannelLayout->mChannelDescriptions[iChannel].mChannelLabel);\n        }\n    } else\n#if 0\n    if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap) {\n        /* This is the same kind of system that's used by Windows audio APIs. */\n        UInt32 iChannel = 0;\n        UInt32 iBit;\n        AudioChannelBitmap bitmap = pChannelLayout->mChannelBitmap;\n        for (iBit = 0; iBit < 32; ++iBit) {\n            AudioChannelBitmap bit = bitmap & (1 << iBit);\n            if (bit != 0) {\n                channelMap[iChannel++] = ma_channel_from_AudioChannelBit(bit);\n            }\n        }\n    } else\n#endif\n    {\n        /*\n        Need to use the tag to determine the channel map. For now I'm just assuming a default channel map, but later on this should\n        be updated to determine the mapping based on the tag.\n        */\n        UInt32 channelCount = AudioChannelLayoutTag_GetNumberOfChannels(pChannelLayout->mChannelLayoutTag);\n        switch (pChannelLayout->mChannelLayoutTag)\n        {\n            case kAudioChannelLayoutTag_Mono:\n            case kAudioChannelLayoutTag_Stereo:\n            case kAudioChannelLayoutTag_StereoHeadphones:\n            case kAudioChannelLayoutTag_MatrixStereo:\n            case kAudioChannelLayoutTag_MidSide:\n            case kAudioChannelLayoutTag_XY:\n            case kAudioChannelLayoutTag_Binaural:\n            case kAudioChannelLayoutTag_Ambisonic_B_Format:\n            {\n                ma_get_standard_channel_map(ma_standard_channel_map_default, channelCount, channelMap);\n            } break;\n            \n            case kAudioChannelLayoutTag_Octagonal:\n            {\n                channelMap[7] = MA_CHANNEL_SIDE_RIGHT;\n                channelMap[6] = MA_CHANNEL_SIDE_LEFT;\n            } /* Intentional fallthrough. */\n            case kAudioChannelLayoutTag_Hexagonal:\n            {\n                channelMap[5] = MA_CHANNEL_BACK_CENTER;\n            } /* Intentional fallthrough. */\n            case kAudioChannelLayoutTag_Pentagonal:\n            {\n                channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            } /* Intentional fallghrough. */\n            case kAudioChannelLayoutTag_Quadraphonic:\n            {\n                channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n                channelMap[2] = MA_CHANNEL_BACK_LEFT;\n                channelMap[1] = MA_CHANNEL_RIGHT;\n                channelMap[0] = MA_CHANNEL_LEFT;\n            } break;\n            \n            /* TODO: Add support for more tags here. */\n        \n            default:\n            {\n                ma_get_standard_channel_map(ma_standard_channel_map_default, channelCount, channelMap);\n            } break;\n        }\n    }\n    \n    return MA_SUCCESS;\n}\n\n\n#if defined(MA_APPLE_DESKTOP)\nma_result ma_get_device_object_ids__coreaudio(ma_context* pContext, UInt32* pDeviceCount, AudioObjectID** ppDeviceObjectIDs) /* NOTE: Free the returned buffer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddressDevices;\n    UInt32 deviceObjectsDataSize;\n    OSStatus status;\n    AudioObjectID* pDeviceObjectIDs;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pDeviceCount != NULL);\n    ma_assert(ppDeviceObjectIDs != NULL);\n\n    /* Safety. */\n    *pDeviceCount = 0;\n    *ppDeviceObjectIDs = NULL;\n    \n    propAddressDevices.mSelector = kAudioHardwarePropertyDevices;\n    propAddressDevices.mScope    = kAudioObjectPropertyScopeGlobal;\n    propAddressDevices.mElement  = kAudioObjectPropertyElementMaster;\n\n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(kAudioObjectSystemObject, &propAddressDevices, 0, NULL, &deviceObjectsDataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    pDeviceObjectIDs = (AudioObjectID*)ma_malloc(deviceObjectsDataSize);\n    if (pDeviceObjectIDs == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n    \n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(kAudioObjectSystemObject, &propAddressDevices, 0, NULL, &deviceObjectsDataSize, pDeviceObjectIDs);\n    if (status != noErr) {\n        ma_free(pDeviceObjectIDs);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    *pDeviceCount = deviceObjectsDataSize / sizeof(AudioObjectID);\n    *ppDeviceObjectIDs = pDeviceObjectIDs;\n\n    (void)pContext; /* Unused. */\n    return MA_SUCCESS;\n}\n\nma_result ma_get_AudioObject_uid_as_CFStringRef(ma_context* pContext, AudioObjectID objectID, CFStringRef* pUID)\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n\n    ma_assert(pContext != NULL);\n\n    propAddress.mSelector = kAudioDevicePropertyDeviceUID;\n    propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n\n    dataSize = sizeof(*pUID);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(objectID, &propAddress, 0, NULL, &dataSize, pUID);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_get_AudioObject_uid(ma_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut)\n{\n    CFStringRef uid;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n\n    result = ma_get_AudioObject_uid_as_CFStringRef(pContext, objectID, &uid);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    if (!((ma_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(uid, bufferOut, bufferSize, kCFStringEncodingUTF8)) {\n        return MA_ERROR;\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_get_AudioObject_name(ma_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut)\n{\n    AudioObjectPropertyAddress propAddress;\n    CFStringRef deviceName = NULL;\n    UInt32 dataSize;\n    OSStatus status;\n\n    ma_assert(pContext != NULL);\n\n    propAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;\n    propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n\n    dataSize = sizeof(deviceName);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(objectID, &propAddress, 0, NULL, &dataSize, &deviceName);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    if (!((ma_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(deviceName, bufferOut, bufferSize, kCFStringEncodingUTF8)) {\n        return MA_ERROR;\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_bool32 ma_does_AudioObject_support_scope(ma_context* pContext, AudioObjectID deviceObjectID, AudioObjectPropertyScope scope)\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioBufferList* pBufferList;\n    ma_bool32 isSupported;\n\n    ma_assert(pContext != NULL);\n\n    /* To know whether or not a device is an input device we need ot look at the stream configuration. If it has an output channel it's a playback device. */\n    propAddress.mSelector = kAudioDevicePropertyStreamConfiguration;\n    propAddress.mScope    = scope;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n    \n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return MA_FALSE;\n    }\n    \n    pBufferList = (AudioBufferList*)ma_malloc(dataSize);\n    if (pBufferList == NULL) {\n        return MA_FALSE;   /* Out of memory. */\n    }\n    \n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pBufferList);\n    if (status != noErr) {\n        ma_free(pBufferList);\n        return MA_FALSE;\n    }\n\n    isSupported = MA_FALSE;\n    if (pBufferList->mNumberBuffers > 0) {\n        isSupported = MA_TRUE;\n    }\n    \n    ma_free(pBufferList);\n    return isSupported;\n}\n\nma_bool32 ma_does_AudioObject_support_playback(ma_context* pContext, AudioObjectID deviceObjectID)\n{\n    return ma_does_AudioObject_support_scope(pContext, deviceObjectID, kAudioObjectPropertyScopeOutput);\n}\n\nma_bool32 ma_does_AudioObject_support_capture(ma_context* pContext, AudioObjectID deviceObjectID)\n{\n    return ma_does_AudioObject_support_scope(pContext, deviceObjectID, kAudioObjectPropertyScopeInput);\n}\n\n\nma_result ma_get_AudioObject_stream_descriptions(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, UInt32* pDescriptionCount, AudioStreamRangedDescription** ppDescriptions) /* NOTE: Free the returned pointer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioStreamRangedDescription* pDescriptions;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pDescriptionCount != NULL);\n    ma_assert(ppDescriptions != NULL);\n    \n    /*\n    TODO: Experiment with kAudioStreamPropertyAvailablePhysicalFormats instead of (or in addition to) kAudioStreamPropertyAvailableVirtualFormats. My\n          MacBook Pro uses s24/32 format, however, which miniaudio does not currently support.\n    */\n    propAddress.mSelector = kAudioStreamPropertyAvailableVirtualFormats; /*kAudioStreamPropertyAvailablePhysicalFormats;*/\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n    \n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    pDescriptions = (AudioStreamRangedDescription*)ma_malloc(dataSize);\n    if (pDescriptions == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n    \n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pDescriptions);\n    if (status != noErr) {\n        ma_free(pDescriptions);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    *pDescriptionCount = dataSize / sizeof(*pDescriptions);\n    *ppDescriptions = pDescriptions;\n    return MA_SUCCESS;\n}\n\n\nma_result ma_get_AudioObject_channel_layout(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, AudioChannelLayout** ppChannelLayout)   /* NOTE: Free the returned pointer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioChannelLayout* pChannelLayout;\n\n    ma_assert(pContext != NULL);\n    ma_assert(ppChannelLayout != NULL);\n    \n    *ppChannelLayout = NULL;    /* Safety. */\n    \n    propAddress.mSelector = kAudioDevicePropertyPreferredChannelLayout;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n    \n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    pChannelLayout = (AudioChannelLayout*)ma_malloc(dataSize);\n    if (pChannelLayout == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n    \n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pChannelLayout);\n    if (status != noErr) {\n        ma_free(pChannelLayout);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    *ppChannelLayout = pChannelLayout;\n    return MA_SUCCESS;\n}\n\nma_result ma_get_AudioObject_channel_count(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32* pChannelCount)\n{\n    AudioChannelLayout* pChannelLayout;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pChannelCount != NULL);\n    \n    *pChannelCount = 0; /* Safety. */\n\n    result = ma_get_AudioObject_channel_layout(pContext, deviceObjectID, deviceType, &pChannelLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) {\n        *pChannelCount = pChannelLayout->mNumberChannelDescriptions;\n    } else if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap) {\n        *pChannelCount = ma_count_set_bits(pChannelLayout->mChannelBitmap);\n    } else {\n        *pChannelCount = AudioChannelLayoutTag_GetNumberOfChannels(pChannelLayout->mChannelLayoutTag);\n    }\n    \n    ma_free(pChannelLayout);\n    return MA_SUCCESS;\n}\n\nma_result ma_get_AudioObject_channel_map(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    AudioChannelLayout* pChannelLayout;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    \n    result = ma_get_AudioObject_channel_layout(pContext, deviceObjectID, deviceType, &pChannelLayout);\n    if (result != MA_SUCCESS) {\n        return result;  /* Rather than always failing here, would it be more robust to simply assume a default? */\n    }\n    \n    result = ma_get_channel_map_from_AudioChannelLayout(pChannelLayout, channelMap);\n    if (result != MA_SUCCESS) {\n        ma_free(pChannelLayout);\n        return result;\n    }\n    \n    ma_free(pChannelLayout);\n    return result;\n}\n\nma_result ma_get_AudioObject_sample_rates(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, UInt32* pSampleRateRangesCount, AudioValueRange** ppSampleRateRanges)   /* NOTE: Free the returned pointer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioValueRange* pSampleRateRanges;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pSampleRateRangesCount != NULL);\n    ma_assert(ppSampleRateRanges != NULL);\n  \n    /* Safety. */\n    *pSampleRateRangesCount = 0;\n    *ppSampleRateRanges = NULL;\n    \n    propAddress.mSelector = kAudioDevicePropertyAvailableNominalSampleRates;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n    \n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    pSampleRateRanges = (AudioValueRange*)ma_malloc(dataSize);\n    if (pSampleRateRanges == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n    \n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pSampleRateRanges);\n    if (status != noErr) {\n        ma_free(pSampleRateRanges);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    *pSampleRateRangesCount = dataSize / sizeof(*pSampleRateRanges);\n    *ppSampleRateRanges = pSampleRateRanges;\n    return MA_SUCCESS;\n}\n\nma_result ma_get_AudioObject_get_closest_sample_rate(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32 sampleRateIn, ma_uint32* pSampleRateOut)\n{\n    UInt32 sampleRateRangeCount;\n    AudioValueRange* pSampleRateRanges;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pSampleRateOut != NULL);\n    \n    *pSampleRateOut = 0;    /* Safety. */\n    \n    result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    if (sampleRateRangeCount == 0) {\n        ma_free(pSampleRateRanges);\n        return MA_ERROR;   /* Should never hit this case should we? */\n    }\n    \n    if (sampleRateIn == 0) {\n        /* Search in order of miniaudio's preferred priority. */\n        UInt32 iMALSampleRate;\n        for (iMALSampleRate = 0; iMALSampleRate < ma_countof(g_maStandardSampleRatePriorities); ++iMALSampleRate) {\n            ma_uint32 malSampleRate = g_maStandardSampleRatePriorities[iMALSampleRate];\n            UInt32 iCASampleRate;\n            for (iCASampleRate = 0; iCASampleRate < sampleRateRangeCount; ++iCASampleRate) {\n                AudioValueRange caSampleRate = pSampleRateRanges[iCASampleRate];\n                if (caSampleRate.mMinimum <= malSampleRate && caSampleRate.mMaximum >= malSampleRate) {\n                    *pSampleRateOut = malSampleRate;\n                    ma_free(pSampleRateRanges);\n                    return MA_SUCCESS;\n                }\n            }\n        }\n        \n        /*\n        If we get here it means none of miniaudio's standard sample rates matched any of the supported sample rates from the device. In this\n        case we just fall back to the first one reported by Core Audio.\n        */\n        ma_assert(sampleRateRangeCount > 0);\n        \n        *pSampleRateOut = pSampleRateRanges[0].mMinimum;\n        ma_free(pSampleRateRanges);\n        return MA_SUCCESS;\n    } else {\n        /* Find the closest match to this sample rate. */\n        UInt32 currentAbsoluteDifference = INT32_MAX;\n        UInt32 iCurrentClosestRange = (UInt32)-1;\n        UInt32 iRange;\n        for (iRange = 0; iRange < sampleRateRangeCount; ++iRange) {\n            if (pSampleRateRanges[iRange].mMinimum <= sampleRateIn && pSampleRateRanges[iRange].mMaximum >= sampleRateIn) {\n                *pSampleRateOut = sampleRateIn;\n                ma_free(pSampleRateRanges);\n                return MA_SUCCESS;\n            } else {\n                UInt32 absoluteDifference;\n                if (pSampleRateRanges[iRange].mMinimum > sampleRateIn) {\n                    absoluteDifference = pSampleRateRanges[iRange].mMinimum - sampleRateIn;\n                } else {\n                    absoluteDifference = sampleRateIn - pSampleRateRanges[iRange].mMaximum;\n                }\n                \n                if (currentAbsoluteDifference > absoluteDifference) {\n                    currentAbsoluteDifference = absoluteDifference;\n                    iCurrentClosestRange = iRange;\n                }\n            }\n        }\n        \n        ma_assert(iCurrentClosestRange != (UInt32)-1);\n        \n        *pSampleRateOut = pSampleRateRanges[iCurrentClosestRange].mMinimum;\n        ma_free(pSampleRateRanges);\n        return MA_SUCCESS;\n    }\n    \n    /* Should never get here, but it would mean we weren't able to find any suitable sample rates. */\n    /*ma_free(pSampleRateRanges);*/\n    /*return MA_ERROR;*/\n}\n\n\nma_result ma_get_AudioObject_closest_buffer_size_in_frames(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32 bufferSizeInFramesIn, ma_uint32* pBufferSizeInFramesOut)\n{\n    AudioObjectPropertyAddress propAddress;\n    AudioValueRange bufferSizeRange;\n    UInt32 dataSize;\n    OSStatus status;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pBufferSizeInFramesOut != NULL);\n    \n    *pBufferSizeInFramesOut = 0;    /* Safety. */\n    \n    propAddress.mSelector = kAudioDevicePropertyBufferFrameSizeRange;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n\n    dataSize = sizeof(bufferSizeRange);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, &bufferSizeRange);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    /* This is just a clamp. */\n    if (bufferSizeInFramesIn < bufferSizeRange.mMinimum) {\n        *pBufferSizeInFramesOut = (ma_uint32)bufferSizeRange.mMinimum;\n    } else if (bufferSizeInFramesIn > bufferSizeRange.mMaximum) {\n        *pBufferSizeInFramesOut = (ma_uint32)bufferSizeRange.mMaximum;\n    } else {\n        *pBufferSizeInFramesOut = bufferSizeInFramesIn;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_set_AudioObject_buffer_size_in_frames(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32* pBufferSizeInOut)\n{\n    ma_result result;\n    ma_uint32 chosenBufferSizeInFrames;\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n\n    ma_assert(pContext != NULL);\n\n    result = ma_get_AudioObject_closest_buffer_size_in_frames(pContext, deviceObjectID, deviceType, *pBufferSizeInOut, &chosenBufferSizeInFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Try setting the size of the buffer... If this fails we just use whatever is currently set. */\n    propAddress.mSelector = kAudioDevicePropertyBufferFrameSize;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = kAudioObjectPropertyElementMaster;\n    \n    ((ma_AudioObjectSetPropertyData_proc)pContext->coreaudio.AudioObjectSetPropertyData)(deviceObjectID, &propAddress, 0, NULL, sizeof(chosenBufferSizeInFrames), &chosenBufferSizeInFrames);\n    \n    /* Get the actual size of the buffer. */\n    dataSize = sizeof(*pBufferSizeInOut);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, &chosenBufferSizeInFrames);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    *pBufferSizeInOut = chosenBufferSizeInFrames;\n    return MA_SUCCESS;\n}\n\n\nma_result ma_find_AudioObjectID(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, AudioObjectID* pDeviceObjectID)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pDeviceObjectID != NULL);\n\n    /* Safety. */\n    *pDeviceObjectID = 0;\n    \n    if (pDeviceID == NULL) {\n        /* Default device. */\n        AudioObjectPropertyAddress propAddressDefaultDevice;\n        UInt32 defaultDeviceObjectIDSize = sizeof(AudioObjectID);\n        AudioObjectID defaultDeviceObjectID;\n        OSStatus status;\n\n        propAddressDefaultDevice.mScope = kAudioObjectPropertyScopeGlobal;\n        propAddressDefaultDevice.mElement = kAudioObjectPropertyElementMaster;\n        if (deviceType == ma_device_type_playback) {\n            propAddressDefaultDevice.mSelector = kAudioHardwarePropertyDefaultOutputDevice;\n        } else {\n            propAddressDefaultDevice.mSelector = kAudioHardwarePropertyDefaultInputDevice;\n        }\n        \n        defaultDeviceObjectIDSize = sizeof(AudioObjectID);\n        status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(kAudioObjectSystemObject, &propAddressDefaultDevice, 0, NULL, &defaultDeviceObjectIDSize, &defaultDeviceObjectID);\n        if (status == noErr) {\n            *pDeviceObjectID = defaultDeviceObjectID;\n            return MA_SUCCESS;\n        }\n    } else {\n        /* Explicit device. */\n        UInt32 deviceCount;\n        AudioObjectID* pDeviceObjectIDs;\n        ma_result result;\n        UInt32 iDevice;\n\n        result = ma_get_device_object_ids__coreaudio(pContext, &deviceCount, &pDeviceObjectIDs);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n        \n        for (iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice];\n            \n            char uid[256];\n            if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(uid), uid) != MA_SUCCESS) {\n                continue;\n            }\n            \n            if (deviceType == ma_device_type_playback) {\n                if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) {\n                    if (strcmp(uid, pDeviceID->coreaudio) == 0) {\n                        *pDeviceObjectID = deviceObjectID;\n                        return MA_SUCCESS;\n                    }\n                }\n            } else {\n                if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) {\n                    if (strcmp(uid, pDeviceID->coreaudio) == 0) {\n                        *pDeviceObjectID = deviceObjectID;\n                        return MA_SUCCESS;\n                    }\n                }\n            }\n        }\n    }\n    \n    /* If we get here it means we couldn't find the device. */\n    return MA_NO_DEVICE;\n}\n\n\nma_result ma_find_best_format__coreaudio(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_bool32 usingDefaultFormat, ma_bool32 usingDefaultChannels, ma_bool32 usingDefaultSampleRate, AudioStreamBasicDescription* pFormat)\n{\n    UInt32 deviceFormatDescriptionCount;\n    AudioStreamRangedDescription* pDeviceFormatDescriptions;\n    ma_result result;\n    ma_uint32 desiredSampleRate;\n    ma_uint32 desiredChannelCount;\n    ma_format desiredFormat;\n    AudioStreamBasicDescription bestDeviceFormatSoFar;\n    ma_bool32 hasSupportedFormat;\n    UInt32 iFormat;\n\n    result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &deviceFormatDescriptionCount, &pDeviceFormatDescriptions);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    desiredSampleRate = sampleRate;\n    if (usingDefaultSampleRate) {\n        /*\n        When using the device's default sample rate, we get the highest priority standard rate supported by the device. Otherwise\n        we just use the pre-set rate.\n        */\n        ma_uint32 iStandardRate;\n        for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) {\n            ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate];\n            ma_bool32 foundRate = MA_FALSE;\n            UInt32 iDeviceRate;\n\n            for (iDeviceRate = 0; iDeviceRate < deviceFormatDescriptionCount; ++iDeviceRate) {\n                ma_uint32 deviceRate = (ma_uint32)pDeviceFormatDescriptions[iDeviceRate].mFormat.mSampleRate;\n                \n                if (deviceRate == standardRate) {\n                    desiredSampleRate = standardRate;\n                    foundRate = MA_TRUE;\n                    break;\n                }\n            }\n            \n            if (foundRate) {\n                break;\n            }\n        }\n    }\n    \n    desiredChannelCount = channels;\n    if (usingDefaultChannels) {\n        ma_get_AudioObject_channel_count(pContext, deviceObjectID, deviceType, &desiredChannelCount);    /* <-- Not critical if this fails. */\n    }\n    \n    desiredFormat = format;\n    if (usingDefaultFormat) {\n        desiredFormat = g_maFormatPriorities[0];\n    }\n    \n    /*\n    If we get here it means we don't have an exact match to what the client is asking for. We'll need to find the closest one. The next\n    loop will check for formats that have the same sample rate to what we're asking for. If there is, we prefer that one in all cases.\n    */\n    ma_zero_object(&bestDeviceFormatSoFar);\n    \n    hasSupportedFormat = MA_FALSE;\n    for (iFormat = 0; iFormat < deviceFormatDescriptionCount; ++iFormat) {\n        ma_format format;\n        ma_result formatResult = ma_format_from_AudioStreamBasicDescription(&pDeviceFormatDescriptions[iFormat].mFormat, &format);\n        if (formatResult == MA_SUCCESS && format != ma_format_unknown) {\n            hasSupportedFormat = MA_TRUE;\n            bestDeviceFormatSoFar = pDeviceFormatDescriptions[iFormat].mFormat;\n            break;\n        }\n    }\n    \n    if (!hasSupportedFormat) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n    \n    \n    for (iFormat = 0; iFormat < deviceFormatDescriptionCount; ++iFormat) {\n        AudioStreamBasicDescription thisDeviceFormat = pDeviceFormatDescriptions[iFormat].mFormat;\n        ma_format thisSampleFormat;\n        ma_result formatResult;\n        ma_format bestSampleFormatSoFar;\n\n        /* If the format is not supported by miniaudio we need to skip this one entirely. */\n        formatResult = ma_format_from_AudioStreamBasicDescription(&pDeviceFormatDescriptions[iFormat].mFormat, &thisSampleFormat);\n        if (formatResult != MA_SUCCESS || thisSampleFormat == ma_format_unknown) {\n            continue;   /* The format is not supported by miniaudio. Skip. */\n        }\n        \n        ma_format_from_AudioStreamBasicDescription(&bestDeviceFormatSoFar, &bestSampleFormatSoFar);\n        \n        /* Getting here means the format is supported by miniaudio which makes this format a candidate. */\n        if (thisDeviceFormat.mSampleRate != desiredSampleRate) {\n            /*\n            \u0010The sample rate does not match, but this format could still be usable, although it's a very low priority. If the best format\n            so far has an equal sample rate we can just ignore this one.\n            */\n            if (bestDeviceFormatSoFar.mSampleRate == desiredSampleRate) {\n                continue;   /* The best sample rate so far has the same sample rate as what we requested which means it's still the best so far. Skip this format. */\n            } else {\n                /* In this case, neither the best format so far nor this one have the same sample rate. Check the channel count next. */\n                if (thisDeviceFormat.mChannelsPerFrame != desiredChannelCount) {\n                    /* This format has a different sample rate _and_ a different channel count. */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) {\n                        continue;   /* No change to the best format. */\n                    } else {\n                        /*\n                        Both this format and the best so far have different sample rates and different channel counts. Whichever has the\n                        best format is the new best.\n                        */\n                        if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                            bestDeviceFormatSoFar = thisDeviceFormat;\n                            continue;\n                        } else {\n                            continue;   /* No change to the best format. */\n                        }\n                    }\n                } else {\n                    /* This format has a different sample rate but the desired channel count. */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) {\n                        /* Both this format and the best so far have the desired channel count. Whichever has the best format is the new best. */\n                        if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                            bestDeviceFormatSoFar = thisDeviceFormat;\n                            continue;\n                        } else {\n                            continue;   /* No change to the best format for now. */\n                        }\n                    } else {\n                        /* This format has the desired channel count, but the best so far does not. We have a new best. */\n                        bestDeviceFormatSoFar = thisDeviceFormat;\n                        continue;\n                    }\n                }\n            }\n        } else {\n            /*\n            The sample rates match which makes this format a very high priority contender. If the best format so far has a different\n            sample rate it needs to be replaced with this one.\n            */\n            if (bestDeviceFormatSoFar.mSampleRate != desiredSampleRate) {\n                bestDeviceFormatSoFar = thisDeviceFormat;\n                continue;\n            } else {\n                /* In this case both this format and the best format so far have the same sample rate. Check the channel count next. */\n                if (thisDeviceFormat.mChannelsPerFrame == desiredChannelCount) {\n                    /*\n                    In this case this format has the same channel count as what the client is requesting. If the best format so far has\n                    a different count, this one becomes the new best.\n                    */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame != desiredChannelCount) {\n                        bestDeviceFormatSoFar = thisDeviceFormat;\n                        continue;\n                    } else {\n                        /* In this case both this format and the best so far have the ideal sample rate and channel count. Check the format. */\n                        if (thisSampleFormat == desiredFormat) {\n                            bestDeviceFormatSoFar = thisDeviceFormat;\n                            break;  /* Found the exact match. */\n                        } else {\n                            /* The formats are different. The new best format is the one with the highest priority format according to miniaudio. */\n                            if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                                bestDeviceFormatSoFar = thisDeviceFormat;\n                                continue;\n                            } else {\n                                continue;   /* No change to the best format for now. */\n                            }\n                        }\n                    }\n                } else {\n                    /*\n                    In this case the channel count is different to what the client has requested. If the best so far has the same channel\n                    count as the requested count then it remains the best.\n                    */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) {\n                        continue;\n                    } else {\n                        /*\n                        This is the case where both have the same sample rate (good) but different channel counts. Right now both have about\n                        the same priority, but we need to compare the format now.\n                        */\n                        if (thisSampleFormat == bestSampleFormatSoFar) {\n                            if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                                bestDeviceFormatSoFar = thisDeviceFormat;\n                                continue;\n                            } else {\n                                continue;   /* No change to the best format for now. */\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    *pFormat = bestDeviceFormatSoFar;\n    return MA_SUCCESS;\n}\n#endif\n\nma_result ma_get_AudioUnit_channel_map(ma_context* pContext, AudioUnit audioUnit, ma_device_type deviceType, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    AudioUnitScope deviceScope;\n    AudioUnitElement deviceBus;\n    UInt32 channelLayoutSize;\n    OSStatus status;\n    AudioChannelLayout* pChannelLayout;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    \n    if (deviceType == ma_device_type_playback) {\n        deviceScope = kAudioUnitScope_Output;\n        deviceBus = MA_COREAUDIO_OUTPUT_BUS;\n    } else {\n        deviceScope = kAudioUnitScope_Input;\n        deviceBus = MA_COREAUDIO_INPUT_BUS;\n    }\n    \n    status = ((ma_AudioUnitGetPropertyInfo_proc)pContext->coreaudio.AudioUnitGetPropertyInfo)(audioUnit, kAudioUnitProperty_AudioChannelLayout, deviceScope, deviceBus, &channelLayoutSize, NULL);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    pChannelLayout = (AudioChannelLayout*)ma_malloc(channelLayoutSize);\n    if (pChannelLayout == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n    \n    status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioUnitProperty_AudioChannelLayout, deviceScope, deviceBus, pChannelLayout, &channelLayoutSize);\n    if (status != noErr) {\n        ma_free(pChannelLayout);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    result = ma_get_channel_map_from_AudioChannelLayout(pChannelLayout, channelMap);\n    if (result != MA_SUCCESS) {\n        ma_free(pChannelLayout);\n        return result;\n    }\n\n    ma_free(pChannelLayout);\n    return MA_SUCCESS;\n}\n\nma_bool32 ma_context_is_device_id_equal__coreaudio(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return strcmp(pID0->coreaudio, pID1->coreaudio) == 0;\n}\n\nma_result ma_context_enumerate_devices__coreaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n#if defined(MA_APPLE_DESKTOP)\n    UInt32 deviceCount;\n    AudioObjectID* pDeviceObjectIDs;\n    ma_result result;\n    UInt32 iDevice;\n\n    result = ma_get_device_object_ids__coreaudio(pContext, &deviceCount, &pDeviceObjectIDs);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n  \n    for (iDevice = 0; iDevice < deviceCount; ++iDevice) {\n        AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice];\n        ma_device_info info;\n\n        ma_zero_object(&info);\n        if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(info.id.coreaudio), info.id.coreaudio) != MA_SUCCESS) {\n            continue;\n        }\n        if (ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(info.name), info.name) != MA_SUCCESS) {\n            continue;\n        }\n\n        if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) {\n            if (!callback(pContext, ma_device_type_playback, &info, pUserData)) {\n                break;\n            }\n        }\n        if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) {\n            if (!callback(pContext, ma_device_type_capture, &info, pUserData)) {\n                break;\n            }\n        }\n    }\n    \n    ma_free(pDeviceObjectIDs);\n#else\n    /* Only supporting default devices on non-Desktop platforms. */\n    ma_device_info info;\n    \n    ma_zero_object(&info);\n    ma_strncpy_s(info.name, sizeof(info.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    if (!callback(pContext, ma_device_type_playback, &info, pUserData)) {\n        return MA_SUCCESS;\n    }\n    \n    ma_zero_object(&info);\n    ma_strncpy_s(info.name, sizeof(info.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    if (!callback(pContext, ma_device_type_capture, &info, pUserData)) {\n        return MA_SUCCESS;\n    }\n#endif\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__coreaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n\n    /* No exclusive mode with the Core Audio backend for now. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n    \n#if defined(MA_APPLE_DESKTOP)\n    /* Desktop */\n    {\n        AudioObjectID deviceObjectID;\n        UInt32 streamDescriptionCount;\n        AudioStreamRangedDescription* pStreamDescriptions;\n        UInt32 iStreamDescription;\n        UInt32 sampleRateRangeCount;\n        AudioValueRange* pSampleRateRanges;\n\n        result = ma_find_AudioObjectID(pContext, deviceType, pDeviceID, &deviceObjectID);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    \n        result = ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(pDeviceInfo->id.coreaudio), pDeviceInfo->id.coreaudio);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    \n        result = ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(pDeviceInfo->name), pDeviceInfo->name);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    \n        /* Formats. */\n        result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &streamDescriptionCount, &pStreamDescriptions);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    \n        for (iStreamDescription = 0; iStreamDescription < streamDescriptionCount; ++iStreamDescription) {\n            ma_format format;\n            ma_bool32 formatExists = MA_FALSE;\n            ma_uint32 iOutputFormat;\n\n            result = ma_format_from_AudioStreamBasicDescription(&pStreamDescriptions[iStreamDescription].mFormat, &format);\n            if (result != MA_SUCCESS) {\n                continue;\n            }\n        \n            ma_assert(format != ma_format_unknown);\n        \n            /* Make sure the format isn't already in the output list. */\n            for (iOutputFormat = 0; iOutputFormat < pDeviceInfo->formatCount; ++iOutputFormat) {\n                if (pDeviceInfo->formats[iOutputFormat] == format) {\n                    formatExists = MA_TRUE;\n                    break;\n                }\n            }\n        \n            if (!formatExists) {\n                pDeviceInfo->formats[pDeviceInfo->formatCount++] = format;\n            }\n        }\n    \n        ma_free(pStreamDescriptions);\n    \n    \n        /* Channels. */\n        result = ma_get_AudioObject_channel_count(pContext, deviceObjectID, deviceType, &pDeviceInfo->minChannels);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n        pDeviceInfo->maxChannels = pDeviceInfo->minChannels;\n    \n    \n        /* Sample rates. */\n        result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    \n        if (sampleRateRangeCount > 0) {\n            UInt32 iSampleRate;\n            pDeviceInfo->minSampleRate = UINT32_MAX;\n            pDeviceInfo->maxSampleRate = 0;\n            for (iSampleRate = 0; iSampleRate < sampleRateRangeCount; ++iSampleRate) {\n                if (pDeviceInfo->minSampleRate > pSampleRateRanges[iSampleRate].mMinimum) {\n                    pDeviceInfo->minSampleRate = pSampleRateRanges[iSampleRate].mMinimum;\n                }\n                if (pDeviceInfo->maxSampleRate < pSampleRateRanges[iSampleRate].mMaximum) {\n                    pDeviceInfo->maxSampleRate = pSampleRateRanges[iSampleRate].mMaximum;\n                }\n            }\n        }\n    }\n#else\n    /* Mobile */\n    {\n        AudioComponentDescription desc;\n        AudioComponent component;\n        AudioUnit audioUnit;\n        OSStatus status;\n        AudioUnitScope formatScope;\n        AudioUnitElement formatElement;\n        AudioStreamBasicDescription bestFormat;\n        UInt32 propSize;\n\n        if (deviceType == ma_device_type_playback) {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        } else {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        }\n    \n        /*\n        Retrieving device information is more annoying on mobile than desktop. For simplicity I'm locking this down to whatever format is\n        reported on a temporary I/O unit. The problem, however, is that this doesn't return a value for the sample rate which we need to\n        retrieve from the AVAudioSession shared instance.\n        */\n        desc.componentType = kAudioUnitType_Output;\n        desc.componentSubType = kAudioUnitSubType_RemoteIO;\n        desc.componentManufacturer = kAudioUnitManufacturer_Apple;\n        desc.componentFlags = 0;\n        desc.componentFlagsMask = 0;\n    \n        component = ((ma_AudioComponentFindNext_proc)pContext->coreaudio.AudioComponentFindNext)(NULL, &desc);\n        if (component == NULL) {\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n    \n        status = ((ma_AudioComponentInstanceNew_proc)pContext->coreaudio.AudioComponentInstanceNew)(component, &audioUnit);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    \n        formatScope   = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output;\n        formatElement = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS;\n    \n        propSize = sizeof(bestFormat);\n        status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, &propSize);\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    \n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(audioUnit);\n        audioUnit = NULL;\n    \n    \n        pDeviceInfo->minChannels = bestFormat.mChannelsPerFrame;\n        pDeviceInfo->maxChannels = bestFormat.mChannelsPerFrame;\n    \n        pDeviceInfo->formatCount = 1;\n        result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &pDeviceInfo->formats[0]);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    \n        /*\n        It looks like Apple are wanting to push the whole AVAudioSession thing. Thus, we need to use that to determine device settings. To do\n        this we just get the shared instance and inspect.\n        */\n        @autoreleasepool {\n            AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n            ma_assert(pAudioSession != NULL);\n\n            pDeviceInfo->minSampleRate = (ma_uint32)pAudioSession.sampleRate;\n            pDeviceInfo->maxSampleRate = pDeviceInfo->minSampleRate;\n        }\n    }\n#endif\n    \n    (void)pDeviceInfo; /* Unused. */\n    return MA_SUCCESS;\n}\n\n\nvoid ma_device_uninit__coreaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n    ma_assert(ma_device__get_state(pDevice) == MA_STATE_UNINITIALIZED);\n    \n    if (pDevice->coreaudio.audioUnitCapture != NULL) {\n        ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n    }\n    if (pDevice->coreaudio.audioUnitPlayback != NULL) {\n        ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n    }\n    \n    if (pDevice->coreaudio.pAudioBufferList) {\n        ma_free(pDevice->coreaudio.pAudioBufferList);\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_pcm_rb_uninit(&pDevice->coreaudio.duplexRB);\n    }\n}\n\n\nOSStatus ma_on_output__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pActionFlags, const AudioTimeStamp* pTimeStamp, UInt32 busNumber, UInt32 frameCount, AudioBufferList* pBufferList)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_stream_layout layout;\n\n    ma_assert(pDevice != NULL);\n\n#if defined(MA_DEBUG_OUTPUT)\n    printf(\"INFO: Output Callback: busNumber=%d, frameCount=%d, mNumberBuffers=%d\\n\", busNumber, frameCount, pBufferList->mNumberBuffers);\n#endif\n\n    /* We need to check whether or not we are outputting interleaved or non-interleaved samples. The way we do this is slightly different for each type. */\n    layout = ma_stream_layout_interleaved;\n    if (pBufferList->mBuffers[0].mNumberChannels != pDevice->playback.internalChannels) {\n        layout = ma_stream_layout_deinterleaved;\n    }\n    \n    if (layout == ma_stream_layout_interleaved) {\n        /* For now we can assume everything is interleaved. */\n        UInt32 iBuffer;\n        for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; ++iBuffer) {\n            if (pBufferList->mBuffers[iBuffer].mNumberChannels == pDevice->playback.internalChannels) {\n                ma_uint32 frameCountForThisBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                if (frameCountForThisBuffer > 0) {\n                    if (pDevice->type == ma_device_type_duplex) {\n                        ma_device__handle_duplex_callback_playback(pDevice, frameCountForThisBuffer, pBufferList->mBuffers[iBuffer].mData, &pDevice->coreaudio.duplexRB);\n                    } else {\n                        ma_device__read_frames_from_client(pDevice, frameCountForThisBuffer, pBufferList->mBuffers[iBuffer].mData);\n                    }\n                }\n                \n            #if defined(MA_DEBUG_OUTPUT)\n                printf(\"  frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\\n\", frameCount, pBufferList->mBuffers[iBuffer].mNumberChannels, pBufferList->mBuffers[iBuffer].mDataByteSize);\n            #endif\n            } else {\n                /*\n                This case is where the number of channels in the output buffer do not match our internal channels. It could mean that it's\n                not interleaved, in which case we can't handle right now since miniaudio does not yet support non-interleaved streams. We just\n                output silence here.\n                */\n                ma_zero_memory(pBufferList->mBuffers[iBuffer].mData, pBufferList->mBuffers[iBuffer].mDataByteSize);\n\n            #if defined(MA_DEBUG_OUTPUT)\n                printf(\"  WARNING: Outputting silence. frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\\n\", frameCount, pBufferList->mBuffers[iBuffer].mNumberChannels, pBufferList->mBuffers[iBuffer].mDataByteSize);\n            #endif\n            }\n        }\n    } else {\n        /* This is the deinterleaved case. We need to update each buffer in groups of internalChannels. This assumes each buffer is the same size. */\n        ma_uint8 tempBuffer[4096];\n        UInt32 iBuffer;\n        for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; iBuffer += pDevice->playback.internalChannels) {\n            ma_uint32 frameCountPerBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_sample(pDevice->playback.internalFormat);\n            ma_uint32 framesRemaining = frameCountPerBuffer;\n\n            while (framesRemaining > 0) {\n                void* ppDeinterleavedBuffers[MA_MAX_CHANNELS];\n                ma_uint32 iChannel;\n                ma_uint32 framesToRead = sizeof(tempBuffer) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                if (framesToRead > framesRemaining) {\n                    framesToRead = framesRemaining;\n                }\n                \n                if (pDevice->type == ma_device_type_duplex) {\n                    ma_device__handle_duplex_callback_playback(pDevice, framesToRead, tempBuffer, &pDevice->coreaudio.duplexRB);\n                } else {\n                    ma_device__read_frames_from_client(pDevice, framesToRead, tempBuffer);\n                }\n                \n                for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) {\n                    ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pBufferList->mBuffers[iBuffer].mData, (frameCountPerBuffer - framesRemaining) * ma_get_bytes_per_sample(pDevice->playback.internalFormat));\n                }\n                \n                ma_deinterleave_pcm_frames(pDevice->playback.internalFormat, pDevice->playback.internalChannels, framesToRead, tempBuffer, ppDeinterleavedBuffers);\n                \n                framesRemaining -= framesToRead;\n            }\n        }\n    }\n    \n    (void)pActionFlags;\n    (void)pTimeStamp;\n    (void)busNumber;\n\n    return noErr;\n}\n\nOSStatus ma_on_input__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pActionFlags, const AudioTimeStamp* pTimeStamp, UInt32 busNumber, UInt32 frameCount, AudioBufferList* pUnusedBufferList)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    AudioBufferList* pRenderedBufferList;\n    ma_stream_layout layout;\n    OSStatus status;\n\n    ma_assert(pDevice != NULL);\n    \n    pRenderedBufferList = (AudioBufferList*)pDevice->coreaudio.pAudioBufferList;\n    ma_assert(pRenderedBufferList);\n    \n    /* We need to check whether or not we are outputting interleaved or non-interleaved samples. The way we do this is slightly different for each type. */\n    layout = ma_stream_layout_interleaved;\n    if (pRenderedBufferList->mBuffers[0].mNumberChannels != pDevice->capture.internalChannels) {\n        layout = ma_stream_layout_deinterleaved;\n    }\n    \n#if defined(MA_DEBUG_OUTPUT)\n    printf(\"INFO: Input Callback: busNumber=%d, frameCount=%d, mNumberBuffers=%d\\n\", busNumber, frameCount, pRenderedBufferList->mNumberBuffers);\n#endif\n    \n    status = ((ma_AudioUnitRender_proc)pDevice->pContext->coreaudio.AudioUnitRender)((AudioUnit)pDevice->coreaudio.audioUnitCapture, pActionFlags, pTimeStamp, busNumber, frameCount, pRenderedBufferList);\n    if (status != noErr) {\n    #if defined(MA_DEBUG_OUTPUT)\n        printf(\"  ERROR: AudioUnitRender() failed with %d\\n\", status);\n    #endif\n        return status;\n    }\n    \n    if (layout == ma_stream_layout_interleaved) {\n        UInt32 iBuffer;\n        for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; ++iBuffer) {\n            if (pRenderedBufferList->mBuffers[iBuffer].mNumberChannels == pDevice->capture.internalChannels) {\n                if (pDevice->type == ma_device_type_duplex) {\n                    ma_device__handle_duplex_callback_capture(pDevice, frameCount, pRenderedBufferList->mBuffers[iBuffer].mData, &pDevice->coreaudio.duplexRB);\n                } else {\n                    ma_device__send_frames_to_client(pDevice, frameCount, pRenderedBufferList->mBuffers[iBuffer].mData);\n                }\n            #if defined(MA_DEBUG_OUTPUT)\n                printf(\"  mDataByteSize=%d\\n\", pRenderedBufferList->mBuffers[iBuffer].mDataByteSize);\n            #endif\n            } else {\n                /*\n                This case is where the number of channels in the output buffer do not match our internal channels. It could mean that it's\n                not interleaved, in which case we can't handle right now since miniaudio does not yet support non-interleaved streams.\n                */\n                ma_uint8 silentBuffer[4096];\n                ma_uint32 framesRemaining;\n                \n                ma_zero_memory(silentBuffer, sizeof(silentBuffer));\n                \n                framesRemaining = frameCount;\n                while (framesRemaining > 0) {\n                    ma_uint32 framesToSend = sizeof(silentBuffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n                    if (framesToSend > framesRemaining) {\n                        framesToSend = framesRemaining;\n                    }\n                    \n                    if (pDevice->type == ma_device_type_duplex) {\n                        ma_device__handle_duplex_callback_capture(pDevice, framesToSend, silentBuffer, &pDevice->coreaudio.duplexRB);\n                    } else {\n                        ma_device__send_frames_to_client(pDevice, framesToSend, silentBuffer);\n                    }\n                    \n                    framesRemaining -= framesToSend;\n                }\n                \n            #if defined(MA_DEBUG_OUTPUT)\n                printf(\"  WARNING: Outputting silence. frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\\n\", frameCount, pRenderedBufferList->mBuffers[iBuffer].mNumberChannels, pRenderedBufferList->mBuffers[iBuffer].mDataByteSize);\n            #endif\n            }\n        }\n    } else {\n        /* This is the deinterleaved case. We need to interleave the audio data before sending it to the client. This assumes each buffer is the same size. */\n        ma_uint8 tempBuffer[4096];\n        UInt32 iBuffer;\n        for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; iBuffer += pDevice->capture.internalChannels) {\n            ma_uint32 framesRemaining = frameCount;\n            while (framesRemaining > 0) {\n                void* ppDeinterleavedBuffers[MA_MAX_CHANNELS];\n                ma_uint32 iChannel;\n                ma_uint32 framesToSend = sizeof(tempBuffer) / ma_get_bytes_per_sample(pDevice->capture.internalFormat);\n                if (framesToSend > framesRemaining) {\n                    framesToSend = framesRemaining;\n                }\n                \n                for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) {\n                    ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pRenderedBufferList->mBuffers[iBuffer].mData, (frameCount - framesRemaining) * ma_get_bytes_per_sample(pDevice->capture.internalFormat));\n                }\n                \n                ma_interleave_pcm_frames(pDevice->capture.internalFormat, pDevice->capture.internalChannels, framesToSend, (const void**)ppDeinterleavedBuffers, tempBuffer);\n\n                if (pDevice->type == ma_device_type_duplex) {\n                    ma_device__handle_duplex_callback_capture(pDevice, framesToSend, tempBuffer, &pDevice->coreaudio.duplexRB);\n                } else {\n                    ma_device__send_frames_to_client(pDevice, framesToSend, tempBuffer);\n                }\n\n                framesRemaining -= framesToSend;\n            }\n        }\n    }\n\n    (void)pActionFlags;\n    (void)pTimeStamp;\n    (void)busNumber;\n    (void)frameCount;\n    (void)pUnusedBufferList;\n\n    return noErr;\n}\n\nvoid on_start_stop__coreaudio(void* pUserData, AudioUnit audioUnit, AudioUnitPropertyID propertyID, AudioUnitScope scope, AudioUnitElement element)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n    \n    /*\n    There's been a report of a deadlock here when triggered by ma_device_uninit(). It looks like\n    AudioUnitGetProprty (called below) and AudioComponentInstanceDispose (called in ma_device_uninit)\n    can try waiting on the same lock. I'm going to try working around this by not calling any Core\n    Audio APIs in the callback when the device has been stopped or uninitialized.\n    */\n    if (ma_device__get_state(pDevice) == MA_STATE_UNINITIALIZED || ma_device__get_state(pDevice) == MA_STATE_STOPPING || ma_device__get_state(pDevice) == MA_STATE_STOPPED) {\n        ma_stop_proc onStop = pDevice->onStop;\n        if (onStop) {\n            onStop(pDevice);\n        }\n        \n        ma_event_signal(&pDevice->coreaudio.stopEvent);\n    } else {\n        UInt32 isRunning;\n        UInt32 isRunningSize = sizeof(isRunning);\n        OSStatus status = ((ma_AudioUnitGetProperty_proc)pDevice->pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioOutputUnitProperty_IsRunning, scope, element, &isRunning, &isRunningSize);\n        if (status != noErr) {\n            return; /* Don't really know what to do in this case... just ignore it, I suppose... */\n        }\n        \n        if (!isRunning) {\n            ma_stop_proc onStop;\n\n            /*\n            The stop event is a bit annoying in Core Audio because it will be called when we automatically switch the default device. Some scenarios to consider:\n            \n            1) When the device is unplugged, this will be called _before_ the default device change notification.\n            2) When the device is changed via the default device change notification, this will be called _after_ the switch.\n            \n            For case #1, we just check if there's a new default device available. If so, we just ignore the stop event. For case #2 we check a flag.\n            */\n            if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isDefaultPlaybackDevice) ||\n                ((audioUnit == pDevice->coreaudio.audioUnitCapture)  && pDevice->coreaudio.isDefaultCaptureDevice)) {\n                /*\n                It looks like the device is switching through an external event, such as the user unplugging the device or changing the default device\n                via the operating system's sound settings. If we're re-initializing the device, we just terminate because we want the stopping of the\n                device to be seamless to the client (we don't want them receiving the onStop event and thinking that the device has stopped when it\n                hasn't!).\n                */\n                if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isSwitchingPlaybackDevice) ||\n                    ((audioUnit == pDevice->coreaudio.audioUnitCapture)  && pDevice->coreaudio.isSwitchingCaptureDevice)) {\n                    return;\n                }\n                \n                /*\n                Getting here means the device is not reinitializing which means it may have been unplugged. From what I can see, it looks like Core Audio\n                will try switching to the new default device seamlessly. We need to somehow find a way to determine whether or not Core Audio will most\n                likely be successful in switching to the new device.\n                \n                TODO: Try to predict if Core Audio will switch devices. If not, the onStop callback needs to be posted.\n                */\n                return;\n            }\n            \n            /* Getting here means we need to stop the device. */\n            onStop = pDevice->onStop;\n            if (onStop) {\n                onStop(pDevice);\n            }\n        }\n    }\n\n    (void)propertyID; /* Unused. */\n}\n\n#if defined(MA_APPLE_DESKTOP)\nOSStatus ma_default_device_changed__coreaudio(AudioObjectID objectID, UInt32 addressCount, const AudioObjectPropertyAddress* pAddresses, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n    \n    /* Not sure if I really need to check this, but it makes me feel better. */\n    if (addressCount == 0) {\n        return noErr;\n    }\n    \n    if (pAddresses[0].mSelector == kAudioHardwarePropertyDefaultOutputDevice) {\n        ma_result reinitResult;\n\n        pDevice->coreaudio.isSwitchingPlaybackDevice = MA_TRUE;\n        reinitResult = ma_device_reinit_internal__coreaudio(pDevice, ma_device_type_playback, MA_TRUE);\n        pDevice->coreaudio.isSwitchingPlaybackDevice = MA_FALSE;\n        \n        if (reinitResult == MA_SUCCESS) {\n            ma_device__post_init_setup(pDevice, ma_device_type_playback);\n            \n            /* Restart the device if required. If this fails we need to stop the device entirely. */\n            if (ma_device__get_state(pDevice) == MA_STATE_STARTED) {\n                OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n                if (status != noErr) {\n                    if (pDevice->type == ma_device_type_duplex) {\n                        ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n                    }\n                    ma_device__set_state(pDevice, MA_STATE_STOPPED);\n                }\n            }\n        }\n    }\n    \n    if (pAddresses[0].mSelector == kAudioHardwarePropertyDefaultInputDevice) {\n        ma_result reinitResult;\n\n        pDevice->coreaudio.isSwitchingPlaybackDevice = MA_TRUE;\n        reinitResult = ma_device_reinit_internal__coreaudio(pDevice, ma_device_type_capture, MA_TRUE);\n        pDevice->coreaudio.isSwitchingPlaybackDevice = MA_FALSE;\n        \n        if (reinitResult == MA_SUCCESS) {\n            ma_device__post_init_setup(pDevice, ma_device_type_capture);\n            \n            /* Restart the device if required. If this fails we need to stop the device entirely. */\n            if (ma_device__get_state(pDevice) == MA_STATE_STARTED) {\n                OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n                if (status != noErr) {\n                    if (pDevice->type == ma_device_type_duplex) {\n                        ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n                    }\n                    ma_device__set_state(pDevice, MA_STATE_STOPPED);\n                }\n            }\n        }\n    }\n    \n    (void)objectID; /* Unused. */\n    return noErr;\n}\n#endif\n\ntypedef struct\n{\n    /* Input. */\n    ma_format formatIn;\n    ma_uint32 channelsIn;\n    ma_uint32 sampleRateIn;\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n    ma_uint32 bufferSizeInFramesIn;\n    ma_uint32 bufferSizeInMillisecondsIn;\n    ma_uint32 periodsIn;\n    ma_bool32 usingDefaultFormat;\n    ma_bool32 usingDefaultChannels;\n    ma_bool32 usingDefaultSampleRate;\n    ma_bool32 usingDefaultChannelMap;\n    ma_share_mode shareMode;\n    ma_bool32 registerStopEvent;\n\n    /* Output. */\n#if defined(MA_APPLE_DESKTOP)\n    AudioObjectID deviceObjectID;\n#endif\n    AudioComponent component;\n    AudioUnit audioUnit;\n    AudioBufferList* pAudioBufferList;  /* Only used for input devices. */\n    ma_format formatOut;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateOut;\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_uint32 bufferSizeInFramesOut;\n    ma_uint32 periodsOut;\n    char deviceName[256];\n} ma_device_init_internal_data__coreaudio;\n\nma_result ma_device_init_internal__coreaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_init_internal_data__coreaudio* pData, void* pDevice_DoNotReference)   /* <-- pDevice is typed as void* intentionally so as to avoid accidentally referencing it. */\n{\n    ma_result result;\n    OSStatus status;\n    UInt32 enableIOFlag;\n    AudioStreamBasicDescription bestFormat;\n    ma_uint32 actualBufferSizeInFrames;\n    AURenderCallbackStruct callbackInfo;\n#if defined(MA_APPLE_DESKTOP)\n    AudioObjectID deviceObjectID;\n#endif\n\n    /* This API should only be used for a single device type: playback or capture. No full-duplex mode. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_assert(pContext != NULL);\n    ma_assert(deviceType == ma_device_type_playback || deviceType == ma_device_type_capture);\n\n#if defined(MA_APPLE_DESKTOP)\n    pData->deviceObjectID = 0;\n#endif\n    pData->component = NULL;\n    pData->audioUnit = NULL;\n    pData->pAudioBufferList = NULL;\n    \n#if defined(MA_APPLE_DESKTOP)\n    result = ma_find_AudioObjectID(pContext, deviceType, pDeviceID, &deviceObjectID);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    pData->deviceObjectID = deviceObjectID;\n#endif\n    \n    /* Core audio doesn't really use the notion of a period so we can leave this unmodified, but not too over the top. */\n    pData->periodsOut = pData->periodsIn;\n    if (pData->periodsOut < 1) {\n        pData->periodsOut = 1;\n    }\n    if (pData->periodsOut > 16) {\n        pData->periodsOut = 16;\n    }\n    \n    \n    /* Audio unit. */\n    status = ((ma_AudioComponentInstanceNew_proc)pContext->coreaudio.AudioComponentInstanceNew)((AudioComponent)pContext->coreaudio.component, (AudioUnit*)&pData->audioUnit);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n    \n    \n    /* The input/output buses need to be explicitly enabled and disabled. We set the flag based on the output unit first, then we just swap it for input. */\n    enableIOFlag = 1;\n    if (deviceType == ma_device_type_capture) {\n        enableIOFlag = 0;\n    }\n    \n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, MA_COREAUDIO_OUTPUT_BUS, &enableIOFlag, sizeof(enableIOFlag));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    enableIOFlag = (enableIOFlag == 0) ? 1 : 0;\n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, MA_COREAUDIO_INPUT_BUS, &enableIOFlag, sizeof(enableIOFlag));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    \n    /* Set the device to use with this audio unit. This is only used on desktop since we are using defaults on mobile. */\n#if defined(MA_APPLE_DESKTOP)\n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS, &deviceObjectID, sizeof(AudioDeviceID));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(result);\n    }\n#endif\n    \n    /*\n    Format. This is the hardest part of initialization because there's a few variables to take into account.\n      1) The format must be supported by the device.\n      2) The format must be supported miniaudio.\n      3) There's a priority that miniaudio prefers.\n    \n    Ideally we would like to use a format that's as close to the hardware as possible so we can get as close to a passthrough as possible. The\n    most important property is the sample rate. miniaudio can do format conversion for any sample rate and channel count, but cannot do the same\n    for the sample data format. If the sample data format is not supported by miniaudio it must be ignored completely.\n    \n    On mobile platforms this is a bit different. We just force the use of whatever the audio unit's current format is set to.\n    */\n    {\n        AudioUnitScope   formatScope   = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output;\n        AudioUnitElement formatElement = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS;\n\n    #if defined(MA_APPLE_DESKTOP)\n        AudioStreamBasicDescription origFormat;\n        UInt32 origFormatSize;\n\n        result = ma_find_best_format__coreaudio(pContext, deviceObjectID, deviceType, pData->formatIn, pData->channelsIn, pData->sampleRateIn, pData->usingDefaultFormat, pData->usingDefaultChannels, pData->usingDefaultSampleRate, &bestFormat);\n        if (result != MA_SUCCESS) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return result;\n        }\n        \n        /* From what I can see, Apple's documentation implies that we should keep the sample rate consistent. */\n        origFormatSize = sizeof(origFormat);\n        if (deviceType == ma_device_type_playback) {\n            status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, MA_COREAUDIO_OUTPUT_BUS, &origFormat, &origFormatSize);\n        } else {\n            status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, MA_COREAUDIO_INPUT_BUS, &origFormat, &origFormatSize);\n        }\n        \n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return result;\n        }\n        \n        bestFormat.mSampleRate = origFormat.mSampleRate;\n        \n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, sizeof(bestFormat));\n        if (status != noErr) {\n            /* We failed to set the format, so fall back to the current format of the audio unit. */\n            bestFormat = origFormat;\n        }\n    #else\n        UInt32 propSize = sizeof(bestFormat);\n        status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, &propSize);\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n        \n        /*\n        Sample rate is a little different here because for some reason kAudioUnitProperty_StreamFormat returns 0... Oh well. We need to instead try\n        setting the sample rate to what the user has requested and then just see the results of it. Need to use some Objective-C here for this since\n        it depends on Apple's AVAudioSession API. To do this we just get the shared AVAudioSession instance and then set it. Note that from what I\n        can tell, it looks like the sample rate is shared between playback and capture for everything.\n        */\n        @autoreleasepool {\n            AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n            ma_assert(pAudioSession != NULL);\n            \n            [pAudioSession setPreferredSampleRate:(double)pData->sampleRateIn error:nil];\n            bestFormat.mSampleRate = pAudioSession.sampleRate;\n        }\n        \n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, sizeof(bestFormat));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    #endif\n        \n        result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &pData->formatOut);\n        if (result != MA_SUCCESS) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return result;\n        }\n        \n        if (pData->formatOut == ma_format_unknown) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n        \n        pData->channelsOut = bestFormat.mChannelsPerFrame;\n        pData->sampleRateOut = bestFormat.mSampleRate;\n    }\n    \n    /*\n    Internal channel map. This is weird in my testing. If I use the AudioObject to get the\n    channel map, the channel descriptions are set to \"Unknown\" for some reason. To work around\n    this it looks like retrieving it from the AudioUnit will work. However, and this is where\n    it gets weird, it doesn't seem to work with capture devices, nor at all on iOS... Therefore\n    I'm going to fall back to a default assumption in these cases.\n    */\n#if defined(MA_APPLE_DESKTOP)\n    result = ma_get_AudioUnit_channel_map(pContext, pData->audioUnit, deviceType, pData->channelMapOut);\n    if (result != MA_SUCCESS) {\n    #if 0\n        /* Try falling back to the channel map from the AudioObject. */\n        result = ma_get_AudioObject_channel_map(pContext, deviceObjectID, deviceType, pData->channelMapOut);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    #else\n        /* Fall back to default assumptions. */\n        ma_get_standard_channel_map(ma_standard_channel_map_default, pData->channelsOut, pData->channelMapOut);\n    #endif\n    }\n#else\n    /* TODO: Figure out how to get the channel map using AVAudioSession. */\n    ma_get_standard_channel_map(ma_standard_channel_map_default, pData->channelsOut, pData->channelMapOut);\n#endif\n    \n\n    /* Buffer size. Not allowing this to be configurable on iOS. */\n    actualBufferSizeInFrames = pData->bufferSizeInFramesIn;\n    \n#if defined(MA_APPLE_DESKTOP)\n    if (actualBufferSizeInFrames == 0) {\n        actualBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pData->bufferSizeInMillisecondsIn, pData->sampleRateOut);\n    }\n    \n    actualBufferSizeInFrames = actualBufferSizeInFrames / pData->periodsOut;\n    result = ma_set_AudioObject_buffer_size_in_frames(pContext, deviceObjectID, deviceType, &actualBufferSizeInFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    pData->bufferSizeInFramesOut = actualBufferSizeInFrames * pData->periodsOut;\n#else\n    actualBufferSizeInFrames = 4096;\n    pData->bufferSizeInFramesOut = actualBufferSizeInFrames;\n#endif\n\n\n    /*\n    During testing I discovered that the buffer size can be too big. You'll get an error like this:\n    \n      kAudioUnitErr_TooManyFramesToProcess : inFramesToProcess=4096, mMaxFramesPerSlice=512\n    \n    Note how inFramesToProcess is smaller than mMaxFramesPerSlice. To fix, we need to set kAudioUnitProperty_MaximumFramesPerSlice to that\n    of the size of our buffer, or do it the other way around and set our buffer size to the kAudioUnitProperty_MaximumFramesPerSlice.\n    */\n    {\n        /*AudioUnitScope propScope = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output;\n        AudioUnitElement propBus = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS;\n    \n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, propScope, propBus, &actualBufferSizeInFrames, sizeof(actualBufferSizeInFrames));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }*/\n        \n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &actualBufferSizeInFrames, sizeof(actualBufferSizeInFrames));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    /* We need a buffer list if this is an input device. We render into this in the input callback. */\n    if (deviceType == ma_device_type_capture) {\n        ma_bool32 isInterleaved = (bestFormat.mFormatFlags & kAudioFormatFlagIsNonInterleaved) == 0;\n        size_t allocationSize;\n        AudioBufferList* pBufferList;\n\n        allocationSize = sizeof(AudioBufferList) - sizeof(AudioBuffer);  /* Subtract sizeof(AudioBuffer) because that part is dynamically sized. */\n        if (isInterleaved) {\n            /* Interleaved case. This is the simple case because we just have one buffer. */\n            allocationSize += sizeof(AudioBuffer) * 1;\n            allocationSize += actualBufferSizeInFrames * ma_get_bytes_per_frame(pData->formatOut, pData->channelsOut);\n        } else {\n            /* Non-interleaved case. This is the more complex case because there's more than one buffer. */\n            allocationSize += sizeof(AudioBuffer) * pData->channelsOut;\n            allocationSize += actualBufferSizeInFrames * ma_get_bytes_per_sample(pData->formatOut) * pData->channelsOut;\n        }\n        \n        pBufferList = (AudioBufferList*)ma_malloc(allocationSize);\n        if (pBufferList == NULL) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return MA_OUT_OF_MEMORY;\n        }\n        \n        if (isInterleaved) {\n            pBufferList->mNumberBuffers = 1;\n            pBufferList->mBuffers[0].mNumberChannels = pData->channelsOut;\n            pBufferList->mBuffers[0].mDataByteSize = actualBufferSizeInFrames * ma_get_bytes_per_frame(pData->formatOut, pData->channelsOut);\n            pBufferList->mBuffers[0].mData = (ma_uint8*)pBufferList + sizeof(AudioBufferList);\n        } else {\n            ma_uint32 iBuffer;\n            pBufferList->mNumberBuffers = pData->channelsOut;\n            for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; ++iBuffer) {\n                pBufferList->mBuffers[iBuffer].mNumberChannels = 1;\n                pBufferList->mBuffers[iBuffer].mDataByteSize = actualBufferSizeInFrames * ma_get_bytes_per_sample(pData->formatOut);\n                pBufferList->mBuffers[iBuffer].mData = (ma_uint8*)pBufferList + ((sizeof(AudioBufferList) - sizeof(AudioBuffer)) + (sizeof(AudioBuffer) * pData->channelsOut)) + (actualBufferSizeInFrames * ma_get_bytes_per_sample(pData->formatOut) * iBuffer);\n            }\n        }\n        \n        pData->pAudioBufferList = pBufferList;\n    }\n    \n    /* Callbacks. */\n    callbackInfo.inputProcRefCon = pDevice_DoNotReference;\n    if (deviceType == ma_device_type_playback) {\n        callbackInfo.inputProc = ma_on_output__coreaudio;\n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, MA_COREAUDIO_OUTPUT_BUS, &callbackInfo, sizeof(callbackInfo));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    } else {\n        callbackInfo.inputProc = ma_on_input__coreaudio;\n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, MA_COREAUDIO_INPUT_BUS, &callbackInfo, sizeof(callbackInfo));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    /* We need to listen for stop events. */\n    if (pData->registerStopEvent) {\n        status = ((ma_AudioUnitAddPropertyListener_proc)pContext->coreaudio.AudioUnitAddPropertyListener)(pData->audioUnit, kAudioOutputUnitProperty_IsRunning, on_start_stop__coreaudio, pDevice_DoNotReference);\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    /* Initialize the audio unit. */\n    status = ((ma_AudioUnitInitialize_proc)pContext->coreaudio.AudioUnitInitialize)(pData->audioUnit);\n    if (status != noErr) {\n        ma_free(pData->pAudioBufferList);\n        pData->pAudioBufferList = NULL;\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n    \n    /* Grab the name. */\n#if defined(MA_APPLE_DESKTOP)\n    ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(pData->deviceName), pData->deviceName);\n#else\n    if (deviceType == ma_device_type_playback) {\n        ma_strcpy_s(pData->deviceName, sizeof(pData->deviceName), MA_DEFAULT_PLAYBACK_DEVICE_NAME);\n    } else {\n        ma_strcpy_s(pData->deviceName, sizeof(pData->deviceName), MA_DEFAULT_CAPTURE_DEVICE_NAME);\n    }\n#endif\n    \n    return result;\n}\n\nma_result ma_device_reinit_internal__coreaudio(ma_device* pDevice, ma_device_type deviceType, ma_bool32 disposePreviousAudioUnit)\n{\n    ma_device_init_internal_data__coreaudio data;\n    ma_result result;\n\n    /* This should only be called for playback or capture, not duplex. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        data.formatIn               = pDevice->capture.format;\n        data.channelsIn             = pDevice->capture.channels;\n        data.sampleRateIn           = pDevice->sampleRate;\n        ma_copy_memory(data.channelMapIn, pDevice->capture.channelMap, sizeof(pDevice->capture.channelMap));\n        data.usingDefaultFormat     = pDevice->capture.usingDefaultFormat;\n        data.usingDefaultChannels   = pDevice->capture.usingDefaultChannels;\n        data.usingDefaultSampleRate = pDevice->usingDefaultSampleRate;\n        data.usingDefaultChannelMap = pDevice->capture.usingDefaultChannelMap;\n        data.shareMode              = pDevice->capture.shareMode;\n        data.registerStopEvent      = MA_TRUE;\n        \n        if (disposePreviousAudioUnit) {\n            ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n            ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n        }\n        if (pDevice->coreaudio.pAudioBufferList) {\n            ma_free(pDevice->coreaudio.pAudioBufferList);\n        }\n        \n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDCapture = (ma_uint32)data.deviceObjectID;\n    #endif\n        pDevice->coreaudio.audioUnitCapture = (ma_ptr)data.audioUnit;\n        pDevice->coreaudio.pAudioBufferList = (ma_ptr)data.pAudioBufferList;\n    }\n    if (deviceType == ma_device_type_playback) {\n        data.formatIn               = pDevice->playback.format;\n        data.channelsIn             = pDevice->playback.channels;\n        data.sampleRateIn           = pDevice->sampleRate;\n        ma_copy_memory(data.channelMapIn, pDevice->playback.channelMap, sizeof(pDevice->playback.channelMap));\n        data.usingDefaultFormat     = pDevice->playback.usingDefaultFormat;\n        data.usingDefaultChannels   = pDevice->playback.usingDefaultChannels;\n        data.usingDefaultSampleRate = pDevice->usingDefaultSampleRate;\n        data.usingDefaultChannelMap = pDevice->playback.usingDefaultChannelMap;\n        data.shareMode              = pDevice->playback.shareMode;\n        data.registerStopEvent      = (pDevice->type != ma_device_type_duplex);\n        \n        if (disposePreviousAudioUnit) {\n            ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n            ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n        }\n        \n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDPlayback = (ma_uint32)data.deviceObjectID;\n    #endif\n        pDevice->coreaudio.audioUnitPlayback = (ma_ptr)data.audioUnit;\n    }\n    data.bufferSizeInFramesIn       = pDevice->coreaudio.originalBufferSizeInFrames;\n    data.bufferSizeInMillisecondsIn = pDevice->coreaudio.originalBufferSizeInMilliseconds;\n    data.periodsIn                  = pDevice->coreaudio.originalPeriods;\n\n    result = ma_device_init_internal__coreaudio(pDevice->pContext, deviceType, NULL, &data, (void*)pDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    \n    return MA_SUCCESS;\n}\n\n\nma_result ma_device_init__coreaudio(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pConfig != NULL);\n    ma_assert(pDevice != NULL);\n\n    /* No exclusive mode with the Core Audio backend for now. */\n    if (((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n    \n    /* Capture needs to be initialized first. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__coreaudio data;\n        data.formatIn                   = pConfig->capture.format;\n        data.channelsIn                 = pConfig->capture.channels;\n        data.sampleRateIn               = pConfig->sampleRate;\n        ma_copy_memory(data.channelMapIn, pConfig->capture.channelMap, sizeof(pConfig->capture.channelMap));\n        data.usingDefaultFormat         = pDevice->capture.usingDefaultFormat;\n        data.usingDefaultChannels       = pDevice->capture.usingDefaultChannels;\n        data.usingDefaultSampleRate     = pDevice->usingDefaultSampleRate;\n        data.usingDefaultChannelMap     = pDevice->capture.usingDefaultChannelMap;\n        data.shareMode                  = pConfig->capture.shareMode;\n        data.bufferSizeInFramesIn       = pConfig->bufferSizeInFrames;\n        data.bufferSizeInMillisecondsIn = pConfig->bufferSizeInMilliseconds;\n        data.registerStopEvent          = MA_TRUE;\n        \n        result = ma_device_init_internal__coreaudio(pDevice->pContext, ma_device_type_capture, pConfig->capture.pDeviceID, &data, (void*)pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n        \n        pDevice->coreaudio.isDefaultCaptureDevice   = (pConfig->capture.pDeviceID == NULL);\n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDCapture    = (ma_uint32)data.deviceObjectID;\n    #endif\n        pDevice->coreaudio.audioUnitCapture         = (ma_ptr)data.audioUnit;\n        pDevice->coreaudio.pAudioBufferList         = (ma_ptr)data.pAudioBufferList;\n        \n        pDevice->capture.internalFormat             = data.formatOut;\n        pDevice->capture.internalChannels           = data.channelsOut;\n        pDevice->capture.internalSampleRate         = data.sampleRateOut;\n        ma_copy_memory(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->capture.internalBufferSizeInFrames = data.bufferSizeInFramesOut;\n        pDevice->capture.internalPeriods            = data.periodsOut;\n        \n        /* TODO: This needs to be made global. */\n    #if defined(MA_APPLE_DESKTOP)\n        /*\n        If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly\n        switch the device in the background.\n        */\n        if (pConfig->capture.pDeviceID == NULL) {\n            AudioObjectPropertyAddress propAddress;\n            propAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice;\n            propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n            propAddress.mElement  = kAudioObjectPropertyElementMaster;\n            ((ma_AudioObjectAddPropertyListener_proc)pDevice->pContext->coreaudio.AudioObjectAddPropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, pDevice);\n        }\n    #endif\n    }\n    \n    /* Playback. */\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__coreaudio data;\n        data.formatIn                   = pConfig->playback.format;\n        data.channelsIn                 = pConfig->playback.channels;\n        data.sampleRateIn               = pConfig->sampleRate;\n        ma_copy_memory(data.channelMapIn, pConfig->playback.channelMap, sizeof(pConfig->playback.channelMap));\n        data.usingDefaultFormat         = pDevice->playback.usingDefaultFormat;\n        data.usingDefaultChannels       = pDevice->playback.usingDefaultChannels;\n        data.usingDefaultSampleRate     = pDevice->usingDefaultSampleRate;\n        data.usingDefaultChannelMap     = pDevice->playback.usingDefaultChannelMap;\n        data.shareMode                  = pConfig->playback.shareMode;\n        \n        /* In full-duplex mode we want the playback buffer to be the same size as the capture buffer. */\n        if (pConfig->deviceType == ma_device_type_duplex) {\n            data.bufferSizeInFramesIn       = pDevice->capture.internalBufferSizeInFrames;\n            data.periodsIn                  = pDevice->capture.internalPeriods;\n            data.registerStopEvent          = MA_FALSE;\n        } else {\n            data.bufferSizeInFramesIn       = pConfig->bufferSizeInFrames;\n            data.bufferSizeInMillisecondsIn = pConfig->bufferSizeInMilliseconds;\n            data.periodsIn                  = pConfig->periods;\n            data.registerStopEvent          = MA_TRUE;\n        }\n        \n        result = ma_device_init_internal__coreaudio(pDevice->pContext, ma_device_type_playback, pConfig->playback.pDeviceID, &data, (void*)pDevice);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n                if (pDevice->coreaudio.pAudioBufferList) {\n                    ma_free(pDevice->coreaudio.pAudioBufferList);\n                }\n            }\n            return result;\n        }\n        \n        pDevice->coreaudio.isDefaultPlaybackDevice   = (pConfig->playback.pDeviceID == NULL);\n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDPlayback    = (ma_uint32)data.deviceObjectID;\n    #endif\n        pDevice->coreaudio.audioUnitPlayback         = (ma_ptr)data.audioUnit;\n        \n        pDevice->playback.internalFormat             = data.formatOut;\n        pDevice->playback.internalChannels           = data.channelsOut;\n        pDevice->playback.internalSampleRate         = data.sampleRateOut;\n        ma_copy_memory(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->playback.internalBufferSizeInFrames = data.bufferSizeInFramesOut;\n        pDevice->playback.internalPeriods            = data.periodsOut;\n        \n        /* TODO: This needs to be made global. */\n    #if defined(MA_APPLE_DESKTOP)\n        /*\n        If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly\n        switch the device in the background.\n        */\n        if (pConfig->playback.pDeviceID == NULL) {\n            AudioObjectPropertyAddress propAddress;\n            propAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;\n            propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n            propAddress.mElement  = kAudioObjectPropertyElementMaster;\n            ((ma_AudioObjectAddPropertyListener_proc)pDevice->pContext->coreaudio.AudioObjectAddPropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, pDevice);\n        }\n    #endif\n    }\n    \n    pDevice->coreaudio.originalBufferSizeInFrames       = pConfig->bufferSizeInFrames;\n    pDevice->coreaudio.originalBufferSizeInMilliseconds = pConfig->bufferSizeInMilliseconds;\n    pDevice->coreaudio.originalPeriods                  = pConfig->periods;\n    \n    /*\n    When stopping the device, a callback is called on another thread. We need to wait for this callback\n    before returning from ma_device_stop(). This event is used for this.\n    */\n    ma_event_init(pContext, &pDevice->coreaudio.stopEvent);\n\n    /* Need a ring buffer for duplex mode. */\n    if (pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 rbSizeInFrames = (ma_uint32)ma_calculate_frame_count_after_src(pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalBufferSizeInFrames);\n        ma_result result = ma_pcm_rb_init(pDevice->capture.format, pDevice->capture.channels, rbSizeInFrames, NULL, &pDevice->coreaudio.duplexRB);\n        if (result != MA_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[Core Audio] Failed to initialize ring buffer.\", result);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_device_start__coreaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n    \n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n        if (status != noErr) {\n            if (pDevice->type == ma_device_type_duplex) {\n                ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n            }\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__coreaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n    \n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    }\n    \n    /* We need to wait for the callback to finish before returning. */\n    ma_event_wait(&pDevice->coreaudio.stopEvent);\n    return MA_SUCCESS;\n}\n\n\nma_result ma_context_uninit__coreaudio(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_coreaudio);\n    \n#if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n    ma_dlclose(pContext, pContext->coreaudio.hAudioUnit);\n    ma_dlclose(pContext, pContext->coreaudio.hCoreAudio);\n    ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation);\n#endif\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__coreaudio(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n#if defined(MA_APPLE_MOBILE)\n    @autoreleasepool {\n        AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n        ma_assert(pAudioSession != NULL);\n\n        [pAudioSession setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];\n        \n        /* By default we want miniaudio to use the speakers instead of the receiver. In the future this may be customizable. */\n        ma_bool32 useSpeakers = MA_TRUE;\n        if (useSpeakers) {\n            [pAudioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];\n        }\n    }\n#endif\n    \n#if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n    pContext->coreaudio.hCoreFoundation = ma_dlopen(pContext, \"CoreFoundation.framework/CoreFoundation\");\n    if (pContext->coreaudio.hCoreFoundation == NULL) {\n        return MA_API_NOT_FOUND;\n    }\n    \n    pContext->coreaudio.CFStringGetCString             = ma_dlsym(pContext, pContext->coreaudio.hCoreFoundation, \"CFStringGetCString\");\n    \n    \n    pContext->coreaudio.hCoreAudio = ma_dlopen(pContext, \"CoreAudio.framework/CoreAudio\");\n    if (pContext->coreaudio.hCoreAudio == NULL) {\n        ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation);\n        return MA_API_NOT_FOUND;\n    }\n    \n    pContext->coreaudio.AudioObjectGetPropertyData     = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, \"AudioObjectGetPropertyData\");\n    pContext->coreaudio.AudioObjectGetPropertyDataSize = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, \"AudioObjectGetPropertyDataSize\");\n    pContext->coreaudio.AudioObjectSetPropertyData     = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, \"AudioObjectSetPropertyData\");\n    pContext->coreaudio.AudioObjectAddPropertyListener = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, \"AudioObjectAddPropertyListener\");\n\n    /*\n    It looks like Apple has moved some APIs from AudioUnit into AudioToolbox on more recent versions of macOS. They are still\n    defined in AudioUnit, but just in case they decide to remove them from there entirely I'm going to implement a fallback.\n    The way it'll work is that it'll first try AudioUnit, and if the required symbols are not present there we'll fall back to\n    AudioToolbox.\n    */\n    pContext->coreaudio.hAudioUnit = ma_dlopen(pContext, \"AudioUnit.framework/AudioUnit\");\n    if (pContext->coreaudio.hAudioUnit == NULL) {\n        ma_dlclose(pContext, pContext->coreaudio.hCoreAudio);\n        ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation);\n        return MA_API_NOT_FOUND;\n    }\n    \n    if (ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioComponentFindNext\") == NULL) {\n        /* Couldn't find the required symbols in AudioUnit, so fall back to AudioToolbox. */\n        ma_dlclose(pContext, pContext->coreaudio.hAudioUnit);\n        pContext->coreaudio.hAudioUnit = ma_dlopen(pContext, \"AudioToolbox.framework/AudioToolbox\");\n        if (pContext->coreaudio.hAudioUnit == NULL) {\n            ma_dlclose(pContext, pContext->coreaudio.hCoreAudio);\n            ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation);\n            return MA_API_NOT_FOUND;\n        }\n    }\n    \n    pContext->coreaudio.AudioComponentFindNext         = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioComponentFindNext\");\n    pContext->coreaudio.AudioComponentInstanceDispose  = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioComponentInstanceDispose\");\n    pContext->coreaudio.AudioComponentInstanceNew      = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioComponentInstanceNew\");\n    pContext->coreaudio.AudioOutputUnitStart           = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioOutputUnitStart\");\n    pContext->coreaudio.AudioOutputUnitStop            = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioOutputUnitStop\");\n    pContext->coreaudio.AudioUnitAddPropertyListener   = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioUnitAddPropertyListener\");\n    pContext->coreaudio.AudioUnitGetPropertyInfo       = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioUnitGetPropertyInfo\");\n    pContext->coreaudio.AudioUnitGetProperty           = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioUnitGetProperty\");\n    pContext->coreaudio.AudioUnitSetProperty           = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioUnitSetProperty\");\n    pContext->coreaudio.AudioUnitInitialize            = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioUnitInitialize\");\n    pContext->coreaudio.AudioUnitRender                = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, \"AudioUnitRender\");\n#else\n    pContext->coreaudio.CFStringGetCString             = (ma_proc)CFStringGetCString;\n    \n    #if defined(MA_APPLE_DESKTOP)\n    pContext->coreaudio.AudioObjectGetPropertyData     = (ma_proc)AudioObjectGetPropertyData;\n    pContext->coreaudio.AudioObjectGetPropertyDataSize = (ma_proc)AudioObjectGetPropertyDataSize;\n    pContext->coreaudio.AudioObjectSetPropertyData     = (ma_proc)AudioObjectSetPropertyData;\n    pContext->coreaudio.AudioObjectAddPropertyListener = (ma_proc)AudioObjectAddPropertyListener;\n    #endif\n    \n    pContext->coreaudio.AudioComponentFindNext         = (ma_proc)AudioComponentFindNext;\n    pContext->coreaudio.AudioComponentInstanceDispose  = (ma_proc)AudioComponentInstanceDispose;\n    pContext->coreaudio.AudioComponentInstanceNew      = (ma_proc)AudioComponentInstanceNew;\n    pContext->coreaudio.AudioOutputUnitStart           = (ma_proc)AudioOutputUnitStart;\n    pContext->coreaudio.AudioOutputUnitStop            = (ma_proc)AudioOutputUnitStop;\n    pContext->coreaudio.AudioUnitAddPropertyListener   = (ma_proc)AudioUnitAddPropertyListener;\n    pContext->coreaudio.AudioUnitGetPropertyInfo       = (ma_proc)AudioUnitGetPropertyInfo;\n    pContext->coreaudio.AudioUnitGetProperty           = (ma_proc)AudioUnitGetProperty;\n    pContext->coreaudio.AudioUnitSetProperty           = (ma_proc)AudioUnitSetProperty;\n    pContext->coreaudio.AudioUnitInitialize            = (ma_proc)AudioUnitInitialize;\n    pContext->coreaudio.AudioUnitRender                = (ma_proc)AudioUnitRender;\n#endif\n\n    pContext->isBackendAsynchronous = MA_TRUE;\n    \n    pContext->onUninit        = ma_context_uninit__coreaudio;\n    pContext->onDeviceIDEqual = ma_context_is_device_id_equal__coreaudio;\n    pContext->onEnumDevices   = ma_context_enumerate_devices__coreaudio;\n    pContext->onGetDeviceInfo = ma_context_get_device_info__coreaudio;\n    pContext->onDeviceInit    = ma_device_init__coreaudio;\n    pContext->onDeviceUninit  = ma_device_uninit__coreaudio;\n    pContext->onDeviceStart   = ma_device_start__coreaudio;\n    pContext->onDeviceStop    = ma_device_stop__coreaudio;\n    \n    /* Audio component. */\n    {\n        AudioComponentDescription desc;\n        desc.componentType         = kAudioUnitType_Output;\n    #if defined(MA_APPLE_DESKTOP)\n        desc.componentSubType      = kAudioUnitSubType_HALOutput;\n    #else\n        desc.componentSubType      = kAudioUnitSubType_RemoteIO;\n    #endif\n        desc.componentManufacturer = kAudioUnitManufacturer_Apple;\n        desc.componentFlags        = 0;\n        desc.componentFlagsMask    = 0;\n    \n        pContext->coreaudio.component = ((ma_AudioComponentFindNext_proc)pContext->coreaudio.AudioComponentFindNext)(NULL, &desc);\n        if (pContext->coreaudio.component == NULL) {\n    #if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n            ma_dlclose(pContext, pContext->coreaudio.hAudioUnit);\n            ma_dlclose(pContext, pContext->coreaudio.hCoreAudio);\n            ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation);\n    #endif\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n#endif  /* Core Audio */\n\n\n\n/******************************************************************************\n\nsndio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_SNDIO\n#include <fcntl.h>\n#include <sys/stat.h>\n\n/*\nOnly supporting OpenBSD. This did not work very well at all on FreeBSD when I tried it. Not sure if this is due\nto miniaudio's implementation or if it's some kind of system configuration issue, but basically the default device\njust doesn't emit any sound, or at times you'll hear tiny pieces. I will consider enabling this when there's\ndemand for it or if I can get it tested and debugged more thoroughly.\n*/\n#if 0\n#if defined(__NetBSD__) || defined(__OpenBSD__)\n#include <sys/audioio.h>\n#endif\n#if defined(__FreeBSD__) || defined(__DragonFly__)\n#include <sys/soundcard.h>\n#endif\n#endif\n\n#define MA_SIO_DEVANY   \"default\"\n#define MA_SIO_PLAY     1\n#define MA_SIO_REC      2\n#define MA_SIO_NENC     8\n#define MA_SIO_NCHAN    8\n#define MA_SIO_NRATE    16\n#define MA_SIO_NCONF    4\n\nstruct ma_sio_hdl; /* <-- Opaque */\n\nstruct ma_sio_par\n{\n    unsigned int bits;\n    unsigned int bps;\n    unsigned int sig;\n    unsigned int le;\n    unsigned int msb;\n    unsigned int rchan;\n    unsigned int pchan;\n    unsigned int rate;\n    unsigned int bufsz;\n    unsigned int xrun;\n    unsigned int round;\n    unsigned int appbufsz;\n    int __pad[3];\n    unsigned int __magic;\n};\n\nstruct ma_sio_enc\n{\n    unsigned int bits;\n    unsigned int bps;\n    unsigned int sig;\n    unsigned int le;\n    unsigned int msb;\n};\n\nstruct ma_sio_conf\n{\n    unsigned int enc;\n    unsigned int rchan;\n    unsigned int pchan;\n    unsigned int rate;\n};\n\nstruct ma_sio_cap\n{\n    struct ma_sio_enc enc[MA_SIO_NENC];\n    unsigned int rchan[MA_SIO_NCHAN];\n    unsigned int pchan[MA_SIO_NCHAN];\n    unsigned int rate[MA_SIO_NRATE];\n    int __pad[7];\n    unsigned int nconf;\n    struct ma_sio_conf confs[MA_SIO_NCONF];\n};\n\ntypedef struct ma_sio_hdl* (* ma_sio_open_proc)   (const char*, unsigned int, int);\ntypedef void               (* ma_sio_close_proc)  (struct ma_sio_hdl*);\ntypedef int                (* ma_sio_setpar_proc) (struct ma_sio_hdl*, struct ma_sio_par*);\ntypedef int                (* ma_sio_getpar_proc) (struct ma_sio_hdl*, struct ma_sio_par*);\ntypedef int                (* ma_sio_getcap_proc) (struct ma_sio_hdl*, struct ma_sio_cap*);\ntypedef size_t             (* ma_sio_write_proc)  (struct ma_sio_hdl*, const void*, size_t);\ntypedef size_t             (* ma_sio_read_proc)   (struct ma_sio_hdl*, void*, size_t);\ntypedef int                (* ma_sio_start_proc)  (struct ma_sio_hdl*);\ntypedef int                (* ma_sio_stop_proc)   (struct ma_sio_hdl*);\ntypedef int                (* ma_sio_initpar_proc)(struct ma_sio_par*);\n\nma_format ma_format_from_sio_enc__sndio(unsigned int bits, unsigned int bps, unsigned int sig, unsigned int le, unsigned int msb)\n{\n    /* We only support native-endian right now. */\n    if ((ma_is_little_endian() && le == 0) || (ma_is_big_endian() && le == 1)) {\n        return ma_format_unknown;\n    }\n    \n    if (bits ==  8 && bps == 1 && sig == 0) {\n        return ma_format_u8;\n    }\n    if (bits == 16 && bps == 2 && sig == 1) {\n        return ma_format_s16;\n    }\n    if (bits == 24 && bps == 3 && sig == 1) {\n        return ma_format_s24;\n    }\n    if (bits == 24 && bps == 4 && sig == 1 && msb == 0) {\n        /*return ma_format_s24_32;*/\n    }\n    if (bits == 32 && bps == 4 && sig == 1) {\n        return ma_format_s32;\n    }\n    \n    return ma_format_unknown;\n}\n\nma_format ma_find_best_format_from_sio_cap__sndio(struct ma_sio_cap* caps)\n{\n    ma_format bestFormat;\n    unsigned int iConfig;\n\n    ma_assert(caps != NULL);\n    \n    bestFormat = ma_format_unknown;\n    for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) {\n        unsigned int iEncoding;\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n            \n            bits = caps->enc[iEncoding].bits;\n            bps  = caps->enc[iEncoding].bps;\n            sig  = caps->enc[iEncoding].sig;\n            le   = caps->enc[iEncoding].le;\n            msb  = caps->enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format == ma_format_unknown) {\n                continue;   /* Format not supported. */\n            }\n            \n            if (bestFormat == ma_format_unknown) {\n                bestFormat = format;\n            } else {\n                if (ma_get_format_priority_index(bestFormat) > ma_get_format_priority_index(format)) {    /* <-- Lower = better. */\n                    bestFormat = format;\n                }\n            }\n        }\n    }\n    \n    return ma_format_unknown;\n}\n\nma_uint32 ma_find_best_channels_from_sio_cap__sndio(struct ma_sio_cap* caps, ma_device_type deviceType, ma_format requiredFormat)\n{\n    ma_uint32 maxChannels;\n    unsigned int iConfig;\n\n    ma_assert(caps != NULL);\n    ma_assert(requiredFormat != ma_format_unknown);\n    \n    /* Just pick whatever configuration has the most channels. */\n    maxChannels = 0;\n    for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) {\n        /* The encoding should be of requiredFormat. */\n        unsigned int iEncoding;\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int iChannel;\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n            \n            bits = caps->enc[iEncoding].bits;\n            bps  = caps->enc[iEncoding].bps;\n            sig  = caps->enc[iEncoding].sig;\n            le   = caps->enc[iEncoding].le;\n            msb  = caps->enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format != requiredFormat) {\n                continue;\n            }\n            \n            /* Getting here means the format is supported. Iterate over each channel count and grab the biggest one. */\n            for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) {\n                unsigned int chan = 0;\n                unsigned int channels;\n\n                if (deviceType == ma_device_type_playback) {\n                    chan = caps->confs[iConfig].pchan;\n                } else {\n                    chan = caps->confs[iConfig].rchan;\n                }\n            \n                if ((chan & (1UL << iChannel)) == 0) {\n                    continue;\n                }\n                \n                if (deviceType == ma_device_type_playback) {\n                    channels = caps->pchan[iChannel];\n                } else {\n                    channels = caps->rchan[iChannel];\n                }\n                \n                if (maxChannels < channels) {\n                    maxChannels = channels;\n                }\n            }\n        }\n    }\n    \n    return maxChannels;\n}\n\nma_uint32 ma_find_best_sample_rate_from_sio_cap__sndio(struct ma_sio_cap* caps, ma_device_type deviceType, ma_format requiredFormat, ma_uint32 requiredChannels)\n{\n    ma_uint32 firstSampleRate;\n    ma_uint32 bestSampleRate;\n    unsigned int iConfig;\n\n    ma_assert(caps != NULL);\n    ma_assert(requiredFormat != ma_format_unknown);\n    ma_assert(requiredChannels > 0);\n    ma_assert(requiredChannels <= MA_MAX_CHANNELS);\n    \n    firstSampleRate = 0; /* <-- If the device does not support a standard rate we'll fall back to the first one that's found. */\n    bestSampleRate  = 0;\n\n    for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) {\n        /* The encoding should be of requiredFormat. */\n        unsigned int iEncoding;\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int iChannel;\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n            \n            bits = caps->enc[iEncoding].bits;\n            bps  = caps->enc[iEncoding].bps;\n            sig  = caps->enc[iEncoding].sig;\n            le   = caps->enc[iEncoding].le;\n            msb  = caps->enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format != requiredFormat) {\n                continue;\n            }\n            \n            /* Getting here means the format is supported. Iterate over each channel count and grab the biggest one. */\n            for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) {\n                unsigned int chan = 0;\n                unsigned int channels;\n                unsigned int iRate;\n\n                if (deviceType == ma_device_type_playback) {\n                    chan = caps->confs[iConfig].pchan;\n                } else {\n                    chan = caps->confs[iConfig].rchan;\n                }\n            \n                if ((chan & (1UL << iChannel)) == 0) {\n                    continue;\n                }\n                \n                if (deviceType == ma_device_type_playback) {\n                    channels = caps->pchan[iChannel];\n                } else {\n                    channels = caps->rchan[iChannel];\n                }\n                \n                if (channels != requiredChannels) {\n                    continue;\n                }\n                \n                /* Getting here means we have found a compatible encoding/channel pair. */\n                for (iRate = 0; iRate < MA_SIO_NRATE; iRate += 1) {\n                    ma_uint32 rate = (ma_uint32)caps->rate[iRate];\n                    ma_uint32 ratePriority;\n                \n                    if (firstSampleRate == 0) {\n                        firstSampleRate = rate;\n                    }\n                    \n                    /* Disregard this rate if it's not a standard one. */\n                    ratePriority = ma_get_standard_sample_rate_priority_index(rate);\n                    if (ratePriority == (ma_uint32)-1) {\n                        continue;\n                    }\n                    \n                    if (ma_get_standard_sample_rate_priority_index(bestSampleRate) > ratePriority) {   /* Lower = better. */\n                        bestSampleRate = rate;\n                    }\n                }\n            }\n        }\n    }\n    \n    /* If a standard sample rate was not found just fall back to the first one that was iterated. */\n    if (bestSampleRate == 0) {\n        bestSampleRate = firstSampleRate;\n    }\n    \n    return bestSampleRate;\n}\n\n\nma_bool32 ma_context_is_device_id_equal__sndio(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return ma_strcmp(pID0->sndio, pID1->sndio) == 0;\n}\n\nma_result ma_context_enumerate_devices__sndio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 isTerminating = MA_FALSE;\n    struct ma_sio_hdl* handle;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n    \n    /* sndio doesn't seem to have a good device enumeration API, so I'm therefore only enumerating over default devices for now. */\n    \n    /* Playback. */\n    if (!isTerminating) {\n        handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(MA_SIO_DEVANY, MA_SIO_PLAY, 0);\n        if (handle != NULL) {\n            /* Supports playback. */\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            ma_strcpy_s(deviceInfo.id.sndio, sizeof(deviceInfo.id.sndio), MA_SIO_DEVANY);\n            ma_strcpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME);\n            \n            isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n            \n            ((ma_sio_close_proc)pContext->sndio.sio_close)(handle);\n        }\n    }\n    \n    /* Capture. */\n    if (!isTerminating) {\n        handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(MA_SIO_DEVANY, MA_SIO_REC, 0);\n        if (handle != NULL) {\n            /* Supports capture. */\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            ma_strcpy_s(deviceInfo.id.sndio, sizeof(deviceInfo.id.sndio), \"default\");\n            ma_strcpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME);\n\n            isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n            \n            ((ma_sio_close_proc)pContext->sndio.sio_close)(handle);\n        }\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__sndio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    char devid[256];\n    struct ma_sio_hdl* handle;\n    struct ma_sio_cap caps;\n    unsigned int iConfig;\n\n    ma_assert(pContext != NULL);\n    (void)shareMode;\n    \n    /* We need to open the device before we can get information about it. */\n    if (pDeviceID == NULL) {\n        ma_strcpy_s(devid, sizeof(devid), MA_SIO_DEVANY);\n        ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (deviceType == ma_device_type_playback) ? MA_DEFAULT_PLAYBACK_DEVICE_NAME : MA_DEFAULT_CAPTURE_DEVICE_NAME);\n    } else {\n        ma_strcpy_s(devid, sizeof(devid), pDeviceID->sndio);\n        ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), devid);\n    }\n    \n    handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(devid, (deviceType == ma_device_type_playback) ? MA_SIO_PLAY : MA_SIO_REC, 0);\n    if (handle == NULL) {\n        return MA_NO_DEVICE;\n    }\n    \n    if (((ma_sio_getcap_proc)pContext->sndio.sio_getcap)(handle, &caps) == 0) {\n        return MA_ERROR;\n    }\n    \n    for (iConfig = 0; iConfig < caps.nconf; iConfig += 1) {\n        /*\n        The main thing we care about is that the encoding is supported by miniaudio. If it is, we want to give\n        preference to some formats over others.\n        */\n        unsigned int iEncoding;\n        unsigned int iChannel;\n        unsigned int iRate;\n\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n            ma_bool32 formatExists = MA_FALSE;\n            ma_uint32 iExistingFormat;\n\n            if ((caps.confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n            \n            bits = caps.enc[iEncoding].bits;\n            bps  = caps.enc[iEncoding].bps;\n            sig  = caps.enc[iEncoding].sig;\n            le   = caps.enc[iEncoding].le;\n            msb  = caps.enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format == ma_format_unknown) {\n                continue;   /* Format not supported. */\n            }\n            \n            /* Add this format if it doesn't already exist. */\n            for (iExistingFormat = 0; iExistingFormat < pDeviceInfo->formatCount; iExistingFormat += 1) {\n                if (pDeviceInfo->formats[iExistingFormat] == format) {\n                    formatExists = MA_TRUE;\n                    break;\n                }\n            }\n            \n            if (!formatExists) {\n                pDeviceInfo->formats[pDeviceInfo->formatCount++] = format;\n            }\n        }\n        \n        /* Channels. */\n        for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) {\n            unsigned int chan = 0;\n            unsigned int channels;\n\n            if (deviceType == ma_device_type_playback) {\n                chan = caps.confs[iConfig].pchan;\n            } else {\n                chan = caps.confs[iConfig].rchan;\n            }\n        \n            if ((chan & (1UL << iChannel)) == 0) {\n                continue;\n            }\n            \n            if (deviceType == ma_device_type_playback) {\n                channels = caps.pchan[iChannel];\n            } else {\n                channels = caps.rchan[iChannel];\n            }\n            \n            if (pDeviceInfo->minChannels > channels) {\n                pDeviceInfo->minChannels = channels;\n            }\n            if (pDeviceInfo->maxChannels < channels) {\n                pDeviceInfo->maxChannels = channels;\n            }\n        }\n        \n        /* Sample rates. */\n        for (iRate = 0; iRate < MA_SIO_NRATE; iRate += 1) {\n            if ((caps.confs[iConfig].rate & (1UL << iRate)) != 0) {\n                unsigned int rate = caps.rate[iRate];\n                if (pDeviceInfo->minSampleRate > rate) {\n                    pDeviceInfo->minSampleRate = rate;\n                }\n                if (pDeviceInfo->maxSampleRate < rate) {\n                    pDeviceInfo->maxSampleRate = rate;\n                }\n            }\n        }\n    }\n\n    ((ma_sio_close_proc)pContext->sndio.sio_close)(handle);\n    return MA_SUCCESS;\n}\n\nvoid ma_device_uninit__sndio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)pDevice->sndio.handleCapture);\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback);\n    }\n}\n\nma_result ma_device_init_handle__sndio(ma_context* pContext, const ma_device_config* pConfig, ma_device_type deviceType, ma_device* pDevice)\n{\n    const char* pDeviceName;\n    ma_ptr handle;\n    int openFlags = 0;\n    struct ma_sio_cap caps;\n    struct ma_sio_par par;\n    ma_device_id* pDeviceID;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_uint32 internalBufferSizeInFrames;\n    ma_uint32 internalPeriods;\n\n    ma_assert(pContext   != NULL);\n    ma_assert(pConfig    != NULL);\n    ma_assert(deviceType != ma_device_type_duplex);\n    ma_assert(pDevice    != NULL);\n\n    if (deviceType == ma_device_type_capture) {\n        openFlags  = MA_SIO_REC;\n        pDeviceID  = pConfig->capture.pDeviceID;\n        format     = pConfig->capture.format;\n        channels   = pConfig->capture.channels;\n        sampleRate = pConfig->sampleRate;\n    } else {\n        openFlags = MA_SIO_PLAY;\n        pDeviceID  = pConfig->playback.pDeviceID;\n        format     = pConfig->playback.format;\n        channels   = pConfig->playback.channels;\n        sampleRate = pConfig->sampleRate;\n    }\n\n    pDeviceName = MA_SIO_DEVANY;\n    if (pDeviceID != NULL) {\n        pDeviceName = pDeviceID->sndio;\n    }\n\n    handle = (ma_ptr)((ma_sio_open_proc)pContext->sndio.sio_open)(pDeviceName, openFlags, 0);\n    if (handle == NULL) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[sndio] Failed to open device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    /* We need to retrieve the device caps to determine the most appropriate format to use. */\n    if (((ma_sio_getcap_proc)pContext->sndio.sio_getcap)((struct ma_sio_hdl*)handle, &caps) == 0) {\n        ((ma_sio_close_proc)pContext->sndio.sio_close)((struct ma_sio_hdl*)handle);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[sndio] Failed to retrieve device caps.\", MA_ERROR);\n    }\n\n    /*\n    Note: sndio reports a huge range of available channels. This is inconvenient for us because there's no real\n    way, as far as I can tell, to get the _actual_ channel count of the device. I'm therefore restricting this\n    to the requested channels, regardless of whether or not the default channel count is requested.\n    \n    For hardware devices, I'm suspecting only a single channel count will be reported and we can safely use the\n    value returned by ma_find_best_channels_from_sio_cap__sndio().\n    */\n    if (deviceType == ma_device_type_capture) {\n        if (pDevice->capture.usingDefaultFormat) {\n            format = ma_find_best_format_from_sio_cap__sndio(&caps);\n        }\n        if (pDevice->capture.usingDefaultChannels) {\n            if (strlen(pDeviceName) > strlen(\"rsnd/\") && strncmp(pDeviceName, \"rsnd/\", strlen(\"rsnd/\")) == 0) {\n                channels = ma_find_best_channels_from_sio_cap__sndio(&caps, deviceType, format);\n            }\n        }\n    } else {\n        if (pDevice->playback.usingDefaultFormat) {\n            format = ma_find_best_format_from_sio_cap__sndio(&caps);\n        }\n        if (pDevice->playback.usingDefaultChannels) {\n            if (strlen(pDeviceName) > strlen(\"rsnd/\") && strncmp(pDeviceName, \"rsnd/\", strlen(\"rsnd/\")) == 0) {\n                channels = ma_find_best_channels_from_sio_cap__sndio(&caps, deviceType, format);\n            }\n        }\n    }\n    \n    if (pDevice->usingDefaultSampleRate) {\n        sampleRate = ma_find_best_sample_rate_from_sio_cap__sndio(&caps, pConfig->deviceType, format, channels);\n    }\n\n\n    ((ma_sio_initpar_proc)pDevice->pContext->sndio.sio_initpar)(&par);\n    par.msb = 0;\n    par.le  = ma_is_little_endian();\n    \n    switch (format) {\n        case ma_format_u8:\n        {\n            par.bits = 8;\n            par.bps  = 1;\n            par.sig  = 0;\n        } break;\n        \n        case ma_format_s24:\n        {\n            par.bits = 24;\n            par.bps  = 3;\n            par.sig  = 1;\n        } break;\n        \n        case ma_format_s32:\n        {\n            par.bits = 32;\n            par.bps  = 4;\n            par.sig  = 1;\n        } break;\n        \n        case ma_format_s16:\n        case ma_format_f32:\n        default:\n        {\n            par.bits = 16;\n            par.bps  = 2;\n            par.sig  = 1;\n        } break;\n    }\n    \n    if (deviceType == ma_device_type_capture) {\n        par.rchan = channels;\n    } else {\n        par.pchan = channels;\n    }\n\n    par.rate = sampleRate;\n\n    internalBufferSizeInFrames = pConfig->bufferSizeInFrames;\n    if (internalBufferSizeInFrames == 0) {\n        internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, par.rate);\n    }\n\n    par.round    = internalBufferSizeInFrames / pConfig->periods;\n    par.appbufsz = par.round * pConfig->periods;\n    \n    if (((ma_sio_setpar_proc)pContext->sndio.sio_setpar)((struct ma_sio_hdl*)handle, &par) == 0) {\n        ((ma_sio_close_proc)pContext->sndio.sio_close)((struct ma_sio_hdl*)handle);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[sndio] Failed to set buffer size.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n    if (((ma_sio_getpar_proc)pContext->sndio.sio_getpar)((struct ma_sio_hdl*)handle, &par) == 0) {\n        ((ma_sio_close_proc)pContext->sndio.sio_close)((struct ma_sio_hdl*)handle);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[sndio] Failed to retrieve buffer size.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    internalFormat             = ma_format_from_sio_enc__sndio(par.bits, par.bps, par.sig, par.le, par.msb);\n    internalChannels           = (deviceType == ma_device_type_capture) ? par.rchan : par.pchan;\n    internalSampleRate         = par.rate;\n    internalPeriods            = par.appbufsz / par.round;\n    internalBufferSizeInFrames = par.appbufsz;\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->sndio.handleCapture                 = handle;\n        pDevice->capture.internalFormat              = internalFormat;\n        pDevice->capture.internalChannels            = internalChannels;\n        pDevice->capture.internalSampleRate          = internalSampleRate;\n        ma_get_standard_channel_map(ma_standard_channel_map_sndio, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n        pDevice->capture.internalBufferSizeInFrames  = internalBufferSizeInFrames;\n        pDevice->capture.internalPeriods             = internalPeriods;\n    } else {\n        pDevice->sndio.handlePlayback                = handle;\n        pDevice->playback.internalFormat             = internalFormat;\n        pDevice->playback.internalChannels           = internalChannels;\n        pDevice->playback.internalSampleRate         = internalSampleRate;\n        ma_get_standard_channel_map(ma_standard_channel_map_sndio, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n        pDevice->playback.internalBufferSizeInFrames = internalBufferSizeInFrames;\n        pDevice->playback.internalPeriods            = internalPeriods;\n    }\n\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"DEVICE INFO\\n\");\n    printf(\"    Format:      %s\\n\", ma_get_format_name(internalFormat));\n    printf(\"    Channels:    %d\\n\", internalChannels);\n    printf(\"    Sample Rate: %d\\n\", internalSampleRate);\n    printf(\"    Buffer Size: %d\\n\", internalBufferSizeInFrames);\n    printf(\"    Periods:     %d\\n\", internalPeriods);\n    printf(\"    appbufsz:    %d\\n\", par.appbufsz);\n    printf(\"    round:       %d\\n\", par.round);\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__sndio(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    ma_zero_object(&pDevice->sndio);\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_handle__sndio(pContext, pConfig, ma_device_type_capture, pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_handle__sndio(pContext, pConfig, ma_device_type_playback, pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__sndio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_stop_proc)pDevice->pContext->sndio.sio_stop)((struct ma_sio_hdl*)pDevice->sndio.handleCapture);\n        ma_atomic_exchange_32(&pDevice->sndio.isStartedCapture, MA_FALSE);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_stop_proc)pDevice->pContext->sndio.sio_stop)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback);\n        ma_atomic_exchange_32(&pDevice->sndio.isStartedPlayback, MA_FALSE);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__sndio(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    int result;\n\n    if (!pDevice->sndio.isStartedPlayback) {\n        ((ma_sio_start_proc)pDevice->pContext->sndio.sio_start)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback);   /* <-- Doesn't actually playback until data is written. */\n        ma_atomic_exchange_32(&pDevice->sndio.isStartedPlayback, MA_TRUE);\n    }\n\n    result = ((ma_sio_write_proc)pDevice->pContext->sndio.sio_write)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    if (result == 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[sndio] Failed to send data from the client to the device.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_device_read__sndio(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    int result;\n\n    if (!pDevice->sndio.isStartedCapture) {\n        ((ma_sio_start_proc)pDevice->pContext->sndio.sio_start)((struct ma_sio_hdl*)pDevice->sndio.handleCapture);   /* <-- Doesn't actually playback until data is written. */\n        ma_atomic_exchange_32(&pDevice->sndio.isStartedCapture, MA_TRUE);\n    }\n    \n    result = ((ma_sio_read_proc)pDevice->pContext->sndio.sio_read)((struct ma_sio_hdl*)pDevice->sndio.handleCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    if (result == 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[sndio] Failed to read data from the device to be sent to the device.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_context_uninit__sndio(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_sndio);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__sndio(const ma_context_config* pConfig, ma_context* pContext)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libsndioNames[] = {\n        \"libsndio.so\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libsndioNames); ++i) {\n        pContext->sndio.sndioSO = ma_dlopen(pContext, libsndioNames[i]);\n        if (pContext->sndio.sndioSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->sndio.sndioSO == NULL) {\n        return MA_NO_BACKEND;\n    }\n    \n    pContext->sndio.sio_open    = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_open\");\n    pContext->sndio.sio_close   = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_close\");\n    pContext->sndio.sio_setpar  = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_setpar\");\n    pContext->sndio.sio_getpar  = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_getpar\");\n    pContext->sndio.sio_getcap  = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_getcap\");\n    pContext->sndio.sio_write   = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_write\");\n    pContext->sndio.sio_read    = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_read\");\n    pContext->sndio.sio_start   = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_start\");\n    pContext->sndio.sio_stop    = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_stop\");\n    pContext->sndio.sio_initpar = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, \"sio_initpar\");\n#else\n    pContext->sndio.sio_open    = sio_open;\n    pContext->sndio.sio_close   = sio_close;\n    pContext->sndio.sio_setpar  = sio_setpar;\n    pContext->sndio.sio_getpar  = sio_getpar;\n    pContext->sndio.sio_getcap  = sio_getcap;\n    pContext->sndio.sio_write   = sio_write;\n    pContext->sndio.sio_read    = sio_read;\n    pContext->sndio.sio_start   = sio_start;\n    pContext->sndio.sio_stop    = sio_stop;\n    pContext->sndio.sio_initpar = sio_initpar;\n#endif\n\n    pContext->onUninit              = ma_context_uninit__sndio;\n    pContext->onDeviceIDEqual       = ma_context_is_device_id_equal__sndio;\n    pContext->onEnumDevices         = ma_context_enumerate_devices__sndio;\n    pContext->onGetDeviceInfo       = ma_context_get_device_info__sndio;\n    pContext->onDeviceInit          = ma_device_init__sndio;\n    pContext->onDeviceUninit        = ma_device_uninit__sndio;\n    pContext->onDeviceStart         = NULL; /* Not required for synchronous backends. */\n    pContext->onDeviceStop          = ma_device_stop__sndio;\n    pContext->onDeviceWrite         = ma_device_write__sndio;\n    pContext->onDeviceRead          = ma_device_read__sndio;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n#endif  /* sndio */\n\n\n\n/******************************************************************************\n\naudio(4) Backend\n\n******************************************************************************/\n#ifdef MA_HAS_AUDIO4\n#include <fcntl.h>\n#include <poll.h>\n#include <errno.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/ioctl.h>\n#include <sys/audioio.h>\n\n#if defined(__OpenBSD__)\n    #include <sys/param.h>\n    #if defined(OpenBSD) && OpenBSD >= 201709\n        #define MA_AUDIO4_USE_NEW_API\n    #endif\n#endif\n\nvoid ma_construct_device_id__audio4(char* id, size_t idSize, const char* base, int deviceIndex)\n{\n    size_t baseLen;\n\n    ma_assert(id != NULL);\n    ma_assert(idSize > 0);\n    ma_assert(deviceIndex >= 0);\n    \n    baseLen = strlen(base);\n    ma_assert(idSize > baseLen);\n    \n    ma_strcpy_s(id, idSize, base);\n    ma_itoa_s(deviceIndex, id+baseLen, idSize-baseLen, 10);\n}\n\nma_result ma_extract_device_index_from_id__audio4(const char* id, const char* base, int* pIndexOut)\n{\n    size_t idLen;\n    size_t baseLen;\n    const char* deviceIndexStr;\n\n    ma_assert(id != NULL);\n    ma_assert(base != NULL);\n    ma_assert(pIndexOut != NULL);\n    \n    idLen = strlen(id);\n    baseLen = strlen(base);\n    if (idLen <= baseLen) {\n        return MA_ERROR;   /* Doesn't look like the id starts with the base. */\n    }\n    \n    if (strncmp(id, base, baseLen) != 0) {\n        return MA_ERROR;   /* ID does not begin with base. */\n    }\n    \n    deviceIndexStr = id + baseLen;\n    if (deviceIndexStr[0] == '\\0') {\n        return MA_ERROR;   /* No index specified in the ID. */\n    }\n    \n    if (pIndexOut) {\n        *pIndexOut = atoi(deviceIndexStr);\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_bool32 ma_context_is_device_id_equal__audio4(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return ma_strcmp(pID0->audio4, pID1->audio4) == 0;\n}\n\n#if !defined(MA_AUDIO4_USE_NEW_API)    /* Old API */\nma_format ma_format_from_encoding__audio4(unsigned int encoding, unsigned int precision)\n{\n    if (precision == 8 && (encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR_LE || encoding == AUDIO_ENCODING_ULINEAR_BE)) {\n        return ma_format_u8;\n    } else {\n        if (ma_is_little_endian() && encoding == AUDIO_ENCODING_SLINEAR_LE) {\n            if (precision == 16) {\n                return ma_format_s16;\n            } else if (precision == 24) {\n                return ma_format_s24;\n            } else if (precision == 32) {\n                return ma_format_s32;\n            }\n        } else if (ma_is_big_endian() && encoding == AUDIO_ENCODING_SLINEAR_BE) {\n            if (precision == 16) {\n                return ma_format_s16;\n            } else if (precision == 24) {\n                return ma_format_s24;\n            } else if (precision == 32) {\n                return ma_format_s32;\n            }\n        }\n    }\n\n    return ma_format_unknown;  /* Encoding not supported. */\n}\n\nvoid ma_encoding_from_format__audio4(ma_format format, unsigned int* pEncoding, unsigned int* pPrecision)\n{\n    ma_assert(format     != ma_format_unknown);\n    ma_assert(pEncoding  != NULL);\n    ma_assert(pPrecision != NULL);\n\n    switch (format)\n    {\n        case ma_format_u8:\n        {\n            *pEncoding = AUDIO_ENCODING_ULINEAR;\n            *pPrecision = 8;\n        } break;\n\n        case ma_format_s24:\n        {\n            *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;\n            *pPrecision = 24;\n        } break;\n\n        case ma_format_s32:\n        {\n            *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;\n            *pPrecision = 32;\n        } break;\n\n        case ma_format_s16:\n        case ma_format_f32:\n        default:\n        {\n            *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;\n            *pPrecision = 16;\n        } break;\n    }\n}\n\nma_format ma_format_from_prinfo__audio4(struct audio_prinfo* prinfo)\n{\n    return ma_format_from_encoding__audio4(prinfo->encoding, prinfo->precision);\n}\n#else\nma_format ma_format_from_swpar__audio4(struct audio_swpar* par)\n{\n    if (par->bits == 8 && par->bps == 1 && par->sig == 0) {\n        return ma_format_u8;\n    }\n    if (par->bits == 16 && par->bps == 2 && par->sig == 1 && par->le == ma_is_little_endian()) {\n        return ma_format_s16;\n    }\n    if (par->bits == 24 && par->bps == 3 && par->sig == 1 && par->le == ma_is_little_endian()) {\n        return ma_format_s24;\n    }\n    if (par->bits == 32 && par->bps == 4 && par->sig == 1 && par->le == ma_is_little_endian()) {\n        return ma_format_f32;\n    }\n\n    /* Format not supported. */\n    return ma_format_unknown;\n}\n#endif\n\nma_result ma_context_get_device_info_from_fd__audio4(ma_context* pContext, ma_device_type deviceType, int fd, ma_device_info* pInfoOut)\n{\n    audio_device_t fdDevice;\n#if !defined(MA_AUDIO4_USE_NEW_API)\n    int counter = 0;\n    audio_info_t fdInfo;\n#else\n    struct audio_swpar fdPar;\n    ma_format format;\n#endif\n\n    ma_assert(pContext != NULL);\n    ma_assert(fd >= 0);\n    ma_assert(pInfoOut != NULL);\n    \n    (void)pContext;\n    (void)deviceType;\n\n    if (ioctl(fd, AUDIO_GETDEV, &fdDevice) < 0) {\n        return MA_ERROR;   /* Failed to retrieve device info. */\n    }\n\n    /* Name. */\n    ma_strcpy_s(pInfoOut->name, sizeof(pInfoOut->name), fdDevice.name);\n\n#if !defined(MA_AUDIO4_USE_NEW_API)\n    /* Supported formats. We get this by looking at the encodings. */\n    for (;;) {\n        audio_encoding_t encoding;\n        ma_format format;\n\n        ma_zero_object(&encoding);\n        encoding.index = counter;\n        if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) {\n            break;\n        }\n\n        format = ma_format_from_encoding__audio4(encoding.encoding, encoding.precision);\n        if (format != ma_format_unknown) {\n            pInfoOut->formats[pInfoOut->formatCount++] = format;\n        }\n\n        counter += 1;\n    }\n\n    if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {\n        return MA_ERROR;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        pInfoOut->minChannels = fdInfo.play.channels; \n        pInfoOut->maxChannels = fdInfo.play.channels;\n        pInfoOut->minSampleRate = fdInfo.play.sample_rate;\n        pInfoOut->maxSampleRate = fdInfo.play.sample_rate;\n    } else {\n        pInfoOut->minChannels = fdInfo.record.channels;\n        pInfoOut->maxChannels = fdInfo.record.channels;\n        pInfoOut->minSampleRate = fdInfo.record.sample_rate;\n        pInfoOut->maxSampleRate = fdInfo.record.sample_rate;\n    }\n#else\n    if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) {\n        return MA_ERROR;\n    }\n    \n    format = ma_format_from_swpar__audio4(&fdPar);\n    if (format == ma_format_unknown) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n    pInfoOut->formats[pInfoOut->formatCount++] = format;\n    \n    if (deviceType == ma_device_type_playback) {\n        pInfoOut->minChannels = fdPar.pchan;\n        pInfoOut->maxChannels = fdPar.pchan;\n    } else {\n        pInfoOut->minChannels = fdPar.rchan;\n        pInfoOut->maxChannels = fdPar.rchan;\n    }\n    \n    pInfoOut->minSampleRate = fdPar.rate;\n    pInfoOut->maxSampleRate = fdPar.rate;\n#endif\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_context_enumerate_devices__audio4(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    const int maxDevices = 64;\n    char devpath[256];\n    int iDevice;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n    \n    /*\n    Every device will be named \"/dev/audioN\", with a \"/dev/audioctlN\" equivalent. We use the \"/dev/audioctlN\"\n    version here since we can open it even when another process has control of the \"/dev/audioN\" device.\n    */\n    for (iDevice = 0; iDevice < maxDevices; ++iDevice) {\n        struct stat st;\n        int fd;\n        ma_bool32 isTerminating = MA_FALSE;\n\n        ma_strcpy_s(devpath, sizeof(devpath), \"/dev/audioctl\");\n        ma_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10);\n    \n        if (stat(devpath, &st) < 0) {\n            break;\n        }\n\n        /* The device exists, but we need to check if it's usable as playback and/or capture. */\n        \n        /* Playback. */\n        if (!isTerminating) {\n            fd = open(devpath, O_RDONLY, 0);\n            if (fd >= 0) {\n                /* Supports playback. */\n                ma_device_info deviceInfo;\n                ma_zero_object(&deviceInfo);\n                ma_construct_device_id__audio4(deviceInfo.id.audio4, sizeof(deviceInfo.id.audio4), \"/dev/audio\", iDevice);\n                if (ma_context_get_device_info_from_fd__audio4(pContext, ma_device_type_playback, fd, &deviceInfo) == MA_SUCCESS) {\n                    isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                }\n                \n                close(fd);\n            }\n        }\n        \n        /* Capture. */\n        if (!isTerminating) {\n            fd = open(devpath, O_WRONLY, 0);\n            if (fd >= 0) {\n                /* Supports capture. */\n                ma_device_info deviceInfo;\n                ma_zero_object(&deviceInfo);\n                ma_construct_device_id__audio4(deviceInfo.id.audio4, sizeof(deviceInfo.id.audio4), \"/dev/audio\", iDevice);\n                if (ma_context_get_device_info_from_fd__audio4(pContext, ma_device_type_capture, fd, &deviceInfo) == MA_SUCCESS) {\n                    isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                }\n                \n                close(fd);\n            }\n        }\n        \n        if (isTerminating) {\n            break;\n        }\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__audio4(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    int fd = -1;\n    int deviceIndex = -1;\n    char ctlid[256];\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n    (void)shareMode;\n    \n    /*\n    We need to open the \"/dev/audioctlN\" device to get the info. To do this we need to extract the number\n    from the device ID which will be in \"/dev/audioN\" format.\n    */\n    if (pDeviceID == NULL) {\n        /* Default device. */\n        ma_strcpy_s(ctlid, sizeof(ctlid), \"/dev/audioctl\");\n    } else {\n        /* Specific device. We need to convert from \"/dev/audioN\" to \"/dev/audioctlN\". */\n        result = ma_extract_device_index_from_id__audio4(pDeviceID->audio4, \"/dev/audio\", &deviceIndex);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n        \n        ma_construct_device_id__audio4(ctlid, sizeof(ctlid), \"/dev/audioctl\", deviceIndex);\n    }\n    \n    fd = open(ctlid, (deviceType == ma_device_type_playback) ? O_WRONLY : O_RDONLY, 0);\n    if (fd == -1) {\n        return MA_NO_DEVICE;\n    }\n    \n    if (deviceIndex == -1) {\n        ma_strcpy_s(pDeviceInfo->id.audio4, sizeof(pDeviceInfo->id.audio4), \"/dev/audio\");\n    } else {\n        ma_construct_device_id__audio4(pDeviceInfo->id.audio4, sizeof(pDeviceInfo->id.audio4), \"/dev/audio\", deviceIndex);\n    }\n    \n    result = ma_context_get_device_info_from_fd__audio4(pContext, deviceType, fd, pDeviceInfo);\n    \n    close(fd);\n    return result;\n}\n\nvoid ma_device_uninit__audio4(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->audio4.fdCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->audio4.fdPlayback);\n    }\n}\n\nma_result ma_device_init_fd__audio4(ma_context* pContext, const ma_device_config* pConfig, ma_device_type deviceType, ma_device* pDevice)\n{\n    const char* pDefaultDeviceNames[] = {\n        \"/dev/audio\",\n        \"/dev/audio0\"\n    };\n    int fd;\n    int fdFlags = 0;\n#if !defined(MA_AUDIO4_USE_NEW_API)    /* Old API */\n    audio_info_t fdInfo;\n#else\n    struct audio_swpar fdPar;\n#endif\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_uint32 internalBufferSizeInFrames;\n    ma_uint32 internalPeriods;\n\n    ma_assert(pContext   != NULL);\n    ma_assert(pConfig    != NULL);\n    ma_assert(deviceType != ma_device_type_duplex);\n    ma_assert(pDevice    != NULL);\n\n    (void)pContext;\n\n    /* The first thing to do is open the file. */\n    if (deviceType == ma_device_type_capture) {\n        fdFlags = O_RDONLY;\n    } else {\n        fdFlags = O_WRONLY;\n    }\n    fdFlags |= O_NONBLOCK;\n\n    if ((deviceType == ma_device_type_capture && pConfig->capture.pDeviceID == NULL) || (deviceType == ma_device_type_playback && pConfig->playback.pDeviceID == NULL)) {\n        /* Default device. */\n        size_t iDevice;\n        for (iDevice = 0; iDevice < ma_countof(pDefaultDeviceNames); ++iDevice) {\n            fd = open(pDefaultDeviceNames[iDevice], fdFlags, 0);\n            if (fd != -1) {\n                break;\n            }\n        }\n    } else {\n        /* Specific device. */\n        fd = open((deviceType == ma_device_type_capture) ? pConfig->capture.pDeviceID->audio4 : pConfig->playback.pDeviceID->audio4, fdFlags, 0);\n    }\n\n    if (fd == -1) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to open device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n#if !defined(MA_AUDIO4_USE_NEW_API)    /* Old API */\n    AUDIO_INITINFO(&fdInfo);\n\n    /* We get the driver to do as much of the data conversion as possible. */\n    if (deviceType == ma_device_type_capture) {\n        fdInfo.mode = AUMODE_RECORD;\n        ma_encoding_from_format__audio4(pConfig->capture.format, &fdInfo.record.encoding, &fdInfo.record.precision);\n        fdInfo.record.channels    = pConfig->capture.channels;\n        fdInfo.record.sample_rate = pConfig->sampleRate;\n    } else {\n        fdInfo.mode = AUMODE_PLAY;\n        ma_encoding_from_format__audio4(pConfig->playback.format, &fdInfo.play.encoding, &fdInfo.play.precision);\n        fdInfo.play.channels    = pConfig->playback.channels;\n        fdInfo.play.sample_rate = pConfig->sampleRate;\n    }\n\n    if (ioctl(fd, AUDIO_SETINFO, &fdInfo) < 0) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to set device format. AUDIO_SETINFO failed.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n    \n    if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] AUDIO_GETINFO failed.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        internalFormat     = ma_format_from_prinfo__audio4(&fdInfo.record);\n        internalChannels   = fdInfo.record.channels;\n        internalSampleRate = fdInfo.record.sample_rate;\n    } else {\n        internalFormat     = ma_format_from_prinfo__audio4(&fdInfo.play);\n        internalChannels   = fdInfo.play.channels;\n        internalSampleRate = fdInfo.play.sample_rate;\n    }\n\n    if (internalFormat == ma_format_unknown) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] The device's internal device format is not supported by miniaudio. The device is unusable.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    /* Buffer. */\n    {\n        ma_uint32 internalBufferSizeInBytes;\n\n        internalBufferSizeInFrames = pConfig->bufferSizeInFrames;\n        if (internalBufferSizeInFrames == 0) {\n            internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, internalSampleRate);\n        }\n\n        internalBufferSizeInBytes = internalBufferSizeInFrames * ma_get_bytes_per_frame(internalFormat, internalChannels);\n        if (internalBufferSizeInBytes < 16) {\n            internalBufferSizeInBytes = 16;\n        }\n\n        internalPeriods = pConfig->periods;\n        if (internalPeriods < 2) {\n            internalPeriods = 2;\n        }\n\n        /* What miniaudio calls a fragment, audio4 calls a block. */\n        AUDIO_INITINFO(&fdInfo);\n        fdInfo.hiwat     = internalPeriods;\n        fdInfo.lowat     = internalPeriods-1;\n        fdInfo.blocksize = internalBufferSizeInBytes / internalPeriods;\n        if (ioctl(fd, AUDIO_SETINFO, &fdInfo) < 0) {\n            close(fd);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to set internal buffer size. AUDIO_SETINFO failed.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n\n        internalPeriods            = fdInfo.hiwat;\n        internalBufferSizeInFrames = (fdInfo.blocksize * fdInfo.hiwat) / ma_get_bytes_per_frame(internalFormat, internalChannels);\n    }\n#else\n    /* We need to retrieve the format of the device so we can know the channel count and sample rate. Then we can calculate the buffer size. */\n    if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to retrieve initial device parameters.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    internalFormat     = ma_format_from_swpar__audio4(&fdPar);\n    internalChannels   = (deviceType == ma_device_type_capture) ? fdPar.rchan : fdPar.pchan;\n    internalSampleRate = fdPar.rate;\n\n    if (internalFormat == ma_format_unknown) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] The device's internal device format is not supported by miniaudio. The device is unusable.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    /* Buffer. */\n    {\n        ma_uint32 internalBufferSizeInBytes;\n\n        internalBufferSizeInFrames = pConfig->bufferSizeInFrames;\n        if (internalBufferSizeInFrames == 0) {\n            internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, internalSampleRate);\n        }\n\n        /* What miniaudio calls a fragment, audio4 calls a block. */\n        internalBufferSizeInBytes = internalBufferSizeInFrames * ma_get_bytes_per_frame(internalFormat, internalChannels);\n        if (internalBufferSizeInBytes < 16) {\n            internalBufferSizeInBytes = 16;\n        }\n    \n        fdPar.nblks = pConfig->periods;\n        fdPar.round = internalBufferSizeInBytes / fdPar.nblks;\n    \n        if (ioctl(fd, AUDIO_SETPAR, &fdPar) < 0) {\n            close(fd);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to set device parameters.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n\n        if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) {\n            close(fd);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to retrieve actual device parameters.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    }\n\n    internalFormat             = ma_format_from_swpar__audio4(&fdPar);\n    internalChannels           = (deviceType == ma_device_type_capture) ? fdPar.rchan : fdPar.pchan;\n    internalSampleRate         = fdPar.rate;\n    internalPeriods            = fdPar.nblks;\n    internalBufferSizeInFrames = (fdPar.nblks * fdPar.round) / ma_get_bytes_per_frame(internalFormat, internalChannels);\n#endif\n\n    if (internalFormat == ma_format_unknown) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] The device's internal device format is not supported by miniaudio. The device is unusable.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->audio4.fdCapture                    = fd;\n        pDevice->capture.internalFormat              = internalFormat;\n        pDevice->capture.internalChannels            = internalChannels;\n        pDevice->capture.internalSampleRate          = internalSampleRate;\n        ma_get_standard_channel_map(ma_standard_channel_map_sound4, internalChannels, pDevice->capture.internalChannelMap);\n        pDevice->capture.internalBufferSizeInFrames  = internalBufferSizeInFrames;\n        pDevice->capture.internalPeriods             = internalPeriods;\n    } else {\n        pDevice->audio4.fdPlayback                   = fd;\n        pDevice->playback.internalFormat             = internalFormat;\n        pDevice->playback.internalChannels           = internalChannels;\n        pDevice->playback.internalSampleRate         = internalSampleRate;\n        ma_get_standard_channel_map(ma_standard_channel_map_sound4, internalChannels, pDevice->playback.internalChannelMap);\n        pDevice->playback.internalBufferSizeInFrames = internalBufferSizeInFrames;\n        pDevice->playback.internalPeriods            = internalPeriods;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__audio4(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    ma_zero_object(&pDevice->audio4);\n    \n    pDevice->audio4.fdCapture  = -1;\n    pDevice->audio4.fdPlayback = -1;\n\n    /*\n    The version of the operating system dictates whether or not the device is exclusive or shared. NetBSD\n    introduced in-kernel mixing which means it's shared. All other BSD flavours are exclusive as far as\n    I'm aware.\n    */\n#if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 800000000\n    /* NetBSD 8.0+ */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n#else\n    /* All other flavors. */\n#endif\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__audio4(pContext, pConfig, ma_device_type_capture, pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__audio4(pContext, pConfig, ma_device_type_playback, pDevice);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                close(pDevice->audio4.fdCapture);\n            }\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n#if 0\nma_result ma_device_start__audio4(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->audio4.fdCapture == -1) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->audio4.fdPlayback == -1) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\nma_result ma_device_stop_fd__audio4(ma_device* pDevice, int fd)\n{\n    if (fd == -1) {\n        return MA_INVALID_ARGS;\n    }\n\n#if !defined(MA_AUDIO4_USE_NEW_API)\n    if (ioctl(fd, AUDIO_FLUSH, 0) < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to stop device. AUDIO_FLUSH failed.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n    }\n#else\n    if (ioctl(fd, AUDIO_STOP, 0) < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to stop device. AUDIO_STOP failed.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__audio4(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_stop_fd__audio4(pDevice, pDevice->audio4.fdCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_stop_fd__audio4(pDevice, pDevice->audio4.fdPlayback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__audio4(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    int result = write(pDevice->audio4.fdPlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    if (result < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to write data to the device.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_read__audio4(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    int result = read(pDevice->audio4.fdCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    if (result < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[audio4] Failed to read data from the device.\", MA_FAILED_TO_READ_DATA_FROM_DEVICE);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_uninit__audio4(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_audio4);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__audio4(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n    pContext->onUninit              = ma_context_uninit__audio4;\n    pContext->onDeviceIDEqual       = ma_context_is_device_id_equal__audio4;\n    pContext->onEnumDevices         = ma_context_enumerate_devices__audio4;\n    pContext->onGetDeviceInfo       = ma_context_get_device_info__audio4;\n    pContext->onDeviceInit          = ma_device_init__audio4;\n    pContext->onDeviceUninit        = ma_device_uninit__audio4;\n    pContext->onDeviceStart         = NULL;\n    pContext->onDeviceStop          = ma_device_stop__audio4;\n    pContext->onDeviceWrite         = ma_device_write__audio4;\n    pContext->onDeviceRead          = ma_device_read__audio4;\n\n    return MA_SUCCESS;\n}\n#endif  /* audio4 */\n\n\n/******************************************************************************\n\nOSS Backend\n\n******************************************************************************/\n#ifdef MA_HAS_OSS\n#include <sys/ioctl.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/soundcard.h>\n\n#ifndef SNDCTL_DSP_HALT\n#define SNDCTL_DSP_HALT SNDCTL_DSP_RESET\n#endif\n\nint ma_open_temp_device__oss()\n{\n    /* The OSS sample code uses \"/dev/mixer\" as the device for getting system properties so I'm going to do the same. */\n    int fd = open(\"/dev/mixer\", O_RDONLY, 0);\n    if (fd >= 0) {\n        return fd;\n    }\n\n    return -1;\n}\n\nma_result ma_context_open_device__oss(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, int* pfd)\n{\n    const char* deviceName;\n    int flags;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pfd != NULL);\n    (void)pContext;\n\n    *pfd = -1;\n\n    /* This function should only be called for playback or capture, not duplex. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    deviceName = \"/dev/dsp\";\n    if (pDeviceID != NULL) {\n        deviceName = pDeviceID->oss;\n    }\n\n    flags = (deviceType == ma_device_type_playback) ? O_WRONLY : O_RDONLY;\n    if (shareMode == ma_share_mode_exclusive) {\n        flags |= O_EXCL;\n    }\n\n    *pfd = open(deviceName, flags, 0);\n    if (*pfd == -1) {\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_bool32 ma_context_is_device_id_equal__oss(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return ma_strcmp(pID0->oss, pID1->oss) == 0;\n}\n\nma_result ma_context_enumerate_devices__oss(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    int fd;\n    oss_sysinfo si;\n    int result;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    fd = ma_open_temp_device__oss();\n    if (fd == -1) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open a temporary device for retrieving system information used for device enumeration.\", MA_NO_BACKEND);\n    }\n\n    result = ioctl(fd, SNDCTL_SYSINFO, &si);\n    if (result != -1) {\n        int iAudioDevice;\n        for (iAudioDevice = 0; iAudioDevice < si.numaudios; ++iAudioDevice) {\n            oss_audioinfo ai;\n            ai.dev = iAudioDevice;\n            result = ioctl(fd, SNDCTL_AUDIOINFO, &ai);\n            if (result != -1) {\n                if (ai.devnode[0] != '\\0') {    /* <-- Can be blank, according to documentation. */\n                    ma_device_info deviceInfo;\n                    ma_bool32 isTerminating = MA_FALSE;\n\n                    ma_zero_object(&deviceInfo);\n\n                    /* ID */\n                    ma_strncpy_s(deviceInfo.id.oss, sizeof(deviceInfo.id.oss), ai.devnode, (size_t)-1);\n\n                    /*\n                    The human readable device name should be in the \"ai.handle\" variable, but it can\n                    sometimes be empty in which case we just fall back to \"ai.name\" which is less user\n                    friendly, but usually has a value.\n                    */\n                    if (ai.handle[0] != '\\0') {\n                        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), ai.handle, (size_t)-1);\n                    } else {\n                        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), ai.name, (size_t)-1);\n                    }\n\n                    /* The device can be both playback and capture. */\n                    if (!isTerminating && (ai.caps & PCM_CAP_OUTPUT) != 0) {\n                        isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                    }\n                    if (!isTerminating && (ai.caps & PCM_CAP_INPUT) != 0) {\n                        isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                    }\n\n                    if (isTerminating) {\n                        break;\n                    }\n                }\n            }\n        }\n    } else {\n        close(fd);\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to retrieve system information for device enumeration.\", MA_NO_BACKEND);\n    }\n\n    close(fd);\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__oss(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_bool32 foundDevice;\n    int fdTemp;\n    oss_sysinfo si;\n    int result;\n\n    ma_assert(pContext != NULL);\n    (void)shareMode;\n\n    /* Handle the default device a little differently. */\n    if (pDeviceID == NULL) {\n        if (deviceType == ma_device_type_playback) {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        } else {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        }\n\n        return MA_SUCCESS;\n    }\n\n\n    /* If we get here it means we are _not_ using the default device. */\n    foundDevice = MA_FALSE;\n\n    fdTemp = ma_open_temp_device__oss();\n    if (fdTemp == -1) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open a temporary device for retrieving system information used for device enumeration.\", MA_NO_BACKEND);\n    }\n\n    result = ioctl(fdTemp, SNDCTL_SYSINFO, &si);\n    if (result != -1) {\n        int iAudioDevice;\n        for (iAudioDevice = 0; iAudioDevice < si.numaudios; ++iAudioDevice) {\n            oss_audioinfo ai;\n            ai.dev = iAudioDevice;\n            result = ioctl(fdTemp, SNDCTL_AUDIOINFO, &ai);\n            if (result != -1) {\n                if (ma_strcmp(ai.devnode, pDeviceID->oss) == 0) {\n                    /* It has the same name, so now just confirm the type. */\n                    if ((deviceType == ma_device_type_playback && ((ai.caps & PCM_CAP_OUTPUT) != 0)) ||\n                        (deviceType == ma_device_type_capture  && ((ai.caps & PCM_CAP_INPUT)  != 0))) {\n                        unsigned int formatMask;\n\n                        /* ID */\n                        ma_strncpy_s(pDeviceInfo->id.oss, sizeof(pDeviceInfo->id.oss), ai.devnode, (size_t)-1);\n\n                        /*\n                        The human readable device name should be in the \"ai.handle\" variable, but it can\n                        sometimes be empty in which case we just fall back to \"ai.name\" which is less user\n                        friendly, but usually has a value.\n                        */\n                        if (ai.handle[0] != '\\0') {\n                            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), ai.handle, (size_t)-1);\n                        } else {\n                            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), ai.name, (size_t)-1);\n                        }\n\n                        pDeviceInfo->minChannels = ai.min_channels;\n                        pDeviceInfo->maxChannels = ai.max_channels;\n                        pDeviceInfo->minSampleRate = ai.min_rate;\n                        pDeviceInfo->maxSampleRate = ai.max_rate;\n                        pDeviceInfo->formatCount = 0;\n\n                        if (deviceType == ma_device_type_playback) {\n                            formatMask = ai.oformats;\n                        } else {\n                            formatMask = ai.iformats;\n                        }\n\n                        if ((formatMask & AFMT_U8) != 0) {\n                            pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_u8;\n                        }\n                        if (((formatMask & AFMT_S16_LE) != 0 && ma_is_little_endian()) || (AFMT_S16_BE && ma_is_big_endian())) {\n                            pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_s16;\n                        }\n                        if (((formatMask & AFMT_S32_LE) != 0 && ma_is_little_endian()) || (AFMT_S32_BE && ma_is_big_endian())) {\n                            pDeviceInfo->formats[pDeviceInfo->formatCount++] = ma_format_s32;\n                        }\n\n                        foundDevice = MA_TRUE;\n                        break;\n                    }\n                }\n            }\n        }\n    } else {\n        close(fdTemp);\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to retrieve system information for device enumeration.\", MA_NO_BACKEND);\n    }\n\n\n    close(fdTemp);\n\n    if (!foundDevice) {\n        return MA_NO_DEVICE;\n    }\n\n    return MA_SUCCESS;\n}\n\nvoid ma_device_uninit__oss(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->oss.fdCapture);\n    }\n    \n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->oss.fdPlayback);\n    }\n}\n\nint ma_format_to_oss(ma_format format)\n{\n    int ossFormat = AFMT_U8;\n    switch (format) {\n        case ma_format_s16: ossFormat = (ma_is_little_endian()) ? AFMT_S16_LE : AFMT_S16_BE; break;\n        case ma_format_s24: ossFormat = (ma_is_little_endian()) ? AFMT_S32_LE : AFMT_S32_BE; break;\n        case ma_format_s32: ossFormat = (ma_is_little_endian()) ? AFMT_S32_LE : AFMT_S32_BE; break;\n        case ma_format_f32: ossFormat = (ma_is_little_endian()) ? AFMT_S16_LE : AFMT_S16_BE; break;\n        case ma_format_u8:\n        default: ossFormat = AFMT_U8; break;\n    }\n\n    return ossFormat;\n}\n\nma_format ma_format_from_oss(int ossFormat)\n{\n    if (ossFormat == AFMT_U8) {\n        return ma_format_u8;\n    } else {\n        if (ma_is_little_endian()) {\n            switch (ossFormat) {\n                case AFMT_S16_LE: return ma_format_s16;\n                case AFMT_S32_LE: return ma_format_s32;\n                default: return ma_format_unknown;\n            }\n        } else {\n            switch (ossFormat) {\n                case AFMT_S16_BE: return ma_format_s16;\n                case AFMT_S32_BE: return ma_format_s32;\n                default: return ma_format_unknown;\n            }\n        }\n    }\n\n    return ma_format_unknown;\n}\n\nma_result ma_device_init_fd__oss(ma_context* pContext, const ma_device_config* pConfig, ma_device_type deviceType, ma_device* pDevice)\n{\n    ma_result result;\n    int ossResult;\n    int fd;\n    const ma_device_id* pDeviceID = NULL;\n    ma_share_mode shareMode;\n    int ossFormat;\n    int ossChannels;\n    int ossSampleRate;\n    int ossFragment;\n\n    ma_assert(pContext != NULL);\n    ma_assert(pConfig != NULL);\n    ma_assert(deviceType != ma_device_type_duplex);\n    ma_assert(pDevice != NULL);\n\n    (void)pContext;\n\n    if (deviceType == ma_device_type_capture) {\n        pDeviceID     = pConfig->capture.pDeviceID;\n        shareMode     = pConfig->capture.shareMode;\n        ossFormat     = ma_format_to_oss(pConfig->capture.format);\n        ossChannels   = (int)pConfig->capture.channels;\n        ossSampleRate = (int)pConfig->sampleRate;\n    } else {\n        pDeviceID     = pConfig->playback.pDeviceID;\n        shareMode     = pConfig->playback.shareMode;\n        ossFormat     = ma_format_to_oss(pConfig->playback.format);\n        ossChannels   = (int)pConfig->playback.channels;\n        ossSampleRate = (int)pConfig->sampleRate;\n    }\n\n    result = ma_context_open_device__oss(pContext, deviceType, pDeviceID, shareMode, &fd);\n    if (result != MA_SUCCESS) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n    }\n\n    /*\n    The OSS documantation is very clear about the order we should be initializing the device's properties:\n      1) Format\n      2) Channels\n      3) Sample rate.\n    */\n\n    /* Format. */\n    ossResult = ioctl(fd, SNDCTL_DSP_SETFMT, &ossFormat);\n    if (ossResult == -1) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set format.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    /* Channels. */\n    ossResult = ioctl(fd, SNDCTL_DSP_CHANNELS, &ossChannels);\n    if (ossResult == -1) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set channel count.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    /* Sample Rate. */\n    ossResult = ioctl(fd, SNDCTL_DSP_SPEED, &ossSampleRate);\n    if (ossResult == -1) {\n        close(fd);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set sample rate.\", MA_FORMAT_NOT_SUPPORTED);\n    }\n\n    /*\n    Buffer.\n\n    The documentation says that the fragment settings should be set as soon as possible, but I'm not sure if\n    it should be done before or after format/channels/rate.\n    \n    OSS wants the fragment size in bytes and a power of 2. When setting, we specify the power, not the actual\n    value.\n    */\n    {\n        ma_uint32 fragmentSizeInBytes;\n        ma_uint32 bufferSizeInFrames;\n        ma_uint32 ossFragmentSizePower;\n        \n        bufferSizeInFrames = pConfig->bufferSizeInFrames;\n        if (bufferSizeInFrames == 0) {\n            bufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, (ma_uint32)ossSampleRate);\n        }\n\n        fragmentSizeInBytes = ma_round_to_power_of_2((bufferSizeInFrames / pConfig->periods) * ma_get_bytes_per_frame(ma_format_from_oss(ossFormat), ossChannels));\n        if (fragmentSizeInBytes < 16) {\n            fragmentSizeInBytes = 16;\n        }\n\n        ossFragmentSizePower = 4;\n        fragmentSizeInBytes >>= 4;\n        while (fragmentSizeInBytes >>= 1) {\n            ossFragmentSizePower += 1;\n        }\n\n        ossFragment = (int)((pConfig->periods << 16) | ossFragmentSizePower);\n        ossResult = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &ossFragment);\n        if (ossResult == -1) {\n            close(fd);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set fragment size and period count.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    }\n\n    /* Internal settings. */\n    if (deviceType == ma_device_type_capture) {\n        pDevice->oss.fdCapture                       = fd;\n        pDevice->capture.internalFormat              = ma_format_from_oss(ossFormat);\n        pDevice->capture.internalChannels            = ossChannels;\n        pDevice->capture.internalSampleRate          = ossSampleRate;\n        ma_get_standard_channel_map(ma_standard_channel_map_sound4, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n        pDevice->capture.internalPeriods             = (ma_uint32)(ossFragment >> 16);\n        pDevice->capture.internalBufferSizeInFrames  = (((ma_uint32)(1 << (ossFragment & 0xFFFF))) * pDevice->capture.internalPeriods) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n\n        if (pDevice->capture.internalFormat == ma_format_unknown) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] The device's internal format is not supported by miniaudio.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    } else {\n        pDevice->oss.fdPlayback                      = fd;\n        pDevice->playback.internalFormat             = ma_format_from_oss(ossFormat);\n        pDevice->playback.internalChannels           = ossChannels;\n        pDevice->playback.internalSampleRate         = ossSampleRate;\n        ma_get_standard_channel_map(ma_standard_channel_map_sound4, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n        pDevice->playback.internalPeriods            = (ma_uint32)(ossFragment >> 16);\n        pDevice->playback.internalBufferSizeInFrames = (((ma_uint32)(1 << (ossFragment & 0xFFFF))) * pDevice->playback.internalPeriods) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n\n        if (pDevice->playback.internalFormat == ma_format_unknown) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] The device's internal format is not supported by miniaudio.\", MA_FORMAT_NOT_SUPPORTED);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__oss(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pConfig  != NULL);\n    ma_assert(pDevice  != NULL);\n\n    ma_zero_object(&pDevice->oss);\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__oss(pContext, pConfig, ma_device_type_capture, pDevice);\n        if (result != MA_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__oss(pContext, pConfig, ma_device_type_playback, pDevice);\n        if (result != MA_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open device.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__oss(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    /*\n    We want to use SNDCTL_DSP_HALT. From the documentation:\n    \n      In multithreaded applications SNDCTL_DSP_HALT (SNDCTL_DSP_RESET) must only be called by the thread\n      that actually reads/writes the audio device. It must not be called by some master thread to kill the\n      audio thread. The audio thread will not stop or get any kind of notification that the device was\n      stopped by the master thread. The device gets stopped but the next read or write call will silently\n      restart the device.\n    \n    This is actually safe in our case, because this function is only ever called from within our worker\n    thread anyway. Just keep this in mind, though...\n    */\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        int result = ioctl(pDevice->oss.fdCapture, SNDCTL_DSP_HALT, 0);\n        if (result == -1) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to stop device. SNDCTL_DSP_HALT failed.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        int result = ioctl(pDevice->oss.fdPlayback, SNDCTL_DSP_HALT, 0);\n        if (result == -1) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to stop device. SNDCTL_DSP_HALT failed.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_write__oss(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount)\n{\n    int resultOSS = write(pDevice->oss.fdPlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    if (resultOSS < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to send data from the client to the device.\", MA_FAILED_TO_SEND_DATA_TO_DEVICE);\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_device_read__oss(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount)\n{\n    int resultOSS = read(pDevice->oss.fdCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    if (resultOSS < 0) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to read data from the device to be sent to the client.\", MA_FAILED_TO_READ_DATA_FROM_DEVICE);\n    }\n    \n    return MA_SUCCESS;\n}\n\nma_result ma_context_uninit__oss(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_oss);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__oss(const ma_context_config* pConfig, ma_context* pContext)\n{\n    int fd;\n    int ossVersion;\n    int result;\n\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n    /* Try opening a temporary device first so we can get version information. This is closed at the end. */\n    fd = ma_open_temp_device__oss();\n    if (fd == -1) {\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open temporary device for retrieving system properties.\", MA_NO_BACKEND);   /* Looks liks OSS isn't installed, or there are no available devices. */\n    }\n\n    /* Grab the OSS version. */\n    ossVersion = 0;\n    result = ioctl(fd, OSS_GETVERSION, &ossVersion);\n    if (result == -1) {\n        close(fd);\n        return ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_ERROR, \"[OSS] Failed to retrieve OSS version.\", MA_NO_BACKEND);\n    }\n\n    pContext->oss.versionMajor = ((ossVersion & 0xFF0000) >> 16);\n    pContext->oss.versionMinor = ((ossVersion & 0x00FF00) >> 8);\n\n    pContext->onUninit              = ma_context_uninit__oss;\n    pContext->onDeviceIDEqual       = ma_context_is_device_id_equal__oss;\n    pContext->onEnumDevices         = ma_context_enumerate_devices__oss;\n    pContext->onGetDeviceInfo       = ma_context_get_device_info__oss;\n    pContext->onDeviceInit          = ma_device_init__oss;\n    pContext->onDeviceUninit        = ma_device_uninit__oss;\n    pContext->onDeviceStart         = NULL; /* Not required for synchronous backends. */\n    pContext->onDeviceStop          = ma_device_stop__oss;\n    pContext->onDeviceWrite         = ma_device_write__oss;\n    pContext->onDeviceRead          = ma_device_read__oss;\n\n    close(fd);\n    return MA_SUCCESS;\n}\n#endif  /* OSS */\n\n\n/******************************************************************************\n\nAAudio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_AAUDIO\n/*#include <AAudio/AAudio.h>*/\n\n#define MA_AAUDIO_UNSPECIFIED 0\n\ntypedef int32_t ma_aaudio_result_t;\ntypedef int32_t ma_aaudio_direction_t;\ntypedef int32_t ma_aaudio_sharing_mode_t;\ntypedef int32_t ma_aaudio_format_t;\ntypedef int32_t ma_aaudio_stream_state_t;\ntypedef int32_t ma_aaudio_performance_mode_t;\ntypedef int32_t ma_aaudio_data_callback_result_t;\n\n/* Result codes. miniaudio only cares about the success code. */\n#define MA_AAUDIO_OK                               0\n\n/* Directions. */\n#define MA_AAUDIO_DIRECTION_OUTPUT                 0\n#define MA_AAUDIO_DIRECTION_INPUT                  1\n\n/* Sharing modes. */\n#define MA_AAUDIO_SHARING_MODE_EXCLUSIVE           0\n#define MA_AAUDIO_SHARING_MODE_SHARED              1\n\n/* Formats. */\n#define MA_AAUDIO_FORMAT_PCM_I16                   1\n#define MA_AAUDIO_FORMAT_PCM_FLOAT                 2\n\n/* Stream states. */\n#define MA_AAUDIO_STREAM_STATE_UNINITIALIZED       0\n#define MA_AAUDIO_STREAM_STATE_UNKNOWN             1\n#define MA_AAUDIO_STREAM_STATE_OPEN                2\n#define MA_AAUDIO_STREAM_STATE_STARTING            3\n#define MA_AAUDIO_STREAM_STATE_STARTED             4\n#define MA_AAUDIO_STREAM_STATE_PAUSING             5\n#define MA_AAUDIO_STREAM_STATE_PAUSED              6\n#define MA_AAUDIO_STREAM_STATE_FLUSHING            7\n#define MA_AAUDIO_STREAM_STATE_FLUSHED             8\n#define MA_AAUDIO_STREAM_STATE_STOPPING            9\n#define MA_AAUDIO_STREAM_STATE_STOPPED             10\n#define MA_AAUDIO_STREAM_STATE_CLOSING             11\n#define MA_AAUDIO_STREAM_STATE_CLOSED              12\n#define MA_AAUDIO_STREAM_STATE_DISCONNECTED        13\n\n/* Performance modes. */\n#define MA_AAUDIO_PERFORMANCE_MODE_NONE            10\n#define MA_AAUDIO_PERFORMANCE_MODE_POWER_SAVING    11\n#define MA_AAUDIO_PERFORMANCE_MODE_LOW_LATENCY     12\n\n/* Callback results. */\n#define MA_AAUDIO_CALLBACK_RESULT_CONTINUE         0\n#define MA_AAUDIO_CALLBACK_RESULT_STOP             1\n\n/* Objects. */\ntypedef struct ma_AAudioStreamBuilder_t* ma_AAudioStreamBuilder;\ntypedef struct ma_AAudioStream_t*        ma_AAudioStream;\n\ntypedef ma_aaudio_data_callback_result_t (*ma_AAudioStream_dataCallback)(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t numFrames);\n\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudio_createStreamBuilder)                   (ma_AAudioStreamBuilder** ppBuilder);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStreamBuilder_delete)                   (ma_AAudioStreamBuilder* pBuilder);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setDeviceId)              (ma_AAudioStreamBuilder* pBuilder, int32_t deviceId);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setDirection)             (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_direction_t direction);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setSharingMode)           (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_sharing_mode_t sharingMode);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setFormat)                (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_format_t format);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setChannelCount)          (ma_AAudioStreamBuilder* pBuilder, int32_t channelCount);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setSampleRate)            (ma_AAudioStreamBuilder* pBuilder, int32_t sampleRate);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setBufferCapacityInFrames)(ma_AAudioStreamBuilder* pBuilder, int32_t numFrames);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setFramesPerDataCallback) (ma_AAudioStreamBuilder* pBuilder, int32_t numFrames);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setDataCallback)          (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream_dataCallback callback, void* pUserData);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setPerformanceMode)       (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_performance_mode_t mode);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStreamBuilder_openStream)               (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream** ppStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_close)                           (ma_AAudioStream* pStream);\ntypedef ma_aaudio_stream_state_t (* MA_PFN_AAudioStream_getState)                        (ma_AAudioStream* pStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_waitForStateChange)              (ma_AAudioStream* pStream, ma_aaudio_stream_state_t inputState, ma_aaudio_stream_state_t* pNextState, int64_t timeoutInNanoseconds);\ntypedef ma_aaudio_format_t       (* MA_PFN_AAudioStream_getFormat)                       (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getChannelCount)                 (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getSampleRate)                   (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getBufferCapacityInFrames)       (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getFramesPerDataCallback)        (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getFramesPerBurst)               (ma_AAudioStream* pStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_requestStart)                    (ma_AAudioStream* pStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_requestStop)                     (ma_AAudioStream* pStream);\n\nma_result ma_result_from_aaudio(ma_aaudio_result_t resultAA)\n{\n    switch (resultAA)\n    {\n        case MA_AAUDIO_OK: return MA_SUCCESS;\n        default: break;\n    }\n\n    return MA_ERROR;\n}\n\nma_aaudio_data_callback_result_t ma_stream_data_callback_capture__aaudio(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t frameCount)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_device__handle_duplex_callback_capture(pDevice, frameCount, pAudioData, &pDevice->aaudio.duplexRB);\n    } else {\n        ma_device__send_frames_to_client(pDevice, frameCount, pAudioData);     /* Send directly to the client. */\n    }\n\n    (void)pStream;\n    return MA_AAUDIO_CALLBACK_RESULT_CONTINUE;\n}\n\nma_aaudio_data_callback_result_t ma_stream_data_callback_playback__aaudio(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t frameCount)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_device__handle_duplex_callback_playback(pDevice, frameCount, pAudioData, &pDevice->aaudio.duplexRB);\n    } else {\n        ma_device__read_frames_from_client(pDevice, frameCount, pAudioData);   /* Read directly from the client. */\n    }\n\n    (void)pStream;\n    return MA_AAUDIO_CALLBACK_RESULT_CONTINUE;\n}\n\nma_result ma_open_stream__aaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, const ma_device_config* pConfig, const ma_device* pDevice, ma_AAudioStream** ppStream)\n{\n    ma_AAudioStreamBuilder* pBuilder;\n    ma_aaudio_result_t resultAA;\n\n    ma_assert(deviceType != ma_device_type_duplex);   /* This function should not be called for a full-duplex device type. */\n\n    *ppStream = NULL;\n\n    resultAA = ((MA_PFN_AAudio_createStreamBuilder)pContext->aaudio.AAudio_createStreamBuilder)(&pBuilder);\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    if (pDeviceID != NULL) {\n        ((MA_PFN_AAudioStreamBuilder_setDeviceId)pContext->aaudio.AAudioStreamBuilder_setDeviceId)(pBuilder, pDeviceID->aaudio);\n    }\n\n    ((MA_PFN_AAudioStreamBuilder_setDirection)pContext->aaudio.AAudioStreamBuilder_setDirection)(pBuilder, (deviceType == ma_device_type_playback) ? MA_AAUDIO_DIRECTION_OUTPUT : MA_AAUDIO_DIRECTION_INPUT);\n    ((MA_PFN_AAudioStreamBuilder_setSharingMode)pContext->aaudio.AAudioStreamBuilder_setSharingMode)(pBuilder, (shareMode == ma_share_mode_shared) ? MA_AAUDIO_SHARING_MODE_SHARED : MA_AAUDIO_SHARING_MODE_EXCLUSIVE);\n\n    if (pConfig != NULL) {\n        ma_uint32 bufferCapacityInFrames;\n\n        if (pDevice == NULL || !pDevice->usingDefaultSampleRate) {\n            ((MA_PFN_AAudioStreamBuilder_setSampleRate)pContext->aaudio.AAudioStreamBuilder_setSampleRate)(pBuilder, pConfig->sampleRate);\n        }\n\n        if (deviceType == ma_device_type_capture) {\n            if (pDevice == NULL || !pDevice->capture.usingDefaultChannels) {\n                ((MA_PFN_AAudioStreamBuilder_setChannelCount)pContext->aaudio.AAudioStreamBuilder_setChannelCount)(pBuilder, pConfig->capture.channels);\n            }\n            if (pDevice == NULL || !pDevice->capture.usingDefaultFormat) {\n                ((MA_PFN_AAudioStreamBuilder_setFormat)pContext->aaudio.AAudioStreamBuilder_setFormat)(pBuilder, (pConfig->capture.format == ma_format_s16) ? MA_AAUDIO_FORMAT_PCM_I16 : MA_AAUDIO_FORMAT_PCM_FLOAT);\n            }\n        } else {\n            if (pDevice == NULL || !pDevice->playback.usingDefaultChannels) {\n                ((MA_PFN_AAudioStreamBuilder_setChannelCount)pContext->aaudio.AAudioStreamBuilder_setChannelCount)(pBuilder, pConfig->playback.channels);\n            }\n            if (pDevice == NULL || !pDevice->playback.usingDefaultFormat) {\n                ((MA_PFN_AAudioStreamBuilder_setFormat)pContext->aaudio.AAudioStreamBuilder_setFormat)(pBuilder, (pConfig->playback.format == ma_format_s16) ? MA_AAUDIO_FORMAT_PCM_I16 : MA_AAUDIO_FORMAT_PCM_FLOAT);\n            }\n        }\n\n        bufferCapacityInFrames = pConfig->bufferSizeInFrames;\n        if (bufferCapacityInFrames == 0) {\n            bufferCapacityInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pConfig->sampleRate);\n        }\n        ((MA_PFN_AAudioStreamBuilder_setBufferCapacityInFrames)pContext->aaudio.AAudioStreamBuilder_setBufferCapacityInFrames)(pBuilder, bufferCapacityInFrames);\n\n        ((MA_PFN_AAudioStreamBuilder_setFramesPerDataCallback)pContext->aaudio.AAudioStreamBuilder_setFramesPerDataCallback)(pBuilder, bufferCapacityInFrames / pConfig->periods);\n\n        if (deviceType == ma_device_type_capture) {\n            ((MA_PFN_AAudioStreamBuilder_setDataCallback)pContext->aaudio.AAudioStreamBuilder_setDataCallback)(pBuilder, ma_stream_data_callback_capture__aaudio, (void*)pDevice);\n        } else {\n            ((MA_PFN_AAudioStreamBuilder_setDataCallback)pContext->aaudio.AAudioStreamBuilder_setDataCallback)(pBuilder, ma_stream_data_callback_playback__aaudio, (void*)pDevice);\n        }\n\n        /* Not sure how this affects things, but since there's a mapping between miniaudio's performance profiles and AAudio's performance modes, let go ahead and set it. */\n        ((MA_PFN_AAudioStreamBuilder_setPerformanceMode)pContext->aaudio.AAudioStreamBuilder_setPerformanceMode)(pBuilder, (pConfig->performanceProfile == ma_performance_profile_low_latency) ? MA_AAUDIO_PERFORMANCE_MODE_LOW_LATENCY : MA_AAUDIO_PERFORMANCE_MODE_NONE);\n    }\n\n    resultAA = ((MA_PFN_AAudioStreamBuilder_openStream)pContext->aaudio.AAudioStreamBuilder_openStream)(pBuilder, ppStream);\n    if (resultAA != MA_AAUDIO_OK) {\n        *ppStream = NULL;\n        ((MA_PFN_AAudioStreamBuilder_delete)pContext->aaudio.AAudioStreamBuilder_delete)(pBuilder);\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    ((MA_PFN_AAudioStreamBuilder_delete)pContext->aaudio.AAudioStreamBuilder_delete)(pBuilder);\n    return MA_SUCCESS;\n}\n\nma_result ma_close_stream__aaudio(ma_context* pContext, ma_AAudioStream* pStream)\n{\n    return ma_result_from_aaudio(((MA_PFN_AAudioStream_close)pContext->aaudio.AAudioStream_close)(pStream));\n}\n\nma_bool32 ma_has_default_device__aaudio(ma_context* pContext, ma_device_type deviceType)\n{\n    /* The only way to know this is to try creating a stream. */\n    ma_AAudioStream* pStream;\n    ma_result result = ma_open_stream__aaudio(pContext, deviceType, NULL, ma_share_mode_shared, NULL, NULL, &pStream);\n    if (result != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n\n    ma_close_stream__aaudio(pContext, pStream);\n    return MA_TRUE;\n}\n\nma_result ma_wait_for_simple_state_transition__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_aaudio_stream_state_t oldState, ma_aaudio_stream_state_t newState)\n{\n    ma_aaudio_stream_state_t actualNewState;\n    ma_aaudio_result_t resultAA = ((MA_PFN_AAudioStream_waitForStateChange)pContext->aaudio.AAudioStream_waitForStateChange)(pStream, oldState, &actualNewState, 5000000000); /* 5 second timeout. */\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    if (newState != actualNewState) {\n        return MA_ERROR;   /* Failed to transition into the expected state. */\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_bool32 ma_context_is_device_id_equal__aaudio(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return pID0->aaudio == pID1->aaudio;\n}\n\nma_result ma_context_enumerate_devices__aaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    /* Unfortunately AAudio does not have an enumeration API. Therefore I'm only going to report default devices, but only if it can instantiate a stream. */\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        deviceInfo.id.aaudio = MA_AAUDIO_UNSPECIFIED;\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n\n        if (ma_has_default_device__aaudio(pContext, ma_device_type_playback)) {\n            cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n        }\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        deviceInfo.id.aaudio = MA_AAUDIO_UNSPECIFIED;\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n\n        if (ma_has_default_device__aaudio(pContext, ma_device_type_capture)) {\n            cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__aaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_AAudioStream* pStream;\n    ma_result result;\n\n    ma_assert(pContext != NULL);\n\n    /* No exclusive mode with AAudio. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* ID */\n    if (pDeviceID != NULL) {\n        pDeviceInfo->id.aaudio = pDeviceID->aaudio;\n    } else {\n        pDeviceInfo->id.aaudio = MA_AAUDIO_UNSPECIFIED;\n    }\n    \n    /* Name */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n\n    /* We'll need to open the device to get accurate sample rate and channel count information. */\n    result = ma_open_stream__aaudio(pContext, deviceType, pDeviceID, shareMode, NULL, NULL, &pStream);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDeviceInfo->minChannels   = ((MA_PFN_AAudioStream_getChannelCount)pContext->aaudio.AAudioStream_getChannelCount)(pStream);\n    pDeviceInfo->maxChannels   = pDeviceInfo->minChannels;\n    pDeviceInfo->minSampleRate = ((MA_PFN_AAudioStream_getSampleRate)pContext->aaudio.AAudioStream_getSampleRate)(pStream);\n    pDeviceInfo->maxSampleRate = pDeviceInfo->minSampleRate;\n\n    ma_close_stream__aaudio(pContext, pStream);\n    pStream = NULL;\n\n\n    /* AAudio supports s16 and f32. */\n    pDeviceInfo->formatCount = 2;\n    pDeviceInfo->formats[0] = ma_format_s16;\n    pDeviceInfo->formats[1] = ma_format_f32;\n\n    return MA_SUCCESS;\n}\n\n\nvoid ma_device_uninit__aaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        pDevice->aaudio.pStreamCapture = NULL;\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        pDevice->aaudio.pStreamPlayback = NULL;\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_pcm_rb_uninit(&pDevice->aaudio.duplexRB);\n    }\n}\n\nma_result ma_device_init__aaudio(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n\n    ma_assert(pDevice != NULL);\n\n    /* No exclusive mode with AAudio. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* We first need to try opening the stream. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        int32_t framesPerPeriod;\n\n        result = ma_open_stream__aaudio(pContext, ma_device_type_capture, pConfig->capture.pDeviceID, pConfig->capture.shareMode, pConfig, pDevice, (ma_AAudioStream**)&pDevice->aaudio.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to open the AAudio stream. */\n        }\n\n        pDevice->capture.internalFormat     = (((MA_PFN_AAudioStream_getFormat)pContext->aaudio.AAudioStream_getFormat)((ma_AAudioStream*)pDevice->aaudio.pStreamCapture) == MA_AAUDIO_FORMAT_PCM_I16) ? ma_format_s16 : ma_format_f32;\n        pDevice->capture.internalChannels   = ((MA_PFN_AAudioStream_getChannelCount)pContext->aaudio.AAudioStream_getChannelCount)((ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        pDevice->capture.internalSampleRate = ((MA_PFN_AAudioStream_getSampleRate)pContext->aaudio.AAudioStream_getSampleRate)((ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        ma_get_standard_channel_map(ma_standard_channel_map_default, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap); /* <-- Cannot find info on channel order, so assuming a default. */\n        pDevice->capture.internalBufferSizeInFrames = ((MA_PFN_AAudioStream_getBufferCapacityInFrames)pContext->aaudio.AAudioStream_getBufferCapacityInFrames)((ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n\n        /*\n        TODO: When synchronous reading and writing is supported, use AAudioStream_getFramesPerBurst() instead of AAudioStream_getFramesPerDataCallback(). Keep\n        using AAudioStream_getFramesPerDataCallback() for asynchronous mode, though.\n        */\n        framesPerPeriod = ((MA_PFN_AAudioStream_getFramesPerDataCallback)pContext->aaudio.AAudioStream_getFramesPerDataCallback)((ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        if (framesPerPeriod > 0) {\n            pDevice->capture.internalPeriods = 1;\n        } else {\n            pDevice->capture.internalPeriods = pDevice->capture.internalBufferSizeInFrames / framesPerPeriod;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        int32_t framesPerPeriod;\n\n        result = ma_open_stream__aaudio(pContext, ma_device_type_playback, pConfig->playback.pDeviceID, pConfig->playback.shareMode, pConfig, pDevice, (ma_AAudioStream**)&pDevice->aaudio.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to open the AAudio stream. */\n        }\n\n        pDevice->playback.internalFormat     = (((MA_PFN_AAudioStream_getFormat)pContext->aaudio.AAudioStream_getFormat)((ma_AAudioStream*)pDevice->aaudio.pStreamPlayback) == MA_AAUDIO_FORMAT_PCM_I16) ? ma_format_s16 : ma_format_f32;\n        pDevice->playback.internalChannels   = ((MA_PFN_AAudioStream_getChannelCount)pContext->aaudio.AAudioStream_getChannelCount)((ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        pDevice->playback.internalSampleRate = ((MA_PFN_AAudioStream_getSampleRate)pContext->aaudio.AAudioStream_getSampleRate)((ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        ma_get_standard_channel_map(ma_standard_channel_map_default, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap); /* <-- Cannot find info on channel order, so assuming a default. */\n        pDevice->playback.internalBufferSizeInFrames = ((MA_PFN_AAudioStream_getBufferCapacityInFrames)pContext->aaudio.AAudioStream_getBufferCapacityInFrames)((ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n\n        framesPerPeriod = ((MA_PFN_AAudioStream_getFramesPerDataCallback)pContext->aaudio.AAudioStream_getFramesPerDataCallback)((ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        if (framesPerPeriod > 0) {\n            pDevice->playback.internalPeriods = 1;\n        } else {\n            pDevice->playback.internalPeriods = pDevice->playback.internalBufferSizeInFrames / framesPerPeriod;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 rbSizeInFrames = (ma_uint32)ma_calculate_frame_count_after_src(pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalBufferSizeInFrames);\n        ma_result result = ma_pcm_rb_init(pDevice->capture.format, pDevice->capture.channels, rbSizeInFrames, NULL, &pDevice->aaudio.duplexRB);\n        if (result != MA_SUCCESS) {\n            if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n                ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n            }\n            if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n                ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n            }\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[AAudio] Failed to initialize ring buffer.\", result);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_start_stream__aaudio(ma_device* pDevice, ma_AAudioStream* pStream)\n{\n    ma_aaudio_result_t resultAA;\n    ma_aaudio_stream_state_t currentState;\n\n    ma_assert(pDevice != NULL);\n\n    resultAA = ((MA_PFN_AAudioStream_requestStart)pDevice->pContext->aaudio.AAudioStream_requestStart)(pStream);\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    /* Do we actually need to wait for the device to transition into it's started state? */\n\n    /* The device should be in either a starting or started state. If it's not set to started we need to wait for it to transition. It should go from starting to started. */\n    currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream);\n    if (currentState != MA_AAUDIO_STREAM_STATE_STARTED) {\n        ma_result result;\n\n        if (currentState != MA_AAUDIO_STREAM_STATE_STARTING) {\n            return MA_ERROR;   /* Expecting the stream to be a starting or started state. */\n        }\n\n        result = ma_wait_for_simple_state_transition__aaudio(pDevice->pContext, pStream, currentState, MA_AAUDIO_STREAM_STATE_STARTED);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop_stream__aaudio(ma_device* pDevice, ma_AAudioStream* pStream)\n{\n    ma_aaudio_result_t resultAA;\n    ma_aaudio_stream_state_t currentState;\n\n    ma_assert(pDevice != NULL);\n\n    resultAA = ((MA_PFN_AAudioStream_requestStop)pDevice->pContext->aaudio.AAudioStream_requestStop)(pStream);\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    /* The device should be in either a stopping or stopped state. If it's not set to started we need to wait for it to transition. It should go from stopping to stopped. */\n    currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream);\n    if (currentState != MA_AAUDIO_STREAM_STATE_STOPPED) {\n        ma_result result;\n\n        if (currentState != MA_AAUDIO_STREAM_STATE_STOPPING) {\n            return MA_ERROR;   /* Expecting the stream to be a stopping or stopped state. */\n        }\n\n        result = ma_wait_for_simple_state_transition__aaudio(pDevice->pContext, pStream, currentState, MA_AAUDIO_STREAM_STATE_STOPPED);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_start__aaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_start_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_start_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            if (pDevice->type == ma_device_type_duplex) {\n                ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n            }\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__aaudio(ma_device* pDevice)\n{\n    ma_stop_proc onStop;\n\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    onStop = pDevice->onStop;\n    if (onStop) {\n        onStop(pDevice);\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_context_uninit__aaudio(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_aaudio);\n    \n    ma_dlclose(pContext, pContext->aaudio.hAAudio);\n    pContext->aaudio.hAAudio = NULL;\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__aaudio(const ma_context_config* pConfig, ma_context* pContext)\n{\n    const char* libNames[] = {\n        \"libaaudio.so\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libNames); ++i) {\n        pContext->aaudio.hAAudio = ma_dlopen(pContext, libNames[i]);\n        if (pContext->aaudio.hAAudio != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->aaudio.hAAudio == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->aaudio.AAudio_createStreamBuilder                    = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudio_createStreamBuilder\");\n    pContext->aaudio.AAudioStreamBuilder_delete                    = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_delete\");\n    pContext->aaudio.AAudioStreamBuilder_setDeviceId               = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setDeviceId\");\n    pContext->aaudio.AAudioStreamBuilder_setDirection              = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setDirection\");\n    pContext->aaudio.AAudioStreamBuilder_setSharingMode            = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setSharingMode\");\n    pContext->aaudio.AAudioStreamBuilder_setFormat                 = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setFormat\");\n    pContext->aaudio.AAudioStreamBuilder_setChannelCount           = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setChannelCount\");\n    pContext->aaudio.AAudioStreamBuilder_setSampleRate             = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setSampleRate\");\n    pContext->aaudio.AAudioStreamBuilder_setBufferCapacityInFrames = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setBufferCapacityInFrames\");\n    pContext->aaudio.AAudioStreamBuilder_setFramesPerDataCallback  = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setFramesPerDataCallback\");\n    pContext->aaudio.AAudioStreamBuilder_setDataCallback           = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setDataCallback\");\n    pContext->aaudio.AAudioStreamBuilder_setPerformanceMode        = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setPerformanceMode\");\n    pContext->aaudio.AAudioStreamBuilder_openStream                = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStreamBuilder_openStream\");\n    pContext->aaudio.AAudioStream_close                            = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_close\");\n    pContext->aaudio.AAudioStream_getState                         = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getState\");\n    pContext->aaudio.AAudioStream_waitForStateChange               = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_waitForStateChange\");\n    pContext->aaudio.AAudioStream_getFormat                        = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getFormat\");\n    pContext->aaudio.AAudioStream_getChannelCount                  = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getChannelCount\");\n    pContext->aaudio.AAudioStream_getSampleRate                    = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getSampleRate\");\n    pContext->aaudio.AAudioStream_getBufferCapacityInFrames        = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getBufferCapacityInFrames\");\n    pContext->aaudio.AAudioStream_getFramesPerDataCallback         = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getFramesPerDataCallback\");\n    pContext->aaudio.AAudioStream_getFramesPerBurst                = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_getFramesPerBurst\");\n    pContext->aaudio.AAudioStream_requestStart                     = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_requestStart\");\n    pContext->aaudio.AAudioStream_requestStop                      = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, \"AAudioStream_requestStop\");\n\n    pContext->isBackendAsynchronous = MA_TRUE;\n\n    pContext->onUninit        = ma_context_uninit__aaudio;\n    pContext->onDeviceIDEqual = ma_context_is_device_id_equal__aaudio;\n    pContext->onEnumDevices   = ma_context_enumerate_devices__aaudio;\n    pContext->onGetDeviceInfo = ma_context_get_device_info__aaudio;\n    pContext->onDeviceInit    = ma_device_init__aaudio;\n    pContext->onDeviceUninit  = ma_device_uninit__aaudio;\n    pContext->onDeviceStart   = ma_device_start__aaudio;\n    pContext->onDeviceStop    = ma_device_stop__aaudio;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n#endif  /* AAudio */\n\n\n/******************************************************************************\n\nOpenSL|ES Backend\n\n******************************************************************************/\n#ifdef MA_HAS_OPENSL\n#include <SLES/OpenSLES.h>\n#ifdef MA_ANDROID\n#include <SLES/OpenSLES_Android.h>\n#endif\n\n/* OpenSL|ES has one-per-application objects :( */\nSLObjectItf g_maEngineObjectSL = NULL;\nSLEngineItf g_maEngineSL = NULL;\nma_uint32 g_maOpenSLInitCounter = 0;\n\n#define MA_OPENSL_OBJ(p)         (*((SLObjectItf)(p)))\n#define MA_OPENSL_OUTPUTMIX(p)   (*((SLOutputMixItf)(p)))\n#define MA_OPENSL_PLAY(p)        (*((SLPlayItf)(p)))\n#define MA_OPENSL_RECORD(p)      (*((SLRecordItf)(p)))\n\n#ifdef MA_ANDROID\n#define MA_OPENSL_BUFFERQUEUE(p) (*((SLAndroidSimpleBufferQueueItf)(p)))\n#else\n#define MA_OPENSL_BUFFERQUEUE(p) (*((SLBufferQueueItf)(p)))\n#endif\n\n/* Converts an individual OpenSL-style channel identifier (SL_SPEAKER_FRONT_LEFT, etc.) to miniaudio. */\nma_uint8 ma_channel_id_to_ma__opensl(SLuint32 id)\n{\n    switch (id)\n    {\n        case SL_SPEAKER_FRONT_LEFT:            return MA_CHANNEL_FRONT_LEFT;\n        case SL_SPEAKER_FRONT_RIGHT:           return MA_CHANNEL_FRONT_RIGHT;\n        case SL_SPEAKER_FRONT_CENTER:          return MA_CHANNEL_FRONT_CENTER;\n        case SL_SPEAKER_LOW_FREQUENCY:         return MA_CHANNEL_LFE;\n        case SL_SPEAKER_BACK_LEFT:             return MA_CHANNEL_BACK_LEFT;\n        case SL_SPEAKER_BACK_RIGHT:            return MA_CHANNEL_BACK_RIGHT;\n        case SL_SPEAKER_FRONT_LEFT_OF_CENTER:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case SL_SPEAKER_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case SL_SPEAKER_BACK_CENTER:           return MA_CHANNEL_BACK_CENTER;\n        case SL_SPEAKER_SIDE_LEFT:             return MA_CHANNEL_SIDE_LEFT;\n        case SL_SPEAKER_SIDE_RIGHT:            return MA_CHANNEL_SIDE_RIGHT;\n        case SL_SPEAKER_TOP_CENTER:            return MA_CHANNEL_TOP_CENTER;\n        case SL_SPEAKER_TOP_FRONT_LEFT:        return MA_CHANNEL_TOP_FRONT_LEFT;\n        case SL_SPEAKER_TOP_FRONT_CENTER:      return MA_CHANNEL_TOP_FRONT_CENTER;\n        case SL_SPEAKER_TOP_FRONT_RIGHT:       return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case SL_SPEAKER_TOP_BACK_LEFT:         return MA_CHANNEL_TOP_BACK_LEFT;\n        case SL_SPEAKER_TOP_BACK_CENTER:       return MA_CHANNEL_TOP_BACK_CENTER;\n        case SL_SPEAKER_TOP_BACK_RIGHT:        return MA_CHANNEL_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts an individual miniaudio channel identifier (MA_CHANNEL_FRONT_LEFT, etc.) to OpenSL-style. */\nSLuint32 ma_channel_id_to_opensl(ma_uint8 id)\n{\n    switch (id)\n    {\n        case MA_CHANNEL_MONO:               return SL_SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_FRONT_LEFT:         return SL_SPEAKER_FRONT_LEFT;\n        case MA_CHANNEL_FRONT_RIGHT:        return SL_SPEAKER_FRONT_RIGHT;\n        case MA_CHANNEL_FRONT_CENTER:       return SL_SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_LFE:                return SL_SPEAKER_LOW_FREQUENCY;\n        case MA_CHANNEL_BACK_LEFT:          return SL_SPEAKER_BACK_LEFT;\n        case MA_CHANNEL_BACK_RIGHT:         return SL_SPEAKER_BACK_RIGHT;\n        case MA_CHANNEL_FRONT_LEFT_CENTER:  return SL_SPEAKER_FRONT_LEFT_OF_CENTER;\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return SL_SPEAKER_FRONT_RIGHT_OF_CENTER;\n        case MA_CHANNEL_BACK_CENTER:        return SL_SPEAKER_BACK_CENTER;\n        case MA_CHANNEL_SIDE_LEFT:          return SL_SPEAKER_SIDE_LEFT;\n        case MA_CHANNEL_SIDE_RIGHT:         return SL_SPEAKER_SIDE_RIGHT;\n        case MA_CHANNEL_TOP_CENTER:         return SL_SPEAKER_TOP_CENTER;\n        case MA_CHANNEL_TOP_FRONT_LEFT:     return SL_SPEAKER_TOP_FRONT_LEFT;\n        case MA_CHANNEL_TOP_FRONT_CENTER:   return SL_SPEAKER_TOP_FRONT_CENTER;\n        case MA_CHANNEL_TOP_FRONT_RIGHT:    return SL_SPEAKER_TOP_FRONT_RIGHT;\n        case MA_CHANNEL_TOP_BACK_LEFT:      return SL_SPEAKER_TOP_BACK_LEFT;\n        case MA_CHANNEL_TOP_BACK_CENTER:    return SL_SPEAKER_TOP_BACK_CENTER;\n        case MA_CHANNEL_TOP_BACK_RIGHT:     return SL_SPEAKER_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts a channel mapping to an OpenSL-style channel mask. */\nSLuint32 ma_channel_map_to_channel_mask__opensl(const ma_channel channelMap[MA_MAX_CHANNELS], ma_uint32 channels)\n{\n    SLuint32 channelMask = 0;\n    ma_uint32 iChannel;\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        channelMask |= ma_channel_id_to_opensl(channelMap[iChannel]);\n    }\n\n    return channelMask;\n}\n\n/* Converts an OpenSL-style channel mask to a miniaudio channel map. */\nvoid ma_channel_mask_to_channel_map__opensl(SLuint32 channelMask, ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    if (channels == 1 && channelMask == 0) {\n        channelMap[0] = MA_CHANNEL_MONO;\n    } else if (channels == 2 && channelMask == 0) {\n        channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n        channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n    } else {\n        if (channels == 1 && (channelMask & SL_SPEAKER_FRONT_CENTER) != 0) {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } else {\n            /* Just iterate over each bit. */\n            ma_uint32 iChannel = 0;\n            ma_uint32 iBit;\n            for (iBit = 0; iBit < 32; ++iBit) {\n                SLuint32 bitValue = (channelMask & (1UL << iBit));\n                if (bitValue != 0) {\n                    /* The bit is set. */\n                    channelMap[iChannel] = ma_channel_id_to_ma__opensl(bitValue);\n                    iChannel += 1;\n                }\n            }\n        }\n    }\n}\n\nSLuint32 ma_round_to_standard_sample_rate__opensl(SLuint32 samplesPerSec)\n{\n    if (samplesPerSec <= SL_SAMPLINGRATE_8) {\n        return SL_SAMPLINGRATE_8;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_11_025) {\n        return SL_SAMPLINGRATE_11_025;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_12) {\n        return SL_SAMPLINGRATE_12;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_16) {\n        return SL_SAMPLINGRATE_16;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_22_05) {\n        return SL_SAMPLINGRATE_22_05;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_24) {\n        return SL_SAMPLINGRATE_24;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_32) {\n        return SL_SAMPLINGRATE_32;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_44_1) {\n        return SL_SAMPLINGRATE_44_1;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_48) {\n        return SL_SAMPLINGRATE_48;\n    }\n\n    /* Android doesn't support more than 48000. */\n#ifndef MA_ANDROID\n    if (samplesPerSec <= SL_SAMPLINGRATE_64) {\n        return SL_SAMPLINGRATE_64;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_88_2) {\n        return SL_SAMPLINGRATE_88_2;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_96) {\n        return SL_SAMPLINGRATE_96;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_192) {\n        return SL_SAMPLINGRATE_192;\n    }\n#endif\n\n    return SL_SAMPLINGRATE_16;\n}\n\n\nma_bool32 ma_context_is_device_id_equal__opensl(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return pID0->opensl == pID1->opensl;\n}\n\nma_result ma_context_enumerate_devices__opensl(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    ma_assert(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to enumerate devices. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    TODO: Test Me.\n    \n    This is currently untested, so for now we are just returning default devices.\n    */\n#if 0 && !defined(MA_ANDROID)\n    ma_bool32 isTerminated = MA_FALSE;\n\n    SLuint32 pDeviceIDs[128];\n    SLint32 deviceCount = sizeof(pDeviceIDs) / sizeof(pDeviceIDs[0]);\n\n    SLAudioIODeviceCapabilitiesItf deviceCaps;\n    SLresult resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, SL_IID_AUDIOIODEVICECAPABILITIES, &deviceCaps);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        /* The interface may not be supported so just report a default device. */\n        goto return_default_device;\n    }\n\n    /* Playback */\n    if (!isTerminated) {\n        resultSL = (*deviceCaps)->GetAvailableAudioOutputs(deviceCaps, &deviceCount, pDeviceIDs);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return MA_NO_DEVICE;\n        }\n\n        for (SLint32 iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            deviceInfo.id.opensl = pDeviceIDs[iDevice];\n\n            SLAudioOutputDescriptor desc;\n            resultSL = (*deviceCaps)->QueryAudioOutputCapabilities(deviceCaps, deviceInfo.id.opensl, &desc);\n            if (resultSL == SL_RESULT_SUCCESS) {\n                ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), (const char*)desc.pDeviceName, (size_t)-1);\n\n                ma_bool32 cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    isTerminated = MA_TRUE;\n                    break;\n                }\n            }\n        }\n    }\n\n    /* Capture */\n    if (!isTerminated) {\n        resultSL = (*deviceCaps)->GetAvailableAudioInputs(deviceCaps, &deviceCount, pDeviceIDs);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return MA_NO_DEVICE;\n        }\n\n        for (SLint32 iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            deviceInfo.id.opensl = pDeviceIDs[iDevice];\n\n            SLAudioInputDescriptor desc;\n            resultSL = (*deviceCaps)->QueryAudioInputCapabilities(deviceCaps, deviceInfo.id.opensl, &desc);\n            if (resultSL == SL_RESULT_SUCCESS) {\n                ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), (const char*)desc.deviceName, (size_t)-1);\n\n                ma_bool32 cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    isTerminated = MA_TRUE;\n                    break;\n                }\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n#else\n    goto return_default_device;\n#endif\n\nreturn_default_device:;\n    cbResult = MA_TRUE;\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__opensl(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_assert(pContext != NULL);\n\n    ma_assert(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to get device info. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* No exclusive mode with OpenSL|ES. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /*\n    TODO: Test Me.\n    \n    This is currently untested, so for now we are just returning default devices.\n    */\n#if 0 && !defined(MA_ANDROID)\n    SLAudioIODeviceCapabilitiesItf deviceCaps;\n    SLresult resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, SL_IID_AUDIOIODEVICECAPABILITIES, &deviceCaps);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        /* The interface may not be supported so just report a default device. */\n        goto return_default_device;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        SLAudioOutputDescriptor desc;\n        resultSL = (*deviceCaps)->QueryAudioOutputCapabilities(deviceCaps, pDeviceID->opensl, &desc);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return MA_NO_DEVICE;\n        }\n\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (const char*)desc.pDeviceName, (size_t)-1);\n    } else {\n        SLAudioInputDescriptor desc;\n        resultSL = (*deviceCaps)->QueryAudioInputCapabilities(deviceCaps, pDeviceID->opensl, &desc);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return MA_NO_DEVICE;\n        }\n\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (const char*)desc.deviceName, (size_t)-1);\n    }\n\n    goto return_detailed_info;\n#else\n    goto return_default_device;\n#endif\n\nreturn_default_device:\n    if (pDeviceID != NULL) {\n        if ((deviceType == ma_device_type_playback && pDeviceID->opensl != SL_DEFAULTDEVICEID_AUDIOOUTPUT) ||\n            (deviceType == ma_device_type_capture  && pDeviceID->opensl != SL_DEFAULTDEVICEID_AUDIOINPUT)) {\n            return MA_NO_DEVICE;   /* Don't know the device. */\n        }\n    }\n\n    /* Name / Description */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    goto return_detailed_info;\n\n\nreturn_detailed_info:\n\n    /*\n    For now we're just outputting a set of values that are supported by the API but not necessarily supported\n    by the device natively. Later on we should work on this so that it more closely reflects the device's\n    actual native format.\n    */\n    pDeviceInfo->minChannels = 1;\n    pDeviceInfo->maxChannels = 2;\n    pDeviceInfo->minSampleRate = 8000;\n    pDeviceInfo->maxSampleRate = 48000;\n    pDeviceInfo->formatCount = 2;\n    pDeviceInfo->formats[0] = ma_format_u8;\n    pDeviceInfo->formats[1] = ma_format_s16;\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\n    pDeviceInfo->formats[pDeviceInfo->formatCount] = ma_format_f32;\n    pDeviceInfo->formatCount += 1;\n#endif\n\n    return MA_SUCCESS;\n}\n\n\n#ifdef MA_ANDROID\n/*void ma_buffer_queue_callback_capture__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, SLuint32 eventFlags, const void* pBuffer, SLuint32 bufferSize, SLuint32 dataUsed, void* pContext)*/\nvoid ma_buffer_queue_callback_capture__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    size_t periodSizeInBytes;\n    ma_uint8* pBuffer;\n    SLresult resultSL;\n\n    ma_assert(pDevice != NULL);\n\n    (void)pBufferQueue;\n\n    /*\n    For now, don't do anything unless the buffer was fully processed. From what I can tell, it looks like\n    OpenSL|ES 1.1 improves on buffer queues to the point that we could much more intelligently handle this,\n    but unfortunately it looks like Android is only supporting OpenSL|ES 1.0.1 for now :(\n    */\n\n    /* Don't do anything if the device is not started. */\n    if (pDevice->state != MA_STATE_STARTED) {\n        return;\n    }\n\n    periodSizeInBytes = (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods) * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    pBuffer = pDevice->opensl.pBufferCapture + (pDevice->opensl.currentBufferIndexCapture * periodSizeInBytes);\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_device__handle_duplex_callback_capture(pDevice, (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods), pBuffer, &pDevice->opensl.duplexRB);\n    } else {\n        ma_device__send_frames_to_client(pDevice, (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods), pBuffer);\n    }\n\n    resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, pBuffer, periodSizeInBytes);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        return;\n    }\n\n    pDevice->opensl.currentBufferIndexCapture = (pDevice->opensl.currentBufferIndexCapture + 1) % pDevice->capture.internalPeriods;\n}\n\nvoid ma_buffer_queue_callback_playback__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    size_t periodSizeInBytes;\n    ma_uint8* pBuffer;\n    SLresult resultSL;\n\n    ma_assert(pDevice != NULL);\n\n    (void)pBufferQueue;\n\n    /* Don't do anything if the device is not started. */\n    if (pDevice->state != MA_STATE_STARTED) {\n        return;\n    }\n\n    periodSizeInBytes = (pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods) * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    pBuffer = pDevice->opensl.pBufferPlayback + (pDevice->opensl.currentBufferIndexPlayback * periodSizeInBytes);\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_device__handle_duplex_callback_playback(pDevice, (pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods), pBuffer, &pDevice->opensl.duplexRB);\n    } else {\n        ma_device__read_frames_from_client(pDevice, (pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods), pBuffer);\n    }\n\n    resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, pBuffer, periodSizeInBytes);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        return;\n    }\n\n    pDevice->opensl.currentBufferIndexPlayback = (pDevice->opensl.currentBufferIndexPlayback + 1) % pDevice->playback.internalPeriods;\n}\n#endif\n\nvoid ma_device_uninit__opensl(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    ma_assert(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it before uninitializing the device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->opensl.pAudioRecorderObj) {\n            MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->Destroy((SLObjectItf)pDevice->opensl.pAudioRecorderObj);\n        }\n\n        ma_free(pDevice->opensl.pBufferCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->opensl.pAudioPlayerObj) {\n            MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->Destroy((SLObjectItf)pDevice->opensl.pAudioPlayerObj);\n        }\n        if (pDevice->opensl.pOutputMixObj) {\n            MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->Destroy((SLObjectItf)pDevice->opensl.pOutputMixObj);\n        }\n\n        ma_free(pDevice->opensl.pBufferPlayback);\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_pcm_rb_uninit(&pDevice->opensl.duplexRB);\n    }\n}\n\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\ntypedef SLAndroidDataFormat_PCM_EX  ma_SLDataFormat_PCM;\n#else\ntypedef SLDataFormat_PCM            ma_SLDataFormat_PCM;\n#endif\n\nma_result ma_SLDataFormat_PCM_init__opensl(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* channelMap, ma_SLDataFormat_PCM* pDataFormat)\n{\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\n    if (format == ma_format_f32) {\n        pDataFormat->formatType     = SL_ANDROID_DATAFORMAT_PCM_EX;\n        pDataFormat->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT;\n    } else {\n        pDataFormat->formatType = SL_DATAFORMAT_PCM;\n    }\n#else\n    pDataFormat->formatType = SL_DATAFORMAT_PCM;\n#endif\n\n    pDataFormat->numChannels   = channels;\n    ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec = ma_round_to_standard_sample_rate__opensl(sampleRate * 1000);  /* In millihertz. Annoyingly, the sample rate variable is named differently between SLAndroidDataFormat_PCM_EX and SLDataFormat_PCM */\n    pDataFormat->bitsPerSample = ma_get_bytes_per_sample(format)*8;\n    pDataFormat->channelMask   = ma_channel_map_to_channel_mask__opensl(channelMap, channels);\n    pDataFormat->endianness    = (ma_is_little_endian()) ? SL_BYTEORDER_LITTLEENDIAN : SL_BYTEORDER_BIGENDIAN;\n\n    /*\n    Android has a few restrictions on the format as documented here: https://developer.android.com/ndk/guides/audio/opensl-for-android.html\n     - Only mono and stereo is supported.\n     - Only u8 and s16 formats are supported.\n     - Maximum sample rate of 48000.\n    */\n#ifdef MA_ANDROID\n    if (pDataFormat->numChannels > 2) {\n        pDataFormat->numChannels = 2;\n    }\n#if __ANDROID_API__ >= 21\n    if (pDataFormat->formatType == SL_ANDROID_DATAFORMAT_PCM_EX) {\n        /* It's floating point. */\n        ma_assert(pDataFormat->representation == SL_ANDROID_PCM_REPRESENTATION_FLOAT);\n        if (pDataFormat->bitsPerSample > 32) {\n            pDataFormat->bitsPerSample = 32;\n        }\n    } else {\n        if (pDataFormat->bitsPerSample > 16) {\n            pDataFormat->bitsPerSample = 16;\n        }\n    }\n#else\n    if (pDataFormat->bitsPerSample > 16) {\n        pDataFormat->bitsPerSample = 16;\n    }\n#endif\n    if (((SLDataFormat_PCM*)pDataFormat)->samplesPerSec > SL_SAMPLINGRATE_48) {\n        ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec = SL_SAMPLINGRATE_48;\n    }\n#endif\n\n    pDataFormat->containerSize = pDataFormat->bitsPerSample;  /* Always tightly packed for now. */\n\n    return MA_SUCCESS;\n}\n\nma_result ma_deconstruct_SLDataFormat_PCM__opensl(ma_SLDataFormat_PCM* pDataFormat, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap)\n{\n    ma_bool32 isFloatingPoint = MA_FALSE;\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\n    if (pDataFormat->formatType == SL_ANDROID_DATAFORMAT_PCM_EX) {\n        ma_assert(pDataFormat->representation == SL_ANDROID_PCM_REPRESENTATION_FLOAT);\n        isFloatingPoint = MA_TRUE;\n    }\n#endif\n    if (isFloatingPoint) {\n        if (pDataFormat->bitsPerSample == 32) {\n            *pFormat = ma_format_f32;\n        }\n    } else {\n        if (pDataFormat->bitsPerSample == 8) {\n            *pFormat = ma_format_u8;\n        } else if (pDataFormat->bitsPerSample == 16) {\n            *pFormat = ma_format_s16;\n        } else if (pDataFormat->bitsPerSample == 24) {\n            *pFormat = ma_format_s24;\n        } else if (pDataFormat->bitsPerSample == 32) {\n            *pFormat = ma_format_s32;\n        }\n    }\n\n    *pChannels   = pDataFormat->numChannels;\n    *pSampleRate = ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec / 1000;\n    ma_channel_mask_to_channel_map__opensl(pDataFormat->channelMask, pDataFormat->numChannels, pChannelMap);\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__opensl(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n#ifdef MA_ANDROID\n    SLDataLocator_AndroidSimpleBufferQueue queue;\n    SLresult resultSL;\n    ma_uint32 bufferSizeInFrames;\n    size_t bufferSizeInBytes;\n    const SLInterfaceID itfIDs1[] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE};\n    const SLboolean itfIDsRequired1[] = {SL_BOOLEAN_TRUE};\n#endif\n\n    (void)pContext;\n\n    ma_assert(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to initialize a new device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    For now, only supporting Android implementations of OpenSL|ES since that's the only one I've\n    been able to test with and I currently depend on Android-specific extensions (simple buffer\n    queues).\n    */\n#ifdef MA_ANDROID\n    /* No exclusive mode with OpenSL|ES. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* Now we can start initializing the device properly. */\n    ma_assert(pDevice != NULL);\n    ma_zero_object(&pDevice->opensl);\n\n    queue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;\n    queue.numBuffers = pConfig->periods;\n\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_SLDataFormat_PCM pcm;\n        SLDataLocator_IODevice locatorDevice;\n        SLDataSource source;\n        SLDataSink sink;\n\n        ma_SLDataFormat_PCM_init__opensl(pConfig->capture.format, pConfig->capture.channels, pConfig->sampleRate, pConfig->capture.channelMap, &pcm);\n\n        locatorDevice.locatorType = SL_DATALOCATOR_IODEVICE;\n        locatorDevice.deviceType  = SL_IODEVICE_AUDIOINPUT;\n        locatorDevice.deviceID    = (pConfig->capture.pDeviceID == NULL) ? SL_DEFAULTDEVICEID_AUDIOINPUT : pConfig->capture.pDeviceID->opensl;\n        locatorDevice.device      = NULL;\n\n        source.pLocator = &locatorDevice;\n        source.pFormat  = NULL;\n\n        sink.pLocator = &queue;\n        sink.pFormat  = (SLDataFormat_PCM*)&pcm;\n\n        resultSL = (*g_maEngineSL)->CreateAudioRecorder(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioRecorderObj, &source, &sink, 1, itfIDs1, itfIDsRequired1);\n        if (resultSL == SL_RESULT_CONTENT_UNSUPPORTED) {\n            /* Unsupported format. Fall back to something safer and try again. If this fails, just abort. */\n            pcm.formatType    = SL_DATAFORMAT_PCM;\n            pcm.numChannels   = 1;\n            ((SLDataFormat_PCM*)&pcm)->samplesPerSec = SL_SAMPLINGRATE_16;  /* The name of the sample rate variable is different between SLAndroidDataFormat_PCM_EX and SLDataFormat_PCM. */\n            pcm.bitsPerSample = 16;\n            pcm.containerSize = pcm.bitsPerSample;  /* Always tightly packed for now. */\n            pcm.channelMask   = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;\n            resultSL = (*g_maEngineSL)->CreateAudioRecorder(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioRecorderObj, &source, &sink, 1, itfIDs1, itfIDsRequired1);\n        }\n\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to create audio recorder.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->Realize((SLObjectItf)pDevice->opensl.pAudioRecorderObj, SL_BOOLEAN_FALSE) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to realize audio recorder.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, SL_IID_RECORD, &pDevice->opensl.pAudioRecorder) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_RECORD interface.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pDevice->opensl.pBufferQueueCapture) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->RegisterCallback((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, ma_buffer_queue_callback_capture__opensl_android, pDevice) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to register buffer queue callback.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        /* The internal format is determined by the \"pcm\" object. */\n        ma_deconstruct_SLDataFormat_PCM__opensl(&pcm, &pDevice->capture.internalFormat, &pDevice->capture.internalChannels, &pDevice->capture.internalSampleRate, pDevice->capture.internalChannelMap);\n\n        /* Buffer. */\n        bufferSizeInFrames = pConfig->bufferSizeInFrames;\n        if (bufferSizeInFrames == 0) {\n            bufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pDevice->capture.internalSampleRate);\n        }\n        pDevice->capture.internalPeriods            = pConfig->periods;\n        pDevice->capture.internalBufferSizeInFrames = (bufferSizeInFrames / pDevice->capture.internalPeriods) * pDevice->capture.internalPeriods;\n        pDevice->opensl.currentBufferIndexCapture   = 0;\n\n        bufferSizeInBytes = pDevice->capture.internalBufferSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n        pDevice->opensl.pBufferCapture = (ma_uint8*)ma_malloc(bufferSizeInBytes);\n        if (pDevice->opensl.pBufferCapture == NULL) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to allocate memory for data buffer.\", MA_OUT_OF_MEMORY);\n        }\n        MA_ZERO_MEMORY(pDevice->opensl.pBufferCapture, bufferSizeInBytes);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_SLDataFormat_PCM pcm;\n        SLDataSource source;\n        SLDataLocator_OutputMix outmixLocator;\n        SLDataSink sink;\n\n        ma_SLDataFormat_PCM_init__opensl(pConfig->playback.format, pConfig->playback.channels, pConfig->sampleRate, pConfig->playback.channelMap, &pcm);\n\n        resultSL = (*g_maEngineSL)->CreateOutputMix(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pOutputMixObj, 0, NULL, NULL);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to create output mix.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->Realize((SLObjectItf)pDevice->opensl.pOutputMixObj, SL_BOOLEAN_FALSE)) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to realize output mix object.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->GetInterface((SLObjectItf)pDevice->opensl.pOutputMixObj, SL_IID_OUTPUTMIX, &pDevice->opensl.pOutputMix) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_OUTPUTMIX interface.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        /* Set the output device. */\n        if (pConfig->playback.pDeviceID != NULL) {\n            SLuint32 deviceID_OpenSL = pConfig->playback.pDeviceID->opensl;\n            MA_OPENSL_OUTPUTMIX(pDevice->opensl.pOutputMix)->ReRoute((SLOutputMixItf)pDevice->opensl.pOutputMix, 1, &deviceID_OpenSL);\n        }\n        \n        source.pLocator = &queue;\n        source.pFormat  = (SLDataFormat_PCM*)&pcm;\n\n        outmixLocator.locatorType = SL_DATALOCATOR_OUTPUTMIX;\n        outmixLocator.outputMix   = (SLObjectItf)pDevice->opensl.pOutputMixObj;\n\n        sink.pLocator = &outmixLocator;\n        sink.pFormat  = NULL;\n\n        resultSL = (*g_maEngineSL)->CreateAudioPlayer(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioPlayerObj, &source, &sink, 1, itfIDs1, itfIDsRequired1);\n        if (resultSL == SL_RESULT_CONTENT_UNSUPPORTED) {\n            /* Unsupported format. Fall back to something safer and try again. If this fails, just abort. */\n            pcm.formatType = SL_DATAFORMAT_PCM;\n            pcm.numChannels = 2;\n            ((SLDataFormat_PCM*)&pcm)->samplesPerSec = SL_SAMPLINGRATE_16;\n            pcm.bitsPerSample = 16;\n            pcm.containerSize = pcm.bitsPerSample;  /* Always tightly packed for now. */\n            pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;\n            resultSL = (*g_maEngineSL)->CreateAudioPlayer(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioPlayerObj, &source, &sink, 1, itfIDs1, itfIDsRequired1);\n        }\n\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to create audio player.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->Realize((SLObjectItf)pDevice->opensl.pAudioPlayerObj, SL_BOOLEAN_FALSE) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to realize audio player.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, SL_IID_PLAY, &pDevice->opensl.pAudioPlayer) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_PLAY interface.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pDevice->opensl.pBufferQueuePlayback) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        if (MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->RegisterCallback((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, ma_buffer_queue_callback_playback__opensl_android, pDevice) != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to register buffer queue callback.\", MA_FAILED_TO_OPEN_BACKEND_DEVICE);\n        }\n\n        /* The internal format is determined by the \"pcm\" object. */\n        ma_deconstruct_SLDataFormat_PCM__opensl(&pcm, &pDevice->playback.internalFormat, &pDevice->playback.internalChannels, &pDevice->playback.internalSampleRate, pDevice->playback.internalChannelMap);\n\n        /* Buffer. */\n        bufferSizeInFrames = pConfig->bufferSizeInFrames;\n        if (bufferSizeInFrames == 0) {\n            bufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pDevice->playback.internalSampleRate);\n        }\n        pDevice->playback.internalPeriods            = pConfig->periods;\n        pDevice->playback.internalBufferSizeInFrames = (bufferSizeInFrames / pDevice->playback.internalPeriods) * pDevice->playback.internalPeriods;\n        pDevice->opensl.currentBufferIndexPlayback   = 0;\n\n        bufferSizeInBytes = pDevice->playback.internalBufferSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n        pDevice->opensl.pBufferPlayback = (ma_uint8*)ma_malloc(bufferSizeInBytes);\n        if (pDevice->opensl.pBufferPlayback == NULL) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to allocate memory for data buffer.\", MA_OUT_OF_MEMORY);\n        }\n        MA_ZERO_MEMORY(pDevice->opensl.pBufferPlayback, bufferSizeInBytes);\n    }\n\n    if (pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 rbSizeInFrames = (ma_uint32)ma_calculate_frame_count_after_src(pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalBufferSizeInFrames);\n        ma_result result = ma_pcm_rb_init(pDevice->capture.format, pDevice->capture.channels, rbSizeInFrames, NULL, &pDevice->opensl.duplexRB);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to initialize ring buffer.\", result);\n        }\n    }\n\n    return MA_SUCCESS;\n#else\n    return MA_NO_BACKEND;   /* Non-Android implementations are not supported. */\n#endif\n}\n\nma_result ma_device_start__opensl(ma_device* pDevice)\n{\n    SLresult resultSL;\n    size_t periodSizeInBytes;\n    ma_uint32 iPeriod;\n\n    ma_assert(pDevice != NULL);\n\n    ma_assert(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to start the device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        resultSL = MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_RECORDING);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to start internal capture device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n\n        periodSizeInBytes = (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods) * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n        for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) {\n            resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, pDevice->opensl.pBufferCapture + (periodSizeInBytes * iPeriod), periodSizeInBytes);\n            if (resultSL != SL_RESULT_SUCCESS) {\n                MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_STOPPED);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to enqueue buffer for capture device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n            }\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        resultSL = MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_PLAYING);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to start internal playback device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n        }\n\n        /* In playback mode (no duplex) we need to load some initial buffers. In duplex mode we need to enqueu silent buffers. */\n        if (pDevice->type == ma_device_type_duplex) {\n            MA_ZERO_MEMORY(pDevice->opensl.pBufferPlayback, pDevice->playback.internalBufferSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n        } else {\n            ma_device__read_frames_from_client(pDevice, pDevice->playback.internalBufferSizeInFrames, pDevice->opensl.pBufferPlayback);   \n        }\n\n        periodSizeInBytes = (pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods) * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n        for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; ++iPeriod) {\n            resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, pDevice->opensl.pBufferPlayback + (periodSizeInBytes * iPeriod), periodSizeInBytes);\n            if (resultSL != SL_RESULT_SUCCESS) {\n                MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_STOPPED);\n                return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to enqueue buffer for playback device.\", MA_FAILED_TO_START_BACKEND_DEVICE);\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__opensl(ma_device* pDevice)\n{\n    SLresult resultSL;\n    ma_stop_proc onStop;\n\n    ma_assert(pDevice != NULL);\n\n    ma_assert(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it before stopping/uninitializing the device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* TODO: Wait until all buffers have been processed. Hint: Maybe SLAndroidSimpleBufferQueue::GetState() could be used in a loop? */\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        resultSL = MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_STOPPED);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to stop internal capture device.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Clear((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        resultSL = MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_STOPPED);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to stop internal playback device.\", MA_FAILED_TO_STOP_BACKEND_DEVICE);\n        }\n\n        MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Clear((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback);\n    }\n\n    /* Make sure the client is aware that the device has stopped. There may be an OpenSL|ES callback for this, but I haven't found it. */\n    onStop = pDevice->onStop;\n    if (onStop) {\n        onStop(pDevice);\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_context_uninit__opensl(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_opensl);\n    (void)pContext;\n\n    /* Uninit global data. */\n    if (g_maOpenSLInitCounter > 0) {\n        if (ma_atomic_decrement_32(&g_maOpenSLInitCounter) == 0) {\n            (*g_maEngineObjectSL)->Destroy(g_maEngineObjectSL);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__opensl(const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n\n    (void)pConfig;\n\n    /* Initialize global data first if applicable. */\n    if (ma_atomic_increment_32(&g_maOpenSLInitCounter) == 1) {\n        SLresult resultSL = slCreateEngine(&g_maEngineObjectSL, 0, NULL, 0, NULL, NULL);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_atomic_decrement_32(&g_maOpenSLInitCounter);\n            return MA_NO_BACKEND;\n        }\n\n        (*g_maEngineObjectSL)->Realize(g_maEngineObjectSL, SL_BOOLEAN_FALSE);\n\n        resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, SL_IID_ENGINE, &g_maEngineSL);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            (*g_maEngineObjectSL)->Destroy(g_maEngineObjectSL);\n            ma_atomic_decrement_32(&g_maOpenSLInitCounter);\n            return MA_NO_BACKEND;\n        }\n    }\n\n    pContext->isBackendAsynchronous = MA_TRUE;\n\n    pContext->onUninit        = ma_context_uninit__opensl;\n    pContext->onDeviceIDEqual = ma_context_is_device_id_equal__opensl;\n    pContext->onEnumDevices   = ma_context_enumerate_devices__opensl;\n    pContext->onGetDeviceInfo = ma_context_get_device_info__opensl;\n    pContext->onDeviceInit    = ma_device_init__opensl;\n    pContext->onDeviceUninit  = ma_device_uninit__opensl;\n    pContext->onDeviceStart   = ma_device_start__opensl;\n    pContext->onDeviceStop    = ma_device_stop__opensl;\n\n    return MA_SUCCESS;\n}\n#endif  /* OpenSL|ES */\n\n\n/******************************************************************************\n\nWeb Audio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_WEBAUDIO\n#include <emscripten/emscripten.h>\n\nma_bool32 ma_is_capture_supported__webaudio()\n{\n    return EM_ASM_INT({\n        return (navigator.mediaDevices !== undefined && navigator.mediaDevices.getUserMedia !== undefined);\n    }, 0) != 0; /* Must pass in a dummy argument for C99 compatibility. */\n}\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nEMSCRIPTEN_KEEPALIVE void ma_device_process_pcm_frames_capture__webaudio(ma_device* pDevice, int frameCount, float* pFrames)\n{\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_device__handle_duplex_callback_capture(pDevice, (ma_uint32)frameCount, pFrames, &pDevice->webaudio.duplexRB);\n    } else {\n        ma_device__send_frames_to_client(pDevice, (ma_uint32)frameCount, pFrames);    /* Send directly to the client. */\n    }\n}\n\nEMSCRIPTEN_KEEPALIVE void ma_device_process_pcm_frames_playback__webaudio(ma_device* pDevice, int frameCount, float* pFrames)\n{\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_device__handle_duplex_callback_playback(pDevice, (ma_uint32)frameCount, pFrames, &pDevice->webaudio.duplexRB);\n    } else {\n        ma_device__read_frames_from_client(pDevice, (ma_uint32)frameCount, pFrames);  /* Read directly from the device. */\n    }\n}\n#ifdef __cplusplus\n}\n#endif\n\nma_bool32 ma_context_is_device_id_equal__webaudio(ma_context* pContext, const ma_device_id* pID0, const ma_device_id* pID1)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pID0 != NULL);\n    ma_assert(pID1 != NULL);\n    (void)pContext;\n\n    return ma_strcmp(pID0->webaudio, pID1->webaudio) == 0;\n}\n\nma_result ma_context_enumerate_devices__webaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    ma_assert(pContext != NULL);\n    ma_assert(callback != NULL);\n\n    /* Only supporting default devices for now. */\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        ma_zero_object(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        if (ma_is_capture_supported__webaudio()) {\n            ma_device_info deviceInfo;\n            ma_zero_object(&deviceInfo);\n            ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n            cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_get_device_info__webaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_assert(pContext != NULL);\n\n    /* No exclusive mode with Web Audio. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if (deviceType == ma_device_type_capture && !ma_is_capture_supported__webaudio()) {\n        return MA_NO_DEVICE;\n    }\n\n\n    ma_zero_memory(pDeviceInfo->id.webaudio, sizeof(pDeviceInfo->id.webaudio));\n\n    /* Only supporting default devices for now. */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    /* Web Audio can support any number of channels and sample rates. It only supports f32 formats, however. */\n    pDeviceInfo->minChannels = 1;\n    pDeviceInfo->maxChannels = MA_MAX_CHANNELS;\n    if (pDeviceInfo->maxChannels > 32) {\n        pDeviceInfo->maxChannels = 32;  /* Maximum output channel count is 32 for createScriptProcessor() (JavaScript). */\n    }\n\n    /* We can query the sample rate by just using a temporary audio context. */\n    pDeviceInfo->minSampleRate = EM_ASM_INT({\n        try {\n            var temp = new (window.AudioContext || window.webkitAudioContext)();\n            var sampleRate = temp.sampleRate;\n            temp.close();\n            return sampleRate;\n        } catch(e) {\n            return 0;\n        }\n    }, 0);  /* Must pass in a dummy argument for C99 compatibility. */\n    pDeviceInfo->maxSampleRate = pDeviceInfo->minSampleRate;\n    if (pDeviceInfo->minSampleRate == 0) {\n        return MA_NO_DEVICE;\n    }\n\n    /* Web Audio only supports f32. */\n    pDeviceInfo->formatCount = 1;\n    pDeviceInfo->formats[0]  = ma_format_f32;\n\n    return MA_SUCCESS;\n}\n\n\nvoid ma_device_uninit_by_index__webaudio(ma_device* pDevice, ma_device_type deviceType, int deviceIndex)\n{\n    ma_assert(pDevice != NULL);\n\n    EM_ASM({\n        var device = miniaudio.get_device_by_index($0);\n\n        /* Make sure all nodes are disconnected and marked for collection. */\n        if (device.scriptNode !== undefined) {\n            device.scriptNode.onaudioprocess = function(e) {};  /* We want to reset the callback to ensure it doesn't get called after AudioContext.close() has returned. Shouldn't happen since we're disconnecting, but just to be safe... */\n            device.scriptNode.disconnect();\n            device.scriptNode = undefined;\n        }\n        if (device.streamNode !== undefined) {\n            device.streamNode.disconnect();\n            device.streamNode = undefined;\n        }\n\n        /*\n        Stop the device. I think there is a chance the callback could get fired after calling this, hence why we want\n        to clear the callback before closing.\n        */\n        device.webaudio.close();\n        device.webaudio = undefined;\n\n        /* Can't forget to free the intermediary buffer. This is the buffer that's shared between JavaScript and C. */\n        if (device.intermediaryBuffer !== undefined) {\n            Module._free(device.intermediaryBuffer);\n            device.intermediaryBuffer = undefined;\n            device.intermediaryBufferView = undefined;\n            device.intermediaryBufferSizeInBytes = undefined;\n        }\n\n        /* Make sure the device is untracked so the slot can be reused later. */\n        miniaudio.untrack_device_by_index($0);\n    }, deviceIndex, deviceType);\n}\n\nvoid ma_device_uninit__webaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_capture, pDevice->webaudio.indexCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_playback, pDevice->webaudio.indexPlayback);\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_pcm_rb_uninit(&pDevice->webaudio.duplexRB);\n    }\n}\n\nma_result ma_device_init_by_type__webaudio(ma_context* pContext, const ma_device_config* pConfig, ma_device_type deviceType, ma_device* pDevice)\n{\n    int deviceIndex;\n    ma_uint32 internalBufferSizeInFrames;\n\n    ma_assert(pContext   != NULL);\n    ma_assert(pConfig    != NULL);\n    ma_assert(deviceType != ma_device_type_duplex);\n    ma_assert(pDevice    != NULL);\n\n    if (deviceType == ma_device_type_capture && !ma_is_capture_supported__webaudio()) {\n        return MA_NO_DEVICE;\n    }\n\n    /* Try calculating an appropriate buffer size. */\n    internalBufferSizeInFrames = pConfig->bufferSizeInFrames;\n    if (internalBufferSizeInFrames == 0) {\n        internalBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->bufferSizeInMilliseconds, pConfig->sampleRate);\n    }\n\n    /* The size of the buffer must be a power of 2 and between 256 and 16384. */\n    if (internalBufferSizeInFrames < 256) {\n        internalBufferSizeInFrames = 256;\n    } else if (internalBufferSizeInFrames > 16384) {\n        internalBufferSizeInFrames = 16384;\n    } else {\n        internalBufferSizeInFrames = ma_next_power_of_2(internalBufferSizeInFrames);\n    }\n\n    /* We create the device on the JavaScript side and reference it using an index. We use this to make it possible to reference the device between JavaScript and C. */\n    deviceIndex = EM_ASM_INT({\n        var channels   = $0;\n        var sampleRate = $1;\n        var bufferSize = $2;    /* In PCM frames. */\n        var isCapture  = $3;\n        var pDevice    = $4;\n\n        if (typeof(miniaudio) === 'undefined') {\n            return -1;  /* Context not initialized. */\n        }\n\n        var device = {};\n\n        /* The AudioContext must be created in a suspended state. */\n        device.webaudio = new (window.AudioContext || window.webkitAudioContext)({sampleRate:sampleRate});\n        device.webaudio.suspend();\n\n        /*\n        We need an intermediary buffer which we use for JavaScript and C interop. This buffer stores interleaved f32 PCM data. Because it's passed between\n        JavaScript and C it needs to be allocated and freed using Module._malloc() and Module._free().\n        */\n        device.intermediaryBufferSizeInBytes = channels * bufferSize * 4;\n        device.intermediaryBuffer = Module._malloc(device.intermediaryBufferSizeInBytes);\n        device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, device.intermediaryBuffer, device.intermediaryBufferSizeInBytes);\n\n        /*\n        Both playback and capture devices use a ScriptProcessorNode for performing per-sample operations.\n\n        ScriptProcessorNode is actually deprecated so this is likely to be temporary. The way this works for playback is very simple. You just set a callback\n        that's periodically fired, just like a normal audio callback function. But apparently this design is \"flawed\" and is now deprecated in favour of\n        something called AudioWorklets which _forces_ you to load a _separate_ .js file at run time... nice... Hopefully ScriptProcessorNode will continue to\n        work for years to come, but this may need to change to use AudioSourceBufferNode instead, which I think is what Emscripten uses for it's built-in SDL\n        implementation. I'll be avoiding that insane AudioWorklet API like the plague...\n\n        For capture it is a bit unintuitive. We use the ScriptProccessorNode _only_ to get the raw PCM data. It is connected to an AudioContext just like the\n        playback case, however we just output silence to the AudioContext instead of passing any real data. It would make more sense to me to use the\n        MediaRecorder API, but unfortunately you need to specify a MIME time (Opus, Vorbis, etc.) for the binary blob that's returned to the client, but I've\n        been unable to figure out how to get this as raw PCM. The closes I can think is to use the MIME type for WAV files and just parse it, but I don't know\n        how well this would work. Although ScriptProccessorNode is deprecated, in practice it seems to have pretty good browser support so I'm leaving it like\n        this for now. If anything knows how I could get raw PCM data using the MediaRecorder API please let me know!\n        */\n        device.scriptNode = device.webaudio.createScriptProcessor(bufferSize, channels, channels);\n\n        if (isCapture) {\n            device.scriptNode.onaudioprocess = function(e) {\n                if (device.intermediaryBuffer === undefined) {\n                    return; /* This means the device has been uninitialized. */\n                }\n\n                /* Make sure silence it output to the AudioContext destination. Not doing this will cause sound to come out of the speakers! */\n                for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) {\n                    e.outputBuffer.getChannelData(iChannel).fill(0.0);\n                }\n\n                /* There are some situations where we may want to send silence to the client. */\n                var sendSilence = false;\n                if (device.streamNode === undefined) {\n                    sendSilence = true;\n                }\n\n                /* Sanity check. This will never happen, right? */\n                if (e.inputBuffer.numberOfChannels != channels) {\n                    console.log(\"Capture: Channel count mismatch. \" + e.inputBufer.numberOfChannels + \" != \" + channels + \". Sending silence.\");\n                    sendSilence = true;\n                }\n\n                /* This looped design guards against the situation where e.inputBuffer is a different size to the original buffer size. Should never happen in practice. */\n                var totalFramesProcessed = 0;\n                while (totalFramesProcessed < e.inputBuffer.length) {\n                    var framesRemaining = e.inputBuffer.length - totalFramesProcessed;\n                    var framesToProcess = framesRemaining;\n                    if (framesToProcess > (device.intermediaryBufferSizeInBytes/channels/4)) {\n                        framesToProcess = (device.intermediaryBufferSizeInBytes/channels/4);\n                    }\n\n                    /* We need to do the reverse of the playback case. We need to interleave the input data and copy it into the intermediary buffer. Then we send it to the client. */\n                    if (sendSilence) {\n                        device.intermediaryBufferView.fill(0.0);\n                    } else {\n                        for (var iFrame = 0; iFrame < framesToProcess; ++iFrame) {\n                            for (var iChannel = 0; iChannel < e.inputBuffer.numberOfChannels; ++iChannel) {\n                                device.intermediaryBufferView[iFrame*channels + iChannel] = e.inputBuffer.getChannelData(iChannel)[totalFramesProcessed + iFrame];\n                            }\n                        }\n                    }\n\n                    /* Send data to the client from our intermediary buffer. */\n                    ccall(\"ma_device_process_pcm_frames_capture__webaudio\", \"undefined\", [\"number\", \"number\", \"number\"], [pDevice, framesToProcess, device.intermediaryBuffer]);\n\n                    totalFramesProcessed += framesToProcess;\n                }\n            };\n\n            navigator.mediaDevices.getUserMedia({audio:true, video:false})\n                .then(function(stream) {\n                    device.streamNode = device.webaudio.createMediaStreamSource(stream);\n                    device.streamNode.connect(device.scriptNode);\n                    device.scriptNode.connect(device.webaudio.destination);\n                })\n                .catch(function(error) {\n                    /* I think this should output silence... */\n                    device.scriptNode.connect(device.webaudio.destination);\n                });\n        } else {\n            device.scriptNode.onaudioprocess = function(e) {\n                if (device.intermediaryBuffer === undefined) {\n                    return; /* This means the device has been uninitialized. */\n                }\n\n                var outputSilence = false;\n\n                /* Sanity check. This will never happen, right? */\n                if (e.outputBuffer.numberOfChannels != channels) {\n                    console.log(\"Playback: Channel count mismatch. \" + e.outputBufer.numberOfChannels + \" != \" + channels + \". Outputting silence.\");\n                    outputSilence = true;\n                    return;\n                }\n\n                /* This looped design guards against the situation where e.outputBuffer is a different size to the original buffer size. Should never happen in practice. */\n                var totalFramesProcessed = 0;\n                while (totalFramesProcessed < e.outputBuffer.length) {\n                    var framesRemaining = e.outputBuffer.length - totalFramesProcessed;\n                    var framesToProcess = framesRemaining;\n                    if (framesToProcess > (device.intermediaryBufferSizeInBytes/channels/4)) {\n                        framesToProcess = (device.intermediaryBufferSizeInBytes/channels/4);\n                    }\n\n                    /* Read data from the client into our intermediary buffer. */\n                    ccall(\"ma_device_process_pcm_frames_playback__webaudio\", \"undefined\", [\"number\", \"number\", \"number\"], [pDevice, framesToProcess, device.intermediaryBuffer]);\n\n                    /* At this point we'll have data in our intermediary buffer which we now need to deinterleave and copy over to the output buffers. */\n                    if (outputSilence) {\n                        for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) {\n                            e.outputBuffer.getChannelData(iChannel).fill(0.0);\n                        }\n                    } else {\n                        for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) {\n                            for (var iFrame = 0; iFrame < framesToProcess; ++iFrame) {\n                                e.outputBuffer.getChannelData(iChannel)[totalFramesProcessed + iFrame] = device.intermediaryBufferView[iFrame*channels + iChannel];\n                            }\n                        }\n                    }\n\n                    totalFramesProcessed += framesToProcess;\n                }\n            };\n\n            device.scriptNode.connect(device.webaudio.destination);\n        }\n\n        return miniaudio.track_device(device);\n    }, (deviceType == ma_device_type_capture) ? pConfig->capture.channels : pConfig->playback.channels, pConfig->sampleRate, internalBufferSizeInFrames, deviceType == ma_device_type_capture, pDevice);\n\n    if (deviceIndex < 0) {\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->webaudio.indexCapture               = deviceIndex;\n        pDevice->capture.internalFormat              = ma_format_f32;\n        pDevice->capture.internalChannels            = pConfig->capture.channels;\n        ma_get_standard_channel_map(ma_standard_channel_map_webaudio, pDevice->capture.internalChannels, pDevice->capture.internalChannelMap);\n        pDevice->capture.internalSampleRate          = EM_ASM_INT({ return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, deviceIndex);\n        pDevice->capture.internalBufferSizeInFrames  = internalBufferSizeInFrames;\n        pDevice->capture.internalPeriods             = 1;\n    } else {\n        pDevice->webaudio.indexPlayback              = deviceIndex;\n        pDevice->playback.internalFormat             = ma_format_f32;\n        pDevice->playback.internalChannels           = pConfig->playback.channels;\n        ma_get_standard_channel_map(ma_standard_channel_map_webaudio, pDevice->playback.internalChannels, pDevice->playback.internalChannelMap);\n        pDevice->playback.internalSampleRate         = EM_ASM_INT({ return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, deviceIndex);\n        pDevice->playback.internalBufferSizeInFrames = internalBufferSizeInFrames;\n        pDevice->playback.internalPeriods            = 1;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init__webaudio(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n\n    /* No exclusive mode with Web Audio. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        result = ma_device_init_by_type__webaudio(pContext, pConfig, ma_device_type_capture, pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        result = ma_device_init_by_type__webaudio(pContext, pConfig, ma_device_type_playback, pDevice);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_capture, pDevice->webaudio.indexCapture);\n            }\n            return result;\n        }\n    }\n\n    /*\n    We need a ring buffer for moving data from the capture device to the playback device. The capture callback is the producer\n    and the playback callback is the consumer. The buffer needs to be large enough to hold internalBufferSizeInFrames based on\n    the external sample rate.\n    */\n    if (pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 rbSizeInFrames = (ma_uint32)ma_calculate_frame_count_after_src(pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalBufferSizeInFrames) * 2;\n        result = ma_pcm_rb_init(pDevice->capture.format, pDevice->capture.channels, rbSizeInFrames, NULL, &pDevice->webaudio.duplexRB);\n        if (result != MA_SUCCESS) {\n            if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n                ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_capture, pDevice->webaudio.indexCapture);\n            }\n            if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n                ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_playback, pDevice->webaudio.indexPlayback);\n            }\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_start__webaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        EM_ASM({\n            miniaudio.get_device_by_index($0).webaudio.resume();\n        }, pDevice->webaudio.indexCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        EM_ASM({\n            miniaudio.get_device_by_index($0).webaudio.resume();\n        }, pDevice->webaudio.indexPlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_device_stop__webaudio(ma_device* pDevice)\n{\n    ma_assert(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        EM_ASM({\n            miniaudio.get_device_by_index($0).webaudio.suspend();\n        }, pDevice->webaudio.indexCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        EM_ASM({\n            miniaudio.get_device_by_index($0).webaudio.suspend();\n        }, pDevice->webaudio.indexPlayback);\n    }\n\n    ma_stop_proc onStop = pDevice->onStop;\n    if (onStop) {\n        onStop(pDevice);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_uninit__webaudio(ma_context* pContext)\n{\n    ma_assert(pContext != NULL);\n    ma_assert(pContext->backend == ma_backend_webaudio);\n\n    /* Nothing needs to be done here. */\n    (void)pContext;\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init__webaudio(const ma_context_config* pConfig, ma_context* pContext)\n{\n    int resultFromJS;\n\n    ma_assert(pContext != NULL);\n\n    /* Here is where our global JavaScript object is initialized. */\n    resultFromJS = EM_ASM_INT({\n        if ((window.AudioContext || window.webkitAudioContext) === undefined) {\n            return 0;   /* Web Audio not supported. */\n        }\n\n        if (typeof(miniaudio) === 'undefined') {\n            miniaudio = {};\n            miniaudio.devices = [];   /* Device cache for mapping devices to indexes for JavaScript/C interop. */\n                    \n            miniaudio.track_device = function(device) {\n                /* Try inserting into a free slot first. */\n                for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) {\n                    if (miniaudio.devices[iDevice] == null) {\n                        miniaudio.devices[iDevice] = device;\n                        return iDevice;\n                    }\n                }\n                        \n                /* Getting here means there is no empty slots in the array so we just push to the end. */\n                miniaudio.devices.push(device);\n                return miniaudio.devices.length - 1;\n            };\n                    \n            miniaudio.untrack_device_by_index = function(deviceIndex) {\n                /* We just set the device's slot to null. The slot will get reused in the next call to ma_track_device. */\n                miniaudio.devices[deviceIndex] = null;\n                        \n                /* Trim the array if possible. */\n                while (miniaudio.devices.length > 0) {\n                    if (miniaudio.devices[miniaudio.devices.length-1] == null) {\n                        miniaudio.devices.pop();\n                    } else {\n                        break;\n                    }\n                }\n            };\n                    \n            miniaudio.untrack_device = function(device) {\n                for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) {\n                    if (miniaudio.devices[iDevice] == device) {\n                        return miniaudio.untrack_device_by_index(iDevice);\n                    }\n                }\n            };\n                    \n            miniaudio.get_device_by_index = function(deviceIndex) {\n                return miniaudio.devices[deviceIndex];\n            };\n        }\n                \n        return 1;\n    }, 0);  /* Must pass in a dummy argument for C99 compatibility. */\n\n    if (resultFromJS != 1) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n\n    pContext->isBackendAsynchronous = MA_TRUE;\n\n    pContext->onUninit              = ma_context_uninit__webaudio;\n    pContext->onDeviceIDEqual       = ma_context_is_device_id_equal__webaudio;\n    pContext->onEnumDevices         = ma_context_enumerate_devices__webaudio;\n    pContext->onGetDeviceInfo       = ma_context_get_device_info__webaudio;\n    pContext->onDeviceInit          = ma_device_init__webaudio;\n    pContext->onDeviceUninit        = ma_device_uninit__webaudio;\n    pContext->onDeviceStart         = ma_device_start__webaudio;\n    pContext->onDeviceStop          = ma_device_stop__webaudio;\n\n    (void)pConfig; /* Unused. */\n    return MA_SUCCESS;\n}\n#endif  /* Web Audio */\n\n\n\nma_bool32 ma__is_channel_map_valid(const ma_channel* channelMap, ma_uint32 channels)\n{\n    /* A blank channel map should be allowed, in which case it should use an appropriate default which will depend on context. */\n    if (channelMap[0] != MA_CHANNEL_NONE) {\n        ma_uint32 iChannel;\n\n        if (channels == 0) {\n            return MA_FALSE;   /* No channels. */\n        }\n\n        /* A channel cannot be present in the channel map more than once. */\n        for (iChannel = 0; iChannel < channels; ++iChannel) {\n            ma_uint32 jChannel;\n            for (jChannel = iChannel + 1; jChannel < channels; ++jChannel) {\n                if (channelMap[iChannel] == channelMap[jChannel]) {\n                    return MA_FALSE;\n                }\n            }\n        }\n    }\n\n    return MA_TRUE;\n}\n\n\nvoid ma_device__post_init_setup(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_assert(pDevice != NULL);\n\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {\n        if (pDevice->capture.usingDefaultFormat) {\n            pDevice->capture.format = pDevice->capture.internalFormat;\n        }\n        if (pDevice->capture.usingDefaultChannels) {\n            pDevice->capture.channels = pDevice->capture.internalChannels;\n        }\n        if (pDevice->capture.usingDefaultChannelMap) {\n            if (pDevice->capture.internalChannels == pDevice->capture.channels) {\n                ma_channel_map_copy(pDevice->capture.channelMap, pDevice->capture.internalChannelMap, pDevice->capture.channels);\n            } else {\n                ma_get_standard_channel_map(ma_standard_channel_map_default, pDevice->capture.channels, pDevice->capture.channelMap);\n            }\n        }\n    }\n\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        if (pDevice->playback.usingDefaultFormat) {\n            pDevice->playback.format = pDevice->playback.internalFormat;\n        }\n        if (pDevice->playback.usingDefaultChannels) {\n            pDevice->playback.channels = pDevice->playback.internalChannels;\n        }\n        if (pDevice->playback.usingDefaultChannelMap) {\n            if (pDevice->playback.internalChannels == pDevice->playback.channels) {\n                ma_channel_map_copy(pDevice->playback.channelMap, pDevice->playback.internalChannelMap, pDevice->playback.channels);\n            } else {\n                ma_get_standard_channel_map(ma_standard_channel_map_default, pDevice->playback.channels, pDevice->playback.channelMap);\n            }\n        }\n    }\n\n    if (pDevice->usingDefaultSampleRate) {\n        if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {\n            pDevice->sampleRate = pDevice->capture.internalSampleRate;\n        } else {\n            pDevice->sampleRate = pDevice->playback.internalSampleRate;\n        }\n    }\n\n    /* PCM converters. */\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {\n        /* Converting from internal device format to public format. */\n        ma_pcm_converter_config converterConfig = ma_pcm_converter_config_init_new();\n        converterConfig.neverConsumeEndOfInput = MA_TRUE;\n        converterConfig.pUserData              = pDevice;\n        converterConfig.formatIn               = pDevice->capture.internalFormat;\n        converterConfig.channelsIn             = pDevice->capture.internalChannels;\n        converterConfig.sampleRateIn           = pDevice->capture.internalSampleRate;\n        ma_channel_map_copy(converterConfig.channelMapIn, pDevice->capture.internalChannelMap, pDevice->capture.internalChannels);\n        converterConfig.formatOut              = pDevice->capture.format;\n        converterConfig.channelsOut            = pDevice->capture.channels;\n        converterConfig.sampleRateOut          = pDevice->sampleRate;\n        ma_channel_map_copy(converterConfig.channelMapOut, pDevice->capture.channelMap, pDevice->capture.channels);\n        converterConfig.onRead = ma_device__pcm_converter__on_read_from_buffer_capture;\n        ma_pcm_converter_init(&converterConfig, &pDevice->capture.converter);\n    }\n\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        /* Converting from public format to device format. */\n        ma_pcm_converter_config converterConfig = ma_pcm_converter_config_init_new();\n        converterConfig.neverConsumeEndOfInput = MA_TRUE;\n        converterConfig.pUserData              = pDevice;\n        converterConfig.formatIn               = pDevice->playback.format;\n        converterConfig.channelsIn             = pDevice->playback.channels;\n        converterConfig.sampleRateIn           = pDevice->sampleRate;\n        ma_channel_map_copy(converterConfig.channelMapIn, pDevice->playback.channelMap, pDevice->playback.channels);\n        converterConfig.formatOut              = pDevice->playback.internalFormat;\n        converterConfig.channelsOut            = pDevice->playback.internalChannels;\n        converterConfig.sampleRateOut          = pDevice->playback.internalSampleRate;\n        ma_channel_map_copy(converterConfig.channelMapOut, pDevice->playback.internalChannelMap, pDevice->playback.internalChannels);\n        if (deviceType == ma_device_type_playback) {\n            if (pDevice->type == ma_device_type_playback) {\n                converterConfig.onRead = ma_device__on_read_from_client;\n            } else {\n                converterConfig.onRead = ma_device__pcm_converter__on_read_from_buffer_playback;\n            }\n        } else {\n            converterConfig.onRead = ma_device__pcm_converter__on_read_from_buffer_playback;\n        }\n        ma_pcm_converter_init(&converterConfig, &pDevice->playback.converter);\n    }\n}\n\n\nma_thread_result MA_THREADCALL ma_worker_thread(void* pData)\n{\n    ma_device* pDevice = (ma_device*)pData;\n    ma_assert(pDevice != NULL);\n\n#ifdef MA_WIN32\n    ma_CoInitializeEx(pDevice->pContext, NULL, MA_COINIT_VALUE);\n#endif\n\n    /*\n    When the device is being initialized it's initial state is set to MA_STATE_UNINITIALIZED. Before returning from\n    ma_device_init(), the state needs to be set to something valid. In miniaudio the device's default state immediately\n    after initialization is stopped, so therefore we need to mark the device as such. miniaudio will wait on the worker\n    thread to signal an event to know when the worker thread is ready for action.\n    */\n    ma_device__set_state(pDevice, MA_STATE_STOPPED);\n    ma_event_signal(&pDevice->stopEvent);\n\n    for (;;) {  /* <-- This loop just keeps the thread alive. The main audio loop is inside. */\n        ma_stop_proc onStop;\n\n        /* We wait on an event to know when something has requested that the device be started and the main loop entered. */\n        ma_event_wait(&pDevice->wakeupEvent);\n\n        /* Default result code. */\n        pDevice->workResult = MA_SUCCESS;\n\n        /* If the reason for the wake up is that we are terminating, just break from the loop. */\n        if (ma_device__get_state(pDevice) == MA_STATE_UNINITIALIZED) {\n            break;\n        }\n\n        /*\n        Getting to this point means the device is wanting to get started. The function that has requested that the device\n        be started will be waiting on an event (pDevice->startEvent) which means we need to make sure we signal the event\n        in both the success and error case. It's important that the state of the device is set _before_ signaling the event.\n        */\n        ma_assert(ma_device__get_state(pDevice) == MA_STATE_STARTING);\n\n        /* Make sure the state is set appropriately. */\n        ma_device__set_state(pDevice, MA_STATE_STARTED);\n        ma_event_signal(&pDevice->startEvent);\n\n        if (pDevice->pContext->onDeviceMainLoop != NULL) {\n            pDevice->pContext->onDeviceMainLoop(pDevice);\n        } else {\n            ma_uint32 periodSizeInFrames;\n\n            /* When a device is using miniaudio's generic worker thread they must implement onDeviceRead or onDeviceWrite, depending on the device type. */\n            ma_assert(\n                (pDevice->type == ma_device_type_playback && pDevice->pContext->onDeviceWrite != NULL) ||\n                (pDevice->type == ma_device_type_capture  && pDevice->pContext->onDeviceRead  != NULL) ||\n                (pDevice->type == ma_device_type_duplex   && pDevice->pContext->onDeviceWrite != NULL && pDevice->pContext->onDeviceRead != NULL)\n            );\n\n            if (pDevice->type == ma_device_type_capture) {\n                ma_assert(pDevice->capture.internalBufferSizeInFrames >= pDevice->capture.internalPeriods);\n                periodSizeInFrames = pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods;\n            } else if (pDevice->type == ma_device_type_playback) {\n                ma_assert(pDevice->playback.internalBufferSizeInFrames >= pDevice->playback.internalPeriods);\n                periodSizeInFrames = pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods;\n            } else {\n                ma_assert(pDevice->capture.internalBufferSizeInFrames >= pDevice->capture.internalPeriods);\n                ma_assert(pDevice->playback.internalBufferSizeInFrames >= pDevice->playback.internalPeriods);\n                periodSizeInFrames = ma_min(\n                    pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods,\n                    pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods\n                );\n            }\n\n            /*\n            With the blocking API, the device is started automatically in read()/write(). All we need to do is enter the loop and just keep reading\n            or writing based on the period size.\n            */\n            \n            /* Main Loop */\n            ma_assert(periodSizeInFrames >= 1);\n            while (ma_device__get_state(pDevice) == MA_STATE_STARTED) {\n                ma_result result = MA_SUCCESS;\n                ma_uint32 totalFramesProcessed = 0;\n\n                if (pDevice->type == ma_device_type_duplex) {\n                    /* The process is device_read -> convert -> callback -> convert -> device_write. */\n                    ma_uint8  captureDeviceData[4096];\n                    ma_uint32 captureDeviceDataCapInFrames = sizeof(captureDeviceData) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n\n                    while (totalFramesProcessed < periodSizeInFrames) {\n                        ma_device_callback_proc onData;\n                        ma_uint32 framesRemaining = periodSizeInFrames - totalFramesProcessed;\n                        ma_uint32 framesToProcess = framesRemaining;\n                        if (framesToProcess > captureDeviceDataCapInFrames) {\n                            framesToProcess = captureDeviceDataCapInFrames;\n                        }\n\n                        result = pDevice->pContext->onDeviceRead(pDevice, captureDeviceData, framesToProcess);\n                        if (result != MA_SUCCESS) {\n                            break;\n                        }\n                    \n                        onData = pDevice->onData;\n                        if (onData != NULL) {\n                            pDevice->capture._dspFrameCount = framesToProcess;\n                            pDevice->capture._dspFrames     = captureDeviceData;\n\n                            /* We need to process every input frame. */\n                            for (;;) {\n                                ma_uint8 capturedData[4096];   /* In capture.format/channels format */\n                                ma_uint8 playbackData[4096];   /* In playback.format/channels format */\n\n                                ma_uint32 capturedDataCapInFrames = sizeof(capturedData) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n                                ma_uint32 playbackDataCapInFrames = sizeof(playbackData) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n\n                                ma_uint32 capturedFramesToTryProcessing = ma_min(capturedDataCapInFrames, playbackDataCapInFrames);\n                                ma_uint32 capturedFramesToProcess = (ma_uint32)ma_pcm_converter_read(&pDevice->capture.converter, capturedData, capturedFramesToTryProcessing);\n                                if (capturedFramesToProcess == 0) {\n                                    break;  /* Don't fire the data callback with zero frames. */\n                                }\n                            \n                                onData(pDevice, playbackData, capturedData, capturedFramesToProcess);\n\n                                /* At this point the playbackData buffer should be holding data that needs to be written to the device. */\n                                pDevice->playback._dspFrameCount = capturedFramesToProcess;\n                                pDevice->playback._dspFrames     = playbackData;\n                                for (;;) {\n                                    ma_uint8 playbackDeviceData[4096];\n\n                                    ma_uint32 playbackDeviceDataCapInFrames = sizeof(playbackDeviceData) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                                    ma_uint32 playbackDeviceFramesCount = (ma_uint32)ma_pcm_converter_read(&pDevice->playback.converter, playbackDeviceData, playbackDeviceDataCapInFrames);\n                                    if (playbackDeviceFramesCount == 0) {\n                                        break;\n                                    }\n\n                                    result = pDevice->pContext->onDeviceWrite(pDevice, playbackDeviceData, playbackDeviceFramesCount);\n                                    if (result != MA_SUCCESS) {\n                                        break;\n                                    }\n\n                                    if (playbackDeviceFramesCount < playbackDeviceDataCapInFrames) {\n                                        break;\n                                    }\n                                }\n\n                                if (capturedFramesToProcess < capturedFramesToTryProcessing) {\n                                    break;\n                                }\n\n                                /* In case an error happened from onDeviceWrite()... */\n                                if (result != MA_SUCCESS) {\n                                    break;\n                                }\n                            }\n                        }\n\n                        totalFramesProcessed += framesToProcess;\n                    }\n                } else {\n                    ma_uint8  buffer[4096];\n                    ma_uint32 bufferSizeInFrames;\n                    if (pDevice->type == ma_device_type_capture) {\n                        bufferSizeInFrames = sizeof(buffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n                    } else {\n                        bufferSizeInFrames = sizeof(buffer) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                    }\n\n                    while (totalFramesProcessed < periodSizeInFrames) {\n                        ma_uint32 framesRemaining = periodSizeInFrames - totalFramesProcessed;\n                        ma_uint32 framesToProcess = framesRemaining;\n                        if (framesToProcess > bufferSizeInFrames) {\n                            framesToProcess = bufferSizeInFrames;\n                        }\n\n                        if (pDevice->type == ma_device_type_playback) {\n                            ma_device__read_frames_from_client(pDevice, framesToProcess, buffer);\n                            result = pDevice->pContext->onDeviceWrite(pDevice, buffer, framesToProcess);\n                        } else {\n                            result = pDevice->pContext->onDeviceRead(pDevice, buffer, framesToProcess);\n                            ma_device__send_frames_to_client(pDevice, framesToProcess, buffer);\n                        }\n\n                        totalFramesProcessed += framesToProcess;\n                    }\n                }\n\n                /* Get out of the loop if read()/write() returned an error. It probably means the device has been stopped. */\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n            }\n        }\n\n        /*\n        Getting here means we have broken from the main loop which happens the application has requested that device be stopped. Note that this\n        may have actually already happened above if the device was lost and miniaudio has attempted to re-initialize the device. In this case we\n        don't want to be doing this a second time.\n        */\n        if (ma_device__get_state(pDevice) != MA_STATE_UNINITIALIZED) {\n            if (pDevice->pContext->onDeviceStop) {\n                pDevice->pContext->onDeviceStop(pDevice);\n            }\n        }\n\n        /* After the device has stopped, make sure an event is posted. */\n        onStop = pDevice->onStop;\n        if (onStop) {\n            onStop(pDevice);\n        }\n\n        /*\n        A function somewhere is waiting for the device to have stopped for real so we need to signal an event to allow it to continue. Note that\n        it's possible that the device has been uninitialized which means we need to _not_ change the status to stopped. We cannot go from an\n        uninitialized state to stopped state.\n        */\n        if (ma_device__get_state(pDevice) != MA_STATE_UNINITIALIZED) {\n            ma_device__set_state(pDevice, MA_STATE_STOPPED);\n            ma_event_signal(&pDevice->stopEvent);\n        }\n    }\n\n    /* Make sure we aren't continuously waiting on a stop event. */\n    ma_event_signal(&pDevice->stopEvent);  /* <-- Is this still needed? */\n\n#ifdef MA_WIN32\n    ma_CoUninitialize(pDevice->pContext);\n#endif\n\n    return (ma_thread_result)0;\n}\n\n\n/* Helper for determining whether or not the given device is initialized. */\nma_bool32 ma_device__is_initialized(ma_device* pDevice)\n{\n    if (pDevice == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_device__get_state(pDevice) != MA_STATE_UNINITIALIZED;\n}\n\n\n#ifdef MA_WIN32\nma_result ma_context_uninit_backend_apis__win32(ma_context* pContext)\n{\n    ma_CoUninitialize(pContext);\n    ma_dlclose(pContext, pContext->win32.hUser32DLL);\n    ma_dlclose(pContext, pContext->win32.hOle32DLL);\n    ma_dlclose(pContext, pContext->win32.hAdvapi32DLL);\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init_backend_apis__win32(ma_context* pContext)\n{\n#ifdef MA_WIN32_DESKTOP\n    /* Ole32.dll */\n    pContext->win32.hOle32DLL = ma_dlopen(pContext, \"ole32.dll\");\n    if (pContext->win32.hOle32DLL == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->win32.CoInitializeEx   = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, \"CoInitializeEx\");\n    pContext->win32.CoUninitialize   = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, \"CoUninitialize\");\n    pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, \"CoCreateInstance\");\n    pContext->win32.CoTaskMemFree    = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, \"CoTaskMemFree\");\n    pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, \"PropVariantClear\");\n    pContext->win32.StringFromGUID2  = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, \"StringFromGUID2\");\n\n\n    /* User32.dll */\n    pContext->win32.hUser32DLL = ma_dlopen(pContext, \"user32.dll\");\n    if (pContext->win32.hUser32DLL == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->win32.GetForegroundWindow = (ma_proc)ma_dlsym(pContext, pContext->win32.hUser32DLL, \"GetForegroundWindow\");\n    pContext->win32.GetDesktopWindow    = (ma_proc)ma_dlsym(pContext, pContext->win32.hUser32DLL, \"GetDesktopWindow\");\n\n\n    /* Advapi32.dll */\n    pContext->win32.hAdvapi32DLL = ma_dlopen(pContext, \"advapi32.dll\");\n    if (pContext->win32.hAdvapi32DLL == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->win32.RegOpenKeyExA    = (ma_proc)ma_dlsym(pContext, pContext->win32.hAdvapi32DLL, \"RegOpenKeyExA\");\n    pContext->win32.RegCloseKey      = (ma_proc)ma_dlsym(pContext, pContext->win32.hAdvapi32DLL, \"RegCloseKey\");\n    pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(pContext, pContext->win32.hAdvapi32DLL, \"RegQueryValueExA\");\n#endif\n\n    ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE);\n    return MA_SUCCESS;\n}\n#else\nma_result ma_context_uninit_backend_apis__nix(ma_context* pContext)\n{\n#if defined(MA_USE_RUNTIME_LINKING_FOR_PTHREAD) && !defined(MA_NO_RUNTIME_LINKING)\n    ma_dlclose(pContext, pContext->posix.pthreadSO);\n#else\n    (void)pContext;\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_result ma_context_init_backend_apis__nix(ma_context* pContext)\n{\n    /* pthread */\n#if defined(MA_USE_RUNTIME_LINKING_FOR_PTHREAD) && !defined(MA_NO_RUNTIME_LINKING)\n    const char* libpthreadFileNames[] = {\n        \"libpthread.so\",\n        \"libpthread.so.0\",\n        \"libpthread.dylib\"\n    };\n    size_t i;\n\n    for (i = 0; i < sizeof(libpthreadFileNames) / sizeof(libpthreadFileNames[0]); ++i) {\n        pContext->posix.pthreadSO = ma_dlopen(pContext, libpthreadFileNames[i]);\n        if (pContext->posix.pthreadSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->posix.pthreadSO == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->posix.pthread_create              = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_create\");\n    pContext->posix.pthread_join                = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_join\");\n    pContext->posix.pthread_mutex_init          = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_mutex_init\");\n    pContext->posix.pthread_mutex_destroy       = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_mutex_destroy\");\n    pContext->posix.pthread_mutex_lock          = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_mutex_lock\");\n    pContext->posix.pthread_mutex_unlock        = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_mutex_unlock\");\n    pContext->posix.pthread_cond_init           = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_cond_init\");\n    pContext->posix.pthread_cond_destroy        = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_cond_destroy\");\n    pContext->posix.pthread_cond_wait           = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_cond_wait\");\n    pContext->posix.pthread_cond_signal         = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_cond_signal\");\n    pContext->posix.pthread_attr_init           = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_attr_init\");\n    pContext->posix.pthread_attr_destroy        = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_attr_destroy\");\n    pContext->posix.pthread_attr_setschedpolicy = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_attr_setschedpolicy\");\n    pContext->posix.pthread_attr_getschedparam  = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_attr_getschedparam\");\n    pContext->posix.pthread_attr_setschedparam  = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, \"pthread_attr_setschedparam\");\n#else\n    pContext->posix.pthread_create              = (ma_proc)pthread_create;\n    pContext->posix.pthread_join                = (ma_proc)pthread_join;\n    pContext->posix.pthread_mutex_init          = (ma_proc)pthread_mutex_init;\n    pContext->posix.pthread_mutex_destroy       = (ma_proc)pthread_mutex_destroy;\n    pContext->posix.pthread_mutex_lock          = (ma_proc)pthread_mutex_lock;\n    pContext->posix.pthread_mutex_unlock        = (ma_proc)pthread_mutex_unlock;\n    pContext->posix.pthread_cond_init           = (ma_proc)pthread_cond_init;\n    pContext->posix.pthread_cond_destroy        = (ma_proc)pthread_cond_destroy;\n    pContext->posix.pthread_cond_wait           = (ma_proc)pthread_cond_wait;\n    pContext->posix.pthread_cond_signal         = (ma_proc)pthread_cond_signal;\n    pContext->posix.pthread_attr_init           = (ma_proc)pthread_attr_init;\n    pContext->posix.pthread_attr_destroy        = (ma_proc)pthread_attr_destroy;\n#if !defined(__EMSCRIPTEN__)\n    pContext->posix.pthread_attr_setschedpolicy = (ma_proc)pthread_attr_setschedpolicy;\n    pContext->posix.pthread_attr_getschedparam  = (ma_proc)pthread_attr_getschedparam;\n    pContext->posix.pthread_attr_setschedparam  = (ma_proc)pthread_attr_setschedparam;\n#endif\n#endif\n\n    return MA_SUCCESS;\n}\n#endif\n\nma_result ma_context_init_backend_apis(ma_context* pContext)\n{\n    ma_result result;\n#ifdef MA_WIN32\n    result = ma_context_init_backend_apis__win32(pContext);\n#else\n    result = ma_context_init_backend_apis__nix(pContext);\n#endif\n\n    return result;\n}\n\nma_result ma_context_uninit_backend_apis(ma_context* pContext)\n{\n    ma_result result;\n#ifdef MA_WIN32\n    result = ma_context_uninit_backend_apis__win32(pContext);\n#else\n    result = ma_context_uninit_backend_apis__nix(pContext);\n#endif\n\n    return result;\n}\n\n\nma_bool32 ma_context_is_backend_asynchronous(ma_context* pContext)\n{\n    return pContext->isBackendAsynchronous;\n}\n\nma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_result result;\n    ma_context_config config;\n    ma_backend defaultBackends[ma_backend_null+1];\n    ma_uint32 iBackend;\n    ma_backend* pBackendsToIterate;\n    ma_uint32 backendsToIterateCount;\n\n    if (pContext == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pContext);\n\n    /* Always make sure the config is set first to ensure properties are available as soon as possible. */\n    if (pConfig != NULL) {\n        config = *pConfig;\n    } else {\n        config = ma_context_config_init();\n    }\n\n    pContext->logCallback = config.logCallback;\n    pContext->threadPriority = config.threadPriority;\n    pContext->pUserData = config.pUserData;\n\n    /* Backend APIs need to be initialized first. This is where external libraries will be loaded and linked. */\n    result = ma_context_init_backend_apis(pContext);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    for (iBackend = 0; iBackend <= ma_backend_null; ++iBackend) {\n        defaultBackends[iBackend] = (ma_backend)iBackend;\n    }\n\n    pBackendsToIterate = (ma_backend*)backends;\n    backendsToIterateCount = backendCount;\n    if (pBackendsToIterate == NULL) {\n        pBackendsToIterate = (ma_backend*)defaultBackends;\n        backendsToIterateCount = ma_countof(defaultBackends);\n    }\n\n    ma_assert(pBackendsToIterate != NULL);\n\n    for (iBackend = 0; iBackend < backendsToIterateCount; ++iBackend) {\n        ma_backend backend = pBackendsToIterate[iBackend];\n\n        result = MA_NO_BACKEND;\n        switch (backend) {\n        #ifdef MA_HAS_WASAPI\n            case ma_backend_wasapi:\n            {\n                result = ma_context_init__wasapi(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_DSOUND\n            case ma_backend_dsound:\n            {\n                result = ma_context_init__dsound(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_WINMM\n            case ma_backend_winmm:\n            {\n                result = ma_context_init__winmm(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_ALSA\n            case ma_backend_alsa:\n            {\n                result = ma_context_init__alsa(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_PULSEAUDIO\n            case ma_backend_pulseaudio:\n            {\n                result = ma_context_init__pulse(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_JACK\n            case ma_backend_jack:\n            {\n                result = ma_context_init__jack(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_COREAUDIO\n            case ma_backend_coreaudio:\n            {\n                result = ma_context_init__coreaudio(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_SNDIO\n            case ma_backend_sndio:\n            {\n                result = ma_context_init__sndio(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_AUDIO4\n            case ma_backend_audio4:\n            {\n                result = ma_context_init__audio4(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_OSS\n            case ma_backend_oss:\n            {\n                result = ma_context_init__oss(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_AAUDIO\n            case ma_backend_aaudio:\n            {\n                result = ma_context_init__aaudio(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_OPENSL\n            case ma_backend_opensl:\n            {\n                result = ma_context_init__opensl(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_WEBAUDIO\n            case ma_backend_webaudio:\n            {\n                result = ma_context_init__webaudio(&config, pContext);\n            } break;\n        #endif\n        #ifdef MA_HAS_NULL\n            case ma_backend_null:\n            {\n                result = ma_context_init__null(&config, pContext);\n            } break;\n        #endif\n\n            default: break;\n        }\n\n        /* If this iteration was successful, return. */\n        if (result == MA_SUCCESS) {\n            result = ma_mutex_init(pContext, &pContext->deviceEnumLock);\n            if (result != MA_SUCCESS) {\n                ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_WARNING, \"Failed to initialize mutex for device enumeration. ma_context_get_devices() is not thread safe.\", MA_FAILED_TO_CREATE_MUTEX);\n            }\n            result = ma_mutex_init(pContext, &pContext->deviceInfoLock);\n            if (result != MA_SUCCESS) {\n                ma_context_post_error(pContext, NULL, MA_LOG_LEVEL_WARNING, \"Failed to initialize mutex for device info retrieval. ma_context_get_device_info() is not thread safe.\", MA_FAILED_TO_CREATE_MUTEX);\n            }\n\n#ifdef MA_DEBUG_OUTPUT\n            printf(\"[miniaudio] Endian:  %s\\n\", ma_is_little_endian() ? \"LE\" : \"BE\");\n            printf(\"[miniaudio] SSE2:    %s\\n\", ma_has_sse2()    ? \"YES\" : \"NO\");\n            printf(\"[miniaudio] AVX2:    %s\\n\", ma_has_avx2()    ? \"YES\" : \"NO\");\n            printf(\"[miniaudio] AVX512F: %s\\n\", ma_has_avx512f() ? \"YES\" : \"NO\");\n            printf(\"[miniaudio] NEON:    %s\\n\", ma_has_neon()    ? \"YES\" : \"NO\");\n#endif\n\n            pContext->backend = backend;\n            return result;\n        }\n    }\n\n    /* If we get here it means an error occurred. */\n    ma_zero_object(pContext);  /* Safety. */\n    return MA_NO_BACKEND;\n}\n\nma_result ma_context_uninit(ma_context* pContext)\n{\n    if (pContext == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pContext->onUninit(pContext);\n\n    ma_mutex_uninit(&pContext->deviceEnumLock);\n    ma_mutex_uninit(&pContext->deviceInfoLock);\n    ma_free(pContext->pDeviceInfos);\n    ma_context_uninit_backend_apis(pContext);\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_result result;\n\n    if (pContext == NULL || pContext->onEnumDevices == NULL || callback == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_mutex_lock(&pContext->deviceEnumLock);\n    {\n        result = pContext->onEnumDevices(pContext, callback, pUserData);\n    }\n    ma_mutex_unlock(&pContext->deviceEnumLock);\n\n    return result;\n}\n\n\nma_bool32 ma_context_get_devices__enum_callback(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData)\n{\n    /*\n    We need to insert the device info into our main internal buffer. Where it goes depends on the device type. If it's a capture device\n    it's just appended to the end. If it's a playback device it's inserted just before the first capture device.\n    */\n\n    /*\n    First make sure we have room. Since the number of devices we add to the list is usually relatively small I've decided to use a\n    simple fixed size increment for buffer expansion.\n    */\n    const ma_uint32 bufferExpansionCount = 2;\n    const ma_uint32 totalDeviceInfoCount = pContext->playbackDeviceInfoCount + pContext->captureDeviceInfoCount;\n\n    if (pContext->deviceInfoCapacity >= totalDeviceInfoCount) {\n        ma_uint32 newCapacity = totalDeviceInfoCount + bufferExpansionCount;\n        ma_device_info* pNewInfos = (ma_device_info*)ma_realloc(pContext->pDeviceInfos, sizeof(*pContext->pDeviceInfos)*newCapacity);\n        if (pNewInfos == NULL) {\n            return MA_FALSE;   /* Out of memory. */\n        }\n\n        pContext->pDeviceInfos = pNewInfos;\n        pContext->deviceInfoCapacity = newCapacity;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        /* Playback. Insert just before the first capture device. */\n\n        /* The first thing to do is move all of the capture devices down a slot. */\n        ma_uint32 iFirstCaptureDevice = pContext->playbackDeviceInfoCount;\n        size_t iCaptureDevice;\n        for (iCaptureDevice = totalDeviceInfoCount; iCaptureDevice > iFirstCaptureDevice; --iCaptureDevice) {\n            pContext->pDeviceInfos[iCaptureDevice] = pContext->pDeviceInfos[iCaptureDevice-1];\n        }\n\n        /* Now just insert where the first capture device was before moving it down a slot. */\n        pContext->pDeviceInfos[iFirstCaptureDevice] = *pInfo;\n        pContext->playbackDeviceInfoCount += 1;\n    } else {\n        /* Capture. Insert at the end. */\n        pContext->pDeviceInfos[totalDeviceInfoCount] = *pInfo;\n        pContext->captureDeviceInfoCount += 1;\n    }\n\n    (void)pUserData;\n    return MA_TRUE;\n}\n\nma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount)\n{\n    ma_result result;\n\n    /* Safety. */\n    if (ppPlaybackDeviceInfos != NULL) *ppPlaybackDeviceInfos = NULL;\n    if (pPlaybackDeviceCount  != NULL) *pPlaybackDeviceCount  = 0;\n    if (ppCaptureDeviceInfos  != NULL) *ppCaptureDeviceInfos  = NULL;\n    if (pCaptureDeviceCount   != NULL) *pCaptureDeviceCount   = 0;\n\n    if (pContext == NULL || pContext->onEnumDevices == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Note that we don't use ma_context_enumerate_devices() here because we want to do locking at a higher level. */\n    ma_mutex_lock(&pContext->deviceEnumLock);\n    {\n        /* Reset everything first. */\n        pContext->playbackDeviceInfoCount = 0;\n        pContext->captureDeviceInfoCount = 0;\n\n        /* Now enumerate over available devices. */\n        result = pContext->onEnumDevices(pContext, ma_context_get_devices__enum_callback, NULL);\n        if (result == MA_SUCCESS) {\n            /* Playback devices. */\n            if (ppPlaybackDeviceInfos != NULL) {\n                *ppPlaybackDeviceInfos = pContext->pDeviceInfos;\n            }\n            if (pPlaybackDeviceCount != NULL) {\n                *pPlaybackDeviceCount = pContext->playbackDeviceInfoCount;\n            }\n\n            /* Capture devices. */\n            if (ppCaptureDeviceInfos != NULL) {\n                *ppCaptureDeviceInfos = pContext->pDeviceInfos + pContext->playbackDeviceInfoCount; /* Capture devices come after playback devices. */\n            }\n            if (pCaptureDeviceCount != NULL) {\n                *pCaptureDeviceCount = pContext->captureDeviceInfoCount;\n            }\n        }\n    }\n    ma_mutex_unlock(&pContext->deviceEnumLock);\n\n    return result;\n}\n\nma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, ma_device_info* pDeviceInfo)\n{\n    ma_device_info deviceInfo;\n\n    /* NOTE: Do not clear pDeviceInfo on entry. The reason is the pDeviceID may actually point to pDeviceInfo->id which will break things. */\n    if (pContext == NULL || pDeviceInfo == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(&deviceInfo);\n\n    /* Help the backend out by copying over the device ID if we have one. */\n    if (pDeviceID != NULL) {\n        ma_copy_memory(&deviceInfo.id, pDeviceID, sizeof(*pDeviceID));\n    }\n\n    /* The backend may have an optimized device info retrieval function. If so, try that first. */\n    if (pContext->onGetDeviceInfo != NULL) {\n        ma_result result;\n        ma_mutex_lock(&pContext->deviceInfoLock);\n        {\n            result = pContext->onGetDeviceInfo(pContext, deviceType, pDeviceID, shareMode, &deviceInfo);\n        }\n        ma_mutex_unlock(&pContext->deviceInfoLock);\n\n        /* Clamp ranges. */\n        deviceInfo.minChannels   = ma_max(deviceInfo.minChannels,   MA_MIN_CHANNELS);\n        deviceInfo.maxChannels   = ma_min(deviceInfo.maxChannels,   MA_MAX_CHANNELS);\n        deviceInfo.minSampleRate = ma_max(deviceInfo.minSampleRate, MA_MIN_SAMPLE_RATE);\n        deviceInfo.maxSampleRate = ma_min(deviceInfo.maxSampleRate, MA_MAX_SAMPLE_RATE);\n\n        *pDeviceInfo = deviceInfo;\n        return result;\n    }\n\n    /* Getting here means onGetDeviceInfo has not been set. */\n    return MA_ERROR;\n}\n\n\nma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_device_config config;\n\n    if (pContext == NULL) {\n        return ma_device_init_ex(NULL, 0, NULL, pConfig, pDevice);\n    }\n    if (pDevice == NULL) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with invalid arguments (pDevice == NULL).\", MA_INVALID_ARGS);\n    }\n    if (pConfig == NULL) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with invalid arguments (pConfig == NULL).\", MA_INVALID_ARGS);\n    }\n\n    /* We need to make a copy of the config so we can set default values if they were left unset in the input config. */\n    config = *pConfig;\n\n    /* Basic config validation. */\n    if (config.deviceType != ma_device_type_playback && config.deviceType != ma_device_type_capture && config.deviceType != ma_device_type_duplex) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with an invalid config. Device type is invalid. Make sure the device type has been set in the config.\", MA_INVALID_DEVICE_CONFIG);\n    }\n\n    if (config.deviceType == ma_device_type_capture || config.deviceType == ma_device_type_duplex) {\n        if (config.capture.channels > MA_MAX_CHANNELS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with an invalid config. Capture channel count cannot exceed 32.\", MA_INVALID_DEVICE_CONFIG);\n        }\n        if (!ma__is_channel_map_valid(config.capture.channelMap, config.capture.channels)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with invalid config. Capture channel map is invalid.\", MA_INVALID_DEVICE_CONFIG);\n        }\n    }\n\n    if (config.deviceType == ma_device_type_playback || config.deviceType == ma_device_type_duplex) {\n        if (config.playback.channels > MA_MAX_CHANNELS) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with an invalid config. Playback channel count cannot exceed 32.\", MA_INVALID_DEVICE_CONFIG);\n        }\n        if (!ma__is_channel_map_valid(config.playback.channelMap, config.playback.channels)) {\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_init() called with invalid config. Playback channel map is invalid.\", MA_INVALID_DEVICE_CONFIG);\n        }\n    }\n\n\n    ma_zero_object(pDevice);\n    pDevice->pContext = pContext;\n\n    /* Set the user data and log callback ASAP to ensure it is available for the entire initialization process. */\n    pDevice->pUserData = config.pUserData;\n    pDevice->onData = config.dataCallback;\n    pDevice->onStop = config.stopCallback;\n\n    if (((ma_uintptr)pDevice % sizeof(pDevice)) != 0) {\n        if (pContext->logCallback) {\n            pContext->logCallback(pContext, pDevice, MA_LOG_LEVEL_WARNING, \"WARNING: ma_device_init() called for a device that is not properly aligned. Thread safety is not supported.\");\n        }\n    }\n\n    /*\n    When passing in 0 for the format/channels/rate/chmap it means the device will be using whatever is chosen by the backend. If everything is set\n    to defaults it means the format conversion pipeline will run on a fast path where data transfer is just passed straight through to the backend.\n    */\n    if (config.sampleRate == 0) {\n        config.sampleRate = MA_DEFAULT_SAMPLE_RATE;\n        pDevice->usingDefaultSampleRate = MA_TRUE;\n    }\n\n    if (config.capture.format == ma_format_unknown) {\n        config.capture.format = MA_DEFAULT_FORMAT;\n        pDevice->capture.usingDefaultFormat = MA_TRUE;\n    }\n    if (config.capture.channels == 0) {\n        config.capture.channels = MA_DEFAULT_CHANNELS;\n        pDevice->capture.usingDefaultChannels = MA_TRUE;\n    }\n    if (config.capture.channelMap[0] == MA_CHANNEL_NONE) {\n        pDevice->capture.usingDefaultChannelMap = MA_TRUE;\n    }\n\n    if (config.playback.format == ma_format_unknown) {\n        config.playback.format = MA_DEFAULT_FORMAT;\n        pDevice->playback.usingDefaultFormat = MA_TRUE;\n    }\n    if (config.playback.channels == 0) {\n        config.playback.channels = MA_DEFAULT_CHANNELS;\n        pDevice->playback.usingDefaultChannels = MA_TRUE;\n    }\n    if (config.playback.channelMap[0] == MA_CHANNEL_NONE) {\n        pDevice->playback.usingDefaultChannelMap = MA_TRUE;\n    }\n\n\n    /* Default buffer size. */\n    if (config.bufferSizeInMilliseconds == 0 && config.bufferSizeInFrames == 0) {\n        config.bufferSizeInMilliseconds = (config.performanceProfile == ma_performance_profile_low_latency) ? MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_LOW_LATENCY : MA_BASE_BUFFER_SIZE_IN_MILLISECONDS_CONSERVATIVE;\n        pDevice->usingDefaultBufferSize = MA_TRUE;\n    }\n\n    /* Default periods. */\n    if (config.periods == 0) {\n        config.periods = MA_DEFAULT_PERIODS;\n        pDevice->usingDefaultPeriods = MA_TRUE;\n    }\n\n    /*\n    Must have at least 3 periods for full-duplex mode. The idea is that the playback and capture positions hang out in the middle period, with the surrounding\n    periods acting as a buffer in case the capture and playback devices get's slightly out of sync.\n    */\n    if (config.deviceType == ma_device_type_duplex && config.periods < 3) {\n        config.periods = 3;\n    }\n\n\n    pDevice->type = config.deviceType;\n    pDevice->sampleRate = config.sampleRate;\n\n    pDevice->capture.shareMode   = config.capture.shareMode;\n    pDevice->capture.format      = config.capture.format;\n    pDevice->capture.channels    = config.capture.channels;\n    ma_channel_map_copy(pDevice->capture.channelMap, config.capture.channelMap, config.capture.channels);\n\n    pDevice->playback.shareMode  = config.playback.shareMode;\n    pDevice->playback.format     = config.playback.format;\n    pDevice->playback.channels   = config.playback.channels;\n    ma_channel_map_copy(pDevice->playback.channelMap, config.playback.channelMap, config.playback.channels);\n\n\n    /* The internal format, channel count and sample rate can be modified by the backend. */\n    pDevice->capture.internalFormat      = pDevice->capture.format;\n    pDevice->capture.internalChannels    = pDevice->capture.channels;\n    pDevice->capture.internalSampleRate  = pDevice->sampleRate;\n    ma_channel_map_copy(pDevice->capture.internalChannelMap, pDevice->capture.channelMap, pDevice->capture.channels);\n\n    pDevice->playback.internalFormat     = pDevice->playback.format;\n    pDevice->playback.internalChannels   = pDevice->playback.channels;\n    pDevice->playback.internalSampleRate = pDevice->sampleRate;\n    ma_channel_map_copy(pDevice->playback.internalChannelMap, pDevice->playback.channelMap, pDevice->playback.channels);\n    \n\n    if (ma_mutex_init(pContext, &pDevice->lock) != MA_SUCCESS) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to create mutex.\", MA_FAILED_TO_CREATE_MUTEX);\n    }\n\n    /*\n    When the device is started, the worker thread is the one that does the actual startup of the backend device. We\n    use a semaphore to wait for the background thread to finish the work. The same applies for stopping the device.\n    \n    Each of these semaphores is released internally by the worker thread when the work is completed. The start\n    semaphore is also used to wake up the worker thread.\n    */\n    if (ma_event_init(pContext, &pDevice->wakeupEvent) != MA_SUCCESS) {\n        ma_mutex_uninit(&pDevice->lock);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to create worker thread wakeup event.\", MA_FAILED_TO_CREATE_EVENT);\n    }\n    if (ma_event_init(pContext, &pDevice->startEvent) != MA_SUCCESS) {\n        ma_event_uninit(&pDevice->wakeupEvent);\n        ma_mutex_uninit(&pDevice->lock);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to create worker thread start event.\", MA_FAILED_TO_CREATE_EVENT);\n    }\n    if (ma_event_init(pContext, &pDevice->stopEvent) != MA_SUCCESS) {\n        ma_event_uninit(&pDevice->startEvent);\n        ma_event_uninit(&pDevice->wakeupEvent);\n        ma_mutex_uninit(&pDevice->lock);\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to create worker thread stop event.\", MA_FAILED_TO_CREATE_EVENT);\n    }\n\n\n    result = pContext->onDeviceInit(pContext, &config, pDevice);\n    if (result != MA_SUCCESS) {\n        return MA_NO_BACKEND;  /* The error message will have been posted with ma_post_error() by the source of the error so don't bother calling it here. */\n    }\n\n    ma_device__post_init_setup(pDevice, pConfig->deviceType);\n\n\n    /* If the backend did not fill out a name for the device, try a generic method. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->capture.name[0] == '\\0') {\n            if (ma_context__try_get_device_name_by_id(pContext, ma_device_type_capture, config.capture.pDeviceID, pDevice->capture.name, sizeof(pDevice->capture.name)) != MA_SUCCESS) {\n                ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), (config.capture.pDeviceID == NULL)  ? MA_DEFAULT_CAPTURE_DEVICE_NAME : \"Capture Device\", (size_t)-1);\n            }\n        }\n    }\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->playback.name[0] == '\\0') {\n            if (ma_context__try_get_device_name_by_id(pContext, ma_device_type_playback, config.playback.pDeviceID, pDevice->playback.name, sizeof(pDevice->playback.name)) != MA_SUCCESS) {\n                ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), (config.playback.pDeviceID == NULL)  ? MA_DEFAULT_PLAYBACK_DEVICE_NAME : \"Playback Device\", (size_t)-1);\n            }\n        }\n    }\n\n\n    /* Some backends don't require the worker thread. */\n    if (!ma_context_is_backend_asynchronous(pContext)) {\n        /* The worker thread. */\n        if (ma_thread_create(pContext, &pDevice->thread, ma_worker_thread, pDevice) != MA_SUCCESS) {\n            ma_device_uninit(pDevice);\n            return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"Failed to create worker thread.\", MA_FAILED_TO_CREATE_THREAD);\n        }\n\n        /* Wait for the worker thread to put the device into it's stopped state for real. */\n        ma_event_wait(&pDevice->stopEvent);\n    } else {\n        ma_device__set_state(pDevice, MA_STATE_STOPPED);\n    }\n\n\n#ifdef MA_DEBUG_OUTPUT\n    printf(\"[%s]\\n\", ma_get_backend_name(pDevice->pContext->backend));\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        printf(\"  %s (%s)\\n\", pDevice->capture.name, \"Capture\");\n        printf(\"    Format:      %s -> %s\\n\", ma_get_format_name(pDevice->capture.format), ma_get_format_name(pDevice->capture.internalFormat));\n        printf(\"    Channels:    %d -> %d\\n\", pDevice->capture.channels, pDevice->capture.internalChannels);\n        printf(\"    Sample Rate: %d -> %d\\n\", pDevice->sampleRate, pDevice->capture.internalSampleRate);\n        printf(\"    Buffer Size: %d/%d (%d)\\n\", pDevice->capture.internalBufferSizeInFrames, pDevice->capture.internalPeriods, (pDevice->capture.internalBufferSizeInFrames / pDevice->capture.internalPeriods));\n        printf(\"    Conversion:\\n\");\n        printf(\"      Pre Format Conversion:    %s\\n\", pDevice->capture.converter.isPreFormatConversionRequired  ? \"YES\" : \"NO\");\n        printf(\"      Post Format Conversion:   %s\\n\", pDevice->capture.converter.isPostFormatConversionRequired ? \"YES\" : \"NO\");\n        printf(\"      Channel Routing:          %s\\n\", pDevice->capture.converter.isChannelRoutingRequired       ? \"YES\" : \"NO\");\n        printf(\"      SRC:                      %s\\n\", pDevice->capture.converter.isSRCRequired                  ? \"YES\" : \"NO\");\n        printf(\"      Channel Routing at Start: %s\\n\", pDevice->capture.converter.isChannelRoutingAtStart        ? \"YES\" : \"NO\");\n        printf(\"      Passthrough:              %s\\n\", pDevice->capture.converter.isPassthrough                  ? \"YES\" : \"NO\");\n    }\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        printf(\"  %s (%s)\\n\", pDevice->playback.name, \"Playback\");\n        printf(\"    Format:      %s -> %s\\n\", ma_get_format_name(pDevice->playback.format), ma_get_format_name(pDevice->playback.internalFormat));\n        printf(\"    Channels:    %d -> %d\\n\", pDevice->playback.channels, pDevice->playback.internalChannels);\n        printf(\"    Sample Rate: %d -> %d\\n\", pDevice->sampleRate, pDevice->playback.internalSampleRate);\n        printf(\"    Buffer Size: %d/%d (%d)\\n\", pDevice->playback.internalBufferSizeInFrames, pDevice->playback.internalPeriods, (pDevice->playback.internalBufferSizeInFrames / pDevice->playback.internalPeriods));\n        printf(\"    Conversion:\\n\");\n        printf(\"      Pre Format Conversion:    %s\\n\", pDevice->playback.converter.isPreFormatConversionRequired  ? \"YES\" : \"NO\");\n        printf(\"      Post Format Conversion:   %s\\n\", pDevice->playback.converter.isPostFormatConversionRequired ? \"YES\" : \"NO\");\n        printf(\"      Channel Routing:          %s\\n\", pDevice->playback.converter.isChannelRoutingRequired       ? \"YES\" : \"NO\");\n        printf(\"      SRC:                      %s\\n\", pDevice->playback.converter.isSRCRequired                  ? \"YES\" : \"NO\");\n        printf(\"      Channel Routing at Start: %s\\n\", pDevice->playback.converter.isChannelRoutingAtStart        ? \"YES\" : \"NO\");\n        printf(\"      Passthrough:              %s\\n\", pDevice->playback.converter.isPassthrough                  ? \"YES\" : \"NO\");\n    }\n#endif\n\n\n    ma_assert(ma_device__get_state(pDevice) == MA_STATE_STOPPED);\n    return MA_SUCCESS;\n}\n\nma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pContextConfig, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_context* pContext;\n    ma_backend defaultBackends[ma_backend_null+1];\n    ma_uint32 iBackend;\n    ma_backend* pBackendsToIterate;\n    ma_uint32 backendsToIterateCount;\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pContext = (ma_context*)ma_malloc(sizeof(*pContext));\n    if (pContext == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    for (iBackend = 0; iBackend <= ma_backend_null; ++iBackend) {\n        defaultBackends[iBackend] = (ma_backend)iBackend;\n    }\n\n    pBackendsToIterate = (ma_backend*)backends;\n    backendsToIterateCount = backendCount;\n    if (pBackendsToIterate == NULL) {\n        pBackendsToIterate = (ma_backend*)defaultBackends;\n        backendsToIterateCount = ma_countof(defaultBackends);\n    }\n\n    result = MA_NO_BACKEND;\n\n    for (iBackend = 0; iBackend < backendsToIterateCount; ++iBackend) {\n        result = ma_context_init(&pBackendsToIterate[iBackend], 1, pContextConfig, pContext);\n        if (result == MA_SUCCESS) {\n            result = ma_device_init(pContext, pConfig, pDevice);\n            if (result == MA_SUCCESS) {\n                break;  /* Success. */\n            } else {\n                ma_context_uninit(pContext);   /* Failure. */\n            }\n        }\n    }\n\n    if (result != MA_SUCCESS) {\n        ma_free(pContext);\n        return result;\n    }\n\n    pDevice->isOwnerOfContext = MA_TRUE;\n    return result;\n}\n\nvoid ma_device_uninit(ma_device* pDevice)\n{\n    if (!ma_device__is_initialized(pDevice)) {\n        return;\n    }\n\n    /* Make sure the device is stopped first. The backends will probably handle this naturally, but I like to do it explicitly for my own sanity. */\n    if (ma_device_is_started(pDevice)) {\n        ma_device_stop(pDevice);\n    }\n\n    /* Putting the device into an uninitialized state will make the worker thread return. */\n    ma_device__set_state(pDevice, MA_STATE_UNINITIALIZED);\n\n    /* Wake up the worker thread and wait for it to properly terminate. */\n    if (!ma_context_is_backend_asynchronous(pDevice->pContext)) {\n        ma_event_signal(&pDevice->wakeupEvent);\n        ma_thread_wait(&pDevice->thread);\n    }\n\n    pDevice->pContext->onDeviceUninit(pDevice);\n\n    ma_event_uninit(&pDevice->stopEvent);\n    ma_event_uninit(&pDevice->startEvent);\n    ma_event_uninit(&pDevice->wakeupEvent);\n    ma_mutex_uninit(&pDevice->lock);\n\n    if (pDevice->isOwnerOfContext) {\n        ma_context_uninit(pDevice->pContext);\n        ma_free(pDevice->pContext);\n    }\n\n    ma_zero_object(pDevice);\n}\n\nvoid ma_device_set_stop_callback(ma_device* pDevice, ma_stop_proc proc)\n{\n    if (pDevice == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_ptr(&pDevice->onStop, proc);\n}\n\nma_result ma_device_start(ma_device* pDevice)\n{\n    ma_result result;\n\n    if (pDevice == NULL) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_start() called with invalid arguments (pDevice == NULL).\", MA_INVALID_ARGS);\n    }\n\n    if (ma_device__get_state(pDevice) == MA_STATE_UNINITIALIZED) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_start() called for an uninitialized device.\", MA_DEVICE_NOT_INITIALIZED);\n    }\n\n    /*\n    Starting the device doesn't do anything in synchronous mode because in that case it's started automatically with\n    ma_device_write() and ma_device_read(). It's best to return an error so that the application can be aware that\n    it's not doing it right.\n    */\n    if (!ma_device__is_async(pDevice)) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_start() called in synchronous mode. This should only be used in asynchronous/callback mode.\", MA_DEVICE_NOT_INITIALIZED);\n    }\n\n    result = MA_ERROR;\n    ma_mutex_lock(&pDevice->lock);\n    {\n        /* Starting and stopping are wrapped in a mutex which means we can assert that the device is in a stopped or paused state. */\n        ma_assert(ma_device__get_state(pDevice) == MA_STATE_STOPPED);\n\n        ma_device__set_state(pDevice, MA_STATE_STARTING);\n\n        /* Asynchronous backends need to be handled differently. */\n        if (ma_context_is_backend_asynchronous(pDevice->pContext)) {\n            result = pDevice->pContext->onDeviceStart(pDevice);\n            if (result == MA_SUCCESS) {\n                ma_device__set_state(pDevice, MA_STATE_STARTED);\n            }\n        } else {\n            /*\n            Synchronous backends are started by signaling an event that's being waited on in the worker thread. We first wake up the\n            thread and then wait for the start event.\n            */\n            ma_event_signal(&pDevice->wakeupEvent);\n\n            /*\n            Wait for the worker thread to finish starting the device. Note that the worker thread will be the one who puts the device\n            into the started state. Don't call ma_device__set_state() here.\n            */\n            ma_event_wait(&pDevice->startEvent);\n            result = pDevice->workResult;\n        }\n    }\n    ma_mutex_unlock(&pDevice->lock);\n\n    return result;\n}\n\nma_result ma_device_stop(ma_device* pDevice)\n{\n    ma_result result;\n\n    if (pDevice == NULL) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_stop() called with invalid arguments (pDevice == NULL).\", MA_INVALID_ARGS);\n    }\n\n    if (ma_device__get_state(pDevice) == MA_STATE_UNINITIALIZED) {\n        return ma_post_error(pDevice, MA_LOG_LEVEL_ERROR, \"ma_device_stop() called for an uninitialized device.\", MA_DEVICE_NOT_INITIALIZED);\n    }\n\n    /*\n    Stopping is slightly different for synchronous mode. In this case it just tells the driver to stop the internal processing of the device. Also,\n    stopping in synchronous mode does not require state checking.\n    */\n    if (!ma_device__is_async(pDevice)) {\n        if (pDevice->pContext->onDeviceStop) {\n            return pDevice->pContext->onDeviceStop(pDevice);\n        }\n    }\n\n    result = MA_ERROR;\n    ma_mutex_lock(&pDevice->lock);\n    {\n        /* Starting and stopping are wrapped in a mutex which means we can assert that the device is in a started or paused state. */\n        ma_assert(ma_device__get_state(pDevice) == MA_STATE_STARTED);\n\n        ma_device__set_state(pDevice, MA_STATE_STOPPING);\n\n        /* There's no need to wake up the thread like we do when starting. */\n\n        /* Asynchronous backends need to be handled differently. */\n        if (ma_context_is_backend_asynchronous(pDevice->pContext)) {\n            if (pDevice->pContext->onDeviceStop) {\n                result = pDevice->pContext->onDeviceStop(pDevice);\n            } else {\n                result = MA_SUCCESS;\n            }\n\n            ma_device__set_state(pDevice, MA_STATE_STOPPED);\n        } else {\n            /* Synchronous backends. */\n\n            /*\n            We need to wait for the worker thread to become available for work before returning. Note that the worker thread will be\n            the one who puts the device into the stopped state. Don't call ma_device__set_state() here.\n            */\n            ma_event_wait(&pDevice->stopEvent);\n            result = MA_SUCCESS;\n        }\n    }\n    ma_mutex_unlock(&pDevice->lock);\n\n    return result;\n}\n\nma_bool32 ma_device_is_started(ma_device* pDevice)\n{\n    if (pDevice == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_device__get_state(pDevice) == MA_STATE_STARTED;\n}\n\n\nma_context_config ma_context_config_init()\n{\n    ma_context_config config;\n    ma_zero_object(&config);\n\n    return config;\n}\n\nma_device_config ma_device_config_init(ma_device_type deviceType)\n{\n    ma_device_config config;\n    ma_zero_object(&config);\n    config.deviceType = deviceType;\n\n    return config;\n}\n#endif  /* MA_NO_DEVICE_IO */\n\n\nvoid ma_get_standard_channel_map_microsoft(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    /* Based off the speaker configurations mentioned here: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ksmedia/ns-ksmedia-ksaudio_channel_config */\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n        } break;\n\n        case 3: /* Not defined, but best guess. */\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 4:\n        {\n#ifndef MA_USE_QUAD_MICROSOFT_CHANNEL_MAP\n            /* Surround. Using the Surround profile has the advantage of the 3rd channel (MA_CHANNEL_FRONT_CENTER) mapping nicely with higher channel counts. */\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_BACK_CENTER;\n#else\n            /* Quad. */\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n#endif\n        } break;\n\n        case 5: /* Not defined, but best guess. */\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_BACK_LEFT;\n            channelMap[4] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 6:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_LFE;\n            channelMap[4] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[5] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n\n        case 7: /* Not defined, but best guess. */\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_LFE;\n            channelMap[4] = MA_CHANNEL_BACK_CENTER;\n            channelMap[5] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[6] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n\n        case 8:\n        default:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_LFE;\n            channelMap[4] = MA_CHANNEL_BACK_LEFT;\n            channelMap[5] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[6] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[7] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 8) {\n        ma_uint32 iChannel;\n        for (iChannel = 8; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-8));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map_alsa(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_LEFT;\n            channelMap[1] = MA_CHANNEL_RIGHT;\n        } break;\n\n        case 3:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 4:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 5:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 6:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_LFE;\n        } break;\n\n        case 7:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_LFE;\n            channelMap[6] = MA_CHANNEL_BACK_CENTER;\n        } break;\n\n        case 8:\n        default:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_LFE;\n            channelMap[6] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[7] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 8) {\n        ma_uint32 iChannel;\n        for (iChannel = 8; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-8));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map_rfc3551(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_LEFT;\n            channelMap[1] = MA_CHANNEL_RIGHT;\n        } break;\n\n        case 3:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 4:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[2] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[3] = MA_CHANNEL_BACK_CENTER;\n        } break;\n\n        case 5:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_BACK_LEFT;\n            channelMap[4] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 6:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[4] = MA_CHANNEL_SIDE_RIGHT;\n            channelMap[5] = MA_CHANNEL_BACK_CENTER;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 8) {\n        ma_uint32 iChannel;\n        for (iChannel = 6; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-6));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map_flac(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_LEFT;\n            channelMap[1] = MA_CHANNEL_RIGHT;\n        } break;\n\n        case 3:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 4:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 5:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_BACK_LEFT;\n            channelMap[4] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 6:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_LFE;\n            channelMap[4] = MA_CHANNEL_BACK_LEFT;\n            channelMap[5] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 7:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_LFE;\n            channelMap[4] = MA_CHANNEL_BACK_CENTER;\n            channelMap[5] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[6] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n\n        case 8:\n        default:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[3] = MA_CHANNEL_LFE;\n            channelMap[4] = MA_CHANNEL_BACK_LEFT;\n            channelMap[5] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[6] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[7] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 8) {\n        ma_uint32 iChannel;\n        for (iChannel = 8; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-8));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map_vorbis(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    /* In Vorbis' type 0 channel mapping, the first two channels are not always the standard left/right - it will have the center speaker where the right usually goes. Why?! */\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_LEFT;\n            channelMap[1] = MA_CHANNEL_RIGHT;\n        } break;\n\n        case 3:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[2] = MA_CHANNEL_FRONT_RIGHT;\n        } break;\n\n        case 4:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 5:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[2] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[3] = MA_CHANNEL_BACK_LEFT;\n            channelMap[4] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 6:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[2] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[3] = MA_CHANNEL_BACK_LEFT;\n            channelMap[4] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[5] = MA_CHANNEL_LFE;\n        } break;\n\n        case 7:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[2] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[3] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[4] = MA_CHANNEL_SIDE_RIGHT;\n            channelMap[5] = MA_CHANNEL_BACK_CENTER;\n            channelMap[6] = MA_CHANNEL_LFE;\n        } break;\n\n        case 8:\n        default:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[2] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[3] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[4] = MA_CHANNEL_SIDE_RIGHT;\n            channelMap[5] = MA_CHANNEL_BACK_LEFT;\n            channelMap[6] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[7] = MA_CHANNEL_LFE;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 8) {\n        ma_uint32 iChannel;\n        for (iChannel = 8; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-8));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map_sound4(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_LEFT;\n            channelMap[1] = MA_CHANNEL_RIGHT;\n        } break;\n\n        case 3:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_CENTER;\n        } break;\n\n        case 4:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 5:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 6:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_LFE;\n        } break;\n\n        case 7:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_BACK_CENTER;\n            channelMap[6] = MA_CHANNEL_LFE;\n        } break;\n\n        case 8:\n        default:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_LFE;\n            channelMap[6] = MA_CHANNEL_SIDE_LEFT;\n            channelMap[7] = MA_CHANNEL_SIDE_RIGHT;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 8) {\n        ma_uint32 iChannel;\n        for (iChannel = 8; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-8));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map_sndio(ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    switch (channels)\n    {\n        case 1:\n        {\n            channelMap[0] = MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            channelMap[0] = MA_CHANNEL_LEFT;\n            channelMap[1] = MA_CHANNEL_RIGHT;\n        } break;\n\n        case 3:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 4:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n        } break;\n\n        case 5:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n        } break;\n\n        case 6:\n        default:\n        {\n            channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n            channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            channelMap[2] = MA_CHANNEL_BACK_LEFT;\n            channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n            channelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            channelMap[5] = MA_CHANNEL_LFE;\n        } break;\n    }\n\n    /* Remainder. */\n    if (channels > 6) {\n        ma_uint32 iChannel;\n        for (iChannel = 6; iChannel < MA_MAX_CHANNELS; ++iChannel) {\n            channelMap[iChannel] = (ma_channel)(MA_CHANNEL_AUX_0 + (iChannel-6));\n        }\n    }\n}\n\nvoid ma_get_standard_channel_map(ma_standard_channel_map standardChannelMap, ma_uint32 channels, ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    switch (standardChannelMap)\n    {\n        case ma_standard_channel_map_alsa:\n        {\n            ma_get_standard_channel_map_alsa(channels, channelMap);\n        } break;\n\n        case ma_standard_channel_map_rfc3551:\n        {\n            ma_get_standard_channel_map_rfc3551(channels, channelMap);\n        } break;\n\n        case ma_standard_channel_map_flac:\n        {\n            ma_get_standard_channel_map_flac(channels, channelMap);\n        } break;\n\n        case ma_standard_channel_map_vorbis:\n        {\n            ma_get_standard_channel_map_vorbis(channels, channelMap);\n        } break;\n\n        case ma_standard_channel_map_sound4:\n        {\n            ma_get_standard_channel_map_sound4(channels, channelMap);\n        } break;\n        \n        case ma_standard_channel_map_sndio:\n        {\n            ma_get_standard_channel_map_sndio(channels, channelMap);\n        } break;\n\n        case ma_standard_channel_map_microsoft:\n        default:\n        {\n            ma_get_standard_channel_map_microsoft(channels, channelMap);\n        } break;\n    }\n}\n\nvoid ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels)\n{\n    if (pOut != NULL && pIn != NULL && channels > 0) {\n        ma_copy_memory(pOut, pIn, sizeof(*pOut) * channels);\n    }\n}\n\nma_bool32 ma_channel_map_valid(ma_uint32 channels, const ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    if (channelMap == NULL) {\n        return MA_FALSE;\n    }\n\n    /* A channel count of 0 is invalid. */\n    if (channels == 0) {\n        return MA_FALSE;\n    }\n\n    /* It does not make sense to have a mono channel when there is more than 1 channel. */\n    if (channels > 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; ++iChannel) {\n            if (channelMap[iChannel] == MA_CHANNEL_MONO) {\n                return MA_FALSE;\n            }\n        }\n    }\n\n    return MA_TRUE;\n}\n\nma_bool32 ma_channel_map_equal(ma_uint32 channels, const ma_channel channelMapA[MA_MAX_CHANNELS], const ma_channel channelMapB[MA_MAX_CHANNELS])\n{\n    ma_uint32 iChannel;\n\n    if (channelMapA == channelMapB) {\n        return MA_FALSE;\n    }\n\n    if (channels == 0 || channels > MA_MAX_CHANNELS) {\n        return MA_FALSE;\n    }\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (channelMapA[iChannel] != channelMapB[iChannel]) {\n            return MA_FALSE;\n        }\n    }\n\n    return MA_TRUE;\n}\n\nma_bool32 ma_channel_map_blank(ma_uint32 channels, const ma_channel channelMap[MA_MAX_CHANNELS])\n{\n    ma_uint32 iChannel;\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (channelMap[iChannel] != MA_CHANNEL_NONE) {\n            return MA_FALSE;\n        }\n    }\n\n    return MA_TRUE;\n}\n\nma_bool32 ma_channel_map_contains_channel_position(ma_uint32 channels, const ma_channel channelMap[MA_MAX_CHANNELS], ma_channel channelPosition)\n{\n    ma_uint32 iChannel;\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (channelMap[iChannel] == channelPosition) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\n\n\n\n/**************************************************************************************************************************************************************\n\nFormat Conversion.\n\n**************************************************************************************************************************************************************/\nvoid ma_copy_memory_64(void* dst, const void* src, ma_uint64 sizeInBytes)\n{\n#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX\n    ma_copy_memory(dst, src, (size_t)sizeInBytes);\n#else\n    while (sizeInBytes > 0) {\n        ma_uint64 bytesToCopyNow = sizeInBytes;\n        if (bytesToCopyNow > MA_SIZE_MAX) {\n            bytesToCopyNow = MA_SIZE_MAX;\n        }\n\n        ma_copy_memory(dst, src, (size_t)bytesToCopyNow);  /* Safe cast to size_t. */\n\n        sizeInBytes -= bytesToCopyNow;\n        dst = (      void*)((      ma_uint8*)dst + bytesToCopyNow);\n        src = (const void*)((const ma_uint8*)src + bytesToCopyNow);\n    }\n#endif\n}\n\nvoid ma_zero_memory_64(void* dst, ma_uint64 sizeInBytes)\n{\n#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX\n    ma_zero_memory(dst, (size_t)sizeInBytes);\n#else\n    while (sizeInBytes > 0) {\n        ma_uint64 bytesToZeroNow = sizeInBytes;\n        if (bytesToZeroNow > MA_SIZE_MAX) {\n            bytesToZeroNow = MA_SIZE_MAX;\n        }\n\n        ma_zero_memory(dst, (size_t)bytesToZeroNow);  /* Safe cast to size_t. */\n\n        sizeInBytes -= bytesToZeroNow;\n        dst = (void*)((ma_uint8*)dst + bytesToZeroNow);\n    }\n#endif\n}\n\n\n/* u8 */\nvoid ma_pcm_u8_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n    ma_copy_memory_64(dst, src, count * sizeof(ma_uint8));\n}\n\n\nvoid ma_pcm_u8_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int16 x = src_u8[i];\n        x = x - 128;\n        x = x << 8;\n        dst_s16[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_u8_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_u8_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_u8_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_u8_to_s16__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_u8_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_u8_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_s16__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_u8_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int16 x = src_u8[i];\n        x = x - 128;\n\n        dst_s24[i*3+0] = 0;\n        dst_s24[i*3+1] = 0;\n        dst_s24[i*3+2] = (ma_uint8)((ma_int8)x);\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_u8_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_u8_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_u8_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_u8_to_s24__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_u8_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_u8_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_s24__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_u8_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int32 x = src_u8[i];\n        x = x - 128;\n        x = x << 24;\n        dst_s32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_u8_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_u8_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_u8_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_u8_to_s32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_u8_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_u8_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_s32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_u8_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        float x = (float)src_u8[i];\n        x = x * 0.00784313725490196078f;    /* 0..255 to 0..2 */\n        x = x - 1;                          /* 0..2 to -1..1 */\n\n        dst_f32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_u8_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_u8_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_u8_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_u8_to_f32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_u8_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_u8_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_f32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\n\nvoid ma_pcm_interleave_u8__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_uint8** src_u8 = (const ma_uint8**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_u8[iFrame*channels + iChannel] = src_u8[iChannel][iFrame];\n        }\n    }\n}\n\nvoid ma_pcm_interleave_u8__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_uint8** src_u8 = (const ma_uint8**)src;\n\n    if (channels == 1) {\n        ma_copy_memory_64(dst, src[0], frameCount * sizeof(ma_uint8));\n    } else if (channels == 2) {\n        ma_uint64 iFrame;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            dst_u8[iFrame*2 + 0] = src_u8[0][iFrame];\n            dst_u8[iFrame*2 + 1] = src_u8[1][iFrame];\n        }\n    } else {\n        ma_uint64 iFrame;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_uint32 iChannel;\n            for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                dst_u8[iFrame*channels + iChannel] = src_u8[iChannel][iFrame];\n            }\n        }\n    }\n}\n\nvoid ma_pcm_interleave_u8(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_u8__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_u8__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nvoid ma_pcm_deinterleave_u8__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8** dst_u8 = (ma_uint8**)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_u8[iChannel][iFrame] = src_u8[iFrame*channels + iChannel];\n        }\n    }\n}\n\nvoid ma_pcm_deinterleave_u8__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_u8__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_deinterleave_u8(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_u8__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_u8__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n/* s16 */\nvoid ma_pcm_s16_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int16 x = src_s16[i];\n            x = x >> 8;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int16 x = src_s16[i];\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x80, 0x7F);\n            if ((x + dither) <= 0x7FFF) {\n                x = (ma_int16)(x + dither);\n            } else {\n                x = 0x7FFF;\n            }\n\n            x = x >> 8;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    }\n}\n\nvoid ma_pcm_s16_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s16_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s16_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s16_to_u8__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s16_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s16_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_u8__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s16_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n    ma_copy_memory_64(dst, src, count * sizeof(ma_int16));\n}\n\n\nvoid ma_pcm_s16_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        dst_s24[i*3+0] = 0;\n        dst_s24[i*3+1] = (ma_uint8)(src_s16[i] & 0xFF);\n        dst_s24[i*3+2] = (ma_uint8)(src_s16[i] >> 8);\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_s16_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s16_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s16_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s16_to_s24__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s16_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s16_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_s24__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s16_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        dst_s32[i] = src_s16[i] << 16;\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_s16_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s16_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s16_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s16_to_s32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s16_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s16_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_s32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s16_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        float x = (float)src_s16[i];\n\n#if 0\n        /* The accurate way. */\n        x = x + 32768.0f;                   /* -32768..32767 to 0..65535 */\n        x = x * 0.00003051804379339284f;    /* 0..65536 to 0..2 */\n        x = x - 1;                          /* 0..2 to -1..1 */\n#else\n        /* The fast way. */\n        x = x * 0.000030517578125f;         /* -32768..32767 to -1..0.999969482421875 */\n#endif\n\n        dst_f32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_s16_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s16_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s16_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s16_to_f32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s16_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s16_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_f32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_interleave_s16__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_int16** src_s16 = (const ma_int16**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s16[iFrame*channels + iChannel] = src_s16[iChannel][iFrame];\n        }\n    }\n}\n\nvoid ma_pcm_interleave_s16__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_s16__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_interleave_s16(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_s16__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_s16__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nvoid ma_pcm_deinterleave_s16__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int16** dst_s16 = (ma_int16**)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s16[iChannel][iFrame] = src_s16[iFrame*channels + iChannel];\n        }\n    }\n}\n\nvoid ma_pcm_deinterleave_s16__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_s16__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_deinterleave_s16(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_s16__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_s16__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n/* s24 */\nvoid ma_pcm_s24_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int8 x = (ma_int8)src_s24[i*3 + 2] + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24);\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x800000, 0x7FFFFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n            \n            x = x >> 24;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    }\n}\n\nvoid ma_pcm_s24_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s24_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s24_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s24_to_u8__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s24_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s24_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_u8__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s24_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_uint16 dst_lo = ((ma_uint16)src_s24[i*3 + 1]);\n            ma_uint16 dst_hi = ((ma_uint16)src_s24[i*3 + 2]) << 8;\n            dst_s16[i] = (ma_int16)dst_lo | dst_hi;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24);\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x8000, 0x7FFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n\n            x = x >> 16;\n            dst_s16[i] = (ma_int16)x;\n        }\n    }\n}\n\nvoid ma_pcm_s24_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s24_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s24_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s24_to_s16__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s24_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s24_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_s16__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s24_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n\n    ma_copy_memory_64(dst, src, count * 3);\n}\n\n\nvoid ma_pcm_s24_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        dst_s32[i] = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24);\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_s24_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s24_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s24_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s24_to_s32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s24_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s24_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_s32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s24_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        float x = (float)(((ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24)) >> 8);\n\n#if 0\n        /* The accurate way. */\n        x = x + 8388608.0f;                 /* -8388608..8388607 to 0..16777215 */\n        x = x * 0.00000011920929665621f;    /* 0..16777215 to 0..2 */\n        x = x - 1;                          /* 0..2 to -1..1 */\n#else\n        /* The fast way. */\n        x = x * 0.00000011920928955078125f; /* -8388608..8388607 to -1..0.999969482421875 */\n#endif\n\n        dst_f32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nvoid ma_pcm_s24_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s24_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s24_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s24_to_f32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s24_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s24_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_f32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_interleave_s24__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8* dst8 = (ma_uint8*)dst;\n    const ma_uint8** src8 = (const ma_uint8**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst8[iFrame*3*channels + iChannel*3 + 0] = src8[iChannel][iFrame*3 + 0];\n            dst8[iFrame*3*channels + iChannel*3 + 1] = src8[iChannel][iFrame*3 + 1];\n            dst8[iFrame*3*channels + iChannel*3 + 2] = src8[iChannel][iFrame*3 + 2];\n        }\n    }\n}\n\nvoid ma_pcm_interleave_s24__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_s24__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_interleave_s24(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_s24__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_s24__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nvoid ma_pcm_deinterleave_s24__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8** dst8 = (ma_uint8**)dst;\n    const ma_uint8* src8 = (const ma_uint8*)src;\n\n    ma_uint32 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst8[iChannel][iFrame*3 + 0] = src8[iFrame*3*channels + iChannel*3 + 0];\n            dst8[iChannel][iFrame*3 + 1] = src8[iFrame*3*channels + iChannel*3 + 1];\n            dst8[iChannel][iFrame*3 + 2] = src8[iFrame*3*channels + iChannel*3 + 2];\n        }\n    }\n}\n\nvoid ma_pcm_deinterleave_s24__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_s24__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_deinterleave_s24(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_s24__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_s24__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n\n/* s32 */\nvoid ma_pcm_s32_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n            x = x >> 24;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x800000, 0x7FFFFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n            \n            x = x >> 24;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    }\n}\n\nvoid ma_pcm_s32_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s32_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s32_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s32_to_u8__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s32_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s32_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_u8__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s32_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n            x = x >> 16;\n            dst_s16[i] = (ma_int16)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x8000, 0x7FFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n            \n            x = x >> 16;\n            dst_s16[i] = (ma_int16)x;\n        }\n    }\n}\n\nvoid ma_pcm_s32_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s32_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s32_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s32_to_s16__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s32_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s32_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_s16__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s32_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_uint32 x = (ma_uint32)src_s32[i];\n        dst_s24[i*3+0] = (ma_uint8)((x & 0x0000FF00) >>  8);\n        dst_s24[i*3+1] = (ma_uint8)((x & 0x00FF0000) >> 16);\n        dst_s24[i*3+2] = (ma_uint8)((x & 0xFF000000) >> 24);\n    }\n\n    (void)ditherMode;   /* No dithering for s32 -> s24. */\n}\n\nvoid ma_pcm_s32_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s32_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s32_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s32_to_s24__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s32_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s32_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_s24__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_s32_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n\n    ma_copy_memory_64(dst, src, count * sizeof(ma_int32));\n}\n\n\nvoid ma_pcm_s32_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        double x = src_s32[i];\n\n#if 0\n        x = x + 2147483648.0;\n        x = x * 0.0000000004656612873077392578125;\n        x = x - 1;\n#else\n        x = x / 2147483648.0;\n#endif\n\n        dst_f32[i] = (float)x;\n    }\n\n    (void)ditherMode;   /* No dithering for s32 -> f32. */\n}\n\nvoid ma_pcm_s32_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_s32_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_s32_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_s32_to_f32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_s32_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_s32_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_f32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_interleave_s32__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_int32** src_s32 = (const ma_int32**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s32[iFrame*channels + iChannel] = src_s32[iChannel][iFrame];\n        }\n    }\n}\n\nvoid ma_pcm_interleave_s32__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_s32__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_interleave_s32(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_s32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_s32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nvoid ma_pcm_deinterleave_s32__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int32** dst_s32 = (ma_int32**)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s32[iChannel][iFrame] = src_s32[iFrame*channels + iChannel];\n        }\n    }\n}\n\nvoid ma_pcm_deinterleave_s32__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_s32__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_deinterleave_s32(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_s32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_s32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n/* f32 */\nvoid ma_pcm_f32_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const float* src_f32 = (const float*)src;\n\n    float ditherMin = 0;\n    float ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -128;\n        ditherMax = 1.0f /  127;\n    }\n\n    for (i = 0; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 127.5f;                             /* 0..2 to 0..255 */\n\n        dst_u8[i] = (ma_uint8)x;\n    }\n}\n\nvoid ma_pcm_f32_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_f32_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_f32_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_f32_to_u8__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_f32_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_f32_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_u8__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_f32_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const float* src_f32 = (const float*)src;\n\n    float ditherMin = 0;\n    float ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    for (i = 0; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n\n#if 0\n        /* The accurate way. */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 32767.5f;                           /* 0..2 to 0..65535 */\n        x = x - 32768.0f;                           /* 0...65535 to -32768..32767 */\n#else\n        /* The fast way. */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n#endif\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n\nvoid ma_pcm_f32_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i4;\n    ma_uint64 count4;\n\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const float* src_f32 = (const float*)src;\n\n    float ditherMin = 0;\n    float ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    /* Unrolled. */\n    i = 0;\n    count4 = count >> 2;\n    for (i4 = 0; i4 < count4; i4 += 1) {\n        float d0 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        float d1 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        float d2 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        float d3 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        \n        float x0 = src_f32[i+0];\n        float x1 = src_f32[i+1];\n        float x2 = src_f32[i+2];\n        float x3 = src_f32[i+3];\n\n        x0 = x0 + d0;\n        x1 = x1 + d1;\n        x2 = x2 + d2;\n        x3 = x3 + d3;\n\n        x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0));\n        x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1));\n        x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2));\n        x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3));\n\n        x0 = x0 * 32767.0f;\n        x1 = x1 * 32767.0f;\n        x2 = x2 * 32767.0f;\n        x3 = x3 * 32767.0f;\n\n        dst_s16[i+0] = (ma_int16)x0;\n        dst_s16[i+1] = (ma_int16)x1;\n        dst_s16[i+2] = (ma_int16)x2;\n        dst_s16[i+3] = (ma_int16)x3;\n\n        i += 4;\n    }\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_f32_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i8;\n    ma_uint64 count8;\n    ma_int16* dst_s16;\n    const float* src_f32;\n    float ditherMin;\n    float ditherMax;\n\n    /* Both the input and output buffers need to be aligned to 16 bytes. */\n    if ((((ma_uintptr)dst & 15) != 0) || (((ma_uintptr)src & 15) != 0)) {\n        ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        return;\n    }\n\n    dst_s16 = (ma_int16*)dst;\n    src_f32 = (const float*)src;\n\n    ditherMin = 0;\n    ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    i = 0;\n\n    /* SSE2. SSE allows us to output 8 s16's at a time which means our loop is unrolled 8 times. */\n    count8 = count >> 3;\n    for (i8 = 0; i8 < count8; i8 += 1) {\n        __m128 d0;\n        __m128 d1;\n        __m128 x0;\n        __m128 x1;\n\n        if (ditherMode == ma_dither_mode_none) {\n            d0 = _mm_set1_ps(0);\n            d1 = _mm_set1_ps(0);\n        } else if (ditherMode == ma_dither_mode_rectangle) {\n            d0 = _mm_set_ps(\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax)\n            );\n            d1 = _mm_set_ps(\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax)\n            );\n        } else {\n            d0 = _mm_set_ps(\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax)\n            );\n            d1 = _mm_set_ps(\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax)\n            );\n        }\n\n        x0 = *((__m128*)(src_f32 + i) + 0);\n        x1 = *((__m128*)(src_f32 + i) + 1);\n\n        x0 = _mm_add_ps(x0, d0);\n        x1 = _mm_add_ps(x1, d1);\n\n        x0 = _mm_mul_ps(x0, _mm_set1_ps(32767.0f));\n        x1 = _mm_mul_ps(x1, _mm_set1_ps(32767.0f));\n\n        _mm_stream_si128(((__m128i*)(dst_s16 + i)), _mm_packs_epi32(_mm_cvttps_epi32(x0), _mm_cvttps_epi32(x1)));\n        \n        i += 8;\n    }\n\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_f32_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i16;\n    ma_uint64 count16;\n    ma_int16* dst_s16;\n    const float* src_f32;\n    float ditherMin;\n    float ditherMax;\n\n    /* Both the input and output buffers need to be aligned to 32 bytes. */\n    if ((((ma_uintptr)dst & 31) != 0) || (((ma_uintptr)src & 31) != 0)) {\n        ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        return;\n    }\n\n    dst_s16 = (ma_int16*)dst;\n    src_f32 = (const float*)src;\n\n    ditherMin = 0;\n    ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    i = 0;\n\n    /* AVX2. AVX2 allows us to output 16 s16's at a time which means our loop is unrolled 16 times. */\n    count16 = count >> 4;\n    for (i16 = 0; i16 < count16; i16 += 1) {\n        __m256 d0;\n        __m256 d1;\n        __m256 x0;\n        __m256 x1;\n        __m256i i0;\n        __m256i i1;\n        __m256i p0;\n        __m256i p1;\n        __m256i r;\n\n        if (ditherMode == ma_dither_mode_none) {\n            d0 = _mm256_set1_ps(0);\n            d1 = _mm256_set1_ps(0);\n        } else if (ditherMode == ma_dither_mode_rectangle) {\n            d0 = _mm256_set_ps(\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax)\n            );\n            d1 = _mm256_set_ps(\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax)\n            );\n        } else {\n            d0 = _mm256_set_ps(\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax)\n            );\n            d1 = _mm256_set_ps(\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax)\n            );\n        }\n\n        x0 = *((__m256*)(src_f32 + i) + 0);\n        x1 = *((__m256*)(src_f32 + i) + 1);\n\n        x0 = _mm256_add_ps(x0, d0);\n        x1 = _mm256_add_ps(x1, d1);\n\n        x0 = _mm256_mul_ps(x0, _mm256_set1_ps(32767.0f));\n        x1 = _mm256_mul_ps(x1, _mm256_set1_ps(32767.0f));\n\n        /* Computing the final result is a little more complicated for AVX2 than SSE2. */\n        i0 = _mm256_cvttps_epi32(x0);\n        i1 = _mm256_cvttps_epi32(x1);\n        p0 = _mm256_permute2x128_si256(i0, i1, 0 | 32);\n        p1 = _mm256_permute2x128_si256(i0, i1, 1 | 48);\n        r  = _mm256_packs_epi32(p0, p1);\n\n        _mm256_stream_si256(((__m256i*)(dst_s16 + i)), r);\n\n        i += 16;\n    }\n\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_f32_to_s16__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    /* TODO: Convert this from AVX to AVX-512. */\n    ma_pcm_f32_to_s16__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_f32_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i8;\n    ma_uint64 count8;\n    ma_int16* dst_s16;\n    const float* src_f32;\n    float ditherMin;\n    float ditherMax;\n\n    /* Both the input and output buffers need to be aligned to 16 bytes. */\n    if ((((ma_uintptr)dst & 15) != 0) || (((ma_uintptr)src & 15) != 0)) {\n        ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        return;\n    }\n\n    dst_s16 = (ma_int16*)dst;\n    src_f32 = (const float*)src;\n\n    ditherMin = 0;\n    ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    i = 0;\n\n    /* NEON. NEON allows us to output 8 s16's at a time which means our loop is unrolled 8 times. */\n    count8 = count >> 3;\n    for (i8 = 0; i8 < count8; i8 += 1) {\n        float32x4_t d0;\n        float32x4_t d1;\n        float32x4_t x0;\n        float32x4_t x1;\n        int32x4_t i0;\n        int32x4_t i1;\n\n        if (ditherMode == ma_dither_mode_none) {\n            d0 = vmovq_n_f32(0);\n            d1 = vmovq_n_f32(0);\n        } else if (ditherMode == ma_dither_mode_rectangle) {\n            float d0v[4];\n            d0v[0] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0v[1] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0v[2] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0v[3] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0 = vld1q_f32(d0v);\n\n            float d1v[4];\n            d1v[0] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1v[1] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1v[2] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1v[3] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1 = vld1q_f32(d1v);\n        } else {\n            float d0v[4];\n            d0v[0] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0v[1] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0v[2] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0v[3] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0 = vld1q_f32(d0v);\n\n            float d1v[4];\n            d1v[0] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1v[1] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1v[2] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1v[3] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1 = vld1q_f32(d1v);\n        }\n\n        x0 = *((float32x4_t*)(src_f32 + i) + 0);\n        x1 = *((float32x4_t*)(src_f32 + i) + 1);\n\n        x0 = vaddq_f32(x0, d0);\n        x1 = vaddq_f32(x1, d1);\n\n        x0 = vmulq_n_f32(x0, 32767.0f);\n        x1 = vmulq_n_f32(x1, 32767.0f);\n\n        i0 = vcvtq_s32_f32(x0);\n        i1 = vcvtq_s32_f32(x1);\n        *((int16x8_t*)(dst_s16 + i)) = vcombine_s16(vqmovn_s32(i0), vqmovn_s32(i1));\n\n        i += 8;\n    }\n\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n#endif\n\nvoid ma_pcm_f32_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_s16__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_f32_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const float* src_f32 = (const float*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int32 r;\n        float x = src_f32[i];\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n\n#if 0\n        /* The accurate way. */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 8388607.5f;                         /* 0..2 to 0..16777215 */\n        x = x - 8388608.0f;                         /* 0..16777215 to -8388608..8388607 */\n#else\n        /* The fast way. */\n        x = x * 8388607.0f;                         /* -1..1 to -8388607..8388607 */\n#endif\n\n        r = (ma_int32)x;\n        dst_s24[(i*3)+0] = (ma_uint8)((r & 0x0000FF) >>  0);\n        dst_s24[(i*3)+1] = (ma_uint8)((r & 0x00FF00) >>  8);\n        dst_s24[(i*3)+2] = (ma_uint8)((r & 0xFF0000) >> 16);\n    }\n\n    (void)ditherMode;   /* No dithering for f32 -> s24. */\n}\n\nvoid ma_pcm_f32_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_f32_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_f32_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_f32_to_s24__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_f32_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_f32_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_s24__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_f32_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const float* src_f32 = (const float*)src;\n\n    ma_uint32 i;\n    for (i = 0; i < count; i += 1) {\n        double x = src_f32[i];\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n\n#if 0\n        /* The accurate way. */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 2147483647.5;                       /* 0..2 to 0..4294967295 */\n        x = x - 2147483648.0;                       /* 0...4294967295 to -2147483648..2147483647 */\n#else\n        /* The fast way. */\n        x = x * 2147483647.0;                       /* -1..1 to -2147483647..2147483647 */\n#endif\n\n        dst_s32[i] = (ma_int32)x;\n    }\n\n    (void)ditherMode;   /* No dithering for f32 -> s32. */\n}\n\nvoid ma_pcm_f32_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_pcm_f32_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_pcm_f32_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_pcm_f32_to_s32__avx512(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__avx2(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nvoid ma_pcm_f32_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nvoid ma_pcm_f32_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_s32__reference(dst, src, count, ditherMode);\n#else\n    ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n#endif\n}\n\n\nvoid ma_pcm_f32_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n\n    ma_copy_memory_64(dst, src, count * sizeof(float));\n}\n\n\nvoid ma_pcm_interleave_f32__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    float* dst_f32 = (float*)dst;\n    const float** src_f32 = (const float**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_f32[iFrame*channels + iChannel] = src_f32[iChannel][iFrame];\n        }\n    }\n}\n\nvoid ma_pcm_interleave_f32__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_f32__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_interleave_f32(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_f32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_f32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nvoid ma_pcm_deinterleave_f32__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    float** dst_f32 = (float**)dst;\n    const float* src_f32 = (const float*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_f32[iChannel][iFrame] = src_f32[iFrame*channels + iChannel];\n        }\n    }\n}\n\nvoid ma_pcm_deinterleave_f32__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_f32__reference(dst, src, frameCount, channels);\n}\n\nvoid ma_pcm_deinterleave_f32(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_f32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_f32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nvoid ma_format_converter_init_callbacks__default(ma_format_converter* pConverter)\n{\n    ma_assert(pConverter != NULL);\n\n    switch (pConverter->config.formatIn)\n    {\n        case ma_format_u8:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_f32;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_f32;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_f32;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_f32;\n            }\n        } break;\n\n        case ma_format_f32:\n        default:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_f32;\n            }\n        } break;\n    }\n}\n\n#if defined(MA_SUPPORT_SSE2)\nvoid ma_format_converter_init_callbacks__sse2(ma_format_converter* pConverter)\n{\n    ma_assert(pConverter != NULL);\n\n    switch (pConverter->config.formatIn)\n    {\n        case ma_format_u8:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s16__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s24__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s32__sse2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_f32__sse2;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_u8__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s24__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s32__sse2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_f32__sse2;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_u8__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s16__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s32__sse2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_f32__sse2;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_u8__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s16__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s24__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_f32__sse2;\n            }\n        } break;\n\n        case ma_format_f32:\n        default:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_u8__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s16__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s24__sse2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s32__sse2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_f32;\n            }\n        } break;\n    }\n}\n#endif\n\n#if defined(MA_SUPPORT_AVX2)\nvoid ma_format_converter_init_callbacks__avx2(ma_format_converter* pConverter)\n{\n    ma_assert(pConverter != NULL);\n\n    switch (pConverter->config.formatIn)\n    {\n        case ma_format_u8:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s16__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s24__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s32__avx2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_f32__avx2;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_u8__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s24__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s32__avx2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_f32__avx2;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_u8__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s16__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s32__avx2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_f32__avx2;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_u8__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s16__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s24__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_f32__avx2;\n            }\n        } break;\n\n        case ma_format_f32:\n        default:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_u8__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s16__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s24__avx2;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s32__avx2;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_f32;\n            }\n        } break;\n    }\n}\n#endif\n\n#if defined(MA_SUPPORT_AVX512)\nvoid ma_format_converter_init_callbacks__avx512(ma_format_converter* pConverter)\n{\n    ma_assert(pConverter != NULL);\n\n    switch (pConverter->config.formatIn)\n    {\n        case ma_format_u8:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s16__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s24__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s32__avx512;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_f32__avx512;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_u8__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s24__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s32__avx512;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_f32__avx512;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_u8__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s16__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s32__avx512;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_f32__avx512;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_u8__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s16__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s24__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_f32__avx512;\n            }\n        } break;\n\n        case ma_format_f32:\n        default:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_u8__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s16__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s24__avx512;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s32__avx512;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_f32;\n            }\n        } break;\n    }\n}\n#endif\n\n#if defined(MA_SUPPORT_NEON)\nvoid ma_format_converter_init_callbacks__neon(ma_format_converter* pConverter)\n{\n    ma_assert(pConverter != NULL);\n\n    switch (pConverter->config.formatIn)\n    {\n        case ma_format_u8:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_u8;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s16__neon;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s24__neon;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_s32__neon;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_u8_to_f32__neon;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_u8__neon;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s16;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s24__neon;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_s32__neon;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s16_to_f32__neon;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_u8__neon;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s16__neon;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s24;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_s32__neon;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s24_to_f32__neon;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_u8__neon;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s16__neon;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s24__neon;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_s32;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_s32_to_f32__neon;\n            }\n        } break;\n\n        case ma_format_f32:\n        default:\n        {\n            if (pConverter->config.formatOut == ma_format_u8) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_u8__neon;\n            } else if (pConverter->config.formatOut == ma_format_s16) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s16__neon;\n            } else if (pConverter->config.formatOut == ma_format_s24) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s24__neon;\n            } else if (pConverter->config.formatOut == ma_format_s32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_s32__neon;\n            } else if (pConverter->config.formatOut == ma_format_f32) {\n                pConverter->onConvertPCM = ma_pcm_f32_to_f32;\n            }\n        } break;\n    }\n}\n#endif\n\nma_result ma_format_converter_init(const ma_format_converter_config* pConfig, ma_format_converter* pConverter)\n{\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    ma_zero_object(pConverter);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pConverter->config = *pConfig;\n\n    /* SIMD */\n    pConverter->useSSE2   = ma_has_sse2()    && !pConfig->noSSE2;\n    pConverter->useAVX2   = ma_has_avx2()    && !pConfig->noAVX2;\n    pConverter->useAVX512 = ma_has_avx512f() && !pConfig->noAVX512;\n    pConverter->useNEON   = ma_has_neon()    && !pConfig->noNEON;\n\n#if defined(MA_SUPPORT_AVX512)\n    if (pConverter->useAVX512) {\n        ma_format_converter_init_callbacks__avx512(pConverter);\n    } else\n#endif\n#if defined(MA_SUPPORT_AVX2)\n    if (pConverter->useAVX2) {\n        ma_format_converter_init_callbacks__avx2(pConverter);\n    } else\n#endif\n#if defined(MA_SUPPORT_SSE2)\n    if (pConverter->useSSE2) {\n        ma_format_converter_init_callbacks__sse2(pConverter);\n    } else\n#endif\n#if defined(MA_SUPPORT_NEON)\n    if (pConverter->useNEON) {\n        ma_format_converter_init_callbacks__neon(pConverter);\n    } else\n#endif\n    {\n        ma_format_converter_init_callbacks__default(pConverter);\n    }\n\n    switch (pConfig->formatOut)\n    {\n        case ma_format_u8:\n        {\n            pConverter->onInterleavePCM   = ma_pcm_interleave_u8;\n            pConverter->onDeinterleavePCM = ma_pcm_deinterleave_u8;\n        } break;\n        case ma_format_s16:\n        {\n            pConverter->onInterleavePCM   = ma_pcm_interleave_s16;\n            pConverter->onDeinterleavePCM = ma_pcm_deinterleave_s16;\n        } break;\n        case ma_format_s24:\n        {\n            pConverter->onInterleavePCM   = ma_pcm_interleave_s24;\n            pConverter->onDeinterleavePCM = ma_pcm_deinterleave_s24;\n        } break;\n        case ma_format_s32:\n        {\n            pConverter->onInterleavePCM   = ma_pcm_interleave_s32;\n            pConverter->onDeinterleavePCM = ma_pcm_deinterleave_s32;\n        } break;\n        case ma_format_f32:\n        default:\n        {\n            pConverter->onInterleavePCM   = ma_pcm_interleave_f32;\n            pConverter->onDeinterleavePCM = ma_pcm_deinterleave_f32;\n        } break;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_format_converter_read(ma_format_converter* pConverter, ma_uint64 frameCount, void* pFramesOut, void* pUserData)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint32 sampleSizeIn;\n    ma_uint32 sampleSizeOut;\n    ma_uint32 frameSizeOut;\n    ma_uint8* pNextFramesOut;\n\n    if (pConverter == NULL || pFramesOut == NULL) {\n        return 0;\n    }\n\n    totalFramesRead = 0;\n    sampleSizeIn    = ma_get_bytes_per_sample(pConverter->config.formatIn);\n    sampleSizeOut   = ma_get_bytes_per_sample(pConverter->config.formatOut);\n    /*frameSizeIn     = sampleSizeIn  * pConverter->config.channels;*/\n    frameSizeOut    = sampleSizeOut * pConverter->config.channels;\n    pNextFramesOut  = (ma_uint8*)pFramesOut;\n\n    if (pConverter->config.onRead != NULL) {\n        /* Input data is interleaved. */\n        if (pConverter->config.formatIn == pConverter->config.formatOut) {\n            /* Pass through. */\n            while (totalFramesRead < frameCount) {\n                ma_uint32 framesJustRead;\n                ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                ma_uint64 framesToReadRightNow = framesRemaining;\n                if (framesToReadRightNow > 0xFFFFFFFF) {\n                    framesToReadRightNow = 0xFFFFFFFF;\n                }\n\n                framesJustRead = (ma_uint32)pConverter->config.onRead(pConverter, (ma_uint32)framesToReadRightNow, pNextFramesOut, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                totalFramesRead += framesJustRead;\n                pNextFramesOut  += framesJustRead * frameSizeOut;\n\n                if (framesJustRead < framesToReadRightNow) {\n                    break;\n                }\n            }\n        } else {\n            /* Conversion required. */\n            ma_uint32 maxFramesToReadAtATime;\n\n            MA_ALIGN(MA_SIMD_ALIGNMENT) ma_uint8 temp[MA_MAX_CHANNELS * MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES * 128];\n            ma_assert(sizeof(temp) <= 0xFFFFFFFF);\n\n            maxFramesToReadAtATime = sizeof(temp) / sampleSizeIn / pConverter->config.channels;\n\n            while (totalFramesRead < frameCount) {\n                ma_uint32 framesJustRead;\n                ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                ma_uint64 framesToReadRightNow = framesRemaining;\n                if (framesToReadRightNow > maxFramesToReadAtATime) {\n                    framesToReadRightNow = maxFramesToReadAtATime;\n                }\n\n                framesJustRead = (ma_uint32)pConverter->config.onRead(pConverter, (ma_uint32)framesToReadRightNow, temp, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                pConverter->onConvertPCM(pNextFramesOut, temp, framesJustRead*pConverter->config.channels, pConverter->config.ditherMode);\n\n                totalFramesRead += framesJustRead;\n                pNextFramesOut  += framesJustRead * frameSizeOut;\n\n                if (framesJustRead < framesToReadRightNow) {\n                    break;\n                }\n            }\n        }\n    } else {\n        /* Input data is deinterleaved. If a conversion is required we need to do an intermediary step. */\n        void* ppTempSamplesOfOutFormat[MA_MAX_CHANNELS];\n        size_t splitBufferSizeOut;\n        ma_uint32 maxFramesToReadAtATime;\n\n        MA_ALIGN(MA_SIMD_ALIGNMENT) ma_uint8 tempSamplesOfOutFormat[MA_MAX_CHANNELS * MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES * 128];\n        ma_assert(sizeof(tempSamplesOfOutFormat) <= 0xFFFFFFFF);\n\n        ma_split_buffer(tempSamplesOfOutFormat, sizeof(tempSamplesOfOutFormat), pConverter->config.channels, MA_SIMD_ALIGNMENT, (void**)&ppTempSamplesOfOutFormat, &splitBufferSizeOut);\n\n        maxFramesToReadAtATime = (ma_uint32)(splitBufferSizeOut / sampleSizeIn);\n\n        while (totalFramesRead < frameCount) {\n            ma_uint32 framesJustRead;\n            ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n            ma_uint64 framesToReadRightNow = framesRemaining;\n            if (framesToReadRightNow > maxFramesToReadAtATime) {\n                framesToReadRightNow = maxFramesToReadAtATime;\n            }\n\n            if (pConverter->config.formatIn == pConverter->config.formatOut) {\n                /* Only interleaving. */\n                framesJustRead = (ma_uint32)pConverter->config.onReadDeinterleaved(pConverter, (ma_uint32)framesToReadRightNow, ppTempSamplesOfOutFormat, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n            } else {\n                /* Interleaving + Conversion. Convert first, then interleave. */\n                void* ppTempSamplesOfInFormat[MA_MAX_CHANNELS];\n                size_t splitBufferSizeIn;\n                ma_uint32 iChannel;\n\n                MA_ALIGN(MA_SIMD_ALIGNMENT) ma_uint8 tempSamplesOfInFormat[MA_MAX_CHANNELS * MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES * 128];\n\n                ma_split_buffer(tempSamplesOfInFormat, sizeof(tempSamplesOfInFormat), pConverter->config.channels, MA_SIMD_ALIGNMENT, (void**)&ppTempSamplesOfInFormat, &splitBufferSizeIn);\n\n                if (framesToReadRightNow > (splitBufferSizeIn / sampleSizeIn)) {\n                    framesToReadRightNow = (splitBufferSizeIn / sampleSizeIn);\n                }\n\n                framesJustRead = (ma_uint32)pConverter->config.onReadDeinterleaved(pConverter, (ma_uint32)framesToReadRightNow, ppTempSamplesOfInFormat, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                for (iChannel = 0; iChannel < pConverter->config.channels; iChannel += 1) {\n                    pConverter->onConvertPCM(ppTempSamplesOfOutFormat[iChannel], ppTempSamplesOfInFormat[iChannel], framesJustRead, pConverter->config.ditherMode);\n                }\n            }\n\n            pConverter->onInterleavePCM(pNextFramesOut, (const void**)ppTempSamplesOfOutFormat, framesJustRead, pConverter->config.channels);\n\n            totalFramesRead += framesJustRead;\n            pNextFramesOut  += framesJustRead * frameSizeOut;\n\n            if (framesJustRead < framesToReadRightNow) {\n                break;\n            }\n        }\n    }\n\n    return totalFramesRead;\n}\n\nma_uint64 ma_format_converter_read_deinterleaved(ma_format_converter* pConverter, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint32 sampleSizeIn;\n    ma_uint32 sampleSizeOut;\n    ma_uint8* ppNextSamplesOut[MA_MAX_CHANNELS];\n\n    if (pConverter == NULL || ppSamplesOut == NULL) {\n        return 0;\n    }\n\n    totalFramesRead = 0;\n    sampleSizeIn = ma_get_bytes_per_sample(pConverter->config.formatIn);\n    sampleSizeOut = ma_get_bytes_per_sample(pConverter->config.formatOut);\n\n    ma_copy_memory(ppNextSamplesOut, ppSamplesOut, sizeof(void*) * pConverter->config.channels);\n\n    if (pConverter->config.onRead != NULL) {\n        /* Input data is interleaved. */\n        ma_uint32 maxFramesToReadAtATime;\n\n        MA_ALIGN(MA_SIMD_ALIGNMENT) ma_uint8 tempSamplesOfOutFormat[MA_MAX_CHANNELS * MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES * 128];\n        ma_assert(sizeof(tempSamplesOfOutFormat) <= 0xFFFFFFFF);\n\n        maxFramesToReadAtATime = sizeof(tempSamplesOfOutFormat) / sampleSizeIn / pConverter->config.channels;\n\n        while (totalFramesRead < frameCount) {\n            ma_uint32 iChannel;\n            ma_uint32 framesJustRead;\n            ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n            ma_uint64 framesToReadRightNow = framesRemaining;\n            if (framesToReadRightNow > maxFramesToReadAtATime) {\n                framesToReadRightNow = maxFramesToReadAtATime;\n            }\n\n            if (pConverter->config.formatIn == pConverter->config.formatOut) {\n                /* Only de-interleaving. */\n                framesJustRead = (ma_uint32)pConverter->config.onRead(pConverter, (ma_uint32)framesToReadRightNow, tempSamplesOfOutFormat, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n            } else {\n                /* De-interleaving + Conversion. Convert first, then de-interleave. */\n                MA_ALIGN(MA_SIMD_ALIGNMENT) ma_uint8 tempSamplesOfInFormat[sizeof(tempSamplesOfOutFormat)];\n\n                framesJustRead = (ma_uint32)pConverter->config.onRead(pConverter, (ma_uint32)framesToReadRightNow, tempSamplesOfInFormat, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                pConverter->onConvertPCM(tempSamplesOfOutFormat, tempSamplesOfInFormat, framesJustRead * pConverter->config.channels, pConverter->config.ditherMode);\n            }\n\n            pConverter->onDeinterleavePCM((void**)ppNextSamplesOut, tempSamplesOfOutFormat, framesJustRead, pConverter->config.channels);\n\n            totalFramesRead += framesJustRead;\n            for (iChannel = 0; iChannel < pConverter->config.channels; ++iChannel) {\n                ppNextSamplesOut[iChannel] += framesJustRead * sampleSizeOut;\n            }\n\n            if (framesJustRead < framesToReadRightNow) {\n                break;\n            }\n        }\n    } else {\n        /* Input data is deinterleaved. */\n        if (pConverter->config.formatIn == pConverter->config.formatOut) {\n            /* Pass through. */\n            while (totalFramesRead < frameCount) {\n                ma_uint32 iChannel;\n                ma_uint32 framesJustRead;\n                ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                ma_uint64 framesToReadRightNow = framesRemaining;\n                if (framesToReadRightNow > 0xFFFFFFFF) {\n                    framesToReadRightNow = 0xFFFFFFFF;\n                }\n\n                framesJustRead = (ma_uint32)pConverter->config.onReadDeinterleaved(pConverter, (ma_uint32)framesToReadRightNow, (void**)ppNextSamplesOut, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                totalFramesRead += framesJustRead;\n                for (iChannel = 0; iChannel < pConverter->config.channels; ++iChannel) {\n                    ppNextSamplesOut[iChannel] += framesJustRead * sampleSizeOut;\n                }\n\n                if (framesJustRead < framesToReadRightNow) {\n                    break;\n                }\n            }\n        } else {\n            /* Conversion required. */\n            void* ppTemp[MA_MAX_CHANNELS];\n            size_t splitBufferSize;\n            ma_uint32 maxFramesToReadAtATime;\n\n            MA_ALIGN(MA_SIMD_ALIGNMENT) ma_uint8 temp[MA_MAX_CHANNELS][MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES * 128];\n            ma_assert(sizeof(temp) <= 0xFFFFFFFF);\n\n            ma_split_buffer(temp, sizeof(temp), pConverter->config.channels, MA_SIMD_ALIGNMENT, (void**)&ppTemp, &splitBufferSize);\n\n            maxFramesToReadAtATime = (ma_uint32)(splitBufferSize / sampleSizeIn);\n\n            while (totalFramesRead < frameCount) {\n                ma_uint32 iChannel;\n                ma_uint32 framesJustRead;\n                ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                ma_uint64 framesToReadRightNow = framesRemaining;\n                if (framesToReadRightNow > maxFramesToReadAtATime) {\n                    framesToReadRightNow = maxFramesToReadAtATime;\n                }\n\n                framesJustRead = (ma_uint32)pConverter->config.onReadDeinterleaved(pConverter, (ma_uint32)framesToReadRightNow, ppTemp, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                for (iChannel = 0; iChannel < pConverter->config.channels; iChannel += 1) {\n                    pConverter->onConvertPCM(ppNextSamplesOut[iChannel], ppTemp[iChannel], framesJustRead, pConverter->config.ditherMode);\n                    ppNextSamplesOut[iChannel] += framesJustRead * sampleSizeOut;\n                }\n\n                totalFramesRead += framesJustRead;\n\n                if (framesJustRead < framesToReadRightNow) {\n                    break;\n                }\n            }\n        }\n    }\n\n    return totalFramesRead;\n}\n\n\nma_format_converter_config ma_format_converter_config_init_new()\n{\n    ma_format_converter_config config;\n    ma_zero_object(&config);\n\n    return config;\n}\n\nma_format_converter_config ma_format_converter_config_init(ma_format formatIn, ma_format formatOut, ma_uint32 channels, ma_format_converter_read_proc onRead, void* pUserData)\n{\n    ma_format_converter_config config = ma_format_converter_config_init_new();\n    config.formatIn = formatIn;\n    config.formatOut = formatOut;\n    config.channels = channels;\n    config.onRead = onRead;\n    config.onReadDeinterleaved = NULL;\n    config.pUserData = pUserData;\n\n    return config;\n}\n\nma_format_converter_config ma_format_converter_config_init_deinterleaved(ma_format formatIn, ma_format formatOut, ma_uint32 channels, ma_format_converter_read_deinterleaved_proc onReadDeinterleaved, void* pUserData)\n{\n    ma_format_converter_config config = ma_format_converter_config_init(formatIn, formatOut, channels, NULL, pUserData);\n    config.onReadDeinterleaved = onReadDeinterleaved;\n\n    return config;\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nChannel Routing\n\n**************************************************************************************************************************************************************/\n\n/*\n-X = Left,   +X = Right\n-Y = Bottom, +Y = Top\n-Z = Front,  +Z = Back\n*/\ntypedef struct\n{\n    float x;\n    float y;\n    float z;\n} ma_vec3;\n\nstatic MA_INLINE ma_vec3 ma_vec3f(float x, float y, float z)\n{\n    ma_vec3 r;\n    r.x = x;\n    r.y = y;\n    r.z = z;\n\n    return r;\n}\n\nstatic MA_INLINE ma_vec3 ma_vec3_add(ma_vec3 a, ma_vec3 b)\n{\n    return ma_vec3f(\n        a.x + b.x,\n        a.y + b.y,\n        a.z + b.z\n    );\n}\n\nstatic MA_INLINE ma_vec3 ma_vec3_sub(ma_vec3 a, ma_vec3 b)\n{\n    return ma_vec3f(\n        a.x - b.x,\n        a.y - b.y,\n        a.z - b.z\n    );\n}\n\nstatic MA_INLINE ma_vec3 ma_vec3_mul(ma_vec3 a, ma_vec3 b)\n{\n    return ma_vec3f(\n        a.x * b.x,\n        a.y * b.y,\n        a.z * b.z\n    );\n}\n\nstatic MA_INLINE ma_vec3 ma_vec3_div(ma_vec3 a, ma_vec3 b)\n{\n    return ma_vec3f(\n        a.x / b.x,\n        a.y / b.y,\n        a.z / b.z\n    );\n}\n\nstatic MA_INLINE float ma_vec3_dot(ma_vec3 a, ma_vec3 b)\n{\n    return a.x*b.x + a.y*b.y + a.z*b.z;\n}\n\nstatic MA_INLINE float ma_vec3_length2(ma_vec3 a)\n{\n    return ma_vec3_dot(a, a);\n}\n\nstatic MA_INLINE float ma_vec3_length(ma_vec3 a)\n{\n    return (float)sqrt(ma_vec3_length2(a));\n}\n\nstatic MA_INLINE ma_vec3 ma_vec3_normalize(ma_vec3 a)\n{\n    float len = 1 / ma_vec3_length(a);\n\n    ma_vec3 r;\n    r.x = a.x * len;\n    r.y = a.y * len;\n    r.z = a.z * len;\n\n    return r;\n}\n\nstatic MA_INLINE float ma_vec3_distance(ma_vec3 a, ma_vec3 b)\n{\n    return ma_vec3_length(ma_vec3_sub(a, b));\n}\n\n\n#define MA_PLANE_LEFT      0\n#define MA_PLANE_RIGHT     1\n#define MA_PLANE_FRONT     2\n#define MA_PLANE_BACK      3\n#define MA_PLANE_BOTTOM    4\n#define MA_PLANE_TOP       5\n\nfloat g_maChannelPlaneRatios[MA_CHANNEL_POSITION_COUNT][6] = {\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_NONE */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_MONO */\n    { 0.5f,  0.0f,  0.5f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_LEFT */\n    { 0.0f,  0.5f,  0.5f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_RIGHT */\n    { 0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_CENTER */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_LFE */\n    { 0.5f,  0.0f,  0.0f,  0.5f,  0.0f,  0.0f},  /* MA_CHANNEL_BACK_LEFT */\n    { 0.0f,  0.5f,  0.0f,  0.5f,  0.0f,  0.0f},  /* MA_CHANNEL_BACK_RIGHT */\n    { 0.25f, 0.0f,  0.75f, 0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_LEFT_CENTER */\n    { 0.0f,  0.25f, 0.75f, 0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_RIGHT_CENTER */\n    { 0.0f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f},  /* MA_CHANNEL_BACK_CENTER */\n    { 1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_SIDE_LEFT */\n    { 0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_SIDE_RIGHT */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  1.0f},  /* MA_CHANNEL_TOP_CENTER */\n    { 0.33f, 0.0f,  0.33f, 0.0f,  0.0f,  0.34f}, /* MA_CHANNEL_TOP_FRONT_LEFT */\n    { 0.0f,  0.0f,  0.5f,  0.0f,  0.0f,  0.5f},  /* MA_CHANNEL_TOP_FRONT_CENTER */\n    { 0.0f,  0.33f, 0.33f, 0.0f,  0.0f,  0.34f}, /* MA_CHANNEL_TOP_FRONT_RIGHT */\n    { 0.33f, 0.0f,  0.0f,  0.33f, 0.0f,  0.34f}, /* MA_CHANNEL_TOP_BACK_LEFT */\n    { 0.0f,  0.0f,  0.0f,  0.5f,  0.0f,  0.5f},  /* MA_CHANNEL_TOP_BACK_CENTER */\n    { 0.0f,  0.33f, 0.0f,  0.33f, 0.0f,  0.34f}, /* MA_CHANNEL_TOP_BACK_RIGHT */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_0 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_1 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_2 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_3 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_4 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_5 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_6 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_7 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_8 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_9 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_10 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_11 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_12 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_13 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_14 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_15 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_16 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_17 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_18 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_19 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_20 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_21 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_22 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_23 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_24 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_25 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_26 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_27 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_28 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_29 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_30 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_31 */\n};\n\nfloat ma_calculate_channel_position_planar_weight(ma_channel channelPositionA, ma_channel channelPositionB)\n{\n    /*\n    Imagine the following simplified example: You have a single input speaker which is the front/left speaker which you want to convert to\n    the following output configuration:\n    \n     - front/left\n     - side/left\n     - back/left\n    \n    The front/left output is easy - it the same speaker position so it receives the full contribution of the front/left input. The amount\n    of contribution to apply to the side/left and back/left speakers, however, is a bit more complicated.\n    \n    Imagine the front/left speaker as emitting audio from two planes - the front plane and the left plane. You can think of the front/left\n    speaker emitting half of it's total volume from the front, and the other half from the left. Since part of it's volume is being emitted\n    from the left side, and the side/left and back/left channels also emit audio from the left plane, one would expect that they would\n    receive some amount of contribution from front/left speaker. The amount of contribution depends on how many planes are shared between\n    the two speakers. Note that in the examples below I've added a top/front/left speaker as an example just to show how the math works\n    across 3 spatial dimensions.\n    \n    The first thing to do is figure out how each speaker's volume is spread over each of plane:\n     - front/left:     2 planes (front and left)      = 1/2 = half it's total volume on each plane\n     - side/left:      1 plane (left only)            = 1/1 = entire volume from left plane\n     - back/left:      2 planes (back and left)       = 1/2 = half it's total volume on each plane\n     - top/front/left: 3 planes (top, front and left) = 1/3 = one third it's total volume on each plane\n    \n    The amount of volume each channel contributes to each of it's planes is what controls how much it is willing to given and take to other\n    channels on the same plane. The volume that is willing to the given by one channel is multiplied by the volume that is willing to be\n    taken by the other to produce the final contribution.\n    */\n\n    /* Contribution = Sum(Volume to Give * Volume to Take) */\n    float contribution = \n        g_maChannelPlaneRatios[channelPositionA][0] * g_maChannelPlaneRatios[channelPositionB][0] +\n        g_maChannelPlaneRatios[channelPositionA][1] * g_maChannelPlaneRatios[channelPositionB][1] +\n        g_maChannelPlaneRatios[channelPositionA][2] * g_maChannelPlaneRatios[channelPositionB][2] +\n        g_maChannelPlaneRatios[channelPositionA][3] * g_maChannelPlaneRatios[channelPositionB][3] +\n        g_maChannelPlaneRatios[channelPositionA][4] * g_maChannelPlaneRatios[channelPositionB][4] +\n        g_maChannelPlaneRatios[channelPositionA][5] * g_maChannelPlaneRatios[channelPositionB][5];\n\n    return contribution;\n}\n\nfloat ma_channel_router__calculate_input_channel_planar_weight(const ma_channel_router* pRouter, ma_channel channelPositionIn, ma_channel channelPositionOut)\n{\n    ma_assert(pRouter != NULL);\n    (void)pRouter;\n\n    return ma_calculate_channel_position_planar_weight(channelPositionIn, channelPositionOut);\n}\n\nma_bool32 ma_channel_router__is_spatial_channel_position(const ma_channel_router* pRouter, ma_channel channelPosition)\n{\n    int i;\n\n    ma_assert(pRouter != NULL);\n    (void)pRouter;\n\n    if (channelPosition == MA_CHANNEL_NONE || channelPosition == MA_CHANNEL_MONO || channelPosition == MA_CHANNEL_LFE) {\n        return MA_FALSE;\n    }\n\n    for (i = 0; i < 6; ++i) {\n        if (g_maChannelPlaneRatios[channelPosition][i] != 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\nma_result ma_channel_router_init(const ma_channel_router_config* pConfig, ma_channel_router* pRouter)\n{\n    ma_uint32 iChannelIn;\n    ma_uint32 iChannelOut;\n\n    if (pRouter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pRouter);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    if (pConfig->onReadDeinterleaved == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (!ma_channel_map_valid(pConfig->channelsIn, pConfig->channelMapIn)) {\n        return MA_INVALID_ARGS;    /* Invalid input channel map. */\n    }\n    if (!ma_channel_map_valid(pConfig->channelsOut, pConfig->channelMapOut)) {\n        return MA_INVALID_ARGS;    /* Invalid output channel map. */\n    }\n\n    pRouter->config = *pConfig;\n\n    /* SIMD */\n    pRouter->useSSE2   = ma_has_sse2()    && !pConfig->noSSE2;\n    pRouter->useAVX2   = ma_has_avx2()    && !pConfig->noAVX2;\n    pRouter->useAVX512 = ma_has_avx512f() && !pConfig->noAVX512;\n    pRouter->useNEON   = ma_has_neon()    && !pConfig->noNEON;\n\n    /* If the input and output channels and channel maps are the same we should use a passthrough. */\n    if (pRouter->config.channelsIn == pRouter->config.channelsOut) {\n        if (ma_channel_map_equal(pRouter->config.channelsIn, pRouter->config.channelMapIn, pRouter->config.channelMapOut)) {\n            pRouter->isPassthrough = MA_TRUE;\n        }\n        if (ma_channel_map_blank(pRouter->config.channelsIn, pRouter->config.channelMapIn) || ma_channel_map_blank(pRouter->config.channelsOut, pRouter->config.channelMapOut)) {\n            pRouter->isPassthrough = MA_TRUE;\n        }\n    }\n\n    /*\n    Here is where we do a bit of pre-processing to know how each channel should be combined to make up the output. Rules:\n    \n    1) If it's a passthrough, do nothing - it's just a simple memcpy().\n    2) If the channel counts are the same and every channel position in the input map is present in the output map, use a\n       simple shuffle. An example might be different 5.1 channel layouts.\n    3) Otherwise channels are blended based on spatial locality.\n    */\n    if (!pRouter->isPassthrough) {\n        if (pRouter->config.channelsIn == pRouter->config.channelsOut) {\n            ma_bool32 areAllChannelPositionsPresent = MA_TRUE;\n            for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n                ma_bool32 isInputChannelPositionInOutput = MA_FALSE;\n                for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                    if (pRouter->config.channelMapIn[iChannelIn] == pRouter->config.channelMapOut[iChannelOut]) {\n                        isInputChannelPositionInOutput = MA_TRUE;\n                        break;\n                    }\n                }\n\n                if (!isInputChannelPositionInOutput) {\n                    areAllChannelPositionsPresent = MA_FALSE;\n                    break;\n                }\n            }\n\n            if (areAllChannelPositionsPresent) {\n                pRouter->isSimpleShuffle = MA_TRUE;\n\n                /*\n                All the router will be doing is rearranging channels which means all we need to do is use a shuffling table which is just\n                a mapping between the index of the input channel to the index of the output channel.\n                */\n                for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n                    for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                        if (pRouter->config.channelMapIn[iChannelIn] == pRouter->config.channelMapOut[iChannelOut]) {\n                            pRouter->shuffleTable[iChannelIn] = (ma_uint8)iChannelOut;\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n\n    /*\n    Here is where weights are calculated. Note that we calculate the weights at all times, even when using a passthrough and simple\n    shuffling. We use different algorithms for calculating weights depending on our mixing mode.\n    \n    In simple mode we don't do any blending (except for converting between mono, which is done in a later step). Instead we just\n    map 1:1 matching channels. In this mode, if no channels in the input channel map correspond to anything in the output channel\n    map, nothing will be heard!\n    */\n\n    /* In all cases we need to make sure all channels that are present in both channel maps have a 1:1 mapping. */\n    for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n        ma_channel channelPosIn = pRouter->config.channelMapIn[iChannelIn];\n\n        for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n            ma_channel channelPosOut = pRouter->config.channelMapOut[iChannelOut];\n\n            if (channelPosIn == channelPosOut) {\n                pRouter->config.weights[iChannelIn][iChannelOut] = 1;\n            }\n        }\n    }\n\n    /*\n    The mono channel is accumulated on all other channels, except LFE. Make sure in this loop we exclude output mono channels since\n    they were handled in the pass above.\n    */\n    for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n        ma_channel channelPosIn = pRouter->config.channelMapIn[iChannelIn];\n\n        if (channelPosIn == MA_CHANNEL_MONO) {\n            for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                ma_channel channelPosOut = pRouter->config.channelMapOut[iChannelOut];\n\n                if (channelPosOut != MA_CHANNEL_NONE && channelPosOut != MA_CHANNEL_MONO && channelPosOut != MA_CHANNEL_LFE) {\n                    pRouter->config.weights[iChannelIn][iChannelOut] = 1;\n                }\n            }\n        }\n    }\n\n    /* The output mono channel is the average of all non-none, non-mono and non-lfe input channels. */\n    {\n        ma_uint32 len = 0;\n        for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n            ma_channel channelPosIn = pRouter->config.channelMapIn[iChannelIn];\n\n            if (channelPosIn != MA_CHANNEL_NONE && channelPosIn != MA_CHANNEL_MONO && channelPosIn != MA_CHANNEL_LFE) {\n                len += 1;\n            }\n        }\n\n        if (len > 0) {\n            float monoWeight = 1.0f / len;\n\n            for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                ma_channel channelPosOut = pRouter->config.channelMapOut[iChannelOut];\n\n                if (channelPosOut == MA_CHANNEL_MONO) {\n                    for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n                        ma_channel channelPosIn = pRouter->config.channelMapIn[iChannelIn];\n\n                        if (channelPosIn != MA_CHANNEL_NONE && channelPosIn != MA_CHANNEL_MONO && channelPosIn != MA_CHANNEL_LFE) {\n                            pRouter->config.weights[iChannelIn][iChannelOut] += monoWeight;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n\n    /* Input and output channels that are not present on the other side need to be blended in based on spatial locality. */\n    switch (pRouter->config.mixingMode)\n    {\n        case ma_channel_mix_mode_rectangular:\n        {\n            /* Unmapped input channels. */\n            for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n                ma_channel channelPosIn = pRouter->config.channelMapIn[iChannelIn];\n\n                if (ma_channel_router__is_spatial_channel_position(pRouter, channelPosIn)) {\n                    if (!ma_channel_map_contains_channel_position(pRouter->config.channelsOut, pRouter->config.channelMapOut, channelPosIn)) {\n                        for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                            ma_channel channelPosOut = pRouter->config.channelMapOut[iChannelOut];\n\n                            if (ma_channel_router__is_spatial_channel_position(pRouter, channelPosOut)) {\n                                float weight = 0;\n                                if (pRouter->config.mixingMode == ma_channel_mix_mode_planar_blend) {\n                                    weight = ma_channel_router__calculate_input_channel_planar_weight(pRouter, channelPosIn, channelPosOut);\n                                }\n\n                                /* Only apply the weight if we haven't already got some contribution from the respective channels. */\n                                if (pRouter->config.weights[iChannelIn][iChannelOut] == 0) {\n                                    pRouter->config.weights[iChannelIn][iChannelOut] = weight;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            /* Unmapped output channels. */\n            for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                ma_channel channelPosOut = pRouter->config.channelMapOut[iChannelOut];\n\n                if (ma_channel_router__is_spatial_channel_position(pRouter, channelPosOut)) {\n                    if (!ma_channel_map_contains_channel_position(pRouter->config.channelsIn, pRouter->config.channelMapIn, channelPosOut)) {\n                        for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n                            ma_channel channelPosIn = pRouter->config.channelMapIn[iChannelIn];\n\n                            if (ma_channel_router__is_spatial_channel_position(pRouter, channelPosIn)) {\n                                float weight = 0;\n                                if (pRouter->config.mixingMode == ma_channel_mix_mode_planar_blend) {\n                                    weight = ma_channel_router__calculate_input_channel_planar_weight(pRouter, channelPosIn, channelPosOut);\n                                }\n\n                                /* Only apply the weight if we haven't already got some contribution from the respective channels. */\n                                if (pRouter->config.weights[iChannelIn][iChannelOut] == 0) {\n                                    pRouter->config.weights[iChannelIn][iChannelOut] = weight;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        } break;\n\n        case ma_channel_mix_mode_custom_weights:\n        case ma_channel_mix_mode_simple:\n        default:\n        {\n            /* Fallthrough. */\n        } break;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE ma_bool32 ma_channel_router__can_use_sse2(ma_channel_router* pRouter, const float* pSamplesOut, const float* pSamplesIn)\n{\n    return pRouter->useSSE2 && (((ma_uintptr)pSamplesOut & 15) == 0) && (((ma_uintptr)pSamplesIn & 15) == 0);\n}\n\nstatic MA_INLINE ma_bool32 ma_channel_router__can_use_avx2(ma_channel_router* pRouter, const float* pSamplesOut, const float* pSamplesIn)\n{\n    return pRouter->useAVX2 && (((ma_uintptr)pSamplesOut & 31) == 0) && (((ma_uintptr)pSamplesIn & 31) == 0);\n}\n\nstatic MA_INLINE ma_bool32 ma_channel_router__can_use_avx512(ma_channel_router* pRouter, const float* pSamplesOut, const float* pSamplesIn)\n{\n    return pRouter->useAVX512 && (((ma_uintptr)pSamplesOut & 63) == 0) && (((ma_uintptr)pSamplesIn & 63) == 0);\n}\n\nstatic MA_INLINE ma_bool32 ma_channel_router__can_use_neon(ma_channel_router* pRouter, const float* pSamplesOut, const float* pSamplesIn)\n{\n    return pRouter->useNEON && (((ma_uintptr)pSamplesOut & 15) == 0) && (((ma_uintptr)pSamplesIn & 15) == 0);\n}\n\nvoid ma_channel_router__do_routing(ma_channel_router* pRouter, ma_uint64 frameCount, float** ppSamplesOut, const float** ppSamplesIn)\n{\n    ma_uint32 iChannelIn;\n    ma_uint32 iChannelOut;\n\n    ma_assert(pRouter != NULL);\n    ma_assert(pRouter->isPassthrough == MA_FALSE);\n\n    if (pRouter->isSimpleShuffle) {\n        /* A shuffle is just a re-arrangement of channels and does not require any arithmetic. */\n        ma_assert(pRouter->config.channelsIn == pRouter->config.channelsOut);\n        for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n            iChannelOut = pRouter->shuffleTable[iChannelIn];\n            ma_copy_memory_64(ppSamplesOut[iChannelOut], ppSamplesIn[iChannelIn], frameCount * sizeof(float));\n        }\n    } else {\n        /* This is the more complicated case. Each of the output channels is accumulated with 0 or more input channels. */\n\n        /* Clear. */\n        for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n            ma_zero_memory_64(ppSamplesOut[iChannelOut], frameCount * sizeof(float));\n        }\n\n        /* Accumulate. */\n        for (iChannelIn = 0; iChannelIn < pRouter->config.channelsIn; ++iChannelIn) {\n            for (iChannelOut = 0; iChannelOut < pRouter->config.channelsOut; ++iChannelOut) {\n                ma_uint64 iFrame = 0;\n#if defined(MA_SUPPORT_NEON)\n                if (ma_channel_router__can_use_neon(pRouter, ppSamplesOut[iChannelOut], ppSamplesIn[iChannelIn])) {\n                    float32x4_t weight = vmovq_n_f32(pRouter->config.weights[iChannelIn][iChannelOut]);\n                    ma_uint64 frameCount4 = frameCount/4;\n                    ma_uint64 iFrame4;\n\n                    for (iFrame4 = 0; iFrame4 < frameCount4; iFrame4 += 1) {\n                        float32x4_t* pO = (float32x4_t*)ppSamplesOut[iChannelOut] + iFrame4;\n                        float32x4_t* pI = (float32x4_t*)ppSamplesIn [iChannelIn ] + iFrame4;\n                        *pO = vaddq_f32(*pO, vmulq_f32(*pI, weight));\n                    }\n\n                    iFrame += frameCount4*4;\n                }\n                else\n#endif\n#if defined(MA_SUPPORT_AVX512)\n                if (ma_channel_router__can_use_avx512(pRouter, ppSamplesOut[iChannelOut], ppSamplesIn[iChannelIn])) {\n                    __m512 weight = _mm512_set1_ps(pRouter->config.weights[iChannelIn][iChannelOut]);\n                    ma_uint64 frameCount16 = frameCount/16;\n                    ma_uint64 iFrame16;\n\n                    for (iFrame16 = 0; iFrame16 < frameCount16; iFrame16 += 1) {\n                        __m512* pO = (__m512*)ppSamplesOut[iChannelOut] + iFrame16;\n                        __m512* pI = (__m512*)ppSamplesIn [iChannelIn ] + iFrame16;\n                        *pO = _mm512_add_ps(*pO, _mm512_mul_ps(*pI, weight));\n                    }\n\n                    iFrame += frameCount16*16;\n                }\n                else\n#endif\n#if defined(MA_SUPPORT_AVX2)\n                if (ma_channel_router__can_use_avx2(pRouter, ppSamplesOut[iChannelOut], ppSamplesIn[iChannelIn])) {\n                    __m256 weight = _mm256_set1_ps(pRouter->config.weights[iChannelIn][iChannelOut]);\n                    ma_uint64 frameCount8 = frameCount/8;\n                    ma_uint64 iFrame8;\n\n                    for (iFrame8 = 0; iFrame8 < frameCount8; iFrame8 += 1) {\n                        __m256* pO = (__m256*)ppSamplesOut[iChannelOut] + iFrame8;\n                        __m256* pI = (__m256*)ppSamplesIn [iChannelIn ] + iFrame8;\n                        *pO = _mm256_add_ps(*pO, _mm256_mul_ps(*pI, weight));\n                    }\n\n                    iFrame += frameCount8*8;\n                }\n                else\n#endif\n#if defined(MA_SUPPORT_SSE2)\n                if (ma_channel_router__can_use_sse2(pRouter, ppSamplesOut[iChannelOut], ppSamplesIn[iChannelIn])) {\n                    __m128 weight = _mm_set1_ps(pRouter->config.weights[iChannelIn][iChannelOut]);\n                    ma_uint64 frameCount4 = frameCount/4;\n                    ma_uint64 iFrame4;\n\n                    for (iFrame4 = 0; iFrame4 < frameCount4; iFrame4 += 1) {\n                        __m128* pO = (__m128*)ppSamplesOut[iChannelOut] + iFrame4;\n                        __m128* pI = (__m128*)ppSamplesIn [iChannelIn ] + iFrame4;\n                        *pO = _mm_add_ps(*pO, _mm_mul_ps(*pI, weight));\n                    }\n\n                    iFrame += frameCount4*4;\n                } else \n#endif\n                {   /* Reference. */\n                    float weight0 = pRouter->config.weights[iChannelIn][iChannelOut];\n                    float weight1 = pRouter->config.weights[iChannelIn][iChannelOut];\n                    float weight2 = pRouter->config.weights[iChannelIn][iChannelOut];\n                    float weight3 = pRouter->config.weights[iChannelIn][iChannelOut];\n                    ma_uint64 frameCount4 = frameCount/4;\n                    ma_uint64 iFrame4;\n\n                    for (iFrame4 = 0; iFrame4 < frameCount4; iFrame4 += 1) {\n                        ppSamplesOut[iChannelOut][iFrame+0] += ppSamplesIn[iChannelIn][iFrame+0] * weight0;\n                        ppSamplesOut[iChannelOut][iFrame+1] += ppSamplesIn[iChannelIn][iFrame+1] * weight1;\n                        ppSamplesOut[iChannelOut][iFrame+2] += ppSamplesIn[iChannelIn][iFrame+2] * weight2;\n                        ppSamplesOut[iChannelOut][iFrame+3] += ppSamplesIn[iChannelIn][iFrame+3] * weight3;\n                        iFrame += 4;\n                    }\n                }\n\n                /* Leftover. */\n                for (; iFrame < frameCount; ++iFrame) {\n                    ppSamplesOut[iChannelOut][iFrame] += ppSamplesIn[iChannelIn][iFrame] * pRouter->config.weights[iChannelIn][iChannelOut];\n                }\n            }\n        }\n    }\n}\n\nma_uint64 ma_channel_router_read_deinterleaved(ma_channel_router* pRouter, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    if (pRouter == NULL || ppSamplesOut == NULL) {\n        return 0;\n    }\n\n    /* Fast path for a passthrough. */\n    if (pRouter->isPassthrough) {\n        if (frameCount <= 0xFFFFFFFF) {\n            return (ma_uint32)pRouter->config.onReadDeinterleaved(pRouter, (ma_uint32)frameCount, ppSamplesOut, pUserData);\n        } else {\n            float* ppNextSamplesOut[MA_MAX_CHANNELS];\n            ma_uint64 totalFramesRead;\n\n            ma_copy_memory(ppNextSamplesOut, ppSamplesOut, sizeof(float*) * pRouter->config.channelsOut);\n\n            totalFramesRead = 0;\n            while (totalFramesRead < frameCount) {\n                ma_uint32 iChannel;\n                ma_uint32 framesJustRead;\n                ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                ma_uint64 framesToReadRightNow = framesRemaining;\n                if (framesToReadRightNow > 0xFFFFFFFF) {\n                    framesToReadRightNow = 0xFFFFFFFF;\n                }\n\n                framesJustRead = (ma_uint32)pRouter->config.onReadDeinterleaved(pRouter, (ma_uint32)framesToReadRightNow, (void**)ppNextSamplesOut, pUserData);\n                if (framesJustRead == 0) {\n                    break;\n                }\n\n                totalFramesRead += framesJustRead;\n\n                if (framesJustRead < framesToReadRightNow) {\n                    break;\n                }\n\n                for (iChannel = 0; iChannel < pRouter->config.channelsOut; ++iChannel) {\n                    ppNextSamplesOut[iChannel] += framesJustRead;\n                }\n            }\n\n            return totalFramesRead;\n        }\n    }\n\n    /* Slower path for a non-passthrough. */\n    {\n        float* ppNextSamplesOut[MA_MAX_CHANNELS];\n        float* ppTemp[MA_MAX_CHANNELS];\n        size_t maxBytesToReadPerFrameEachIteration;\n        size_t maxFramesToReadEachIteration;\n        ma_uint64 totalFramesRead;\n        MA_ALIGN(MA_SIMD_ALIGNMENT) float temp[MA_MAX_CHANNELS * 256];\n\n        ma_assert(sizeof(temp) <= 0xFFFFFFFF);\n        ma_copy_memory(ppNextSamplesOut, ppSamplesOut, sizeof(float*) * pRouter->config.channelsOut);\n        \n        \n        ma_split_buffer(temp, sizeof(temp), pRouter->config.channelsIn, MA_SIMD_ALIGNMENT, (void**)&ppTemp, &maxBytesToReadPerFrameEachIteration);\n\n        maxFramesToReadEachIteration = maxBytesToReadPerFrameEachIteration/sizeof(float);\n\n        totalFramesRead = 0;\n        while (totalFramesRead < frameCount) {\n            ma_uint32 iChannel;\n            ma_uint32 framesJustRead;\n            ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n            ma_uint64 framesToReadRightNow = framesRemaining;\n            if (framesToReadRightNow > maxFramesToReadEachIteration) {\n                framesToReadRightNow = maxFramesToReadEachIteration;\n            }\n\n            framesJustRead = pRouter->config.onReadDeinterleaved(pRouter, (ma_uint32)framesToReadRightNow, (void**)ppTemp, pUserData);\n            if (framesJustRead == 0) {\n                break;\n            }\n\n            ma_channel_router__do_routing(pRouter, framesJustRead, (float**)ppNextSamplesOut, (const float**)ppTemp);  /* <-- Real work is done here. */\n\n            totalFramesRead += framesJustRead;\n            if (totalFramesRead < frameCount) {\n                for (iChannel = 0; iChannel < pRouter->config.channelsIn; iChannel += 1) {\n                    ppNextSamplesOut[iChannel] += framesJustRead;\n                }\n            }\n\n            if (framesJustRead < framesToReadRightNow) {\n                break;\n            }\n        }\n\n        return totalFramesRead;\n    }\n}\n\nma_channel_router_config ma_channel_router_config_init(ma_uint32 channelsIn, const ma_channel channelMapIn[MA_MAX_CHANNELS], ma_uint32 channelsOut, const ma_channel channelMapOut[MA_MAX_CHANNELS], ma_channel_mix_mode mixingMode, ma_channel_router_read_deinterleaved_proc onRead, void* pUserData)\n{\n    ma_channel_router_config config;\n    ma_uint32 iChannel;\n\n    ma_zero_object(&config);\n\n    config.channelsIn = channelsIn;\n    for (iChannel = 0; iChannel < channelsIn; ++iChannel) {\n        config.channelMapIn[iChannel] = channelMapIn[iChannel];\n    }\n\n    config.channelsOut = channelsOut;\n    for (iChannel = 0; iChannel < channelsOut; ++iChannel) {\n        config.channelMapOut[iChannel] = channelMapOut[iChannel];\n    }\n\n    config.mixingMode = mixingMode;\n    config.onReadDeinterleaved = onRead;\n    config.pUserData = pUserData;\n\n    return config;\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nSRC\n\n**************************************************************************************************************************************************************/\n#define ma_floorf(x) ((float)floor((double)(x)))\n#define ma_sinf(x)   ((float)sin((double)(x)))\n#define ma_cosf(x)   ((float)cos((double)(x)))\n\nstatic MA_INLINE double ma_sinc(double x)\n{\n    if (x != 0) {\n        return sin(MA_PI_D*x) / (MA_PI_D*x);\n    } else {\n        return 1;\n    }\n}\n\n#define ma_sincf(x) ((float)ma_sinc((double)(x)))\n\n\nma_uint64 ma_src_read_deinterleaved__passthrough(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData);\nma_uint64 ma_src_read_deinterleaved__linear(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData);\nma_uint64 ma_src_read_deinterleaved__sinc(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData);\n\nvoid ma_src__build_sinc_table__sinc(ma_src* pSRC)\n{\n    ma_uint32 i;\n\n    ma_assert(pSRC != NULL);\n\n    pSRC->sinc.table[0] = 1.0f;\n    for (i = 1; i < ma_countof(pSRC->sinc.table); i += 1) {\n        double x = i*MA_PI_D / MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION;\n        pSRC->sinc.table[i] = (float)(sin(x)/x);\n    }\n}\n\nvoid ma_src__build_sinc_table__rectangular(ma_src* pSRC)\n{\n    /* This is the same as the base sinc table. */\n    ma_src__build_sinc_table__sinc(pSRC);\n}\n\nvoid ma_src__build_sinc_table__hann(ma_src* pSRC)\n{\n    ma_uint32 i;\n\n    ma_src__build_sinc_table__sinc(pSRC);\n\n    for (i = 0; i < ma_countof(pSRC->sinc.table); i += 1) {\n        double x = pSRC->sinc.table[i];\n        double N = MA_SRC_SINC_MAX_WINDOW_WIDTH*2;\n        double n = ((double)(i) / MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION) + MA_SRC_SINC_MAX_WINDOW_WIDTH;\n        double w = 0.5 * (1 - cos((2*MA_PI_D*n) / (N)));\n\n        pSRC->sinc.table[i] = (float)(x * w);\n    }\n}\n\nma_result ma_src_init(const ma_src_config* pConfig, ma_src* pSRC)\n{\n    if (pSRC == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pSRC);\n\n    if (pConfig == NULL || pConfig->onReadDeinterleaved == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    if (pConfig->channels == 0 || pConfig->channels > MA_MAX_CHANNELS) {\n        return MA_INVALID_ARGS;\n    }\n\n    pSRC->config = *pConfig;\n\n    /* SIMD */\n    pSRC->useSSE2   = ma_has_sse2()    && !pConfig->noSSE2;\n    pSRC->useAVX2   = ma_has_avx2()    && !pConfig->noAVX2;\n    pSRC->useAVX512 = ma_has_avx512f() && !pConfig->noAVX512;\n    pSRC->useNEON   = ma_has_neon()    && !pConfig->noNEON;\n\n    if (pSRC->config.algorithm == ma_src_algorithm_sinc) {\n        /* Make sure the window width within bounds. */\n        if (pSRC->config.sinc.windowWidth == 0) {\n            pSRC->config.sinc.windowWidth = MA_SRC_SINC_DEFAULT_WINDOW_WIDTH;\n        }\n        if (pSRC->config.sinc.windowWidth < MA_SRC_SINC_MIN_WINDOW_WIDTH) {\n            pSRC->config.sinc.windowWidth = MA_SRC_SINC_MIN_WINDOW_WIDTH;\n        }\n        if (pSRC->config.sinc.windowWidth > MA_SRC_SINC_MAX_WINDOW_WIDTH) {\n            pSRC->config.sinc.windowWidth = MA_SRC_SINC_MAX_WINDOW_WIDTH;\n        }\n\n        /* Set up the lookup table. */\n        switch (pSRC->config.sinc.windowFunction) {\n            case ma_src_sinc_window_function_hann:        ma_src__build_sinc_table__hann(pSRC);        break;\n            case ma_src_sinc_window_function_rectangular: ma_src__build_sinc_table__rectangular(pSRC); break;\n            default: return MA_INVALID_ARGS;   /* <-- Hitting this means the window function is unknown to miniaudio. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_src_set_sample_rate(ma_src* pSRC, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    if (pSRC == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have a sample rate of > 0. */\n    if (sampleRateIn == 0 || sampleRateOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_exchange_32(&pSRC->config.sampleRateIn, sampleRateIn);\n    ma_atomic_exchange_32(&pSRC->config.sampleRateOut, sampleRateOut);\n\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_src_read_deinterleaved(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    ma_src_algorithm algorithm;\n\n    if (pSRC == NULL || frameCount == 0 || ppSamplesOut == NULL) {\n        return 0;\n    }\n\n    algorithm = pSRC->config.algorithm;\n\n    /* Can use a function pointer for this. */\n    switch (algorithm) {\n        case ma_src_algorithm_none:   return ma_src_read_deinterleaved__passthrough(pSRC, frameCount, ppSamplesOut, pUserData);\n        case ma_src_algorithm_linear: return ma_src_read_deinterleaved__linear(     pSRC, frameCount, ppSamplesOut, pUserData);\n        case ma_src_algorithm_sinc:   return ma_src_read_deinterleaved__sinc(       pSRC, frameCount, ppSamplesOut, pUserData);\n        default: break;\n    }\n\n    /* Should never get here. */\n    return 0;\n}\n\nma_uint64 ma_src_read_deinterleaved__passthrough(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    if (frameCount <= 0xFFFFFFFF) {\n        return pSRC->config.onReadDeinterleaved(pSRC, (ma_uint32)frameCount, ppSamplesOut, pUserData);\n    } else {\n        ma_uint32 iChannel;\n        ma_uint64 totalFramesRead;\n        float* ppNextSamplesOut[MA_MAX_CHANNELS];\n\n        for (iChannel = 0; iChannel < pSRC->config.channels; ++iChannel) {\n            ppNextSamplesOut[iChannel] = (float*)ppSamplesOut[iChannel];\n        }\n\n        totalFramesRead = 0;\n        while (totalFramesRead < frameCount) {\n            ma_uint32 framesJustRead;\n            ma_uint64 framesRemaining = frameCount - totalFramesRead;\n            ma_uint64 framesToReadRightNow = framesRemaining;\n            if (framesToReadRightNow > 0xFFFFFFFF) {\n                framesToReadRightNow = 0xFFFFFFFF;\n            }\n\n            framesJustRead = (ma_uint32)pSRC->config.onReadDeinterleaved(pSRC, (ma_uint32)framesToReadRightNow, (void**)ppNextSamplesOut, pUserData);\n            if (framesJustRead == 0) {\n                break;\n            }\n\n            totalFramesRead += framesJustRead;\n            for (iChannel = 0; iChannel < pSRC->config.channels; ++iChannel) {\n                ppNextSamplesOut[iChannel] += framesJustRead;\n            }\n\n            if (framesJustRead < framesToReadRightNow) {\n                break;\n            }\n        }\n\n        return totalFramesRead;\n    }\n}\n\nma_uint64 ma_src_read_deinterleaved__linear(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    float* ppNextSamplesOut[MA_MAX_CHANNELS];\n    float factor;\n    ma_uint32 maxFrameCountPerChunkIn;\n    ma_uint64 totalFramesRead;\n\n    ma_assert(pSRC != NULL);\n    ma_assert(frameCount > 0);\n    ma_assert(ppSamplesOut != NULL);\n    \n    ma_copy_memory(ppNextSamplesOut, ppSamplesOut, sizeof(void*) * pSRC->config.channels);\n\n    factor = (float)pSRC->config.sampleRateIn / pSRC->config.sampleRateOut;\n    maxFrameCountPerChunkIn = ma_countof(pSRC->linear.input[0]);\n\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n        ma_uint32 iChannel;\n        float tBeg;\n        float tEnd;\n        float tAvailable;\n        float tNext;\n        float* ppSamplesFromClient[MA_MAX_CHANNELS];\n        ma_uint32 iNextFrame;\n        ma_uint32 maxOutputFramesToRead;\n        ma_uint32 maxOutputFramesToRead4;\n        ma_uint32 framesToReadFromClient;\n        ma_uint32 framesReadFromClient;\n        ma_uint64 framesRemaining = frameCount - totalFramesRead;\n        ma_uint64 framesToRead = framesRemaining;\n        if (framesToRead > 16384) {\n            framesToRead = 16384;    /* <-- Keep this small because we're using 32-bit floats for calculating sample positions and I don't want to run out of precision with huge sample counts. */\n        }\n\n\n        /* Read Input Data */\n        tBeg = pSRC->linear.timeIn;\n        tEnd = tBeg + ((ma_int64)framesToRead*factor); /* Cast to int64 required for VC6. */\n\n        framesToReadFromClient = (ma_uint32)(tEnd) + 1 + 1;   /* +1 to make tEnd 1-based and +1 because we always need to an extra sample for interpolation. */\n        if (framesToReadFromClient >= maxFrameCountPerChunkIn) {\n            framesToReadFromClient  = maxFrameCountPerChunkIn;\n        }\n\n        for (iChannel = 0; iChannel < pSRC->config.channels; ++iChannel) {\n            ppSamplesFromClient[iChannel] = pSRC->linear.input[iChannel] + pSRC->linear.leftoverFrames;\n        }\n        \n        framesReadFromClient = 0;\n        if (framesToReadFromClient > pSRC->linear.leftoverFrames) {\n            framesReadFromClient = (ma_uint32)pSRC->config.onReadDeinterleaved(pSRC, (ma_uint32)framesToReadFromClient - pSRC->linear.leftoverFrames, (void**)ppSamplesFromClient, pUserData);\n        }\n\n        framesReadFromClient += pSRC->linear.leftoverFrames;  /* <-- You can sort of think of it as though we've re-read the leftover samples from the client. */\n        if (framesReadFromClient < 2) {\n            break;\n        }\n\n        for (iChannel = 0; iChannel < pSRC->config.channels; ++iChannel) {\n            ppSamplesFromClient[iChannel] = pSRC->linear.input[iChannel];\n        }\n\n\n        /* Write Output Data */\n\n        /*\n        At this point we have a bunch of frames that the client has given to us for processing. From this we can determine the maximum number of output frames\n        that can be processed from this input. We want to output as many samples as possible from our input data.\n        */\n        tAvailable = framesReadFromClient - tBeg - 1; /* Subtract 1 because the last input sample is needed for interpolation and cannot be included in the output sample count calculation. */\n\n        maxOutputFramesToRead = (ma_uint32)(tAvailable / factor);\n        if (maxOutputFramesToRead == 0) {\n            maxOutputFramesToRead = 1;\n        }\n        if (maxOutputFramesToRead > framesToRead) {\n            maxOutputFramesToRead = (ma_uint32)framesToRead;\n        }\n\n        /* Output frames are always read in groups of 4 because I'm planning on using this as a reference for some SIMD-y stuff later. */\n        maxOutputFramesToRead4 = maxOutputFramesToRead/4;\n        for (iChannel = 0; iChannel < pSRC->config.channels; ++iChannel) {\n            ma_uint32 iFrameOut;\n            float t0 = pSRC->linear.timeIn + factor*0;\n            float t1 = pSRC->linear.timeIn + factor*1;\n            float t2 = pSRC->linear.timeIn + factor*2;\n            float t3 = pSRC->linear.timeIn + factor*3;\n            float t;\n            \n            for (iFrameOut = 0; iFrameOut < maxOutputFramesToRead4; iFrameOut += 1) {\n                float iPrevSample0 = (float)floor(t0);\n                float iPrevSample1 = (float)floor(t1);\n                float iPrevSample2 = (float)floor(t2);\n                float iPrevSample3 = (float)floor(t3);\n                \n                float iNextSample0 = iPrevSample0 + 1;\n                float iNextSample1 = iPrevSample1 + 1;\n                float iNextSample2 = iPrevSample2 + 1;\n                float iNextSample3 = iPrevSample3 + 1;\n\n                float alpha0 = t0 - iPrevSample0;\n                float alpha1 = t1 - iPrevSample1;\n                float alpha2 = t2 - iPrevSample2;\n                float alpha3 = t3 - iPrevSample3;\n\n                float prevSample0 = ppSamplesFromClient[iChannel][(ma_uint32)iPrevSample0];\n                float prevSample1 = ppSamplesFromClient[iChannel][(ma_uint32)iPrevSample1];\n                float prevSample2 = ppSamplesFromClient[iChannel][(ma_uint32)iPrevSample2];\n                float prevSample3 = ppSamplesFromClient[iChannel][(ma_uint32)iPrevSample3];\n                \n                float nextSample0 = ppSamplesFromClient[iChannel][(ma_uint32)iNextSample0];\n                float nextSample1 = ppSamplesFromClient[iChannel][(ma_uint32)iNextSample1];\n                float nextSample2 = ppSamplesFromClient[iChannel][(ma_uint32)iNextSample2];\n                float nextSample3 = ppSamplesFromClient[iChannel][(ma_uint32)iNextSample3];\n\n                ppNextSamplesOut[iChannel][iFrameOut*4 + 0] = ma_mix_f32_fast(prevSample0, nextSample0, alpha0);\n                ppNextSamplesOut[iChannel][iFrameOut*4 + 1] = ma_mix_f32_fast(prevSample1, nextSample1, alpha1);\n                ppNextSamplesOut[iChannel][iFrameOut*4 + 2] = ma_mix_f32_fast(prevSample2, nextSample2, alpha2);\n                ppNextSamplesOut[iChannel][iFrameOut*4 + 3] = ma_mix_f32_fast(prevSample3, nextSample3, alpha3);\n\n                t0 += factor*4;\n                t1 += factor*4;\n                t2 += factor*4;\n                t3 += factor*4;\n            }\n\n            t = pSRC->linear.timeIn + (factor*maxOutputFramesToRead4*4);\n            for (iFrameOut = (maxOutputFramesToRead4*4); iFrameOut < maxOutputFramesToRead; iFrameOut += 1) {\n                float iPrevSample = (float)floor(t);\n                float iNextSample = iPrevSample + 1;\n                float alpha = t - iPrevSample;\n                float prevSample;\n                float nextSample;\n\n                ma_assert(iPrevSample < ma_countof(pSRC->linear.input[iChannel]));\n                ma_assert(iNextSample < ma_countof(pSRC->linear.input[iChannel]));\n\n                prevSample = ppSamplesFromClient[iChannel][(ma_uint32)iPrevSample];\n                nextSample = ppSamplesFromClient[iChannel][(ma_uint32)iNextSample];\n\n                ppNextSamplesOut[iChannel][iFrameOut] = ma_mix_f32_fast(prevSample, nextSample, alpha);\n\n                t += factor;\n            }\n\n            ppNextSamplesOut[iChannel] += maxOutputFramesToRead;\n        }\n\n        totalFramesRead += maxOutputFramesToRead;\n\n\n        /* Residual */\n        tNext = pSRC->linear.timeIn + (maxOutputFramesToRead*factor);\n\n        pSRC->linear.timeIn = tNext;\n        ma_assert(tNext <= framesReadFromClient+1);\n\n        iNextFrame = (ma_uint32)floor(tNext);\n        pSRC->linear.leftoverFrames = framesReadFromClient - iNextFrame;\n        pSRC->linear.timeIn = tNext - iNextFrame;\n\n        for (iChannel = 0; iChannel < pSRC->config.channels; ++iChannel) {\n            ma_uint32 iFrame;\n            for (iFrame = 0; iFrame < pSRC->linear.leftoverFrames; ++iFrame) {\n                float sample = ppSamplesFromClient[iChannel][framesReadFromClient-pSRC->linear.leftoverFrames + iFrame];\n                ppSamplesFromClient[iChannel][iFrame] = sample;\n            }\n        }\n\n        \n        /* Exit the loop if we've found everything from the client. */\n        if (framesReadFromClient < framesToReadFromClient) {\n            break;\n        }\n    }\n\n    return totalFramesRead;\n}\n\n\nma_src_config ma_src_config_init_new()\n{\n    ma_src_config config;\n    ma_zero_object(&config);\n\n    return config;\n}\n\nma_src_config ma_src_config_init(ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_uint32 channels, ma_src_read_deinterleaved_proc onReadDeinterleaved, void* pUserData)\n{\n    ma_src_config config = ma_src_config_init_new();\n    config.sampleRateIn = sampleRateIn;\n    config.sampleRateOut = sampleRateOut;\n    config.channels = channels;\n    config.onReadDeinterleaved = onReadDeinterleaved;\n    config.pUserData = pUserData;\n\n    return config;\n}\n\n\n/**************************************************************************************************************************************************************\n\nSinc Sample Rate Conversion\n===========================\n\nThe sinc SRC algorithm uses a windowed sinc to perform interpolation of samples. Currently, miniaudio's implementation supports rectangular and Hann window\nmethods.\n\nWhenever an output sample is being computed, it looks at a sub-section of the input samples. I've called this sub-section in the code below the \"window\",\nwhich I realize is a bit ambigous with the mathematical \"window\", but it works for me when I need to conceptualize things in my head. The window is made up\nof two halves. The first half contains past input samples (initialized to zero), and the second half contains future input samples. As time moves forward\nand input samples are consumed, the window moves forward. The larger the window, the better the quality at the expense of slower processing. The window is\nlimited the range [MA_SRC_SINC_MIN_WINDOW_WIDTH, MA_SRC_SINC_MAX_WINDOW_WIDTH] and defaults to MA_SRC_SINC_DEFAULT_WINDOW_WIDTH.\n\nInput samples are cached for efficiency (to prevent frequently requesting tiny numbers of samples from the client). When the window gets to the end of the\ncache, it's moved back to the start, and more samples are read from the client. If the client has no more data to give, the cache is filled with zeros and\nthe last of the input samples will be consumed. Once the last of the input samples have been consumed, no more samples will be output.\n\n\nWhen reading output samples, we always first read whatever is already in the input cache. Only when the cache has been fully consumed do we read more data\nfrom the client.\n\nTo access samples in the input buffer you do so relative to the window. When the window itself is at position 0, the first item in the buffer is accessed\nwith \"windowPos + windowWidth\". Generally, to access any sample relative to the window you do \"windowPos + windowWidth + sampleIndexRelativeToWindow\".\n\n**************************************************************************************************************************************************************/\n\n/* Comment this to disable interpolation of table lookups. Less accurate, but faster. */\n#define MA_USE_SINC_TABLE_INTERPOLATION\n\n/* Retrieves a sample from the input buffer's window. Values >= 0 retrieve future samples. Negative values return past samples. */\nstatic MA_INLINE float ma_src_sinc__get_input_sample_from_window(const ma_src* pSRC, ma_uint32 channel, ma_uint32 windowPosInSamples, ma_int32 sampleIndex)\n{\n    ma_assert(pSRC != NULL);\n    ma_assert(channel < pSRC->config.channels);\n    ma_assert(sampleIndex >= -(ma_int32)pSRC->config.sinc.windowWidth);\n    ma_assert(sampleIndex <   (ma_int32)pSRC->config.sinc.windowWidth);\n\n    /* The window should always be contained within the input cache. */\n    ma_assert(windowPosInSamples <  ma_countof(pSRC->sinc.input[0]) - pSRC->config.sinc.windowWidth);\n    \n    return pSRC->sinc.input[channel][windowPosInSamples + pSRC->config.sinc.windowWidth + sampleIndex];\n}\n\nstatic MA_INLINE float ma_src_sinc__interpolation_factor(const ma_src* pSRC, float x)\n{\n    float xabs;\n    ma_int32 ixabs;\n\n    ma_assert(pSRC != NULL);\n\n    xabs  = (float)fabs(x);\n    xabs  = xabs * MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION;\n    ixabs = (ma_int32)xabs;\n\n#if defined(MA_USE_SINC_TABLE_INTERPOLATION)\n    {\n        float a = xabs - ixabs;\n        return ma_mix_f32_fast(pSRC->sinc.table[ixabs], pSRC->sinc.table[ixabs+1], a);\n    }\n#else\n    return pSRC->sinc.table[ixabs];\n#endif\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE __m128 ma_fabsf_sse2(__m128 x)\n{\n    return _mm_and_ps(_mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF)), x);\n}\n\nstatic MA_INLINE __m128 ma_truncf_sse2(__m128 x)\n{\n    return _mm_cvtepi32_ps(_mm_cvttps_epi32(x));\n}\n\nstatic MA_INLINE __m128 ma_src_sinc__interpolation_factor__sse2(const ma_src* pSRC, __m128 x)\n{\n    __m128  resolution128;\n    __m128  xabs;\n    __m128i ixabs;\n    __m128  lo;\n    __m128  hi;\n    __m128  a;\n    __m128  r;\n    int* ixabsv;\n\n    resolution128  = _mm_set1_ps(MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION);\n    xabs  = ma_fabsf_sse2(x);\n    xabs  = _mm_mul_ps(xabs, resolution128);\n    ixabs = _mm_cvttps_epi32(xabs);\n\n    ixabsv = (int*)&ixabs;\n    \n    lo = _mm_set_ps(\n        pSRC->sinc.table[ixabsv[3]],\n        pSRC->sinc.table[ixabsv[2]],\n        pSRC->sinc.table[ixabsv[1]],\n        pSRC->sinc.table[ixabsv[0]]\n    );\n\n    hi = _mm_set_ps(\n        pSRC->sinc.table[ixabsv[3]+1],\n        pSRC->sinc.table[ixabsv[2]+1],\n        pSRC->sinc.table[ixabsv[1]+1],\n        pSRC->sinc.table[ixabsv[0]+1]\n    );\n\n    a = _mm_sub_ps(xabs, _mm_cvtepi32_ps(ixabs));\n    r = ma_mix_f32_fast__sse2(lo, hi, a);\n\n    return r;\n}\n#endif\n\n#if defined(MA_SUPPORT_AVX2)\nstatic MA_INLINE __m256 ma_fabsf_avx2(__m256 x)\n{\n    return _mm256_and_ps(_mm256_castsi256_ps(_mm256_set1_epi32(0x7FFFFFFF)), x);\n}\n\n#if 0\nstatic MA_INLINE __m256 ma_src_sinc__interpolation_factor__avx2(const ma_src* pSRC, __m256 x)\n{\n    __m256 resolution256  = _mm256_set1_ps(MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION);\n    __m256 xabs = ma_fabsf_avx2(x);\n\n    xabs = _mm256_mul_ps(xabs, resolution256);\n\n    __m256i ixabs = _mm256_cvttps_epi32(xabs);\n    __m256 a = _mm256_sub_ps(xabs, _mm256_cvtepi32_ps(ixabs));\n\n    \n    int* ixabsv = (int*)&ixabs;\n\n    __m256 lo = _mm256_set_ps(\n        pSRC->sinc.table[ixabsv[7]],\n        pSRC->sinc.table[ixabsv[6]],\n        pSRC->sinc.table[ixabsv[5]],\n        pSRC->sinc.table[ixabsv[4]],\n        pSRC->sinc.table[ixabsv[3]],\n        pSRC->sinc.table[ixabsv[2]],\n        pSRC->sinc.table[ixabsv[1]],\n        pSRC->sinc.table[ixabsv[0]]\n    );\n    \n    __m256 hi = _mm256_set_ps(\n        pSRC->sinc.table[ixabsv[7]+1],\n        pSRC->sinc.table[ixabsv[6]+1],\n        pSRC->sinc.table[ixabsv[5]+1],\n        pSRC->sinc.table[ixabsv[4]+1],\n        pSRC->sinc.table[ixabsv[3]+1],\n        pSRC->sinc.table[ixabsv[2]+1],\n        pSRC->sinc.table[ixabsv[1]+1],\n        pSRC->sinc.table[ixabsv[0]+1]\n    );\n\n    __m256 r = ma_mix_f32_fast__avx2(lo, hi, a);\n\n    return r;\n}\n#endif\n\n#endif\n\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE float32x4_t ma_fabsf_neon(float32x4_t x)\n{\n    return vabdq_f32(vmovq_n_f32(0), x);\n}\n\nstatic MA_INLINE float32x4_t ma_src_sinc__interpolation_factor__neon(const ma_src* pSRC, float32x4_t x)\n{\n    float32x4_t xabs;\n    int32x4_t   ixabs;\n    float32x4_t a\n    float32x4_t r\n    int* ixabsv;\n    float lo[4];\n    float hi[4];\n\n    xabs  = ma_fabsf_neon(x);\n    xabs  = vmulq_n_f32(xabs, MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION);\n    ixabs = vcvtq_s32_f32(xabs);\n\n    ixabsv = (int*)&ixabs;\n\n    lo[0] = pSRC->sinc.table[ixabsv[0]];\n    lo[1] = pSRC->sinc.table[ixabsv[1]];\n    lo[2] = pSRC->sinc.table[ixabsv[2]];\n    lo[3] = pSRC->sinc.table[ixabsv[3]];\n\n    hi[0] = pSRC->sinc.table[ixabsv[0]+1];\n    hi[1] = pSRC->sinc.table[ixabsv[1]+1];\n    hi[2] = pSRC->sinc.table[ixabsv[2]+1];\n    hi[3] = pSRC->sinc.table[ixabsv[3]+1];\n\n    a = vsubq_f32(xabs, vcvtq_f32_s32(ixabs));\n    r = ma_mix_f32_fast__neon(vld1q_f32(lo), vld1q_f32(hi), a);\n\n    return r;\n}\n#endif\n\nma_uint64 ma_src_read_deinterleaved__sinc(ma_src* pSRC, ma_uint64 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    float factor;\n    float inverseFactor;\n    ma_int32 windowWidth;\n    ma_int32 windowWidth2;\n    ma_int32 windowWidthSIMD;\n    ma_int32 windowWidthSIMD2;\n    float* ppNextSamplesOut[MA_MAX_CHANNELS];\n    float _windowSamplesUnaligned[MA_SRC_SINC_MAX_WINDOW_WIDTH*2 + MA_SIMD_ALIGNMENT];\n    float* windowSamples;\n    float _iWindowFUnaligned[MA_SRC_SINC_MAX_WINDOW_WIDTH*2 + MA_SIMD_ALIGNMENT];\n    float* iWindowF;\n    ma_int32 i;\n    ma_uint64 totalOutputFramesRead;\n\n    ma_assert(pSRC != NULL);\n    ma_assert(frameCount > 0);\n    ma_assert(ppSamplesOut != NULL);\n\n    factor = (float)pSRC->config.sampleRateIn / pSRC->config.sampleRateOut;\n    inverseFactor = 1/factor;\n\n    windowWidth  = (ma_int32)pSRC->config.sinc.windowWidth;\n    windowWidth2 = windowWidth*2;\n\n    /*\n    There are cases where it's actually more efficient to increase the window width so that it's aligned with the respective\n    SIMD pipeline being used.\n    */\n    windowWidthSIMD = windowWidth;\n    if (pSRC->useNEON) {\n        windowWidthSIMD = (windowWidthSIMD + 1) & ~(1);\n    } else  if (pSRC->useAVX512) {\n        windowWidthSIMD = (windowWidthSIMD + 7) & ~(7);\n    } else if (pSRC->useAVX2) {\n        windowWidthSIMD = (windowWidthSIMD + 3) & ~(3);\n    } else if (pSRC->useSSE2) {\n        windowWidthSIMD = (windowWidthSIMD + 1) & ~(1);\n    }\n\n    windowWidthSIMD2 = windowWidthSIMD*2;\n    (void)windowWidthSIMD2; /* <-- Silence a warning when SIMD is disabled. */\n\n    ma_copy_memory(ppNextSamplesOut, ppSamplesOut, sizeof(void*) * pSRC->config.channels);\n\n    windowSamples = (float*)(((ma_uintptr)_windowSamplesUnaligned + MA_SIMD_ALIGNMENT-1) & ~(MA_SIMD_ALIGNMENT-1));\n    ma_zero_memory(windowSamples, MA_SRC_SINC_MAX_WINDOW_WIDTH*2 * sizeof(float));\n\n    iWindowF = (float*)(((ma_uintptr)_iWindowFUnaligned + MA_SIMD_ALIGNMENT-1) & ~(MA_SIMD_ALIGNMENT-1));\n    ma_zero_memory(iWindowF, MA_SRC_SINC_MAX_WINDOW_WIDTH*2 * sizeof(float));\n\n    for (i = 0; i < windowWidth2; ++i) {\n        iWindowF[i] = (float)(i - windowWidth);\n    }\n\n    totalOutputFramesRead = 0;\n    while (totalOutputFramesRead < frameCount) {\n        ma_uint32 maxInputSamplesAvailableInCache;\n        float timeInBeg;\n        float timeInEnd;\n        ma_uint64 maxOutputFramesToRead;\n        ma_uint64 outputFramesRemaining;\n        ma_uint64 outputFramesToRead;\n        ma_uint32 iChannel;\n        ma_uint32 prevWindowPosInSamples;\n        ma_uint32 availableOutputFrames;\n\n        /*\n        The maximum number of frames we can read this iteration depends on how many input samples we have available to us. This is the number\n        of input samples between the end of the window and the end of the cache.\n        */\n        maxInputSamplesAvailableInCache = ma_countof(pSRC->sinc.input[0]) - (pSRC->config.sinc.windowWidth*2) - pSRC->sinc.windowPosInSamples;\n        if (maxInputSamplesAvailableInCache > pSRC->sinc.inputFrameCount) {\n            maxInputSamplesAvailableInCache = pSRC->sinc.inputFrameCount;\n        }\n\n        /* Never consume the tail end of the input data if requested. */\n        if (pSRC->config.neverConsumeEndOfInput) {\n            if (maxInputSamplesAvailableInCache >= pSRC->config.sinc.windowWidth) {\n                maxInputSamplesAvailableInCache -= pSRC->config.sinc.windowWidth;\n            } else {\n                maxInputSamplesAvailableInCache  = 0;\n            }\n        }\n\n        timeInBeg = pSRC->sinc.timeIn;\n        timeInEnd = (float)(pSRC->sinc.windowPosInSamples + maxInputSamplesAvailableInCache);\n\n        ma_assert(timeInBeg >= 0);\n        ma_assert(timeInBeg <= timeInEnd);\n\n        maxOutputFramesToRead = (ma_uint64)(((timeInEnd - timeInBeg) * inverseFactor));\n\n        outputFramesRemaining = frameCount - totalOutputFramesRead;\n        outputFramesToRead = outputFramesRemaining;\n        if (outputFramesToRead > maxOutputFramesToRead) {\n            outputFramesToRead = maxOutputFramesToRead;\n        }\n\n        for (iChannel = 0; iChannel < pSRC->config.channels; iChannel += 1) {\n            /* Do SRC. */\n            float timeIn = timeInBeg;\n            ma_uint32 iSample;\n            for (iSample = 0; iSample < outputFramesToRead; iSample += 1) {\n                float sampleOut = 0;\n                float iTimeInF = ma_floorf(timeIn);\n                ma_uint32 iTimeIn = (ma_uint32)iTimeInF;\n                ma_int32 iWindow = 0;\n                float tScalar;\n\n                /* Pre-load the window samples into an aligned buffer to begin with. Need to put these into an aligned buffer to make SIMD easier. */\n                windowSamples[0] = 0;   /* <-- The first sample is always zero. */\n                for (i = 1; i < windowWidth2; ++i) {\n                    windowSamples[i] = pSRC->sinc.input[iChannel][iTimeIn + i];\n                }\n\n#if defined(MA_SUPPORT_AVX2) || defined(MA_SUPPORT_AVX512)\n                if (pSRC->useAVX2 || pSRC->useAVX512) {\n                    __m256i ixabs[MA_SRC_SINC_MAX_WINDOW_WIDTH*2/8];\n                    __m256      a[MA_SRC_SINC_MAX_WINDOW_WIDTH*2/8];\n                    __m256 resolution256;\n                    __m256 t;\n                    __m256 r;\n                    ma_int32 windowWidth8;\n                    ma_int32 iWindow8;\n\n                    resolution256 = _mm256_set1_ps(MA_SRC_SINC_LOOKUP_TABLE_RESOLUTION);\n\n                    t = _mm256_set1_ps((timeIn - iTimeInF));\n                    r = _mm256_set1_ps(0);\n\n                    windowWidth8 = windowWidthSIMD2 >> 3;\n                    for (iWindow8 = 0; iWindow8 < windowWidth8; iWindow8 += 1) {\n                        __m256 w = *((__m256*)iWindowF + iWindow8);\n\n                        __m256 xabs = _mm256_sub_ps(t, w);\n                        xabs = ma_fabsf_avx2(xabs);\n                        xabs = _mm256_mul_ps(xabs, resolution256);\n\n                        ixabs[iWindow8] = _mm256_cvttps_epi32(xabs);\n                            a[iWindow8] = _mm256_sub_ps(xabs, _mm256_cvtepi32_ps(ixabs[iWindow8]));\n                    }\n                    \n                    for (iWindow8 = 0; iWindow8 < windowWidth8; iWindow8 += 1) {\n                        int* ixabsv = (int*)&ixabs[iWindow8];\n\n                        __m256 lo = _mm256_set_ps(\n                            pSRC->sinc.table[ixabsv[7]],\n                            pSRC->sinc.table[ixabsv[6]],\n                            pSRC->sinc.table[ixabsv[5]],\n                            pSRC->sinc.table[ixabsv[4]],\n                            pSRC->sinc.table[ixabsv[3]],\n                            pSRC->sinc.table[ixabsv[2]],\n                            pSRC->sinc.table[ixabsv[1]],\n                            pSRC->sinc.table[ixabsv[0]]\n                        );\n    \n                        __m256 hi = _mm256_set_ps(\n                            pSRC->sinc.table[ixabsv[7]+1],\n                            pSRC->sinc.table[ixabsv[6]+1],\n                            pSRC->sinc.table[ixabsv[5]+1],\n                            pSRC->sinc.table[ixabsv[4]+1],\n                            pSRC->sinc.table[ixabsv[3]+1],\n                            pSRC->sinc.table[ixabsv[2]+1],\n                            pSRC->sinc.table[ixabsv[1]+1],\n                            pSRC->sinc.table[ixabsv[0]+1]\n                        );\n\n                        __m256 s = *((__m256*)windowSamples + iWindow8);\n                        r = _mm256_add_ps(r, _mm256_mul_ps(s, ma_mix_f32_fast__avx2(lo, hi, a[iWindow8])));\n                    }\n\n                    /* Horizontal add. */\n                    __m256 x = _mm256_hadd_ps(r, _mm256_permute2f128_ps(r, r, 1));\n                           x = _mm256_hadd_ps(x, x);\n                           x = _mm256_hadd_ps(x, x);\n                    sampleOut += _mm_cvtss_f32(_mm256_castps256_ps128(x));\n\n                    iWindow += windowWidth8 * 8;\n                }\n                else\n#endif\n#if defined(MA_SUPPORT_SSE2)\n                if (pSRC->useSSE2) {\n                    __m128 t = _mm_set1_ps((timeIn - iTimeInF));\n                    __m128 r = _mm_set1_ps(0);\n\n                    ma_int32 windowWidth4 = windowWidthSIMD2 >> 2;\n                    ma_int32 iWindow4;\n                    for (iWindow4 = 0; iWindow4 < windowWidth4; iWindow4 += 1) {\n                        __m128* s = (__m128*)windowSamples + iWindow4;\n                        __m128* w = (__m128*)iWindowF + iWindow4;\n\n                        __m128 a = ma_src_sinc__interpolation_factor__sse2(pSRC, _mm_sub_ps(t, *w));\n                        r = _mm_add_ps(r, _mm_mul_ps(*s, a));\n                    }\n\n                    sampleOut += ((float*)(&r))[0];\n                    sampleOut += ((float*)(&r))[1];\n                    sampleOut += ((float*)(&r))[2];\n                    sampleOut += ((float*)(&r))[3];\n\n                    iWindow += windowWidth4 * 4;\n                }\n                else\n#endif\n#if defined(MA_SUPPORT_NEON)\n                if (pSRC->useNEON) {\n                    float32x4_t t = vmovq_n_f32((timeIn - iTimeInF));\n                    float32x4_t r = vmovq_n_f32(0);\n\n                    ma_int32 windowWidth4 = windowWidthSIMD2 >> 2;\n                    ma_int32 iWindow4;\n                    for (iWindow4 = 0; iWindow4 < windowWidth4; iWindow4 += 1) {\n                        float32x4_t* s = (float32x4_t*)windowSamples + iWindow4;\n                        float32x4_t* w = (float32x4_t*)iWindowF + iWindow4;\n\n                        float32x4_t a = ma_src_sinc__interpolation_factor__neon(pSRC, vsubq_f32(t, *w));\n                        r = vaddq_f32(r, vmulq_f32(*s, a));\n                    }\n\n                    sampleOut += ((float*)(&r))[0];\n                    sampleOut += ((float*)(&r))[1];\n                    sampleOut += ((float*)(&r))[2];\n                    sampleOut += ((float*)(&r))[3];\n\n                    iWindow += windowWidth4 * 4;\n                }\n                else\n#endif\n                {\n                    iWindow += 1;   /* The first one is a dummy for SIMD alignment purposes. Skip it. */\n                }\n\n                /* Non-SIMD/Reference implementation. */\n                tScalar = (timeIn - iTimeIn);\n                for (; iWindow < windowWidth2; iWindow += 1) {\n                    float s = windowSamples[iWindow];\n                    float w = iWindowF[iWindow];\n\n                    float a = ma_src_sinc__interpolation_factor(pSRC, (tScalar - w));\n                    float r = s * a;\n\n                    sampleOut += r;\n                }\n\n                ppNextSamplesOut[iChannel][iSample] = (float)sampleOut;\n\n                timeIn += factor;\n            }\n\n            ppNextSamplesOut[iChannel] += outputFramesToRead;\n        }\n\n        totalOutputFramesRead += outputFramesToRead;\n\n        prevWindowPosInSamples = pSRC->sinc.windowPosInSamples;\n\n        pSRC->sinc.timeIn            += ((ma_int64)outputFramesToRead * factor); /* Cast to int64 required for VC6. */\n        pSRC->sinc.windowPosInSamples = (ma_uint32)pSRC->sinc.timeIn;\n        pSRC->sinc.inputFrameCount   -= pSRC->sinc.windowPosInSamples - prevWindowPosInSamples;\n\n        /* If the window has reached a point where we cannot read a whole output sample it needs to be moved back to the start. */\n        availableOutputFrames = (ma_uint32)((timeInEnd - pSRC->sinc.timeIn) * inverseFactor);\n\n        if (availableOutputFrames == 0) {\n            size_t samplesToMove = ma_countof(pSRC->sinc.input[0]) - pSRC->sinc.windowPosInSamples;\n\n            pSRC->sinc.timeIn            -= ma_floorf(pSRC->sinc.timeIn);\n            pSRC->sinc.windowPosInSamples = 0;\n\n            /* Move everything from the end of the cache up to the front. */\n            for (iChannel = 0; iChannel < pSRC->config.channels; iChannel += 1) {\n                memmove(pSRC->sinc.input[iChannel], pSRC->sinc.input[iChannel] + ma_countof(pSRC->sinc.input[iChannel]) - samplesToMove, samplesToMove * sizeof(*pSRC->sinc.input[iChannel]));\n            }\n        }\n\n        /* Read more data from the client if required. */\n        if (pSRC->isEndOfInputLoaded) {\n            pSRC->isEndOfInputLoaded = MA_FALSE;\n            break;\n        }\n\n        /*\n        Everything beyond this point is reloading. If we're at the end of the input data we do _not_ want to try reading any more in this function call. If the\n        caller wants to keep trying, they can reload their internal data sources and call this function again. We should never be \n        */\n        ma_assert(pSRC->isEndOfInputLoaded == MA_FALSE);\n\n        if (pSRC->sinc.inputFrameCount <= pSRC->config.sinc.windowWidth || availableOutputFrames == 0) {\n            float* ppInputDst[MA_MAX_CHANNELS] = {0};\n            ma_uint32 framesToReadFromClient;\n            ma_uint32 framesReadFromClient;\n            ma_uint32 leftoverFrames;\n\n            for (iChannel = 0; iChannel < pSRC->config.channels; iChannel += 1) {\n                ppInputDst[iChannel] = pSRC->sinc.input[iChannel] + pSRC->config.sinc.windowWidth + pSRC->sinc.inputFrameCount;\n            }\n\n            /* Now read data from the client. */\n            framesToReadFromClient = ma_countof(pSRC->sinc.input[0]) - (pSRC->config.sinc.windowWidth + pSRC->sinc.inputFrameCount);\n\n            framesReadFromClient = 0;\n            if (framesToReadFromClient > 0) {\n                framesReadFromClient = pSRC->config.onReadDeinterleaved(pSRC, framesToReadFromClient, (void**)ppInputDst, pUserData);\n            }\n\n            if (framesReadFromClient != framesToReadFromClient) {\n                pSRC->isEndOfInputLoaded = MA_TRUE;\n            } else {\n                pSRC->isEndOfInputLoaded = MA_FALSE;\n            }\n\n            if (framesReadFromClient != 0) {\n                pSRC->sinc.inputFrameCount += framesReadFromClient;\n            } else {\n                /* We couldn't get anything more from the client. If no more output samples can be computed from the available input samples we need to return. */\n                if (pSRC->config.neverConsumeEndOfInput) {\n                    if ((pSRC->sinc.inputFrameCount * inverseFactor) <= pSRC->config.sinc.windowWidth) {\n                        break;\n                    }\n                } else {\n                    if ((pSRC->sinc.inputFrameCount * inverseFactor) < 1) {\n                        break;\n                    }\n                }\n            }\n\n            /* Anything left over in the cache must be set to zero. */\n            leftoverFrames = ma_countof(pSRC->sinc.input[0]) - (pSRC->config.sinc.windowWidth + pSRC->sinc.inputFrameCount);\n            if (leftoverFrames > 0) {\n                for (iChannel = 0; iChannel < pSRC->config.channels; iChannel += 1) {\n                    ma_zero_memory(pSRC->sinc.input[iChannel] + pSRC->config.sinc.windowWidth + pSRC->sinc.inputFrameCount, leftoverFrames * sizeof(float));\n                }\n            }\n        }\n    }\n\n    return totalOutputFramesRead;\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nFormat Conversion\n\n**************************************************************************************************************************************************************/\nvoid ma_pcm_convert(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 sampleCount, ma_dither_mode ditherMode)\n{\n    if (formatOut == formatIn) {\n        ma_copy_memory_64(pOut, pIn, sampleCount * ma_get_bytes_per_sample(formatOut));\n        return;\n    }\n\n    switch (formatIn)\n    {\n        case ma_format_u8:\n        {\n            switch (formatOut)\n            {\n                case ma_format_s16: ma_pcm_u8_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_u8_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_u8_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_u8_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_s16_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_s16_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_s16_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_s16_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_s24_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s16: ma_pcm_s24_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_s24_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_s24_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_s32_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s16: ma_pcm_s32_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_s32_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_s32_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_f32_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s16: ma_pcm_f32_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_f32_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_f32_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        default: break;\n    }\n}\n\nvoid ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void* pInterleavedPCMFrames, void** ppDeinterleavedPCMFrames)\n{\n    if (pInterleavedPCMFrames == NULL || ppDeinterleavedPCMFrames == NULL) {\n        return; /* Invalid args. */\n    }\n\n    /* For efficiency we do this per format. */\n    switch (format) {\n        case ma_format_s16:\n        {\n            const ma_int16* pSrcS16 = (const ma_int16*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    ma_int16* pDstS16 = (ma_int16*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstS16[iPCMFrame] = pSrcS16[iPCMFrame*channels+iChannel];\n                }\n            }\n        } break;\n        \n        case ma_format_f32:\n        {\n            const float* pSrcF32 = (const float*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    float* pDstF32 = (float*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstF32[iPCMFrame] = pSrcF32[iPCMFrame*channels+iChannel];\n                }\n            }\n        } break;\n        \n        default:\n        {\n            ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format);\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                          void* pDst = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes);\n                    const void* pSrc = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes);\n                    memcpy(pDst, pSrc, sampleSizeInBytes);\n                }\n            }\n        } break;\n    }\n}\n\nvoid ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void** ppDeinterleavedPCMFrames, void* pInterleavedPCMFrames)\n{\n    switch (format)\n    {\n        case ma_format_s16:\n        {\n            ma_int16* pDstS16 = (ma_int16*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    const ma_int16* pSrcS16 = (const ma_int16*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstS16[iPCMFrame*channels+iChannel] = pSrcS16[iPCMFrame];\n                }\n            }\n        } break;\n        \n        case ma_format_f32:\n        {\n            float* pDstF32 = (float*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    const float* pSrcF32 = (const float*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstF32[iPCMFrame*channels+iChannel] = pSrcF32[iPCMFrame];\n                }\n            }\n        } break;\n    \n        default:\n        {\n            ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format);\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                          void* pDst = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes);\n                    const void* pSrc = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes);\n                    memcpy(pDst, pSrc, sampleSizeInBytes);\n                }\n            }\n        } break;\n    }\n}\n\n\n\ntypedef struct\n{\n    ma_pcm_converter* pDSP;\n    void* pUserDataForClient;\n} ma_pcm_converter_callback_data;\n\nma_uint32 ma_pcm_converter__pre_format_converter_on_read(ma_format_converter* pConverter, ma_uint32 frameCount, void* pFramesOut, void* pUserData)\n{\n    ma_pcm_converter_callback_data* pData;\n    ma_pcm_converter* pDSP;\n\n    (void)pConverter;\n\n    pData = (ma_pcm_converter_callback_data*)pUserData;\n    ma_assert(pData != NULL);\n\n    pDSP = pData->pDSP;\n    ma_assert(pDSP != NULL);\n\n    return pDSP->onRead(pDSP, pFramesOut, frameCount, pData->pUserDataForClient);\n}\n\nma_uint32 ma_pcm_converter__post_format_converter_on_read(ma_format_converter* pConverter, ma_uint32 frameCount, void* pFramesOut, void* pUserData)\n{\n    ma_pcm_converter_callback_data* pData;\n    ma_pcm_converter* pDSP;\n\n    (void)pConverter;\n\n    pData = (ma_pcm_converter_callback_data*)pUserData;\n    ma_assert(pData != NULL);\n\n    pDSP = pData->pDSP;\n    ma_assert(pDSP != NULL);\n\n    /* When this version of this callback is used it means we're reading directly from the client. */\n    ma_assert(pDSP->isPreFormatConversionRequired == MA_FALSE);\n    ma_assert(pDSP->isChannelRoutingRequired == MA_FALSE);\n    ma_assert(pDSP->isSRCRequired == MA_FALSE);\n\n    return pDSP->onRead(pDSP, pFramesOut, frameCount, pData->pUserDataForClient);\n}\n\nma_uint32 ma_pcm_converter__post_format_converter_on_read_deinterleaved(ma_format_converter* pConverter, ma_uint32 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    ma_pcm_converter_callback_data* pData;\n    ma_pcm_converter* pDSP;\n\n    (void)pConverter;\n\n    pData = (ma_pcm_converter_callback_data*)pUserData;\n    ma_assert(pData != NULL);\n\n    pDSP = pData->pDSP;\n    ma_assert(pDSP != NULL);\n\n    if (!pDSP->isChannelRoutingAtStart) {\n        return (ma_uint32)ma_channel_router_read_deinterleaved(&pDSP->channelRouter, frameCount, ppSamplesOut, pUserData);\n    } else {\n        if (pDSP->isSRCRequired) {\n            return (ma_uint32)ma_src_read_deinterleaved(&pDSP->src, frameCount, ppSamplesOut, pUserData);\n        } else {\n            return (ma_uint32)ma_channel_router_read_deinterleaved(&pDSP->channelRouter, frameCount, ppSamplesOut, pUserData);\n        }\n    }\n}\n\nma_uint32 ma_pcm_converter__src_on_read_deinterleaved(ma_src* pSRC, ma_uint32 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    ma_pcm_converter_callback_data* pData;\n    ma_pcm_converter* pDSP;\n\n    (void)pSRC;\n\n    pData = (ma_pcm_converter_callback_data*)pUserData;\n    ma_assert(pData != NULL);\n\n    pDSP = pData->pDSP;\n    ma_assert(pDSP != NULL);\n\n    /* If the channel routing stage is at the front we need to read from that. Otherwise we read from the pre format converter. */\n    if (pDSP->isChannelRoutingAtStart) {\n        return (ma_uint32)ma_channel_router_read_deinterleaved(&pDSP->channelRouter, frameCount, ppSamplesOut, pUserData);\n    } else {\n        return (ma_uint32)ma_format_converter_read_deinterleaved(&pDSP->formatConverterIn, frameCount, ppSamplesOut, pUserData);\n    }\n}\n\nma_uint32 ma_pcm_converter__channel_router_on_read_deinterleaved(ma_channel_router* pRouter, ma_uint32 frameCount, void** ppSamplesOut, void* pUserData)\n{\n    ma_pcm_converter_callback_data* pData;\n    ma_pcm_converter* pDSP;\n\n    (void)pRouter;\n\n    pData = (ma_pcm_converter_callback_data*)pUserData;\n    ma_assert(pData != NULL);\n\n    pDSP = pData->pDSP;\n    ma_assert(pDSP != NULL);\n\n    /* If the channel routing stage is at the front of the pipeline we read from the pre format converter. Otherwise we read from the sample rate converter. */\n    if (pDSP->isChannelRoutingAtStart) {\n        return (ma_uint32)ma_format_converter_read_deinterleaved(&pDSP->formatConverterIn, frameCount, ppSamplesOut, pUserData);\n    } else {\n        if (pDSP->isSRCRequired) {\n            return (ma_uint32)ma_src_read_deinterleaved(&pDSP->src, frameCount, ppSamplesOut, pUserData);\n        } else {\n            return (ma_uint32)ma_format_converter_read_deinterleaved(&pDSP->formatConverterIn, frameCount, ppSamplesOut, pUserData);\n        }\n    }\n}\n\nma_result ma_pcm_converter_init(const ma_pcm_converter_config* pConfig, ma_pcm_converter* pDSP)\n{\n    ma_result result;\n\n    if (pDSP == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pDSP);\n    pDSP->onRead = pConfig->onRead;\n    pDSP->pUserData = pConfig->pUserData;\n    pDSP->isDynamicSampleRateAllowed = pConfig->allowDynamicSampleRate;\n\n    /*\n    In general, this is the pipeline used for data conversion. Note that this can actually change which is explained later.\n    \n      Pre Format Conversion -> Sample Rate Conversion -> Channel Routing -> Post Format Conversion\n    \n    Pre Format Conversion\n    ---------------------\n    This is where the sample data is converted to a format that's usable by the later stages in the pipeline. Input data\n    is converted to deinterleaved floating-point.\n    \n    Channel Routing\n    ---------------\n    Channel routing is where stereo is converted to 5.1, mono is converted to stereo, etc. This stage depends on the\n    pre format conversion stage.\n    \n    Sample Rate Conversion\n    ----------------------\n    Sample rate conversion depends on the pre format conversion stage and as the name implies performs sample rate conversion.\n    \n    Post Format Conversion\n    ----------------------\n    This stage is where our deinterleaved floating-point data from the previous stages are converted to the requested output\n    format.\n    \n    \n    Optimizations\n    -------------\n    Sometimes the conversion pipeline is rearranged for efficiency. The first obvious optimization is to eliminate unnecessary\n    stages in the pipeline. When no channel routing nor sample rate conversion is necessary, the entire pipeline is optimized\n    down to just this:\n    \n      Post Format Conversion\n    \n    When sample rate conversion is not unnecessary:\n    \n      Pre Format Conversion -> Channel Routing -> Post Format Conversion\n    \n    When channel routing is unnecessary:\n    \n      Pre Format Conversion -> Sample Rate Conversion -> Post Format Conversion\n    \n    A slightly less obvious optimization is used depending on whether or not we are increasing or decreasing the number of\n    channels. Because everything in the pipeline works on a per-channel basis, the efficiency of the pipeline is directly\n    proportionate to the number of channels that need to be processed. Therefore, it's can be more efficient to move the\n    channel conversion stage to an earlier or later stage. When the channel count is being reduced, we move the channel\n    conversion stage to the start of the pipeline so that later stages can work on a smaller number of channels at a time.\n    Otherwise, we move the channel conversion stage to the end of the pipeline. When reducing the channel count, the pipeline\n    will look like this:\n    \n      Pre Format Conversion -> Channel Routing -> Sample Rate Conversion -> Post Format Conversion\n    \n    Notice how the Channel Routing and Sample Rate Conversion stages are swapped so that the SRC stage has less data to process.\n    */\n\n    /* First we need to determine what's required and what's not. */\n    if (pConfig->sampleRateIn != pConfig->sampleRateOut || pConfig->allowDynamicSampleRate) {\n        pDSP->isSRCRequired = MA_TRUE;\n    }\n    if (pConfig->channelsIn != pConfig->channelsOut || !ma_channel_map_equal(pConfig->channelsIn, pConfig->channelMapIn, pConfig->channelMapOut)) {\n        pDSP->isChannelRoutingRequired = MA_TRUE;\n    }\n\n    /* If neither a sample rate conversion nor channel conversion is necessary we can skip the pre format conversion. */\n    if (!pDSP->isSRCRequired && !pDSP->isChannelRoutingRequired) {\n        /* We don't need a pre format conversion stage, but we may still need a post format conversion stage. */\n        if (pConfig->formatIn != pConfig->formatOut) {\n            pDSP->isPostFormatConversionRequired = MA_TRUE;\n        }\n    } else {\n        pDSP->isPreFormatConversionRequired  = MA_TRUE;\n        pDSP->isPostFormatConversionRequired = MA_TRUE;\n    }\n\n    /* Use a passthrough if none of the stages are being used. */\n    if (!pDSP->isPreFormatConversionRequired && !pDSP->isPostFormatConversionRequired && !pDSP->isChannelRoutingRequired && !pDSP->isSRCRequired) {\n        pDSP->isPassthrough = MA_TRUE;\n    }\n\n    /* Move the channel conversion stage to the start of the pipeline if we are reducing the channel count. */\n    if (pConfig->channelsOut < pConfig->channelsIn) {\n        pDSP->isChannelRoutingAtStart = MA_TRUE;\n    }\n\n\n    /*\n    We always initialize every stage of the pipeline regardless of whether or not the stage is used because it simplifies\n    a few things when it comes to dynamically changing properties post-initialization.\n    */\n    result = MA_SUCCESS;\n\n    /* Pre format conversion. */\n    {\n        ma_format_converter_config preFormatConverterConfig = ma_format_converter_config_init(\n            pConfig->formatIn,\n            ma_format_f32,\n            pConfig->channelsIn,\n            ma_pcm_converter__pre_format_converter_on_read,\n            pDSP\n        );\n        preFormatConverterConfig.ditherMode = pConfig->ditherMode;\n        preFormatConverterConfig.noSSE2     = pConfig->noSSE2;\n        preFormatConverterConfig.noAVX2     = pConfig->noAVX2;\n        preFormatConverterConfig.noAVX512   = pConfig->noAVX512;\n        preFormatConverterConfig.noNEON     = pConfig->noNEON;\n\n        result = ma_format_converter_init(&preFormatConverterConfig, &pDSP->formatConverterIn);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /*\n    Post format conversion. The exact configuration for this depends on whether or not we are reading data directly from the client\n    or from an earlier stage in the pipeline.\n    */\n    {\n        ma_format_converter_config postFormatConverterConfig = ma_format_converter_config_init_new();\n        postFormatConverterConfig.formatIn   = pConfig->formatIn;\n        postFormatConverterConfig.formatOut  = pConfig->formatOut;\n        postFormatConverterConfig.channels   = pConfig->channelsOut;\n        postFormatConverterConfig.ditherMode = pConfig->ditherMode;\n        postFormatConverterConfig.noSSE2     = pConfig->noSSE2;\n        postFormatConverterConfig.noAVX2     = pConfig->noAVX2;\n        postFormatConverterConfig.noAVX512   = pConfig->noAVX512;\n        postFormatConverterConfig.noNEON     = pConfig->noNEON;\n        if (pDSP->isPreFormatConversionRequired) {\n            postFormatConverterConfig.onReadDeinterleaved = ma_pcm_converter__post_format_converter_on_read_deinterleaved;\n            postFormatConverterConfig.formatIn = ma_format_f32;\n        } else {\n            postFormatConverterConfig.onRead = ma_pcm_converter__post_format_converter_on_read;\n        }\n\n        result = ma_format_converter_init(&postFormatConverterConfig, &pDSP->formatConverterOut);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /* SRC */\n    {\n        ma_src_config srcConfig = ma_src_config_init(\n            pConfig->sampleRateIn,\n            pConfig->sampleRateOut,\n            ((pConfig->channelsIn < pConfig->channelsOut) ? pConfig->channelsIn : pConfig->channelsOut),\n            ma_pcm_converter__src_on_read_deinterleaved,\n            pDSP\n        );\n        srcConfig.algorithm              = pConfig->srcAlgorithm;\n        srcConfig.neverConsumeEndOfInput = pConfig->neverConsumeEndOfInput;\n        srcConfig.noSSE2                 = pConfig->noSSE2;\n        srcConfig.noAVX2                 = pConfig->noAVX2;\n        srcConfig.noAVX512               = pConfig->noAVX512;\n        srcConfig.noNEON                 = pConfig->noNEON;\n        ma_copy_memory(&srcConfig.sinc, &pConfig->sinc, sizeof(pConfig->sinc));\n\n        result = ma_src_init(&srcConfig, &pDSP->src);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /* Channel conversion */\n    {\n        ma_channel_router_config routerConfig = ma_channel_router_config_init(\n            pConfig->channelsIn,\n            pConfig->channelMapIn,\n            pConfig->channelsOut,\n            pConfig->channelMapOut,\n            pConfig->channelMixMode,\n            ma_pcm_converter__channel_router_on_read_deinterleaved,\n            pDSP);\n        routerConfig.noSSE2   = pConfig->noSSE2;\n        routerConfig.noAVX2   = pConfig->noAVX2;\n        routerConfig.noAVX512 = pConfig->noAVX512;\n        routerConfig.noNEON   = pConfig->noNEON;\n\n        result = ma_channel_router_init(&routerConfig, &pDSP->channelRouter);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_pcm_converter_refresh_sample_rate(ma_pcm_converter* pDSP)\n{\n    /* The SRC stage will already have been initialized so we can just set it there. */\n    ma_src_set_sample_rate(&pDSP->src, pDSP->src.config.sampleRateIn, pDSP->src.config.sampleRateOut);\n    return MA_SUCCESS;\n}\n\nma_result ma_pcm_converter_set_input_sample_rate(ma_pcm_converter* pDSP, ma_uint32 sampleRateIn)\n{\n    if (pDSP == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have a sample rate of > 0. */\n    if (sampleRateIn == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have been initialized with allowDynamicSampleRate. */\n    if (!pDSP->isDynamicSampleRateAllowed) {\n        return MA_INVALID_OPERATION;\n    }\n\n    ma_atomic_exchange_32(&pDSP->src.config.sampleRateIn, sampleRateIn);\n    return ma_pcm_converter_refresh_sample_rate(pDSP);\n}\n\nma_result ma_pcm_converter_set_output_sample_rate(ma_pcm_converter* pDSP, ma_uint32 sampleRateOut)\n{\n    if (pDSP == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have a sample rate of > 0. */\n    if (sampleRateOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have been initialized with allowDynamicSampleRate. */\n    if (!pDSP->isDynamicSampleRateAllowed) {\n        return MA_INVALID_OPERATION;\n    }\n\n    ma_atomic_exchange_32(&pDSP->src.config.sampleRateOut, sampleRateOut);\n    return ma_pcm_converter_refresh_sample_rate(pDSP);\n}\n\nma_result ma_pcm_converter_set_sample_rate(ma_pcm_converter* pDSP, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    if (pDSP == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have a sample rate of > 0. */\n    if (sampleRateIn == 0 || sampleRateOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Must have been initialized with allowDynamicSampleRate. */\n    if (!pDSP->isDynamicSampleRateAllowed) {\n        return MA_INVALID_OPERATION;\n    }\n\n    ma_atomic_exchange_32(&pDSP->src.config.sampleRateIn, sampleRateIn);\n    ma_atomic_exchange_32(&pDSP->src.config.sampleRateOut, sampleRateOut);\n\n    return ma_pcm_converter_refresh_sample_rate(pDSP);\n}\n\nma_uint64 ma_pcm_converter_read(ma_pcm_converter* pDSP, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_pcm_converter_callback_data data;\n\n    if (pDSP == NULL || pFramesOut == NULL) {\n        return 0;\n    }\n\n    /* Fast path. */\n    if (pDSP->isPassthrough) {\n        if (frameCount <= 0xFFFFFFFF) {\n            return (ma_uint32)pDSP->onRead(pDSP, pFramesOut, (ma_uint32)frameCount, pDSP->pUserData);\n        } else {\n            ma_uint8* pNextFramesOut = (ma_uint8*)pFramesOut;\n\n            ma_uint64 totalFramesRead = 0;\n            while (totalFramesRead < frameCount) {\n                ma_uint32 framesRead;\n                ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                ma_uint64 framesToReadRightNow = framesRemaining;\n                if (framesToReadRightNow > 0xFFFFFFFF) {\n                    framesToReadRightNow = 0xFFFFFFFF;\n                }\n\n                framesRead = pDSP->onRead(pDSP, pNextFramesOut, (ma_uint32)framesToReadRightNow, pDSP->pUserData);\n                if (framesRead == 0) {\n                    break;\n                }\n\n                pNextFramesOut  += framesRead * pDSP->channelRouter.config.channelsOut * ma_get_bytes_per_sample(pDSP->formatConverterOut.config.formatOut);\n                totalFramesRead += framesRead;\n            }\n\n            return totalFramesRead;\n        }\n    }\n\n    /* Slower path. The real work is done here. To do this all we need to do is read from the last stage in the pipeline. */\n    ma_assert(pDSP->isPostFormatConversionRequired == MA_TRUE);\n\n    data.pDSP = pDSP;\n    data.pUserDataForClient = pDSP->pUserData;\n    return ma_format_converter_read(&pDSP->formatConverterOut, frameCount, pFramesOut, &data);\n}\n\n\ntypedef struct\n{\n    const void* pDataIn;\n    ma_format formatIn;\n    ma_uint32 channelsIn;\n    ma_uint64 totalFrameCount;\n    ma_uint64 iNextFrame;\n    ma_bool32 isFeedingZeros;  /* When set to true, feeds the DSP zero samples. */\n} ma_convert_frames__data;\n\nma_uint32 ma_convert_frames__on_read(ma_pcm_converter* pDSP, void* pFramesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_convert_frames__data* pData;\n    ma_uint32 framesToRead;\n    ma_uint64 framesRemaining;\n    ma_uint32 frameSizeInBytes;\n\n    (void)pDSP;\n\n    pData = (ma_convert_frames__data*)pUserData;\n    ma_assert(pData != NULL);\n    ma_assert(pData->totalFrameCount >= pData->iNextFrame);\n\n    framesToRead = frameCount;\n    framesRemaining = (pData->totalFrameCount - pData->iNextFrame);\n    if (framesToRead > framesRemaining) {\n        framesToRead = (ma_uint32)framesRemaining;\n    }\n\n    frameSizeInBytes = ma_get_bytes_per_frame(pData->formatIn, pData->channelsIn);\n\n    if (!pData->isFeedingZeros) {\n        ma_copy_memory(pFramesOut, (const ma_uint8*)pData->pDataIn + (frameSizeInBytes * pData->iNextFrame), frameSizeInBytes * framesToRead);\n    } else {\n        ma_zero_memory(pFramesOut, frameSizeInBytes * framesToRead);\n    }\n\n    pData->iNextFrame += framesToRead;\n    return framesToRead;\n}\n\nma_pcm_converter_config ma_pcm_converter_config_init_new()\n{\n    ma_pcm_converter_config config;\n    ma_zero_object(&config);\n\n    return config;\n}\n\nma_pcm_converter_config ma_pcm_converter_config_init(ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, ma_pcm_converter_read_proc onRead, void* pUserData)\n{\n    return ma_pcm_converter_config_init_ex(formatIn, channelsIn, sampleRateIn, NULL, formatOut, channelsOut, sampleRateOut, NULL, onRead, pUserData);\n}\n\nma_pcm_converter_config ma_pcm_converter_config_init_ex(ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_channel channelMapIn[MA_MAX_CHANNELS], ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut,  ma_channel channelMapOut[MA_MAX_CHANNELS], ma_pcm_converter_read_proc onRead, void* pUserData)\n{\n    ma_pcm_converter_config config;\n    ma_zero_object(&config);\n    config.formatIn = formatIn;\n    config.channelsIn = channelsIn;\n    config.sampleRateIn = sampleRateIn;\n    config.formatOut = formatOut;\n    config.channelsOut = channelsOut;\n    config.sampleRateOut = sampleRateOut;\n    if (channelMapIn != NULL) {\n        ma_copy_memory(config.channelMapIn, channelMapIn, sizeof(config.channelMapIn));\n    }\n    if (channelMapOut != NULL) {\n        ma_copy_memory(config.channelMapOut, channelMapOut, sizeof(config.channelMapOut));\n    }\n    config.onRead = onRead;\n    config.pUserData = pUserData;\n\n    return config;\n}\n\n\n\nma_uint64 ma_convert_frames(void* pOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, const void* pIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_uint64 frameCount)\n{\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n\n    ma_get_standard_channel_map(ma_standard_channel_map_default, channelsOut, channelMapOut);\n    ma_get_standard_channel_map(ma_standard_channel_map_default, channelsIn, channelMapIn);\n\n    return ma_convert_frames_ex(pOut, formatOut, channelsOut, sampleRateOut, channelMapOut, pIn, formatIn, channelsIn, sampleRateIn, channelMapIn, frameCount);\n}\n\nma_uint64 ma_convert_frames_ex(void* pOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, ma_channel channelMapOut[MA_MAX_CHANNELS], const void* pIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn, ma_channel channelMapIn[MA_MAX_CHANNELS], ma_uint64 frameCount)\n{\n    ma_uint64 frameCountOut;\n    ma_convert_frames__data data;\n    ma_pcm_converter_config converterConfig;\n    ma_pcm_converter converter;\n    ma_uint64 totalFramesRead;\n\n    if (frameCount == 0) {\n        return 0;\n    }\n\n    frameCountOut = ma_calculate_frame_count_after_src(sampleRateOut, sampleRateIn, frameCount);\n    if (pOut == NULL) {\n        return frameCountOut;\n    }\n\n    data.pDataIn = pIn;\n    data.formatIn = formatIn;\n    data.channelsIn = channelsIn;\n    data.totalFrameCount = frameCount;\n    data.iNextFrame = 0;\n    data.isFeedingZeros = MA_FALSE;\n\n    ma_zero_object(&converterConfig);\n\n    converterConfig.formatIn = formatIn;\n    converterConfig.channelsIn = channelsIn;\n    converterConfig.sampleRateIn = sampleRateIn;\n    if (channelMapIn != NULL) {\n        ma_channel_map_copy(converterConfig.channelMapIn, channelMapIn, channelsIn);\n    } else {\n        ma_get_standard_channel_map(ma_standard_channel_map_default, converterConfig.channelsIn, converterConfig.channelMapIn);\n    }\n    \n    converterConfig.formatOut = formatOut;\n    converterConfig.channelsOut = channelsOut;\n    converterConfig.sampleRateOut = sampleRateOut;\n    if (channelMapOut != NULL) {\n        ma_channel_map_copy(converterConfig.channelMapOut, channelMapOut, channelsOut);\n    } else {\n        ma_get_standard_channel_map(ma_standard_channel_map_default, converterConfig.channelsOut, converterConfig.channelMapOut);\n    }\n\n    converterConfig.onRead = ma_convert_frames__on_read;\n    converterConfig.pUserData = &data;\n\n    if (ma_pcm_converter_init(&converterConfig, &converter) != MA_SUCCESS) {\n        return 0;\n    }\n\n    /*\n    Always output our computed frame count. There is a chance the sample rate conversion routine may not output the last sample\n    due to precision issues with 32-bit floats, in which case we should feed the DSP zero samples so it can generate that last\n    frame.\n    */\n    totalFramesRead = ma_pcm_converter_read(&converter, pOut, frameCountOut);\n    if (totalFramesRead < frameCountOut) {\n        ma_uint32 bpf = ma_get_bytes_per_frame(formatIn, channelsIn);\n\n        data.isFeedingZeros = MA_TRUE;\n        data.totalFrameCount = ((ma_uint64)0xFFFFFFFF << 32) | 0xFFFFFFFF; /* C89 does not support 64-bit constants so need to instead construct it like this. Annoying... */ /*data.totalFrameCount = 0xFFFFFFFFFFFFFFFF;*/\n        data.pDataIn = NULL;\n\n        while (totalFramesRead < frameCountOut) {\n            ma_uint64 framesToRead;\n            ma_uint64 framesJustRead;\n\n            framesToRead = (frameCountOut - totalFramesRead);\n            ma_assert(framesToRead > 0);\n\n            framesJustRead = ma_pcm_converter_read(&converter, ma_offset_ptr(pOut, totalFramesRead * bpf), framesToRead);\n            totalFramesRead += framesJustRead;\n\n            if (framesJustRead < framesToRead) {\n                break;\n            }\n        }\n\n        /* At this point we should have output every sample, but just to be super duper sure, just fill the rest with zeros. */\n        if (totalFramesRead < frameCountOut) {\n            ma_zero_memory_64(ma_offset_ptr(pOut, totalFramesRead * bpf), ((frameCountOut - totalFramesRead) * bpf));\n            totalFramesRead = frameCountOut;\n        }\n    }\n\n    ma_assert(totalFramesRead == frameCountOut);\n    return totalFramesRead;\n}\n\n\n/**************************************************************************************************************************************************************\n\nRing Buffer\n\n**************************************************************************************************************************************************************/\nMA_INLINE ma_uint32 ma_rb__extract_offset_in_bytes(ma_uint32 encodedOffset)\n{\n    return encodedOffset & 0x7FFFFFFF;\n}\n\nMA_INLINE ma_uint32 ma_rb__extract_offset_loop_flag(ma_uint32 encodedOffset)\n{\n    return encodedOffset & 0x80000000;\n}\n\nMA_INLINE void* ma_rb__get_read_ptr(ma_rb* pRB)\n{\n    ma_assert(pRB != NULL);\n    return ma_offset_ptr(pRB->pBuffer, ma_rb__extract_offset_in_bytes(pRB->encodedReadOffset));\n}\n\nMA_INLINE void* ma_rb__get_write_ptr(ma_rb* pRB)\n{\n    ma_assert(pRB != NULL);\n    return ma_offset_ptr(pRB->pBuffer, ma_rb__extract_offset_in_bytes(pRB->encodedWriteOffset));\n}\n\nMA_INLINE ma_uint32 ma_rb__construct_offset(ma_uint32 offsetInBytes, ma_uint32 offsetLoopFlag)\n{\n    return offsetLoopFlag | offsetInBytes;\n}\n\nMA_INLINE void ma_rb__deconstruct_offset(ma_uint32 encodedOffset, ma_uint32* pOffsetInBytes, ma_uint32* pOffsetLoopFlag)\n{\n    ma_assert(pOffsetInBytes != NULL);\n    ma_assert(pOffsetLoopFlag != NULL);\n\n    *pOffsetInBytes  = ma_rb__extract_offset_in_bytes(encodedOffset);\n    *pOffsetLoopFlag = ma_rb__extract_offset_loop_flag(encodedOffset);\n}\n\n\nma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, ma_rb* pRB)\n{\n    const ma_uint32 maxSubBufferSize = 0x7FFFFFFF - (MA_SIMD_ALIGNMENT-1);\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (subbufferSizeInBytes == 0 || subbufferCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (subbufferSizeInBytes > maxSubBufferSize) {\n        return MA_INVALID_ARGS;    /* Maximum buffer size is ~2GB. The most significant bit is a flag for use internally. */\n    }\n\n\n    ma_zero_object(pRB);\n    pRB->subbufferSizeInBytes = (ma_uint32)subbufferSizeInBytes;\n    pRB->subbufferCount = (ma_uint32)subbufferCount;\n\n    if (pOptionalPreallocatedBuffer != NULL) {\n        pRB->subbufferStrideInBytes = (ma_uint32)subbufferStrideInBytes;\n        pRB->pBuffer = pOptionalPreallocatedBuffer;\n    } else {\n        size_t bufferSizeInBytes;\n\n        /*\n        Here is where we allocate our own buffer. We always want to align this to MA_SIMD_ALIGNMENT for future SIMD optimization opportunity. To do this\n        we need to make sure the stride is a multiple of MA_SIMD_ALIGNMENT.\n        */\n        pRB->subbufferStrideInBytes = (pRB->subbufferSizeInBytes + (MA_SIMD_ALIGNMENT-1)) & ~MA_SIMD_ALIGNMENT;\n\n        bufferSizeInBytes = (size_t)pRB->subbufferCount*pRB->subbufferStrideInBytes;\n        pRB->pBuffer = ma_aligned_malloc(bufferSizeInBytes, MA_SIMD_ALIGNMENT);\n        if (pRB->pBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        ma_zero_memory(pRB->pBuffer, bufferSizeInBytes);\n        pRB->ownsBuffer = MA_TRUE;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_rb_init(size_t bufferSizeInBytes, void* pOptionalPreallocatedBuffer, ma_rb* pRB)\n{\n    return ma_rb_init_ex(bufferSizeInBytes, 1, 0, pOptionalPreallocatedBuffer, pRB);\n}\n\nvoid ma_rb_uninit(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    if (pRB->ownsBuffer) {\n        ma_aligned_free(pRB->pBuffer);\n    }\n}\n\nma_result ma_rb_acquire_read(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut)\n{\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    size_t bytesAvailable;\n    size_t bytesRequested;\n\n    if (pRB == NULL || pSizeInBytes == NULL || ppBufferOut == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The returned buffer should never move ahead of the write pointer. */\n    writeOffset = pRB->encodedWriteOffset;\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    readOffset = pRB->encodedReadOffset;\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    /*\n    The number of bytes available depends on whether or not the read and write pointers are on the same loop iteration. If so, we\n    can only read up to the write pointer. If not, we can only read up to the end of the buffer.\n    */\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        bytesAvailable = writeOffsetInBytes - readOffsetInBytes;\n    } else {\n        bytesAvailable = pRB->subbufferSizeInBytes - readOffsetInBytes;\n    }\n\n    bytesRequested = *pSizeInBytes;\n    if (bytesRequested > bytesAvailable) {\n        bytesRequested = bytesAvailable;\n    }\n\n    *pSizeInBytes = bytesRequested;\n    (*ppBufferOut) = ma_rb__get_read_ptr(pRB);\n\n    return MA_SUCCESS;\n}\n\nma_result ma_rb_commit_read(ma_rb* pRB, size_t sizeInBytes, void* pBufferOut)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 newReadOffsetInBytes;\n    ma_uint32 newReadOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Validate the buffer. */\n    if (pBufferOut != ma_rb__get_read_ptr(pRB)) {\n        return MA_INVALID_ARGS;\n    }\n\n    readOffset = pRB->encodedReadOffset;\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    /* Check that sizeInBytes is correct. It should never go beyond the end of the buffer. */\n    newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + sizeInBytes);\n    if (newReadOffsetInBytes > pRB->subbufferSizeInBytes) {\n        return MA_INVALID_ARGS;    /* <-- sizeInBytes will cause the read offset to overflow. */\n    }\n\n    /* Move the read pointer back to the start if necessary. */\n    newReadOffsetLoopFlag = readOffsetLoopFlag;\n    if (newReadOffsetInBytes == pRB->subbufferSizeInBytes) {\n        newReadOffsetInBytes = 0;\n        newReadOffsetLoopFlag ^= 0x80000000;\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedReadOffset, ma_rb__construct_offset(newReadOffsetLoopFlag, newReadOffsetInBytes));\n    return MA_SUCCESS;\n}\n\nma_result ma_rb_acquire_write(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    size_t bytesAvailable;\n    size_t bytesRequested;\n\n    if (pRB == NULL || pSizeInBytes == NULL || ppBufferOut == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The returned buffer should never overtake the read buffer. */\n    readOffset = pRB->encodedReadOffset;\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = pRB->encodedWriteOffset;\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    /*\n    In the case of writing, if the write pointer and the read pointer are on the same loop iteration we can only\n    write up to the end of the buffer. Otherwise we can only write up to the read pointer. The write pointer should\n    never overtake the read pointer.\n    */\n    if (writeOffsetLoopFlag == readOffsetLoopFlag) {\n        bytesAvailable = pRB->subbufferSizeInBytes - writeOffsetInBytes;\n    } else {\n        bytesAvailable = readOffsetInBytes - writeOffsetInBytes;\n    }\n\n    bytesRequested = *pSizeInBytes;\n    if (bytesRequested > bytesAvailable) {\n        bytesRequested = bytesAvailable;\n    }\n\n    *pSizeInBytes = bytesRequested;\n    *ppBufferOut  = ma_rb__get_write_ptr(pRB);\n\n    /* Clear the buffer if desired. */\n    if (pRB->clearOnWriteAcquire) {\n        ma_zero_memory(*ppBufferOut, *pSizeInBytes);\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_rb_commit_write(ma_rb* pRB, size_t sizeInBytes, void* pBufferOut)\n{\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 newWriteOffsetInBytes;\n    ma_uint32 newWriteOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Validate the buffer. */\n    if (pBufferOut != ma_rb__get_write_ptr(pRB)) {\n        return MA_INVALID_ARGS;\n    }\n\n    writeOffset = pRB->encodedWriteOffset;\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    /* Check that sizeInBytes is correct. It should never go beyond the end of the buffer. */\n    newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + sizeInBytes);\n    if (newWriteOffsetInBytes > pRB->subbufferSizeInBytes) {\n        return MA_INVALID_ARGS;    /* <-- sizeInBytes will cause the read offset to overflow. */\n    }\n\n    /* Move the read pointer back to the start if necessary. */\n    newWriteOffsetLoopFlag = writeOffsetLoopFlag;\n    if (newWriteOffsetInBytes == pRB->subbufferSizeInBytes) {\n        newWriteOffsetInBytes = 0;\n        newWriteOffsetLoopFlag ^= 0x80000000;\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedWriteOffset, ma_rb__construct_offset(newWriteOffsetLoopFlag, newWriteOffsetInBytes));\n    return MA_SUCCESS;\n}\n\nma_result ma_rb_seek_read(ma_rb* pRB, size_t offsetInBytes)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 newReadOffsetInBytes;\n    ma_uint32 newReadOffsetLoopFlag;\n\n    if (pRB == NULL || offsetInBytes > pRB->subbufferSizeInBytes) {\n        return MA_INVALID_ARGS;\n    }\n\n    readOffset = pRB->encodedReadOffset;\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = pRB->encodedWriteOffset;\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    newReadOffsetInBytes = readOffsetInBytes;\n    newReadOffsetLoopFlag = readOffsetLoopFlag;\n\n    /* We cannot go past the write buffer. */\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        if ((readOffsetInBytes + offsetInBytes) > writeOffsetInBytes) {\n            newReadOffsetInBytes = writeOffsetInBytes;\n        } else {\n            newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes);\n        }\n    } else {\n        /* May end up looping. */\n        if ((readOffsetInBytes + offsetInBytes) >= pRB->subbufferSizeInBytes) {\n            newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes) - pRB->subbufferSizeInBytes;\n            newReadOffsetLoopFlag ^= 0x80000000;    /* <-- Looped. */\n        } else {\n            newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes);\n        }\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedReadOffset, ma_rb__construct_offset(newReadOffsetInBytes, newReadOffsetLoopFlag));\n    return MA_SUCCESS;\n}\n\nma_result ma_rb_seek_write(ma_rb* pRB, size_t offsetInBytes)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 newWriteOffsetInBytes;\n    ma_uint32 newWriteOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    readOffset = pRB->encodedReadOffset;\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = pRB->encodedWriteOffset;\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    newWriteOffsetInBytes = writeOffsetInBytes;\n    newWriteOffsetLoopFlag = writeOffsetLoopFlag;\n\n    /* We cannot go past the write buffer. */\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        /* May end up looping. */\n        if ((writeOffsetInBytes + offsetInBytes) >= pRB->subbufferSizeInBytes) {\n            newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes) - pRB->subbufferSizeInBytes;\n            newWriteOffsetLoopFlag ^= 0x80000000;    /* <-- Looped. */\n        } else {\n            newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes);\n        }\n    } else {\n        if ((writeOffsetInBytes + offsetInBytes) > readOffsetInBytes) {\n            newWriteOffsetInBytes = readOffsetInBytes;\n        } else {\n            newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes);\n        }\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedWriteOffset, ma_rb__construct_offset(newWriteOffsetInBytes, newWriteOffsetLoopFlag));\n    return MA_SUCCESS;\n}\n\nma_int32 ma_rb_pointer_distance(ma_rb* pRB)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    readOffset = pRB->encodedReadOffset;\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = pRB->encodedWriteOffset;\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        return writeOffsetInBytes - readOffsetInBytes;\n    } else {\n        return writeOffsetInBytes + (pRB->subbufferSizeInBytes - readOffsetInBytes);\n    }\n}\n\nsize_t ma_rb_get_subbuffer_size(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return pRB->subbufferSizeInBytes;\n}\n\nsize_t ma_rb_get_subbuffer_stride(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    if (pRB->subbufferStrideInBytes == 0) {\n        return (size_t)pRB->subbufferSizeInBytes;\n    }\n\n    return (size_t)pRB->subbufferStrideInBytes;\n}\n\nsize_t ma_rb_get_subbuffer_offset(ma_rb* pRB, size_t subbufferIndex)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return subbufferIndex * ma_rb_get_subbuffer_stride(pRB);\n}\n\nvoid* ma_rb_get_subbuffer_ptr(ma_rb* pRB, size_t subbufferIndex, void* pBuffer)\n{\n    if (pRB == NULL) {\n        return NULL;\n    }\n\n    return ma_offset_ptr(pBuffer, ma_rb_get_subbuffer_offset(pRB, subbufferIndex));\n}\n\n\nstatic MA_INLINE ma_uint32 ma_pcm_rb_get_bpf(ma_pcm_rb* pRB)\n{\n    ma_assert(pRB != NULL);\n\n    return ma_get_bytes_per_frame(pRB->format, pRB->channels);\n}\n\nma_result ma_pcm_rb_init_ex(ma_format format, ma_uint32 channels, ma_uint32 subbufferSizeInFrames, ma_uint32 subbufferCount, ma_uint32 subbufferStrideInFrames, void* pOptionalPreallocatedBuffer, ma_pcm_rb* pRB)\n{\n    ma_uint32 bpf;\n    ma_result result;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pRB);\n\n    bpf = ma_get_bytes_per_frame(format, channels);\n    if (bpf == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_rb_init_ex(subbufferSizeInFrames*bpf, subbufferCount, subbufferStrideInFrames*bpf, pOptionalPreallocatedBuffer, &pRB->rb);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pRB->format   = format;\n    pRB->channels = channels;\n\n    return MA_SUCCESS;\n}\n\nma_result ma_pcm_rb_init(ma_format format, ma_uint32 channels, ma_uint32 bufferSizeInFrames, void* pOptionalPreallocatedBuffer, ma_pcm_rb* pRB)\n{\n    return ma_pcm_rb_init_ex(format, channels, bufferSizeInFrames, 1, 0, pOptionalPreallocatedBuffer, pRB);\n}\n\nvoid ma_pcm_rb_uninit(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    ma_rb_uninit(&pRB->rb);\n}\n\nma_result ma_pcm_rb_acquire_read(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut)\n{\n    size_t sizeInBytes;\n    ma_result result;\n\n    if (pRB == NULL || pSizeInFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    sizeInBytes = *pSizeInFrames * ma_pcm_rb_get_bpf(pRB);\n\n    result = ma_rb_acquire_read(&pRB->rb, &sizeInBytes, ppBufferOut);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pSizeInFrames = (ma_uint32)(sizeInBytes / (size_t)ma_pcm_rb_get_bpf(pRB));\n    return MA_SUCCESS;\n}\n\nma_result ma_pcm_rb_commit_read(ma_pcm_rb* pRB, ma_uint32 sizeInFrames, void* pBufferOut)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_commit_read(&pRB->rb, sizeInFrames * ma_pcm_rb_get_bpf(pRB), pBufferOut);\n}\n\nma_result ma_pcm_rb_acquire_write(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut)\n{\n    size_t sizeInBytes;\n    ma_result result;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    sizeInBytes = *pSizeInFrames * ma_pcm_rb_get_bpf(pRB);\n\n    result = ma_rb_acquire_write(&pRB->rb, &sizeInBytes, ppBufferOut);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pSizeInFrames = (ma_uint32)(sizeInBytes / ma_pcm_rb_get_bpf(pRB));\n    return MA_SUCCESS;\n}\n\nma_result ma_pcm_rb_commit_write(ma_pcm_rb* pRB, ma_uint32 sizeInFrames, void* pBufferOut)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_commit_write(&pRB->rb, sizeInFrames * ma_pcm_rb_get_bpf(pRB), pBufferOut);\n}\n\nma_result ma_pcm_rb_seek_read(ma_pcm_rb* pRB, ma_uint32 offsetInFrames)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_seek_read(&pRB->rb, offsetInFrames * ma_pcm_rb_get_bpf(pRB));\n}\n\nma_result ma_pcm_rb_seek_write(ma_pcm_rb* pRB, ma_uint32 offsetInFrames)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_seek_write(&pRB->rb, offsetInFrames * ma_pcm_rb_get_bpf(pRB));\n}\n\nma_int32 ma_pcm_rb_pointer_disance(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_pointer_distance(&pRB->rb) / ma_pcm_rb_get_bpf(pRB);\n}\n\nma_uint32 ma_pcm_rb_get_subbuffer_size(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_size(&pRB->rb) / ma_pcm_rb_get_bpf(pRB));\n}\n\nma_uint32 ma_pcm_rb_get_subbuffer_stride(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_stride(&pRB->rb) / ma_pcm_rb_get_bpf(pRB));\n}\n\nma_uint32 ma_pcm_rb_get_subbuffer_offset(ma_pcm_rb* pRB, ma_uint32 subbufferIndex)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_offset(&pRB->rb, subbufferIndex) / ma_pcm_rb_get_bpf(pRB));\n}\n\nvoid* ma_pcm_rb_get_subbuffer_ptr(ma_pcm_rb* pRB, ma_uint32 subbufferIndex, void* pBuffer)\n{\n    if (pRB == NULL) {\n        return NULL;\n    }\n\n    return ma_rb_get_subbuffer_ptr(&pRB->rb, subbufferIndex, pBuffer);\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nMiscellaneous Helpers\n\n**************************************************************************************************************************************************************/\nvoid* ma_malloc(size_t sz)\n{\n    return MA_MALLOC(sz);\n}\n\nvoid* ma_realloc(void* p, size_t sz)\n{\n    return MA_REALLOC(p, sz);\n}\n\nvoid ma_free(void* p)\n{\n    MA_FREE(p);\n}\n\nvoid* ma_aligned_malloc(size_t sz, size_t alignment)\n{\n    size_t extraBytes;\n    void* pUnaligned;\n    void* pAligned;\n\n    if (alignment == 0) {\n        return 0;\n    }\n\n    extraBytes = alignment-1 + sizeof(void*);\n\n    pUnaligned = ma_malloc(sz + extraBytes);\n    if (pUnaligned == NULL) {\n        return NULL;\n    }\n\n    pAligned = (void*)(((ma_uintptr)pUnaligned + extraBytes) & ~((ma_uintptr)(alignment-1)));\n    ((void**)pAligned)[-1] = pUnaligned;\n\n    return pAligned;\n}\n\nvoid ma_aligned_free(void* p)\n{\n    ma_free(((void**)p)[-1]);\n}\n\nconst char* ma_get_format_name(ma_format format)\n{\n    switch (format)\n    {\n        case ma_format_unknown: return \"Unknown\";\n        case ma_format_u8:      return \"8-bit Unsigned Integer\";\n        case ma_format_s16:     return \"16-bit Signed Integer\";\n        case ma_format_s24:     return \"24-bit Signed Integer (Tightly Packed)\";\n        case ma_format_s32:     return \"32-bit Signed Integer\";\n        case ma_format_f32:     return \"32-bit IEEE Floating Point\";\n        default:                return \"Invalid\";\n    }\n}\n\nvoid ma_blend_f32(float* pOut, float* pInA, float* pInB, float factor, ma_uint32 channels)\n{\n    ma_uint32 i;\n    for (i = 0; i < channels; ++i) {\n        pOut[i] = ma_mix_f32(pInA[i], pInB[i], factor);\n    }\n}\n\n\nma_uint32 ma_get_bytes_per_sample(ma_format format)\n{\n    ma_uint32 sizes[] = {\n        0,  /* unknown */\n        1,  /* u8 */\n        2,  /* s16 */\n        3,  /* s24 */\n        4,  /* s32 */\n        4,  /* f32 */\n    };\n    return sizes[format];\n}\n\n\n/**************************************************************************************************************************************************************\n\nDecoding\n\n**************************************************************************************************************************************************************/\n#ifndef MA_NO_DECODING\n\nsize_t ma_decoder_read_bytes(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead)\n{\n    size_t bytesRead;\n\n    ma_assert(pDecoder != NULL);\n    ma_assert(pBufferOut != NULL);\n\n    bytesRead = pDecoder->onRead(pDecoder, pBufferOut, bytesToRead);\n    pDecoder->readPointer += bytesRead;\n\n    return bytesRead;\n}\n\nma_bool32 ma_decoder_seek_bytes(ma_decoder* pDecoder, int byteOffset, ma_seek_origin origin)\n{\n    ma_bool32 wasSuccessful;\n\n    ma_assert(pDecoder != NULL);\n\n    wasSuccessful = pDecoder->onSeek(pDecoder, byteOffset, origin);\n    if (wasSuccessful) {\n        if (origin == ma_seek_origin_start) {\n            pDecoder->readPointer = (ma_uint64)byteOffset;\n        } else {\n            pDecoder->readPointer += byteOffset;\n        }\n    }\n\n    return wasSuccessful;\n}\n\nma_bool32 ma_decoder_seek_bytes_64(ma_decoder* pDecoder, ma_uint64 byteOffset, ma_seek_origin origin)\n{\n    ma_assert(pDecoder != NULL);\n\n    if (origin == ma_seek_origin_start) {\n        ma_uint64 bytesToSeekThisIteration = 0x7FFFFFFF;\n        if (bytesToSeekThisIteration > byteOffset) {\n            bytesToSeekThisIteration = byteOffset;\n        }\n\n        if (!ma_decoder_seek_bytes(pDecoder, (int)bytesToSeekThisIteration, ma_seek_origin_start)) {\n            return MA_FALSE;\n        }\n\n        byteOffset -= bytesToSeekThisIteration;\n    }\n\n    /* Getting here means we need to seek relative to the current position. */\n    while (byteOffset > 0) {\n        ma_uint64 bytesToSeekThisIteration = 0x7FFFFFFF;\n        if (bytesToSeekThisIteration > byteOffset) {\n            bytesToSeekThisIteration = byteOffset;\n        }\n\n        if (!ma_decoder_seek_bytes(pDecoder, (int)bytesToSeekThisIteration, ma_seek_origin_current)) {\n            return MA_FALSE;\n        }\n\n        byteOffset -= bytesToSeekThisIteration;\n    }\n\n    return MA_TRUE;\n}\n\n\nma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate)\n{\n    ma_decoder_config config;\n    ma_zero_object(&config);\n    config.format = outputFormat;\n    config.channels = outputChannels;\n    config.sampleRate = outputSampleRate;\n    ma_get_standard_channel_map(ma_standard_channel_map_default, config.channels, config.channelMap);\n\n    return config;\n}\n\nma_decoder_config ma_decoder_config_init_copy(const ma_decoder_config* pConfig)\n{\n    ma_decoder_config config;\n    if (pConfig != NULL) {\n        config = *pConfig;\n    } else {\n        ma_zero_object(&config);\n    }\n\n    return config;\n}\n\nma_result ma_decoder__init_dsp(ma_decoder* pDecoder, const ma_decoder_config* pConfig, ma_pcm_converter_read_proc onRead)\n{\n    ma_pcm_converter_config dspConfig;\n\n    ma_assert(pDecoder != NULL);\n\n    /* Output format. */\n    if (pConfig->format == ma_format_unknown) {\n        pDecoder->outputFormat = pDecoder->internalFormat;\n    } else {\n        pDecoder->outputFormat = pConfig->format;\n    }\n\n    if (pConfig->channels == 0) {\n        pDecoder->outputChannels = pDecoder->internalChannels;\n    } else {\n        pDecoder->outputChannels = pConfig->channels;\n    }\n\n    if (pConfig->sampleRate == 0) {\n        pDecoder->outputSampleRate = pDecoder->internalSampleRate;\n    } else {\n        pDecoder->outputSampleRate = pConfig->sampleRate;\n    }\n\n    if (ma_channel_map_blank(pDecoder->outputChannels, pConfig->channelMap)) {\n        ma_get_standard_channel_map(ma_standard_channel_map_default, pDecoder->outputChannels, pDecoder->outputChannelMap);\n    } else {\n        ma_copy_memory(pDecoder->outputChannelMap, pConfig->channelMap, sizeof(pConfig->channelMap));\n    }\n\n\n    /* DSP. */\n    dspConfig = ma_pcm_converter_config_init_ex(\n        pDecoder->internalFormat, pDecoder->internalChannels, pDecoder->internalSampleRate, pDecoder->internalChannelMap,\n        pDecoder->outputFormat,   pDecoder->outputChannels,   pDecoder->outputSampleRate,   pDecoder->outputChannelMap,\n        onRead, pDecoder);\n    dspConfig.channelMixMode = pConfig->channelMixMode;\n    dspConfig.ditherMode = pConfig->ditherMode;\n    dspConfig.srcAlgorithm = pConfig->srcAlgorithm;\n    dspConfig.sinc = pConfig->src.sinc;\n\n    return ma_pcm_converter_init(&dspConfig, &pDecoder->dsp);\n}\n\n/* WAV */\n#ifdef dr_wav_h\n#define MA_HAS_WAV\n\nsize_t ma_decoder_internal_on_read__wav(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    return ma_decoder_read_bytes(pDecoder, pBufferOut, bytesToRead);\n}\n\ndrwav_bool32 ma_decoder_internal_on_seek__wav(void* pUserData, int offset, drwav_seek_origin origin)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    return ma_decoder_seek_bytes(pDecoder, offset, (origin == drwav_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current);\n}\n\nma_uint32 ma_decoder_internal_on_read_pcm_frames__wav(ma_pcm_converter* pDSP, void* pSamplesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_decoder* pDecoder;\n    drwav* pWav;\n\n    (void)pDSP;\n\n    pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    pWav = (drwav*)pDecoder->pInternalDecoder;\n    ma_assert(pWav != NULL);\n\n    switch (pDecoder->internalFormat) {\n        case ma_format_s16: return (ma_uint32)drwav_read_pcm_frames_s16(pWav, frameCount, (drwav_int16*)pSamplesOut);\n        case ma_format_s32: return (ma_uint32)drwav_read_pcm_frames_s32(pWav, frameCount, (drwav_int32*)pSamplesOut);\n        case ma_format_f32: return (ma_uint32)drwav_read_pcm_frames_f32(pWav, frameCount,       (float*)pSamplesOut);\n        default: break;\n    }\n\n    /* Should never get here. If we do, it means the internal format was not set correctly at initialization time. */\n    ma_assert(MA_FALSE);\n    return 0;\n}\n\nma_result ma_decoder_internal_on_seek_to_pcm_frame__wav(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    drwav* pWav;\n    drwav_bool32 result;\n\n    pWav = (drwav*)pDecoder->pInternalDecoder;\n    ma_assert(pWav != NULL);\n\n    result = drwav_seek_to_pcm_frame(pWav, frameIndex);\n    if (result) {\n        return MA_SUCCESS;\n    } else {\n        return MA_ERROR;\n    }\n}\n\nma_result ma_decoder_internal_on_uninit__wav(ma_decoder* pDecoder)\n{\n    drwav_close((drwav*)pDecoder->pInternalDecoder);\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_decoder_internal_on_get_length_in_pcm_frames__wav(ma_decoder* pDecoder)\n{\n    return ((drwav*)pDecoder->pInternalDecoder)->totalPCMFrameCount;\n}\n\nma_result ma_decoder_init_wav__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    drwav* pWav;\n    ma_result result;\n\n    ma_assert(pConfig != NULL);\n    ma_assert(pDecoder != NULL);\n\n    /* Try opening the decoder first. */\n    pWav = drwav_open(ma_decoder_internal_on_read__wav, ma_decoder_internal_on_seek__wav, pDecoder);\n    if (pWav == NULL) {\n        return MA_ERROR;\n    }\n\n    /* If we get here it means we successfully initialized the WAV decoder. We can now initialize the rest of the ma_decoder. */\n    pDecoder->onSeekToPCMFrame = ma_decoder_internal_on_seek_to_pcm_frame__wav;\n    pDecoder->onUninit = ma_decoder_internal_on_uninit__wav;\n    pDecoder->onGetLengthInPCMFrames = ma_decoder_internal_on_get_length_in_pcm_frames__wav;\n    pDecoder->pInternalDecoder = pWav;\n\n    /* Try to be as optimal as possible for the internal format. If miniaudio does not support a format we will fall back to f32. */\n    pDecoder->internalFormat = ma_format_unknown;\n    switch (pWav->translatedFormatTag) {\n        case DR_WAVE_FORMAT_PCM:\n        {\n            if (pWav->bitsPerSample == 8) {\n                pDecoder->internalFormat = ma_format_s16;\n            } else if (pWav->bitsPerSample == 16) {\n                pDecoder->internalFormat = ma_format_s16;\n            } else if (pWav->bitsPerSample == 32) {\n                pDecoder->internalFormat = ma_format_s32;\n            }\n        } break;\n\n        case DR_WAVE_FORMAT_IEEE_FLOAT:\n        {\n            if (pWav->bitsPerSample == 32) {\n                pDecoder->internalFormat = ma_format_f32;\n            }\n        } break;\n\n        case DR_WAVE_FORMAT_ALAW:\n        case DR_WAVE_FORMAT_MULAW:\n        case DR_WAVE_FORMAT_ADPCM:\n        case DR_WAVE_FORMAT_DVI_ADPCM:\n        {\n            pDecoder->internalFormat = ma_format_s16;\n        } break;\n    }\n\n    if (pDecoder->internalFormat == ma_format_unknown) {\n        pDecoder->internalFormat = ma_format_f32;\n    }\n\n    pDecoder->internalChannels = pWav->channels;\n    pDecoder->internalSampleRate = pWav->sampleRate;\n    ma_get_standard_channel_map(ma_standard_channel_map_microsoft, pDecoder->internalChannels, pDecoder->internalChannelMap);\n\n    result = ma_decoder__init_dsp(pDecoder, pConfig, ma_decoder_internal_on_read_pcm_frames__wav);\n    if (result != MA_SUCCESS) {\n        drwav_close(pWav);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n/* FLAC */\n#ifdef dr_flac_h\n#define MA_HAS_FLAC\n\nsize_t ma_decoder_internal_on_read__flac(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    return ma_decoder_read_bytes(pDecoder, pBufferOut, bytesToRead);\n}\n\ndrflac_bool32 ma_decoder_internal_on_seek__flac(void* pUserData, int offset, drflac_seek_origin origin)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    return ma_decoder_seek_bytes(pDecoder, offset, (origin == drflac_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current);\n}\n\nma_uint32 ma_decoder_internal_on_read_pcm_frames__flac(ma_pcm_converter* pDSP, void* pSamplesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_decoder* pDecoder;\n    drflac* pFlac;\n\n    (void)pDSP;\n\n    pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    pFlac = (drflac*)pDecoder->pInternalDecoder;\n    ma_assert(pFlac != NULL);\n\n    switch (pDecoder->internalFormat) {\n        case ma_format_s16: return (ma_uint32)drflac_read_pcm_frames_s16(pFlac, frameCount, (drflac_int16*)pSamplesOut);\n        case ma_format_s32: return (ma_uint32)drflac_read_pcm_frames_s32(pFlac, frameCount, (drflac_int32*)pSamplesOut);\n        case ma_format_f32: return (ma_uint32)drflac_read_pcm_frames_f32(pFlac, frameCount,        (float*)pSamplesOut);\n        default: break;\n    }\n\n    /* Should never get here. If we do, it means the internal format was not set correctly at initialization time. */\n    ma_assert(MA_FALSE);\n    return 0;\n}\n\nma_result ma_decoder_internal_on_seek_to_pcm_frame__flac(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    drflac* pFlac;\n    drflac_bool32 result;\n\n    pFlac = (drflac*)pDecoder->pInternalDecoder;\n    ma_assert(pFlac != NULL);\n\n    result = drflac_seek_to_pcm_frame(pFlac, frameIndex);\n    if (result) {\n        return MA_SUCCESS;\n    } else {\n        return MA_ERROR;\n    }\n}\n\nma_result ma_decoder_internal_on_uninit__flac(ma_decoder* pDecoder)\n{\n    drflac_close((drflac*)pDecoder->pInternalDecoder);\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_decoder_internal_on_get_length_in_pcm_frames__flac(ma_decoder* pDecoder)\n{\n    return ((drflac*)pDecoder->pInternalDecoder)->totalPCMFrameCount;\n}\n\nma_result ma_decoder_init_flac__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    drflac* pFlac;\n    ma_result result;\n\n    ma_assert(pConfig != NULL);\n    ma_assert(pDecoder != NULL);\n\n    /* Try opening the decoder first. */\n    pFlac = drflac_open(ma_decoder_internal_on_read__flac, ma_decoder_internal_on_seek__flac, pDecoder);\n    if (pFlac == NULL) {\n        return MA_ERROR;\n    }\n\n    /* If we get here it means we successfully initialized the FLAC decoder. We can now initialize the rest of the ma_decoder. */\n    pDecoder->onSeekToPCMFrame = ma_decoder_internal_on_seek_to_pcm_frame__flac;\n    pDecoder->onUninit = ma_decoder_internal_on_uninit__flac;\n    pDecoder->onGetLengthInPCMFrames = ma_decoder_internal_on_get_length_in_pcm_frames__flac;\n    pDecoder->pInternalDecoder = pFlac;\n\n    /*\n    dr_flac supports reading as s32, s16 and f32. Try to do a one-to-one mapping if possible, but fall back to s32 if not. s32 is the \"native\" FLAC format\n    since it's the only one that's truly lossless.\n    */\n    pDecoder->internalFormat = ma_format_s32;\n    if (pConfig->format == ma_format_s16) {\n        pDecoder->internalFormat = ma_format_s16;\n    } else if (pConfig->format == ma_format_f32) {\n        pDecoder->internalFormat = ma_format_f32;\n    }\n\n    pDecoder->internalChannels = pFlac->channels;\n    pDecoder->internalSampleRate = pFlac->sampleRate;\n    ma_get_standard_channel_map(ma_standard_channel_map_flac, pDecoder->internalChannels, pDecoder->internalChannelMap);\n\n    result = ma_decoder__init_dsp(pDecoder, pConfig, ma_decoder_internal_on_read_pcm_frames__flac);\n    if (result != MA_SUCCESS) {\n        drflac_close(pFlac);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n/* Vorbis */\n#ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H\n#define MA_HAS_VORBIS\n\n/* The size in bytes of each chunk of data to read from the Vorbis stream. */\n#define MA_VORBIS_DATA_CHUNK_SIZE  4096\n\ntypedef struct\n{\n    stb_vorbis* pInternalVorbis;\n    ma_uint8* pData;\n    size_t dataSize;\n    size_t dataCapacity;\n    ma_uint32 framesConsumed;  /* The number of frames consumed in ppPacketData. */\n    ma_uint32 framesRemaining; /* The number of frames remaining in ppPacketData. */\n    float** ppPacketData;\n} ma_vorbis_decoder;\n\nma_uint32 ma_vorbis_decoder_read_pcm_frames(ma_vorbis_decoder* pVorbis, ma_decoder* pDecoder, void* pSamplesOut, ma_uint32 frameCount)\n{\n    float* pSamplesOutF;\n    ma_uint32 totalFramesRead;\n\n    ma_assert(pVorbis != NULL);\n    ma_assert(pDecoder != NULL);\n\n    pSamplesOutF = (float*)pSamplesOut;\n\n    totalFramesRead = 0;\n    while (frameCount > 0) {\n        /* Read from the in-memory buffer first. */\n        while (pVorbis->framesRemaining > 0 && frameCount > 0) {\n            ma_uint32 iChannel;\n            for (iChannel = 0; iChannel < pDecoder->internalChannels; ++iChannel) {\n                pSamplesOutF[0] = pVorbis->ppPacketData[iChannel][pVorbis->framesConsumed];\n                pSamplesOutF += 1;\n            }\n\n            pVorbis->framesConsumed += 1;\n            pVorbis->framesRemaining -= 1;\n            frameCount -= 1;\n            totalFramesRead += 1;\n        }\n\n        if (frameCount == 0) {\n            break;\n        }\n\n        ma_assert(pVorbis->framesRemaining == 0);\n\n        /* We've run out of cached frames, so decode the next packet and continue iteration. */\n        do\n        {\n            int samplesRead;\n            int consumedDataSize;\n\n            if (pVorbis->dataSize > INT_MAX) {\n                break;  /* Too big. */\n            }\n\n            samplesRead = 0;\n            consumedDataSize = stb_vorbis_decode_frame_pushdata(pVorbis->pInternalVorbis, pVorbis->pData, (int)pVorbis->dataSize, NULL, (float***)&pVorbis->ppPacketData, &samplesRead);\n            if (consumedDataSize != 0) {\n                size_t leftoverDataSize = (pVorbis->dataSize - (size_t)consumedDataSize);\n                size_t i;\n                for (i = 0; i < leftoverDataSize; ++i) {\n                    pVorbis->pData[i] = pVorbis->pData[i + consumedDataSize];\n                }\n\n                pVorbis->dataSize = leftoverDataSize;\n                pVorbis->framesConsumed = 0;\n                pVorbis->framesRemaining = samplesRead;\n                break;\n            } else {\n                /* Need more data. If there's any room in the existing buffer allocation fill that first. Otherwise expand. */\n                size_t bytesRead;\n                if (pVorbis->dataCapacity == pVorbis->dataSize) {\n                    /* No room. Expand. */\n                    size_t newCap = pVorbis->dataCapacity + MA_VORBIS_DATA_CHUNK_SIZE;\n                    ma_uint8* pNewData;\n\n                    pNewData = (ma_uint8*)ma_realloc(pVorbis->pData, newCap);\n                    if (pNewData == NULL) {\n                        return totalFramesRead; /* Out of memory. */\n                    }\n\n                    pVorbis->pData = pNewData;\n                    pVorbis->dataCapacity = newCap;\n                }\n\n                /* Fill in a chunk. */\n                bytesRead = ma_decoder_read_bytes(pDecoder, pVorbis->pData + pVorbis->dataSize, (pVorbis->dataCapacity - pVorbis->dataSize));\n                if (bytesRead == 0) {\n                    return totalFramesRead; /* Error reading more data. */\n                }\n\n                pVorbis->dataSize += bytesRead;\n            }\n        } while (MA_TRUE);\n    }\n\n    return totalFramesRead;\n}\n\nma_result ma_vorbis_decoder_seek_to_pcm_frame(ma_vorbis_decoder* pVorbis, ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    float buffer[4096];\n\n    ma_assert(pVorbis != NULL);\n    ma_assert(pDecoder != NULL);\n\n    /*\n    This is terribly inefficient because stb_vorbis does not have a good seeking solution with it's push API. Currently this just performs\n    a full decode right from the start of the stream. Later on I'll need to write a layer that goes through all of the Ogg pages until we\n    find the one containing the sample we need. Then we know exactly where to seek for stb_vorbis.\n    */\n    if (!ma_decoder_seek_bytes(pDecoder, 0, ma_seek_origin_start)) {\n        return MA_ERROR;\n    }\n\n    stb_vorbis_flush_pushdata(pVorbis->pInternalVorbis);\n    pVorbis->framesConsumed = 0;\n    pVorbis->framesRemaining = 0;\n    pVorbis->dataSize = 0;\n\n    while (frameIndex > 0) {\n        ma_uint32 framesRead;\n        ma_uint32 framesToRead = ma_countof(buffer)/pDecoder->internalChannels;\n        if (framesToRead > frameIndex) {\n            framesToRead = (ma_uint32)frameIndex;\n        }\n\n        framesRead = ma_vorbis_decoder_read_pcm_frames(pVorbis, pDecoder, buffer, framesToRead);\n        if (framesRead == 0) {\n            return MA_ERROR;\n        }\n\n        frameIndex -= framesRead;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nma_result ma_decoder_internal_on_seek_to_pcm_frame__vorbis(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    ma_vorbis_decoder* pVorbis = (ma_vorbis_decoder*)pDecoder->pInternalDecoder;\n    ma_assert(pVorbis != NULL);\n\n    return ma_vorbis_decoder_seek_to_pcm_frame(pVorbis, pDecoder, frameIndex);\n}\n\nma_result ma_decoder_internal_on_uninit__vorbis(ma_decoder* pDecoder)\n{\n    ma_vorbis_decoder* pVorbis = (ma_vorbis_decoder*)pDecoder->pInternalDecoder;\n    ma_assert(pVorbis != NULL);\n\n    stb_vorbis_close(pVorbis->pInternalVorbis);\n    ma_free(pVorbis->pData);\n    ma_free(pVorbis);\n\n    return MA_SUCCESS;\n}\n\nma_uint32 ma_decoder_internal_on_read_pcm_frames__vorbis(ma_pcm_converter* pDSP, void* pSamplesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_decoder* pDecoder;\n    ma_vorbis_decoder* pVorbis;\n\n    (void)pDSP;\n\n    pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n    ma_assert(pDecoder->internalFormat == ma_format_f32);\n\n    pVorbis = (ma_vorbis_decoder*)pDecoder->pInternalDecoder;\n    ma_assert(pVorbis != NULL);\n\n    return ma_vorbis_decoder_read_pcm_frames(pVorbis, pDecoder, pSamplesOut, frameCount);\n}\n\nma_uint64 ma_decoder_internal_on_get_length_in_pcm_frames__vorbis(ma_decoder* pDecoder)\n{\n    /* No good way to do this with Vorbis. */\n    (void)pDecoder;\n    return 0;\n}\n\nma_result ma_decoder_init_vorbis__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    stb_vorbis* pInternalVorbis = NULL;\n    size_t dataSize = 0;\n    size_t dataCapacity = 0;\n    ma_uint8* pData = NULL;\n    stb_vorbis_info vorbisInfo;\n    size_t vorbisDataSize;\n    ma_vorbis_decoder* pVorbis;\n\n    ma_assert(pConfig != NULL);\n    ma_assert(pDecoder != NULL);\n\n    /* We grow the buffer in chunks. */\n    do\n    {\n        /* Allocate memory for a new chunk. */\n        ma_uint8* pNewData;\n        size_t bytesRead;\n        int vorbisError = 0;\n        int consumedDataSize = 0;\n\n        dataCapacity += MA_VORBIS_DATA_CHUNK_SIZE;\n        pNewData = (ma_uint8*)ma_realloc(pData, dataCapacity);\n        if (pNewData == NULL) {\n            ma_free(pData);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pData = pNewData;\n\n        /* Fill in a chunk. */\n        bytesRead = ma_decoder_read_bytes(pDecoder, pData + dataSize, (dataCapacity - dataSize));\n        if (bytesRead == 0) {\n            return MA_ERROR;\n        }\n\n        dataSize += bytesRead;\n        if (dataSize > INT_MAX) {\n            return MA_ERROR;   /* Too big. */\n        }\n\n        pInternalVorbis = stb_vorbis_open_pushdata(pData, (int)dataSize, &consumedDataSize, &vorbisError, NULL);\n        if (pInternalVorbis != NULL) {\n            /*\n            If we get here it means we were able to open the stb_vorbis decoder. There may be some leftover bytes in our buffer, so\n            we need to move those bytes down to the front of the buffer since they'll be needed for future decoding.\n            */\n            size_t leftoverDataSize = (dataSize - (size_t)consumedDataSize);\n            size_t i;\n            for (i = 0; i < leftoverDataSize; ++i) {\n                pData[i] = pData[i + consumedDataSize];\n            }\n\n            dataSize = leftoverDataSize;\n            break;  /* Success. */\n        } else {\n            if (vorbisError == VORBIS_need_more_data) {\n                continue;\n            } else {\n                return MA_ERROR;   /* Failed to open the stb_vorbis decoder. */\n            }\n        }\n    } while (MA_TRUE);\n\n\n    /* If we get here it means we successfully opened the Vorbis decoder. */\n    vorbisInfo = stb_vorbis_get_info(pInternalVorbis);\n\n    /* Don't allow more than MA_MAX_CHANNELS channels. */\n    if (vorbisInfo.channels > MA_MAX_CHANNELS) {\n        stb_vorbis_close(pInternalVorbis);\n        ma_free(pData);\n        return MA_ERROR;   /* Too many channels. */\n    }\n\n    vorbisDataSize = sizeof(ma_vorbis_decoder) + sizeof(float)*vorbisInfo.max_frame_size;\n    pVorbis = (ma_vorbis_decoder*)ma_malloc(vorbisDataSize);\n    if (pVorbis == NULL) {\n        stb_vorbis_close(pInternalVorbis);\n        ma_free(pData);\n        return MA_OUT_OF_MEMORY;\n    }\n\n    ma_zero_memory(pVorbis, vorbisDataSize);\n    pVorbis->pInternalVorbis = pInternalVorbis;\n    pVorbis->pData = pData;\n    pVorbis->dataSize = dataSize;\n    pVorbis->dataCapacity = dataCapacity;\n\n    pDecoder->onSeekToPCMFrame = ma_decoder_internal_on_seek_to_pcm_frame__vorbis;\n    pDecoder->onUninit = ma_decoder_internal_on_uninit__vorbis;\n    pDecoder->onGetLengthInPCMFrames = ma_decoder_internal_on_get_length_in_pcm_frames__vorbis;\n    pDecoder->pInternalDecoder = pVorbis;\n\n    /* The internal format is always f32. */\n    pDecoder->internalFormat = ma_format_f32;\n    pDecoder->internalChannels = vorbisInfo.channels;\n    pDecoder->internalSampleRate = vorbisInfo.sample_rate;\n    ma_get_standard_channel_map(ma_standard_channel_map_vorbis, pDecoder->internalChannels, pDecoder->internalChannelMap);\n\n    result = ma_decoder__init_dsp(pDecoder, pConfig, ma_decoder_internal_on_read_pcm_frames__vorbis);\n    if (result != MA_SUCCESS) {\n        stb_vorbis_close(pVorbis->pInternalVorbis);\n        ma_free(pVorbis->pData);\n        ma_free(pVorbis);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n/* MP3 */\n#ifdef dr_mp3_h\n#define MA_HAS_MP3\n\nsize_t ma_decoder_internal_on_read__mp3(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    return ma_decoder_read_bytes(pDecoder, pBufferOut, bytesToRead);\n}\n\ndrmp3_bool32 ma_decoder_internal_on_seek__mp3(void* pUserData, int offset, drmp3_seek_origin origin)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    return ma_decoder_seek_bytes(pDecoder, offset, (origin == drmp3_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current);\n}\n\nma_uint32 ma_decoder_internal_on_read_pcm_frames__mp3(ma_pcm_converter* pDSP, void* pSamplesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_decoder* pDecoder;\n    drmp3* pMP3;\n\n    (void)pDSP;\n\n    pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n    ma_assert(pDecoder->internalFormat == ma_format_f32);\n\n    pMP3 = (drmp3*)pDecoder->pInternalDecoder;\n    ma_assert(pMP3 != NULL);\n\n    return (ma_uint32)drmp3_read_pcm_frames_f32(pMP3, frameCount, (float*)pSamplesOut);\n}\n\nma_result ma_decoder_internal_on_seek_to_pcm_frame__mp3(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    drmp3* pMP3;\n    drmp3_bool32 result;\n\n    pMP3 = (drmp3*)pDecoder->pInternalDecoder;\n    ma_assert(pMP3 != NULL);\n\n    result = drmp3_seek_to_pcm_frame(pMP3, frameIndex);\n    if (result) {\n        return MA_SUCCESS;\n    } else {\n        return MA_ERROR;\n    }\n}\n\nma_result ma_decoder_internal_on_uninit__mp3(ma_decoder* pDecoder)\n{\n    drmp3_uninit((drmp3*)pDecoder->pInternalDecoder);\n    ma_free(pDecoder->pInternalDecoder);\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_decoder_internal_on_get_length_in_pcm_frames__mp3(ma_decoder* pDecoder)\n{\n    return drmp3_get_pcm_frame_count((drmp3*)pDecoder->pInternalDecoder);\n}\n\nma_result ma_decoder_init_mp3__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    drmp3* pMP3;\n    drmp3_config mp3Config;\n    ma_result result;\n\n    ma_assert(pConfig != NULL);\n    ma_assert(pDecoder != NULL);\n\n    pMP3 = (drmp3*)ma_malloc(sizeof(*pMP3));\n    if (pMP3 == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    /*\n    Try opening the decoder first. MP3 can have variable sample rates (it's per frame/packet). We therefore need\n    to use some smarts to determine the most appropriate internal sample rate. These are the rules we're going\n    to use:\n    \n    Sample Rates\n    1) If an output sample rate is specified in pConfig we just use that. Otherwise;\n    2) Fall back to 44100.\n    \n    The internal channel count is always stereo, and the internal format is always f32.\n    */\n    ma_zero_object(&mp3Config);\n    mp3Config.outputChannels = 2;\n    mp3Config.outputSampleRate = (pConfig->sampleRate != 0) ? pConfig->sampleRate : 44100;\n    if (!drmp3_init(pMP3, ma_decoder_internal_on_read__mp3, ma_decoder_internal_on_seek__mp3, pDecoder, &mp3Config)) {\n        return MA_ERROR;\n    }\n\n    /* If we get here it means we successfully initialized the MP3 decoder. We can now initialize the rest of the ma_decoder. */\n    pDecoder->onSeekToPCMFrame = ma_decoder_internal_on_seek_to_pcm_frame__mp3;\n    pDecoder->onUninit = ma_decoder_internal_on_uninit__mp3;\n    pDecoder->onGetLengthInPCMFrames = ma_decoder_internal_on_get_length_in_pcm_frames__mp3;\n    pDecoder->pInternalDecoder = pMP3;\n\n    /* Internal format. */\n    pDecoder->internalFormat = ma_format_f32;\n    pDecoder->internalChannels = pMP3->channels;\n    pDecoder->internalSampleRate = pMP3->sampleRate;\n    ma_get_standard_channel_map(ma_standard_channel_map_default, pDecoder->internalChannels, pDecoder->internalChannelMap);\n\n    result = ma_decoder__init_dsp(pDecoder, pConfig, ma_decoder_internal_on_read_pcm_frames__mp3);\n    if (result != MA_SUCCESS) {\n        ma_free(pMP3);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n/* Raw */\nma_uint32 ma_decoder_internal_on_read_pcm_frames__raw(ma_pcm_converter* pDSP, void* pSamplesOut, ma_uint32 frameCount, void* pUserData)\n{\n    ma_decoder* pDecoder;\n    ma_uint32 bpf;\n\n    (void)pDSP;\n\n    pDecoder = (ma_decoder*)pUserData;\n    ma_assert(pDecoder != NULL);\n\n    /* For raw decoding we just read directly from the decoder's callbacks. */\n    bpf = ma_get_bytes_per_frame(pDecoder->internalFormat, pDecoder->internalChannels);\n    return (ma_uint32)ma_decoder_read_bytes(pDecoder, pSamplesOut, frameCount * bpf) / bpf;\n}\n\nma_result ma_decoder_internal_on_seek_to_pcm_frame__raw(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    ma_bool32 result = MA_FALSE;\n    ma_uint64 totalBytesToSeek;\n\n    ma_assert(pDecoder != NULL);\n\n    if (pDecoder->onSeek == NULL) {\n        return MA_ERROR;\n    }\n\n    /* The callback uses a 32 bit integer whereas we use a 64 bit unsigned integer. We just need to continuously seek until we're at the correct position. */\n    totalBytesToSeek = frameIndex * ma_get_bytes_per_frame(pDecoder->internalFormat, pDecoder->internalChannels);\n    if (totalBytesToSeek < 0x7FFFFFFF) {\n        /* Simple case. */\n        result = ma_decoder_seek_bytes(pDecoder, (int)(frameIndex * ma_get_bytes_per_frame(pDecoder->internalFormat, pDecoder->internalChannels)), ma_seek_origin_start);\n    } else {\n        /* Complex case. Start by doing a seek relative to the start. Then keep looping using offset seeking. */\n        result = ma_decoder_seek_bytes(pDecoder, 0x7FFFFFFF, ma_seek_origin_start);\n        if (result == MA_TRUE) {\n            totalBytesToSeek -= 0x7FFFFFFF;\n\n            while (totalBytesToSeek > 0) {\n                ma_uint64 bytesToSeekThisIteration = totalBytesToSeek;\n                if (bytesToSeekThisIteration > 0x7FFFFFFF) {\n                    bytesToSeekThisIteration = 0x7FFFFFFF;\n                }\n\n                result = ma_decoder_seek_bytes(pDecoder, (int)bytesToSeekThisIteration, ma_seek_origin_current);\n                if (result != MA_TRUE) {\n                    break;\n                }\n\n                totalBytesToSeek -= bytesToSeekThisIteration;\n            }\n        }\n    }\n\n    if (result) {\n        return MA_SUCCESS;\n    } else {\n        return MA_ERROR;\n    }\n}\n\nma_result ma_decoder_internal_on_uninit__raw(ma_decoder* pDecoder)\n{\n    (void)pDecoder;\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_decoder_internal_on_get_length_in_pcm_frames__raw(ma_decoder* pDecoder)\n{\n    (void)pDecoder;\n    return 0;\n}\n\nma_result ma_decoder_init_raw__internal(const ma_decoder_config* pConfigIn, const ma_decoder_config* pConfigOut, ma_decoder* pDecoder)\n{\n    ma_result result;\n\n    ma_assert(pConfigIn != NULL);\n    ma_assert(pConfigOut != NULL);\n    ma_assert(pDecoder != NULL);\n\n    pDecoder->onSeekToPCMFrame = ma_decoder_internal_on_seek_to_pcm_frame__raw;\n    pDecoder->onUninit = ma_decoder_internal_on_uninit__raw;\n    pDecoder->onGetLengthInPCMFrames = ma_decoder_internal_on_get_length_in_pcm_frames__raw;\n\n    /* Internal format. */\n    pDecoder->internalFormat = pConfigIn->format;\n    pDecoder->internalChannels = pConfigIn->channels;\n    pDecoder->internalSampleRate = pConfigIn->sampleRate;\n    ma_channel_map_copy(pDecoder->internalChannelMap, pConfigIn->channelMap, pConfigIn->channels);\n\n    result = ma_decoder__init_dsp(pDecoder, pConfigOut, ma_decoder_internal_on_read_pcm_frames__raw);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nma_result ma_decoder__preinit(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_assert(pConfig != NULL);\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pDecoder);\n\n    if (onRead == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDecoder->onRead = onRead;\n    pDecoder->onSeek = onSeek;\n    pDecoder->pUserData = pUserData;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n\nma_result ma_decoder_init_wav(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(onRead, onSeek, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_WAV\n    return ma_decoder_init_wav__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_flac(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(onRead, onSeek, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_FLAC\n    return ma_decoder_init_flac__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_vorbis(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(onRead, onSeek, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_VORBIS\n    return ma_decoder_init_vorbis__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_mp3(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(onRead, onSeek, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_MP3\n    return ma_decoder_init_mp3__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_raw(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfigIn, const ma_decoder_config* pConfigOut, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfigOut);\n\n    result = ma_decoder__preinit(onRead, onSeek, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init_raw__internal(pConfigIn, &config, pDecoder);\n}\n\nma_result ma_decoder_init__internal(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = MA_NO_BACKEND;\n\n    ma_assert(pConfig != NULL);\n    ma_assert(pDecoder != NULL);\n\n    /* Silence some warnings in the case that we don't have any decoder backends enabled. */\n    (void)onRead;\n    (void)onSeek;\n    (void)pUserData;\n    (void)pConfig;\n    (void)pDecoder;\n\n    /* We use trial and error to open a decoder. */\n\n#ifdef MA_HAS_WAV\n    if (result != MA_SUCCESS) {\n        result = ma_decoder_init_wav__internal(pConfig, pDecoder);\n        if (result != MA_SUCCESS) {\n            onSeek(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n#endif\n#ifdef MA_HAS_FLAC\n    if (result != MA_SUCCESS) {\n        result = ma_decoder_init_flac__internal(pConfig, pDecoder);\n        if (result != MA_SUCCESS) {\n            onSeek(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n#endif\n#ifdef MA_HAS_VORBIS\n    if (result != MA_SUCCESS) {\n        result = ma_decoder_init_vorbis__internal(pConfig, pDecoder);\n        if (result != MA_SUCCESS) {\n            onSeek(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n#endif\n#ifdef MA_HAS_MP3\n    if (result != MA_SUCCESS) {\n        result = ma_decoder_init_mp3__internal(pConfig, pDecoder);\n        if (result != MA_SUCCESS) {\n            onSeek(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n#endif\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(onRead, onSeek, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init__internal(onRead, onSeek, pUserData, &config, pDecoder);\n}\n\n\nsize_t ma_decoder__on_read_memory(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead)\n{\n    size_t bytesRemaining;\n\n    ma_assert(pDecoder->memory.dataSize >= pDecoder->memory.currentReadPos);\n\n    bytesRemaining = pDecoder->memory.dataSize - pDecoder->memory.currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n\n    if (bytesToRead > 0) {\n        ma_copy_memory(pBufferOut, pDecoder->memory.pData + pDecoder->memory.currentReadPos, bytesToRead);\n        pDecoder->memory.currentReadPos += bytesToRead;\n    }\n\n    return bytesToRead;\n}\n\nma_bool32 ma_decoder__on_seek_memory(ma_decoder* pDecoder, int byteOffset, ma_seek_origin origin)\n{\n    if (origin == ma_seek_origin_current) {\n        if (byteOffset > 0) {\n            if (pDecoder->memory.currentReadPos + byteOffset > pDecoder->memory.dataSize) {\n                byteOffset = (int)(pDecoder->memory.dataSize - pDecoder->memory.currentReadPos);  /* Trying to seek too far forward. */\n            }\n        } else {\n            if (pDecoder->memory.currentReadPos < (size_t)-byteOffset) {\n                byteOffset = -(int)pDecoder->memory.currentReadPos;  /* Trying to seek too far backwards. */\n            }\n        }\n\n        /* This will never underflow thanks to the clamps above. */\n        pDecoder->memory.currentReadPos += byteOffset;\n    } else {\n        if ((ma_uint32)byteOffset <= pDecoder->memory.dataSize) {\n            pDecoder->memory.currentReadPos = byteOffset;\n        } else {\n            pDecoder->memory.currentReadPos = pDecoder->memory.dataSize;  /* Trying to seek too far forward. */\n        }\n    }\n\n    return MA_TRUE;\n}\n\nma_result ma_decoder__preinit_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, NULL, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pData == NULL || dataSize == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDecoder->memory.pData = (const ma_uint8*)pData;\n    pDecoder->memory.dataSize = dataSize;\n    pDecoder->memory.currentReadPos = 0;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n\nma_result ma_decoder_init_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);  /* Make sure the config is not NULL. */\n\n    result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init__internal(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, NULL, &config, pDecoder);\n}\n\nma_result ma_decoder_init_memory_wav(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);  /* Make sure the config is not NULL. */\n\n    result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_WAV\n    return ma_decoder_init_wav__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_memory_flac(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);  /* Make sure the config is not NULL. */\n\n    result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_FLAC\n    return ma_decoder_init_flac__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_memory_vorbis(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);  /* Make sure the config is not NULL. */\n\n    result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_VORBIS\n    return ma_decoder_init_vorbis__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_memory_mp3(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);  /* Make sure the config is not NULL. */\n\n    result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n#ifdef MA_HAS_MP3\n    return ma_decoder_init_mp3__internal(&config, pDecoder);\n#else\n    return MA_NO_BACKEND;\n#endif\n}\n\nma_result ma_decoder_init_memory_raw(const void* pData, size_t dataSize, const ma_decoder_config* pConfigIn, const ma_decoder_config* pConfigOut, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfigOut);  /* Make sure the config is not NULL. */\n\n    result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init_raw__internal(pConfigIn, &config, pDecoder);\n}\n\n#ifndef MA_NO_STDIO\n#include <stdio.h>\n#if !defined(_MSC_VER) && !defined(__DMC__)\n#include <strings.h>    /* For strcasecmp(). */\n#endif\n\nconst char* ma_path_file_name(const char* path)\n{\n    const char* fileName;\n\n    if (path == NULL) {\n        return NULL;\n    }\n\n    fileName = path;\n\n    /* We just loop through the path until we find the last slash. */\n    while (path[0] != '\\0') {\n        if (path[0] == '/' || path[0] == '\\\\') {\n            fileName = path;\n        }\n\n        path += 1;\n    }\n\n    /* At this point the file name is sitting on a slash, so just move forward. */\n    while (fileName[0] != '\\0' && (fileName[0] == '/' || fileName[0] == '\\\\')) {\n        fileName += 1;\n    }\n\n    return fileName;\n}\n\nconst char* ma_path_extension(const char* path)\n{\n    const char* extension;\n    const char* lastOccurance;\n\n    if (path == NULL) {\n        path = \"\";\n    }\n\n    extension = ma_path_file_name(path);\n    lastOccurance = NULL;\n\n    /* Just find the last '.' and return. */\n    while (extension[0] != '\\0') {\n        if (extension[0] == '.') {\n            extension += 1;\n            lastOccurance = extension;\n        }\n\n        extension += 1;\n    }\n\n    return (lastOccurance != NULL) ? lastOccurance : extension;\n}\n\nma_bool32 ma_path_extension_equal(const char* path, const char* extension)\n{\n    const char* ext1;\n    const char* ext2;\n\n    if (path == NULL || extension == NULL) {\n        return MA_FALSE;\n    }\n\n    ext1 = extension;\n    ext2 = ma_path_extension(path);\n\n#if defined(_MSC_VER) || defined(__DMC__)\n    return _stricmp(ext1, ext2) == 0;\n#else\n    return strcasecmp(ext1, ext2) == 0;\n#endif\n}\n\nsize_t ma_decoder__on_read_stdio(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead)\n{\n    return fread(pBufferOut, 1, bytesToRead, (FILE*)pDecoder->pUserData);\n}\n\nma_bool32 ma_decoder__on_seek_stdio(ma_decoder* pDecoder, int byteOffset, ma_seek_origin origin)\n{\n    return fseek((FILE*)pDecoder->pUserData, byteOffset, (origin == ma_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;\n}\n\nma_result ma_decoder__preinit_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    FILE* pFile;\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_zero_object(pDecoder);\n\n    if (pFilePath == NULL || pFilePath[0] == '\\0') {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    if (fopen_s(&pFile, pFilePath, \"rb\") != 0) {\n        return MA_ERROR;\n    }\n#else\n    pFile = fopen(pFilePath, \"rb\");\n    if (pFile == NULL) {\n        return MA_ERROR;\n    }\n#endif\n\n    /* We need to manually set the user data so the calls to ma_decoder__on_seek_stdio() succeed. */\n    pDecoder->pUserData = pFile;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n\nma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit_file(pFilePath, pConfig, pDecoder);    /* This sets pDecoder->pUserData to a FILE*. */\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* WAV */\n    if (ma_path_extension_equal(pFilePath, \"wav\")) {\n        result =  ma_decoder_init_wav(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n        if (result == MA_SUCCESS) {\n            return MA_SUCCESS;\n        }\n\n        ma_decoder__on_seek_stdio(pDecoder, 0, ma_seek_origin_start);\n    }\n\n    /* FLAC */\n    if (ma_path_extension_equal(pFilePath, \"flac\")) {\n        result =  ma_decoder_init_flac(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n        if (result == MA_SUCCESS) {\n            return MA_SUCCESS;\n        }\n\n        ma_decoder__on_seek_stdio(pDecoder, 0, ma_seek_origin_start);\n    }\n\n    /* MP3 */\n    if (ma_path_extension_equal(pFilePath, \"mp3\")) {\n        result =  ma_decoder_init_mp3(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n        if (result == MA_SUCCESS) {\n            return MA_SUCCESS;\n        }\n\n        ma_decoder__on_seek_stdio(pDecoder, 0, ma_seek_origin_start);\n    }\n\n    /* Trial and error. */\n    return ma_decoder_init(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n}\n\nma_result ma_decoder_init_file_wav(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit_file(pFilePath, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init_wav(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n}\n\nma_result ma_decoder_init_file_flac(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit_file(pFilePath, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init_flac(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n}\n\nma_result ma_decoder_init_file_vorbis(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit_file(pFilePath, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init_vorbis(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n}\n\nma_result ma_decoder_init_file_mp3(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit_file(pFilePath, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init_mp3(ma_decoder__on_read_stdio, ma_decoder__on_seek_stdio, pDecoder->pUserData, pConfig, pDecoder);\n}\n#endif\n\nma_result ma_decoder_uninit(ma_decoder* pDecoder)\n{\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDecoder->onUninit) {\n        pDecoder->onUninit(pDecoder);\n    }\n\n#ifndef MA_NO_STDIO\n    /* If we have a file handle, close it. */\n    if (pDecoder->onRead == ma_decoder__on_read_stdio) {\n        fclose((FILE*)pDecoder->pUserData);\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder)\n{\n    if (pDecoder == NULL) {\n        return 0;\n    }\n\n    if (pDecoder->onGetLengthInPCMFrames) {\n        return pDecoder->onGetLengthInPCMFrames(pDecoder);\n    }\n\n    return 0;\n}\n\nma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount)\n{\n    if (pDecoder == NULL) {\n        return 0;\n    }\n\n    return ma_pcm_converter_read(&pDecoder->dsp, pFramesOut, frameCount);\n}\n\nma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    if (pDecoder == NULL) {\n        return 0;\n    }\n\n    if (pDecoder->onSeekToPCMFrame) {\n        return pDecoder->onSeekToPCMFrame(pDecoder, frameIndex);\n    }\n\n    /* Should never get here, but if we do it means onSeekToPCMFrame was not set by the backend. */\n    return MA_INVALID_ARGS;\n}\n\n\nma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_decoder_config* pConfigOut, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    ma_uint64 totalFrameCount;\n    ma_uint64 bpf;\n    ma_uint64 dataCapInFrames;\n    void* pPCMFramesOut;\n\n    ma_assert(pDecoder != NULL);\n    \n    totalFrameCount = 0;\n    bpf = ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels);\n\n    /* The frame count is unknown until we try reading. Thus, we just run in a loop. */\n    dataCapInFrames = 0;\n    pPCMFramesOut = NULL;\n    for (;;) {\n        ma_uint64 frameCountToTryReading;\n        ma_uint64 framesJustRead;\n\n        /* Make room if there's not enough. */\n        if (totalFrameCount == dataCapInFrames) {\n            void* pNewPCMFramesOut;\n            ma_uint64 newDataCapInFrames = dataCapInFrames*2;\n            if (newDataCapInFrames == 0) {\n                newDataCapInFrames = 4096;\n            }\n\n            if ((newDataCapInFrames * bpf) > MA_SIZE_MAX) {\n                ma_free(pPCMFramesOut);\n                return MA_TOO_LARGE;\n            }\n\n\n            pNewPCMFramesOut = (void*)ma_realloc(pPCMFramesOut, (size_t)(newDataCapInFrames * bpf));\n            if (pNewPCMFramesOut == NULL) {\n                ma_free(pPCMFramesOut);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            dataCapInFrames = newDataCapInFrames;\n            pPCMFramesOut = pNewPCMFramesOut;\n        }\n\n        frameCountToTryReading = dataCapInFrames - totalFrameCount;\n        ma_assert(frameCountToTryReading > 0);\n\n        framesJustRead = ma_decoder_read_pcm_frames(pDecoder, (ma_uint8*)pPCMFramesOut + (totalFrameCount * bpf), frameCountToTryReading);\n        totalFrameCount += framesJustRead;\n\n        if (framesJustRead < frameCountToTryReading) {\n            break;\n        }\n    }\n\n    \n    if (pConfigOut != NULL) {\n        pConfigOut->format = pDecoder->outputFormat;\n        pConfigOut->channels = pDecoder->outputChannels;\n        pConfigOut->sampleRate = pDecoder->outputSampleRate;\n        ma_channel_map_copy(pConfigOut->channelMap, pDecoder->outputChannelMap, pDecoder->outputChannels);\n    }\n\n    if (ppPCMFramesOut != NULL) {\n        *ppPCMFramesOut = pPCMFramesOut;\n    } else {\n        ma_free(pPCMFramesOut);\n    }\n\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = totalFrameCount;\n    }\n\n    ma_decoder_uninit(pDecoder);\n    return MA_SUCCESS;\n}\n\n#ifndef MA_NO_STDIO\nma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    ma_decoder_config config;\n    ma_decoder decoder;\n    ma_result result;\n\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = 0;\n    }\n    if (ppPCMFramesOut != NULL) {\n        *ppPCMFramesOut = NULL;\n    }\n\n    if (pFilePath == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    config = ma_decoder_config_init_copy(pConfig);\n    \n    result = ma_decoder_init_file(pFilePath, &config, &decoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder__full_decode_and_uninit(&decoder, pConfig, pFrameCountOut, ppPCMFramesOut);\n}\n#endif\n\nma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    ma_decoder_config config;\n    ma_decoder decoder;\n    ma_result result;\n\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = 0;\n    }\n    if (ppPCMFramesOut != NULL) {\n        *ppPCMFramesOut = NULL;\n    }\n\n    if (pData == NULL || dataSize == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    config = ma_decoder_config_init_copy(pConfig);\n    \n    result = ma_decoder_init_memory(pData, dataSize, &config, &decoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder__full_decode_and_uninit(&decoder, pConfig, pFrameCountOut, ppPCMFramesOut);\n}\n\n#endif  /* MA_NO_DECODING */\n\n\n\n\n/**************************************************************************************************************************************************************\n\nGeneration\n\n**************************************************************************************************************************************************************/\nma_result ma_sine_wave_init(double amplitude, double periodsPerSecond, ma_uint32 sampleRate, ma_sine_wave* pSineWave)\n{\n    if (pSineWave == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    ma_zero_object(pSineWave);\n\n    if (amplitude == 0 || periodsPerSecond == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (amplitude > 1) {\n        amplitude = 1;\n    }\n    if (amplitude < -1) {\n        amplitude = -1;\n    }\n\n    pSineWave->amplitude = amplitude;\n    pSineWave->periodsPerSecond = periodsPerSecond;\n    pSineWave->delta = MA_TAU_D / sampleRate;\n    pSineWave->time = 0;\n\n    return MA_SUCCESS;\n}\n\nma_uint64 ma_sine_wave_read_f32(ma_sine_wave* pSineWave, ma_uint64 count, float* pSamples)\n{\n    return ma_sine_wave_read_f32_ex(pSineWave, count, 1, ma_stream_layout_interleaved, &pSamples);\n}\n\nma_uint64 ma_sine_wave_read_f32_ex(ma_sine_wave* pSineWave, ma_uint64 frameCount, ma_uint32 channels, ma_stream_layout layout, float** ppFrames)\n{\n    if (pSineWave == NULL) {\n        return 0;\n    }\n\n    if (ppFrames != NULL) {\n        ma_uint64 iFrame;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_uint32 iChannel;\n\n            float s = (float)(sin(pSineWave->time * pSineWave->periodsPerSecond) * pSineWave->amplitude);\n            pSineWave->time += pSineWave->delta;\n\n            if (layout == ma_stream_layout_interleaved) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    ppFrames[0][iFrame*channels + iChannel] = s;\n                }\n            } else {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    ppFrames[iChannel][iFrame] = s;\n                }\n            }\n        }\n    } else {\n        pSineWave->time += pSineWave->delta * (ma_int64)frameCount; /* Cast to int64 required for VC6. */\n    }\n\n    return frameCount;\n}\n\n#if defined(_MSC_VER)\n    #pragma warning(pop)\n#endif\n\n#endif  /* MINIAUDIO_IMPLEMENTATION */\n\n/*\nBACKEND IMPLEMENTATION GUIDLINES\n================================\nContext\n-------\n- Run-time linking if possible.\n- Set whether or not it's an asynchronous backend\n\nDevice\n------\n- If a full-duplex device is requested and the backend does not support full duplex devices, have ma_device_init__[backend]()\n  return MA_DEVICE_TYPE_NOT_SUPPORTED.\n- If exclusive mode is requested, but the backend does not support it, return MA_SHARE_MODE_NOT_SUPPORTED. If practical, try\n  not to fall back to a different share mode - give the client exactly what they asked for. Some backends, such as ALSA, may\n  not have a practical way to distinguish between the two.\n- If pDevice->usingDefault* is set, prefer the device's native value if the backend supports it. Otherwise use the relevant\n  value from the config.\n- If the configs buffer size in frames is 0, set it based on the buffer size in milliseconds, keeping in mind to handle the\n  case when the default sample rate is being used where practical.\n- Backends must set the following members of pDevice before returning successfully from ma_device_init__[backend]():\n  - internalFormat\n  - internalChannels\n  - internalSampleRate\n  - internalChannelMap\n  - bufferSizeInFrames\n  - periods\n*/\n\n/*\nREVISION HISTORY\n================\nv0.9.5 - 2019-05-21\n  - Add logging to ma_dlopen() and ma_dlsym().\n  - Add ma_decoder_get_length_in_pcm_frames().\n  - Fix a bug with capture on the OpenSL|ES backend.\n  - Fix a bug with the ALSA backend where a device would not restart after being stopped.\n\nv0.9.4 - 2019-05-06\n  - Add support for C89. With this change, miniaudio should compile clean with GCC/Clang with \"-std=c89 -ansi -pedantic\" and\n    Microsoft copmilers back to VC6. Other compilers should also work, but have not been tested.\n\nv0.9.3 - 2019-04-19\n  - Fix compiler errors on GCC when compiling with -std=c99.\n\nv0.9.2 - 2019-04-08\n  - Add support for per-context user data.\n  - Fix a potential bug with context configs.\n  - Fix some bugs with PulseAudio.\n\nv0.9.1 - 2019-03-17\n  - Fix a bug where the output buffer is not getting zeroed out before calling the data callback. This happens when\n    the device is running in passthrough mode (not doing any data conversion).\n  - Fix an issue where the data callback is getting called too frequently on the WASAPI and DirectSound backends.\n  - Fix error on the UWP build.\n  - Fix a build error on Apple platforms.\n\nv0.9 - 2019-03-06\n  - Rebranded to \"miniaudio\". All namespaces have been renamed from \"mal\" to \"ma\".\n  - API CHANGE: ma_device_init() and ma_device_config_init() have changed significantly:\n    - The device type, device ID and user data pointer have moved from ma_device_init() to the config.\n    - All variations of ma_device_config_init_*() have been removed in favor of just ma_device_config_init().\n    - ma_device_config_init() now takes only one parameter which is the device type. All other properties need\n      to be set on the returned object directly.\n    - The onDataCallback and onStopCallback members of ma_device_config have been renamed to \"dataCallback\"\n      and \"stopCallback\".\n    - The ID of the physical device is now split into two: one for the playback device and the other for the\n      capture device. This is required for full-duplex. These are named \"pPlaybackDeviceID\" and \"pCaptureDeviceID\".\n  - API CHANGE: The data callback has changed. It now uses a unified callback for all device types rather than\n    being separate for each. It now takes two pointers - one containing input data and the other output data. This\n    design in required for full-duplex. The return value is now void instead of the number of frames written. The\n    new callback looks like the following:\n        void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);\n  - API CHANGE: Remove the log callback parameter from ma_context_config_init(). With this change,\n    ma_context_config_init() now takes no parameters and the log callback is set via the structure directly. The\n    new policy for config initialization is that only mandatory settings are passed in to *_config_init(). The\n    \"onLog\" member of ma_context_config has been renamed to \"logCallback\".\n  - API CHANGE: Remove ma_device_get_buffer_size_in_bytes().\n  - API CHANGE: Rename decoding APIs to \"pcm_frames\" convention.\n    - mal_decoder_read()          -> ma_decoder_read_pcm_frames()\n    - mal_decoder_seek_to_frame() -> ma_decoder_seek_to_pcm_frame()\n  - API CHANGE: Rename sine wave reading APIs to f32 convention.\n    - mal_sine_wave_read()    -> ma_sine_wave_read_f32()\n    - mal_sine_wave_read_ex() -> ma_sine_wave_read_f32_ex()\n  - API CHANGE: Remove some deprecated APIs\n    - mal_device_set_recv_callback()\n    - mal_device_set_send_callback()\n    - mal_src_set_input_sample_rate()\n    - mal_src_set_output_sample_rate()\n  - API CHANGE: Add log level to the log callback. New signature:\n    - void on_log(ma_context* pContext, ma_device* pDevice, ma_uint32 logLevel, const char* message)\n  - API CHANGE: Changes to result codes. Constants have changed and unused codes have been removed. If you're\n    a binding mainainer you will need to update your result code constants.\n  - API CHANGE: Change the order of the ma_backend enums to priority order. If you are a binding maintainer, you\n    will need to update.\n  - API CHANGE: Rename mal_dsp to ma_pcm_converter. All functions have been renamed from mal_dsp_*() to\n    ma_pcm_converter_*(). All structures have been renamed from mal_dsp* to ma_pcm_converter*.\n  - API CHANGE: Reorder parameters of ma_decoder_read_pcm_frames() to be consistent with the new parameter order scheme.\n  - The resampling algorithm has been changed from sinc to linear. The rationale for this is that the sinc implementation\n    is too inefficient right now. This will hopefully be improved at a later date.\n  - Device initialization will no longer fall back to shared mode if exclusive mode is requested but is unusable.\n    With this change, if you request an device in exclusive mode, but exclusive mode is not supported, it will not\n    automatically fall back to shared mode. The client will need to reinitialize the device in shared mode if that's\n    what they want.\n  - Add ring buffer API. This is ma_rb and ma_pcm_rb, the difference being that ma_rb operates on bytes and\n    ma_pcm_rb operates on PCM frames.\n  - Add Web Audio backend. This is used when compiling with Emscripten. The SDL backend, which was previously\n    used for web support, will be removed in a future version.\n  - Add AAudio backend (Android Audio). This is the new priority backend for Android. Support for AAudio starts\n    with Android 8. OpenSL|ES is used as a fallback for older versions of Android.\n  - Remove OpenAL and SDL backends.\n  - Fix a possible deadlock when rapidly stopping the device after it has started.\n  - Update documentation.\n  - Change licensing to a choice of public domain _or_ MIT-0 (No Attribution).\n\nv0.8.14 - 2018-12-16\n  - Core Audio: Fix a bug where the device state is not set correctly after stopping.\n  - Add support for custom weights to the channel router.\n  - Update decoders to use updated APIs in dr_flac, dr_mp3 and dr_wav.\n\nv0.8.13 - 2018-12-04\n  - Core Audio: Fix a bug with channel mapping.\n  - Fix a bug with channel routing where the back/left and back/right channels have the wrong weight.\n\nv0.8.12 - 2018-11-27\n  - Drop support for SDL 1.2. The Emscripten build now requires \"-s USE_SDL=2\".\n  - Fix a linking error with ALSA.\n  - Fix a bug on iOS where the device name is not set correctly.\n\nv0.8.11 - 2018-11-21\n  - iOS bug fixes.\n  - Minor tweaks to PulseAudio.\n\nv0.8.10 - 2018-10-21\n  - Core Audio: Fix a hang when uninitializing a device.\n  - Fix a bug where an incorrect value is returned from ma_device_stop().\n\nv0.8.9 - 2018-09-28\n  - Fix a bug with the SDL backend where device initialization fails.\n\nv0.8.8 - 2018-09-14\n  - Fix Linux build with the ALSA backend.\n  - Minor documentation fix.\n\nv0.8.7 - 2018-09-12\n  - Fix a bug with UWP detection.\n\nv0.8.6 - 2018-08-26\n  - Automatically switch the internal device when the default device is unplugged. Note that this is still in the\n    early stages and not all backends handle this the same way. As of this version, this will not detect a default\n    device switch when changed from the operating system's audio preferences (unless the backend itself handles\n    this automatically). This is not supported in exclusive mode.\n  - WASAPI and Core Audio: Add support for stream routing. When the application is using a default device and the\n    user switches the default device via the operating system's audio preferences, miniaudio will automatically switch\n    the internal device to the new default. This is not supported in exclusive mode.\n  - WASAPI: Add support for hardware offloading via IAudioClient2. Only supported on Windows 8 and newer.\n  - WASAPI: Add support for low-latency shared mode via IAudioClient3. Only supported on Windows 10 and newer.\n  - Add support for compiling the UWP build as C.\n  - mal_device_set_recv_callback() and mal_device_set_send_callback() have been deprecated. You must now set this\n    when the device is initialized with mal_device_init*(). These will be removed in version 0.9.0.\n\nv0.8.5 - 2018-08-12\n  - Add support for specifying the size of a device's buffer in milliseconds. You can still set the buffer size in\n    frames if that suits you. When bufferSizeInFrames is 0, bufferSizeInMilliseconds will be used. If both are non-0\n    then bufferSizeInFrames will take priority. If both are set to 0 the default buffer size is used.\n  - Add support for the audio(4) backend to OpenBSD.\n  - Fix a bug with the ALSA backend that was causing problems on Raspberry Pi. This significantly improves the\n    Raspberry Pi experience.\n  - Fix a bug where an incorrect number of samples is returned from sinc resampling.\n  - Add support for setting the value to be passed to internal calls to CoInitializeEx().\n  - WASAPI and WinMM: Stop the device when it is unplugged.\n\nv0.8.4 - 2018-08-06\n  - Add sndio backend for OpenBSD.\n  - Add audio(4) backend for NetBSD.\n  - Drop support for the OSS backend on everything except FreeBSD and DragonFly BSD.\n  - Formats are now native-endian (were previously little-endian).\n  - Mark some APIs as deprecated:\n    - mal_src_set_input_sample_rate() and mal_src_set_output_sample_rate() are replaced with mal_src_set_sample_rate().\n    - mal_dsp_set_input_sample_rate() and mal_dsp_set_output_sample_rate() are replaced with mal_dsp_set_sample_rate().\n  - Fix a bug when capturing using the WASAPI backend.\n  - Fix some aliasing issues with resampling, specifically when increasing the sample rate.\n  - Fix warnings.\n\nv0.8.3 - 2018-07-15\n  - Fix a crackling bug when resampling in capture mode.\n  - Core Audio: Fix a bug where capture does not work.\n  - ALSA: Fix a bug where the worker thread can get stuck in an infinite loop.\n  - PulseAudio: Fix a bug where mal_context_init() succeeds when PulseAudio is unusable.\n  - JACK: Fix a bug where mal_context_init() succeeds when JACK is unusable.\n\nv0.8.2 - 2018-07-07\n  - Fix a bug on macOS with Core Audio where the internal callback is not called.\n\nv0.8.1 - 2018-07-06\n  - Fix compilation errors and warnings.\n\nv0.8 - 2018-07-05\n  - Changed MA_IMPLEMENTATION to MINI_AL_IMPLEMENTATION for consistency with other libraries. The old\n    way is still supported for now, but you should update as it may be removed in the future.\n  - API CHANGE: Replace device enumeration APIs. mal_enumerate_devices() has been replaced with\n    mal_context_get_devices(). An additional low-level device enumration API has been introduced called\n    mal_context_enumerate_devices() which uses a callback to report devices.\n  - API CHANGE: Rename mal_get_sample_size_in_bytes() to mal_get_bytes_per_sample() and add\n    mal_get_bytes_per_frame().\n  - API CHANGE: Replace mal_device_config.preferExclusiveMode with ma_device_config.shareMode.\n    - This new config can be set to mal_share_mode_shared (default) or ma_share_mode_exclusive.\n  - API CHANGE: Remove excludeNullDevice from mal_context_config.alsa.\n  - API CHANGE: Rename MA_MAX_SAMPLE_SIZE_IN_BYTES to MA_MAX_PCM_SAMPLE_SIZE_IN_BYTES.\n  - API CHANGE: Change the default channel mapping to the standard Microsoft mapping.\n  - API CHANGE: Remove backend-specific result codes.\n  - API CHANGE: Changes to the format conversion APIs (mal_pcm_f32_to_s16(), etc.)\n  - Add support for Core Audio (Apple).\n  - Add support for PulseAudio.\n    - This is the highest priority backend on Linux (higher priority than ALSA) since it is commonly\n      installed by default on many of the popular distros and offer's more seamless integration on\n      platforms where PulseAudio is used. In addition, if PulseAudio is installed and running (which\n      is extremely common), it's better to just use PulseAudio directly rather than going through the\n      \"pulse\" ALSA plugin (which is what the \"default\" ALSA device is likely set to).\n  - Add support for JACK.\n  - Remove dependency on asound.h for the ALSA backend. This means the ALSA development packages are no\n    longer required to build miniaudio.\n  - Remove dependency on dsound.h for the DirectSound backend. This fixes build issues with some\n    distributions of MinGW.\n  - Remove dependency on audioclient.h for the WASAPI backend. This fixes build issues with some\n    distributions of MinGW.\n  - Add support for dithering to format conversion.\n  - Add support for configuring the priority of the worker thread.\n  - Add a sine wave generator.\n  - Improve efficiency of sample rate conversion.\n  - Introduce the notion of standard channel maps. Use mal_get_standard_channel_map().\n  - Introduce the notion of default device configurations. A default config uses the same configuration\n    as the backend's internal device, and as such results in a pass-through data transmission pipeline.\n  - Add support for passing in NULL for the device config in mal_device_init(), which uses a default\n    config. This requires manually calling mal_device_set_send/recv_callback().\n  - Add support for decoding from raw PCM data (mal_decoder_init_raw(), etc.)\n  - Make mal_device_init_ex() more robust.\n  - Make some APIs more const-correct.\n  - Fix errors with SDL detection on Apple platforms.\n  - Fix errors with OpenAL detection.\n  - Fix some memory leaks.\n  - Fix a bug with opening decoders from memory.\n  - Early work on SSE2, AVX2 and NEON optimizations.\n  - Miscellaneous bug fixes.\n  - Documentation updates.\n\nv0.7 - 2018-02-25\n  - API CHANGE: Change mal_src_read_frames() and mal_dsp_read_frames() to use 64-bit sample counts.\n  - Add decoder APIs for loading WAV, FLAC, Vorbis and MP3 files.\n  - Allow opening of devices without a context.\n    - In this case the context is created and managed internally by the device.\n  - Change the default channel mapping to the same as that used by FLAC.\n  - Fix build errors with macOS.\n\nv0.6c - 2018-02-12\n  - Fix build errors with BSD/OSS.\n\nv0.6b - 2018-02-03\n  - Fix some warnings when compiling with Visual C++.\n\nv0.6a - 2018-01-26\n  - Fix errors with channel mixing when increasing the channel count.\n  - Improvements to the build system for the OpenAL backend.\n  - Documentation fixes.\n\nv0.6 - 2017-12-08\n  - API CHANGE: Expose and improve mutex APIs. If you were using the mutex APIs before this version you'll\n    need to update.\n  - API CHANGE: SRC and DSP callbacks now take a pointer to a mal_src and ma_dsp object respectively.\n  - API CHANGE: Improvements to event and thread APIs. These changes make these APIs more consistent.\n  - Add support for SDL and Emscripten.\n  - Simplify the build system further for when development packages for various backends are not installed.\n    With this change, when the compiler supports __has_include, backends without the relevant development\n    packages installed will be ignored. This fixes the build for old versions of MinGW.\n  - Fixes to the Android build.\n  - Add mal_convert_frames(). This is a high-level helper API for performing a one-time, bulk conversion of\n    audio data to a different format.\n  - Improvements to f32 -> u8/s16/s24/s32 conversion routines.\n  - Fix a bug where the wrong value is returned from mal_device_start() for the OpenSL backend.\n  - Fixes and improvements for Raspberry Pi.\n  - Warning fixes.\n\nv0.5 - 2017-11-11\n  - API CHANGE: The mal_context_init() function now takes a pointer to a ma_context_config object for\n    configuring the context. The works in the same kind of way as the device config. The rationale for this\n    change is to give applications better control over context-level properties, add support for backend-\n    specific configurations, and support extensibility without breaking the API.\n  - API CHANGE: The alsa.preferPlugHW device config variable has been removed since it's not really useful for\n    anything anymore.\n  - ALSA: By default, device enumeration will now only enumerate over unique card/device pairs. Applications\n    can enable verbose device enumeration by setting the alsa.useVerboseDeviceEnumeration context config\n    variable.\n  - ALSA: When opening a device in shared mode (the default), the dmix/dsnoop plugin will be prioritized. If\n    this fails it will fall back to the hw plugin. With this change the preferExclusiveMode config is now\n    honored. Note that this does not happen when alsa.useVerboseDeviceEnumeration is set to true (see above)\n    which is by design.\n  - ALSA: Add support for excluding the \"null\" device using the alsa.excludeNullDevice context config variable.\n  - ALSA: Fix a bug with channel mapping which causes an assertion to fail.\n  - Fix errors with enumeration when pInfo is set to NULL.\n  - OSS: Fix a bug when starting a device when the client sends 0 samples for the initial buffer fill.\n\nv0.4 - 2017-11-05\n  - API CHANGE: The log callback is now per-context rather than per-device and as is thus now passed to\n    mal_context_init(). The rationale for this change is that it allows applications to capture diagnostic\n    messages at the context level. Previously this was only available at the device level.\n  - API CHANGE: The device config passed to mal_device_init() is now const.\n  - Added support for OSS which enables support on BSD platforms.\n  - Added support for WinMM (waveOut/waveIn).\n  - Added support for UWP (Universal Windows Platform) applications. Currently C++ only.\n  - Added support for exclusive mode for selected backends. Currently supported on WASAPI.\n  - POSIX builds no longer require explicit linking to libpthread (-lpthread).\n  - ALSA: Explicit linking to libasound (-lasound) is no longer required.\n  - ALSA: Latency improvements.\n  - ALSA: Use MMAP mode where available. This can be disabled with the alsa.noMMap config.\n  - ALSA: Use \"hw\" devices instead of \"plughw\" devices by default. This can be disabled with the\n    alsa.preferPlugHW config.\n  - WASAPI is now the highest priority backend on Windows platforms.\n  - Fixed an error with sample rate conversion which was causing crackling when capturing.\n  - Improved error handling.\n  - Improved compiler support.\n  - Miscellaneous bug fixes.\n\nv0.3 - 2017-06-19\n  - API CHANGE: Introduced the notion of a context. The context is the highest level object and is required for\n    enumerating and creating devices. Now, applications must first create a context, and then use that to\n    enumerate and create devices. The reason for this change is to ensure device enumeration and creation is\n    tied to the same backend. In addition, some backends are better suited to this design.\n  - API CHANGE: Removed the rewinding APIs because they're too inconsistent across the different backends, hard\n    to test and maintain, and just generally unreliable.\n  - Added helper APIs for initializing mal_device_config objects.\n  - Null Backend: Fixed a crash when recording.\n  - Fixed build for UWP.\n  - Added support for f32 formats to the OpenSL|ES backend.\n  - Added initial implementation of the WASAPI backend.\n  - Added initial implementation of the OpenAL backend.\n  - Added support for low quality linear sample rate conversion.\n  - Added early support for basic channel mapping.\n\nv0.2 - 2016-10-28\n  - API CHANGE: Add user data pointer as the last parameter to mal_device_init(). The rationale for this\n    change is to ensure the logging callback has access to the user data during initialization.\n  - API CHANGE: Have device configuration properties be passed to mal_device_init() via a structure. Rationale:\n    1) The number of parameters is just getting too much.\n    2) It makes it a bit easier to add new configuration properties in the future. In particular, there's a\n       chance there will be support added for backend-specific properties.\n  - Dropped support for f64, A-law and Mu-law formats since they just aren't common enough to justify the\n    added maintenance cost.\n  - DirectSound: Increased the default buffer size for capture devices.\n  - Added initial implementation of the OpenSL|ES backend.\n\nv0.1 - 2016-10-21\n  - Initial versioned release.\n*/\n\n\n/*\nThis software is available as a choice of the following licenses. Choose\nwhichever you prefer.\n\n===============================================================================\nALTERNATIVE 1 - Public Domain (www.unlicense.org)\n===============================================================================\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\n\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org/>\n\n===============================================================================\nALTERNATIVE 2 - MIT No Attribution\n===============================================================================\nCopyright 2019 David Reid\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n"
  },
  {
    "path": "source-code/source/plugins/DivaSound/src/dllmain.cpp",
    "content": "#include \"framework.h\"\n#include \"PluginConfigApi.h\"\n#include <detours.h>\n#pragma comment(lib, \"detours.lib\")\n\n#include <windows.h>\n#include <iostream>\n#include <vector>\n#include <strsafe.h>\n#include <bassasio.h>\n#include <shellapi.h>\n\nvoid InjectCode(void* address, const std::vector<uint8_t> data)\n{\n\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\tDWORD oldProtect;\n\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\tmemcpy(address, data.data(), byteCount);\n\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n}\n\nvoid NopBytes(void* address, unsigned int num)\n{\n\tstd::vector<uint8_t> newbytes = {};\n\n\tfor (unsigned int i = 0; i < num; ++i) newbytes.push_back(0x90);\n\n\tInjectCode(address, newbytes);\n}\n\nvoid resizeInternalBuffers(int frames)\n{\n\tfloat* oldMixbuffer = divaAudioMixCls->mixbuffer;\n\n\tdivaBufSizeInFrames = frames;\n\n\tdivaAudioMixCls->mixbuffer = (float*)malloc(divaBufSizeInFrames * 4 * 4);\n\tdivaAudioMixCls->mixbuffer_size = divaBufSizeInFrames * 4 * 4;\n\tfree(oldMixbuffer);\n\n\tfor (int i = 0; i < divaAudioMixCls->streamingChannels_len; i++)\n\t{\n\t\tfloat* oldChannelBuffer = divaAudioMixCls->streamingChannels[i].buffer;\n\t\tif (oldChannelBuffer != nullptr)\n\t\t{\n\t\t\tif (divaAudioMixCls->streamingChannels[i].playing == 0)\n\t\t\t{\n\t\t\t\tdivaAudioMixCls->streamingChannels[i].buffer = (float*)malloc(divaBufSizeInFrames * 4 * 4);\n\t\t\t\tdivaAudioMixCls->streamingChannels[i].buffer_size = divaBufSizeInFrames * 4 * 4;\n\t\t\t\tfree(oldChannelBuffer);\n\t\t\t}\n\t\t\telse if (divaAudioMixCls->streamingChannels[i].mutex != nullptr && mtx_lock_0(&divaAudioMixCls->streamingChannels[i].mutex) == 0)\n\t\t\t{\n\t\t\t\tdivaAudioMixCls->streamingChannels[i].buffer = (float*)malloc(divaBufSizeInFrames * 4 * 4);\n\t\t\t\tdivaAudioMixCls->streamingChannels[i].buffer_size = divaBufSizeInFrames * 4 * 4;\n\t\t\t\tfree(oldChannelBuffer);\n\t\t\t\tmtx_unlock(&divaAudioMixCls->streamingChannels[i].mutex);\n\t\t\t\t//printf(\"[DivaSound] %d\\n\", i);\n\t\t\t}\n\t\t}\n\t}\n\tdivaAudCls->buffer_size = divaBufSizeInFrames;\n\n\tprintf(\"[DivaSound] Resized internal buffers to %d frames\\n\", frames);\n}\n\nvoid resizeTestLoop()\n{\n\tbool dir = true;\n\twhile (true)\n\t{\n\t\tSleep(3000);\n\n\t\tif (dir)\n\t\t\tresizeInternalBuffers(divaBufSizeInFrames + 10000);\n\t\telse\n\t\t\tresizeInternalBuffers(divaBufSizeInFrames - 10000);\n\n\t\tdir = !dir;\n\t}\n}\n\n\nvoid stopPlayback()\n{\n\tif (useAsio)\n\t{\n\t\tif (BASS_ASIO_IsStarted()) BASS_ASIO_Stop();\n\t}\n\telse\n\t{\n\t\tif (ma_device_is_started(&device)) ma_device_stop(&device);\n\t}\n}\n\nvoid closeDevice()\n{\n\tstopPlayback();\n\n\tif (useAsio)\n\t{\n\t\tBASS_ASIO_Free();\n\t}\n\telse\n\t{\n\t\tma_device_uninit(&device);\n\t\tma_context_uninit(&context);\n\t}\n}\n\n\nvoid audioCallback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)\n{\n\t(void)pDevice;\n\t(void)pOutput;\n\t(void)pInput;\n\t(void)frameCount;\n\n\tif (divaAudCls->breakDword != 0 || divaAudioMixCls->mixbuffer == nullptr)\n\t{\n\t\tstopPlayback();\n\t\treturn;\n\t}\n\n\tif (frameCount > divaBufSizeInFrames)\n\t{\n\t\tprintf(\"[DivaSound] Warning: PDAFT buffer is too small\\n\");\n\n\t\t// allocate a larger buffer if necessary.\n\t\t// add 128 frames of padding because this isn't normal and we want to avoid it happening again if possible.\n\t\tresizeInternalBuffers(frameCount + 128);\n\t}\n\t\n\tdivaAudioFillbuffer(divaAudioMixCls, (int16_t*)pOutput, frameCount, 0, 0);\n\n\tif (bitDepth > 16) // we should generate the output buffer ourselves\n\t{\n\t\tfloat volumes[4];\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tvolumes[i] = divaAudioMixCls->volume_master * divaAudioMixCls->volume_channels[i];\n\t\t}\n\n\n\t\tint startChannel = 4 - nChannels;\n\n\t\tfor (unsigned int i = 0; i < frameCount; i++)\n\t\t{\n\t\t\tfor (int currentChannel = startChannel; currentChannel < 4; currentChannel++)\n\t\t\t{\n\t\t\t\t// note: currentChannel is for the game's buffer, outputChannel is for our output buffer.\n\t\t\t\t// outputChannel should also be used for volumes.\n\t\t\t\tint outputChannel = currentChannel - startChannel;\n\n\t\t\t\tif (bitDepth == 24) // 24 bit int output\n\t\t\t\t{\n\t\t\t\t\tint32_t out_val = (int32_t)(divaAudioMixCls->mixbuffer[i*4 + currentChannel] * volumes[outputChannel] * 8388607.0f);\n\n\t\t\t\t\tif (out_val > 8388607) out_val = 8388607;\n\t\t\t\t\telse if (out_val < -8388608) out_val = -8388608;\n\n\t\t\t\t\tuint64_t out_pos = (i*nChannels + outputChannel) * 3;\n\n\t\t\t\t\t((byte*)pOutput)[out_pos] = out_val;\n\t\t\t\t\t((byte*)pOutput)[out_pos + 1] = out_val >> 8;\n\t\t\t\t\t((byte*)pOutput)[out_pos + 2] = out_val >> 16;\n\t\t\t\t}\n\n\t\t\t\telse if (bitDepth == 32) // floating point output\n\t\t\t\t{\n\t\t\t\t\t((float*)pOutput)[i*nChannels + outputChannel] = divaAudioMixCls->mixbuffer[i*4 + currentChannel] * volumes[outputChannel];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nDWORD asioCallback(bool input, DWORD channel, void* buffer, DWORD length, void* user)\n{\n\tma_uint32 frames = length * 8 / bitDepth / nChannels;\n\taudioCallback(&device, buffer, NULL, frames);\n\treturn length;\n}\n\n\nvoid asioNotifyProc(DWORD notify, void* user);\n\nbool asioInit(bool enablePanel)\n{\n\tif (BASS_ASIO_Init == NULL)\n\t{\n\t\tprintf(\"[DivaSound] BASS ASIO not loaded...\\n\");\n\t\treturn false;\n\t}\n\n\tif (HIWORD(BASS_ASIO_GetVersion()) != BASSASIOVERSION)\n\t{\n\t\tprintf(\"[DivaSound] Incorrect BASS ASIO version. Use 1.4.0.0.\\n\");\n\t\treturn false;\n\t}\n\n\tif (!BASS_ASIO_Init(asioDevice, BASS_ASIO_THREAD))\n\t{\n\t\tprintf(\"[DivaSound] Failed to initialize device\\n\");\n\t\treturn false;\n\t}\n\n\tif (enablePanel && showAsioPanel) BASS_ASIO_ControlPanel();\n\n\tif (!BASS_ASIO_ChannelEnable(false, 0, (ASIOPROC*)asioCallback, NULL))\n\t{\n\t\tprintf(\"[DivaSound] Failed to enable channels\\n\");\n\t\tBASS_ASIO_Free();\n\t\treturn false;\n\t}\n\tfor (int i = 1; i < nChannels; i++)\n\t{\n\t\tif (!BASS_ASIO_ChannelJoin(false, i, 0))\n\t\t{\n\t\t\tprintf(\"[DivaSound] Failed to enable channels\\n\");\n\t\t\tBASS_ASIO_Free();\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (BASS_ASIO_CheckRate(44100))\n\t\tBASS_ASIO_SetRate(44100);\n\n\tBASS_ASIO_ChannelSetRate(false, 0, 44100);\n\n\tif (bitDepth == 32)\n\t\tBASS_ASIO_ChannelSetFormat(false, 0, BASS_ASIO_FORMAT_FLOAT);\n\telse if (bitDepth == 24)\n\t\tBASS_ASIO_ChannelSetFormat(false, 0, BASS_ASIO_FORMAT_24BIT);\n\telse\n\t\tBASS_ASIO_ChannelSetFormat(false, 0, BASS_ASIO_FORMAT_16BIT);\n\n\tBASS_ASIO_SetNotify((ASIONOTIFYPROC*)asioNotifyProc, NULL);\n\n\treturn true;\n}\n\nvoid asioReinit()\n{\n\tprintf(\"[DivaSound] Reinitialising ASIO device...\\n\");\n\tcloseDevice();\n\n\tif (!asioInit(false)) return;\n\n\tBASS_ASIO_INFO asioInfo;\n\tBASS_ASIO_GetInfo(&asioInfo);\n\tdouble actualRate = BASS_ASIO_GetRate();\n\n\tprintf(\"[DivaSound] Output buffer size: %d (%dms at %dHz)\\n\", asioInfo.bufpref, (int)(asioInfo.bufpref * 1000 / actualRate), (int)actualRate);\n\n\tdivaBufSizeInFrames = (int)(asioInfo.bufpref * 44100 / actualRate);\n\tdivaBufSizeInMilliseconds = divaBufSizeInFrames * 1000 / 44100;\n\tprintf(\"[DivaSound] PDAFT buffer size: %d (%dms at %dHz)\\n\", divaBufSizeInFrames, divaBufSizeInMilliseconds, 44100);\n\n\tresizeInternalBuffers(divaBufSizeInFrames);\n\n\tif (!BASS_ASIO_Start(asioInfo.bufpref, 1))\n\t{\n\t\tprintf(\"[DivaSound] Failed to start playback device\\n\");\n\t\tBASS_ASIO_Free();\n\t\treturn;\n\t}\n\n\tprintf(\"[DivaSound] Started playback\\n\");\n}\n\nvoid asioNotifyProc(DWORD notify, void* user)\n{\n\tif (notify == BASS_ASIO_NOTIFY_RESET)\n\t{\n\t\tstd::thread asioReinitThread(asioReinit);\n\t\tasioReinitThread.join();\n\t}\n}\n\n\nbool maInit()\n{\n\tma_backend backends[] = { maBackend };\n\n\tcontextConfig = ma_context_config_init();\n\tcontextConfig.threadPriority = ma_thread_priority_highest;\n\n\tif (ma_context_init(backends, sizeof(backends) / sizeof(backends[0]), &contextConfig, &context) != MA_SUCCESS) {\n\t\tprintf(\"[DivaSound] Failed to initialize context\\n\");\n\t\treturn false;\n\t}\n\n\n\tdeviceConfig = ma_device_config_init(ma_device_type_playback);\n\tdeviceConfig.playback.channels = nChannels;\n\tdeviceConfig.sampleRate = 44100;\n\tdeviceConfig.bufferSizeInMilliseconds = requestBuffer; // actual result may be larger\n\tdeviceConfig.periods = nPeriods;\n\tdeviceConfig.dataCallback = audioCallback;\n\tdeviceConfig.pUserData = NULL;\n\tdeviceConfig.playback.shareMode = maSharemode;\n\n\tif (bitDepth == 32)\n\t\tdeviceConfig.playback.format = ma_format_f32;\n\telse if (bitDepth == 24)\n\t\tdeviceConfig.playback.format = ma_format_s24;\n\telse\n\t\tdeviceConfig.playback.format = ma_format_s16;\n\n\tif (nChannels == 4)\n\t{\n\t\tdeviceConfig.playback.channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n\t\tdeviceConfig.playback.channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n\t\tdeviceConfig.playback.channelMap[2] = MA_CHANNEL_BACK_LEFT;\n\t\tdeviceConfig.playback.channelMap[3] = MA_CHANNEL_BACK_RIGHT;\n\t}\n\n\n\tif (ma_device_init(&context, &deviceConfig, &device) != MA_SUCCESS) {\n\t\tprintf(\"[DivaSound] Failed to open playback device\\n\");\n\t\tma_context_uninit(&context);\n\t\treturn false;\n\t}\n\t//printf(\"[DivaSound] Opened playback device\\n\");\n\n\treturn true;\n}\n\n\nvoid loadConfig()\n{\n\tnChannels = GetPrivateProfileIntW(L\"general\", L\"channels\", 2, CONFIG_FILE);\n\tif (nChannels != 4) nChannels = 2;\n\n\n\tbitDepth = GetPrivateProfileIntW(L\"general\", L\"bit_depth\", 16, CONFIG_FILE);\n\tif (bitDepth != 32 && bitDepth != 24) bitDepth = 16;\n\n\n\trequestBuffer = GetPrivateProfileIntW(L\"buffer\", L\"buffer_size\", 10, CONFIG_FILE);\n\tif (requestBuffer < 0) requestBuffer = 0;\n\n\n\tnPeriods = GetPrivateProfileIntW(L\"buffer\", L\"periods\", 2, CONFIG_FILE);\n\tif (nPeriods < 1) nPeriods = 1;\n\n\n\tuseOldInit = GetPrivateProfileIntW(L\"general\", L\"alternate_init\", 1, CONFIG_FILE) > 0 ? false : true;\n\n\n\tGetPrivateProfileStringW(L\"general\", L\"backend\", L\"wasapi\", backendName, 32, CONFIG_FILE);\n\tfor (wchar_t& chr : backendName)\n\t\tchr = towlower(chr);\n\n\tuseAsio = false;\n\tmaSharemode = ma_share_mode_shared;\n\n\tif (lstrcmpW(backendName, L\"asio\") == 0)\n\t{\n\t\tStringCchCopyW(backendName, 32, L\"ASIO\");\n\t\tuseAsio = true;\n\t}\n\telse if (lstrcmpW(backendName, L\"directsound\") == 0)\n\t{\n\t\tStringCchCopyW(backendName, 32, L\"DirectSound\");\n\t\tmaBackend = ma_backend_dsound;\n\t}\n\telse if (lstrcmpW(backendName, L\"wasapi_exclusive\") == 0)\n\t{\n\t\tStringCchCopyW(backendName, 32, L\"WASAPI (Exclusive mode)\");\n\t\tmaBackend = ma_backend_wasapi;\n\t\tmaSharemode = ma_share_mode_exclusive;\n\t}\n\telse\n\t{\n\t\tStringCchCopyW(backendName, 32, L\"WASAPI\");\n\t\tmaBackend = ma_backend_wasapi;\n\t}\n\n\n\tif (GetPrivateProfileIntW(L\"asio\", L\"auto_device\", TRUE, CONFIG_FILE))\n\t{\n\t\tasioDevice = -1;\n\t}\n\telse\n\t{\n\t\tasioDevice = GetPrivateProfileIntW(L\"asio\", L\"device\", -1, CONFIG_FILE);\n\t}\n\n\tshowAsioPanel = GetPrivateProfileIntW(L\"asio\", L\"show_config\", 0, CONFIG_FILE) > 0 ? true : false;\n}\n\nvoid hookedAudioInit(initClass *cls, uint64_t unk, uint64_t unk2)\n{\n\t//printf(\"[DivaSound] Loaded\\n\");\n\tprintf(\"[DivaSound] Output config: %S %dch %dbit\\n\", backendName, nChannels, bitDepth);\n\n\tdivaAudCls = cls;\n\tdivaAudCls->breakDword = 0;\n\n\tif (useOldInit)\n\t{\n\t\tprintf(\"[DivaSound] Using old initialisation method\\n\");\n\t\t// let the game set some stuff up\n\t\t// might be necessary sometimes\n\t\tdivaAudioInit(divaAudCls, unk, unk2);\n\t\t//printf(\"[DivaSound] Game audio initialised\\n\");\n\t}\n\telse\n\t{\n\t\t// setup some variables instead of using the original init function\n\t\tdivaAudCls->mixer = new audioMixer();\n\t\tdivaAudCls->mixer->volume_master = 1.0f;\n\t\tdivaAudCls->mixer->volume_channels[0] = 1.0f;\n\t\tdivaAudCls->mixer->volume_channels[1] = 1.0f;\n\t\tdivaAudCls->mixer->volume_channels[2] = 1.0f;\n\t\tdivaAudCls->mixer->volume_channels[3] = 1.0f;\n\t\tdivaAudCls->mixer->audioClass = divaAudCls;\n\n\t\tmtx_init(&divaAudCls->mixer->volume_mutex, 2);\n\t}\n\n\tdivaAudioMixCls = divaAudCls->mixer;\n\t\n\tdivaAudCls->channels = nChannels; // this could replace stereo patch\n\tdivaAudCls->rate = 44100; // really does nothing\n\tdivaAudCls->depth = bitDepth; // setting this to something other than 16 just removes output\n\n\n\tif (useAsio)\n\t{\n\t\tif (!asioInit(true)) return;\n\n\t\tBASS_ASIO_INFO asioInfo;\n\t\tBASS_ASIO_GetInfo(&asioInfo);\n\t\tdouble actualRate = BASS_ASIO_GetRate();\n\n\t\tprintf(\"[DivaSound] Output buffer size: %d (%dms at %dHz)\\n\", asioInfo.bufpref, (int)(asioInfo.bufpref * 1000 / actualRate), (int)actualRate);\n\n\t\tdivaBufSizeInFrames = (int)(asioInfo.bufpref * 44100 / actualRate);\n\t\tdivaBufSizeInMilliseconds = divaBufSizeInFrames * 1000 / 44100;\n\t\tprintf(\"[DivaSound] PDAFT buffer size: %d (%dms at %dHz)\\n\", divaBufSizeInFrames, divaBufSizeInMilliseconds, 44100);\n\n\n\t\tdivaAudioAllocMixer(divaAudioMixCls, unk, unk2, divaBufSizeInFrames);\n\t\tprintf(\"[DivaSound] Created internal audio mixer\\n\");\n\n\t\tif (!BASS_ASIO_Start(asioInfo.bufpref, 1))\n\t\t{\n\t\t\tprintf(\"[DivaSound] Failed to start playback device\\n\");\n\t\t\tBASS_ASIO_Free();\n\t\t\treturn;\n\t\t}\n\n\t\tprintf(\"[DivaSound] Started playback\\n\");\n\t}\n\telse\n\t{\n\t\tif (!maInit()) return;\n\n\t\tif (device.playback.internalSampleRate)\n\t\t{\n\t\t\tmaInternalBufferSizeInMilliseconds = device.playback.internalBufferSizeInFrames * 1000 / device.playback.internalSampleRate; // because miniaudio doesn't seem to have this\n\t\t\tprintf(\"[DivaSound] Output buffer size: %d (%dms at %dHz)\\n\", device.playback.internalBufferSizeInFrames, maInternalBufferSizeInMilliseconds, device.playback.internalSampleRate);\n\t\t\tprintf(\"[DivaSound] Buffer periods: %d\\n\", device.playback.internalPeriods);\n\n\t\t\tdivaBufSizeInFrames = device.playback.internalBufferSizeInFrames * device.sampleRate / device.playback.internalSampleRate; // +128; // 128 is just a bit extra in case resampling needs it or something. idk\n\t\t\tdivaBufSizeInMilliseconds = divaBufSizeInFrames * 1000 / device.sampleRate;\n\t\t\tprintf(\"[DivaSound] PDAFT buffer size: %d (%dms at %dHz)\\n\", divaBufSizeInFrames, divaBufSizeInMilliseconds, device.sampleRate);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprintf(\"[DivaSound] Unable to determine output sample rate. Assuming 44100Hz.\\n\");\n\n\t\t\tmaInternalBufferSizeInMilliseconds = device.playback.internalBufferSizeInFrames * 1000 / 44100; // because miniaudio doesn't seem to have this\n\t\t\tprintf(\"[DivaSound] Output buffer size: %d (%dms at %dHz)\\n\", device.playback.internalBufferSizeInFrames, maInternalBufferSizeInMilliseconds, 44100);\n\t\t\tprintf(\"[DivaSound] Buffer periods: %d\\n\", device.playback.internalPeriods);\n\n\t\t\tdivaBufSizeInFrames = device.playback.internalBufferSizeInFrames * device.sampleRate / 44100;\n\t\t\tdivaBufSizeInMilliseconds = divaBufSizeInFrames * 1000 / device.sampleRate;\n\t\t\tprintf(\"[DivaSound] PDAFT buffer size: %d (%dms at %dHz)\\n\", divaBufSizeInFrames, divaBufSizeInMilliseconds, device.sampleRate);\n\t\t}\n\n\n\t\tdivaAudioAllocMixer(divaAudioMixCls, unk, unk2, divaBufSizeInFrames);\n\t\tprintf(\"[DivaSound] Created internal audio mixer\\n\");\n\n\n\t\tif (ma_device_start(&device) != MA_SUCCESS) {\n\t\t\tprintf(\"[DivaSound] Failed to start playback device\\n\");\n\t\t\tma_device_uninit(&device);\n\t\t\tma_context_uninit(&context);\n\t\t\treturn;\n\t\t}\n\t\tprintf(\"[DivaSound] Started playback\\n\");\n\t}\n\n\tdivaAudCls->hCallback = new HANDLE();\n\t*divaAudCls->hCallback = (HANDLE)1; // this *should* be an actual thread handle, but I bypassed the destruction stuff anyway lol\n\n\tdivaAudCls->buffer_size = divaBufSizeInFrames;\n\t//loopThread = std::thread(resizeTestLoop);\n}\n\n\nBOOL APIENTRY DllMain(HMODULE hModule,\n\tDWORD  ul_reason_for_call,\n\tLPVOID lpReserved\n)\n{\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\tloadConfig();\n\n\t\tif (useOldInit)\n\t\t{\n\t\t\t // these patches are only needed if calling the game's own init function\n\t\t\t // they shouldn't be necessary anymore\n\n\t\t\t// force stereo mode\n\t\t\tInjectCode((void*)0x0000000140A860C0, { 0x02 });\n\n\t\t\t// remove a call to get device info and skip the check for it\n\t\t\tNopBytes((void*)0x140626b56, 7);\n\t\t\tNopBytes((void*)0x140626b8a, 8);\n\t\t\tInjectCode((void*)0x140626b8a, { 0x48, 0x83, 0xEF, 0x18 }); // fix value of RDI because I changed the flow here\n\t\t\tNopBytes((void*)0x140626ba9, 11);\n\n\t\t\t// return from the original init early\n\t\t\tInjectCode((void*)0x0000000140626C29, { 0x48, 0xE9 });\n\t\t}\n\n\t\t// skip some thread deinitialisation stuff I don't care about\n\t\tInjectCode((void*)0x0000000140625F42, { 0xEB, 0x29 });\n    \n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaAudioInit, (PVOID)hookedAudioInit);\n\t\tDetourTransactionCommit();\n\t}\n\telse if (ul_reason_for_call == DLL_PROCESS_DETACH)\n\t{\n\t\tcloseDevice();\n\t}\n\treturn TRUE;\n}\n\n\nusing namespace PluginConfig;\n\nvoid OpenWiki()\n{\n\tShellExecuteW(NULL, L\"open\", L\"https://github.com/somewhatlurker/DivaSound/wiki\", NULL, NULL, SW_SHOW);\n}\n\nPluginConfigOption config[] = {\n\t{ CONFIG_DROPDOWN_TEXT, new PluginConfigDropdownTextData{L\"backend\", L\"general\", CONFIG_FILE, L\"Backend:\", L\"Sets the audio output protocol.\", L\"WASAPI\", std::vector<LPCWSTR>({ L\"WASAPI\", L\"WASAPI_Exclusive\" }), true, false } },\n\t{ CONFIG_DROPDOWN_NUMBER, new PluginConfigDropdownNumberData{ L\"channels\", L\"general\", CONFIG_FILE, L\"Channels:\", L\"Sets the number of channels.\", 2, std::vector<int>({ 2, 4 }), false } },\n\t{ CONFIG_DROPDOWN_NUMBER, new PluginConfigDropdownNumberData{ L\"bit_depth\", L\"general\", CONFIG_FILE, L\"Bit Depth:\", L\"Sets the audio sample format.\\n(32 uses floating point samples)\", 16, std::vector<int>({ 16, 24, 32 }), false } },\n\t{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"alternate_init\", L\"general\", CONFIG_FILE, L\"Use new init\", L\"Use the full initialisation replacement.\\nTry unchecking this if DivaSound seems to cause crashes.\", true, false } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 8 } },\n\t{ CONFIG_GROUP_START, new PluginConfigGroupData{ L\"WASAPI Buffer Settings\", 75 } },\n\t{ CONFIG_NUMERIC, new PluginConfigNumericData{ L\"buffer_size\", L\"buffer\", CONFIG_FILE, L\"Target Buffer Size:\", L\"Sets the target buffer size in ms.\\nWASAPI will often ignore this and adapt to your hardware config automatically.\", 10, 1, 100 } },\n\t{ CONFIG_NUMERIC, new PluginConfigNumericData{ L\"periods\", L\"buffer\", CONFIG_FILE, L\"Buffer Periods:\", L\"Sets how often the buffer should be filled.\\nFewer periods usually allows for lower latency, but lowering this may cause issues.\", 2, 1, 8 } },\n\t{ CONFIG_GROUP_END, NULL },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 8 } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 0 } }, // 0px spacers are placeholders for ASIO config\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 0 } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 0 } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 0 } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 0 } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 0 } },\n\t{ CONFIG_BUTTON, new PluginConfigButtonData{ L\"Help\", L\"Get help on the DivaSound wiki.\", OpenWiki } },\n\t{ CONFIG_SPACER, new PluginConfigSpacerData{ 8 } },\n};\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"DivaSound\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"DivaSound Plugin by somewhatlurker\\n\\nDivaSound replaces the game's original audio output,\\nimproving device support and adding configurable options.\";\n}\n\nextern \"C\" __declspec(dllexport) PluginConfigArray GetPluginOptions(void)\n{\n\tif (BASS_ASIO_GetDeviceInfo != NULL && BASS_ASIO_SetUnicode != NULL)\n\t{\n\t\tif (BASS_ASIO_SetUnicode(true)) // ensure strings are UTF-16\n\t\t{\n\t\t\tstd::vector<LPCWSTR> devices;\n\t\t\tBASS_ASIO_DEVICEINFO info;\n\t\t\tfor (int i = 0; BASS_ASIO_GetDeviceInfo(i, &info); i++)\n\t\t\t{\n\t\t\t\tdevices.push_back(_wcsdup((WCHAR*)info.name));\n\t\t\t}\n\n\t\t\t// make sure user-set device isn't out of bounds\n\t\t\tint asioDevice = GetPrivateProfileIntW(L\"asio\", L\"device\", -1, CONFIG_FILE);\n\t\t\twhile (asioDevice + 1 > devices.size())\n\t\t\t{\n\t\t\t\tdevices.push_back(L\"---\");\n\t\t\t}\n\n\t\t\tif (devices.size() > 0)\n\t\t\t{\n\t\t\t\t((PluginConfigDropdownTextData*)config[0].data)->valueStrings.push_back(L\"ASIO\");\n\n\t\t\t\tconst int cfgPos = 10;\n\t\t\t\tdelete config[cfgPos].data;\n\t\t\t\tdelete config[cfgPos + 1].data;\n\t\t\t\tdelete config[cfgPos + 2].data;\n\t\t\t\tdelete config[cfgPos + 3].data;\n\t\t\t\tdelete config[cfgPos + 4].data;\n\t\t\t\tdelete config[cfgPos + 5].data;\n\n\t\t\t\tconfig[cfgPos] = { CONFIG_GROUP_START, new PluginConfigGroupData{ L\"ASIO Settings\", 90 } };\n\t\t\t\tconfig[cfgPos + 1] = { CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"show_config\", L\"asio\", CONFIG_FILE, L\"Show ASIO config\", L\"Show the ASIO driver config window when the game opens.\\nUse this to adjust output settings, then disable it.\\n(ASIO devices are unaffected by the normal buffer settings)\", false, false } };\n\t\t\t\tconfig[cfgPos + 2] = { CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"auto_device\", L\"asio\", CONFIG_FILE, L\"Automatic ASIO device\", L\"Automatically choose the first available device for ASIO backend.\\nDisable this to use a manually choose a device.\", true, false } };\n\t\t\t\tconfig[cfgPos + 3] = { CONFIG_DROPDOWN_INDEX, new PluginConfigDropdownIndexData{ L\"device\", L\"asio\", CONFIG_FILE, L\"ASIO Device:\", L\"Sets the ASIO device.\\nMake sure automatic device selection is turned off to enable this.\", 0, devices } };\n\t\t\t\tconfig[cfgPos + 4] = { CONFIG_GROUP_END, NULL };\n\t\t\t\tconfig[cfgPos + 5] = { CONFIG_SPACER, new PluginConfigSpacerData{ 8 } };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn PluginConfigArray{ _countof(config), config };\n}"
  },
  {
    "path": "source-code/source/plugins/DivaSound/src/framework.h",
    "content": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n#include <string>\n#include <vector>\n#include <thread>\n#define MINIAUDIO_IMPLEMENTATION\n#include <miniaudio.h>\n#include <bassasio.h>\n#include <mmdeviceapi.h>\n#include <audioclient.h>\n\nvoid (*divaAudioInit)(void* cls, uint64_t unk, uint64_t unk2) = (void(*)(void* cls, uint64_t unk, uint64_t unk2))0x1406269F0;\n\nvoid (*divaAudioFillbuffer)(void* mixer, int16_t* buf, uint64_t nFrames, bool disableHpVol, bool invertPhase) = (void(*)(void* mixer, int16_t* buf, uint64_t nFrames, bool disableHpVol, bool invertPhase))0x140627370;\n// mixer is a pointer to an audioMixer (from audio init's cls + 0x70)\n// disableHpVol uses speaker volume for headphones (only works in 4ch mode)\n// invertPhase inverts the output signal (only works if disableHpVol == false)\n\nint (*divaAudioAllocMixer)(void* cls, uint64_t unk, uint64_t unk2, int64_t nFrames) = (int(*)(void* cls, uint64_t unk, uint64_t unk2, int64_t nFrames))0x140626710;\n// unks are the same as from the init call. they seem to set the internal mixing channel counts(?) \n// cls is the same as mixer in divaAudioFillbuffer\n// nFrames is number of audio frames to hold in the mixing buffers (only used when divaAudioFillbuffer is called). Internally this is multiplied by 16 (buffers are built using 32bit floats)\n\nint(*mtx_init)(void* mutex, int type) = (int(*)(void* mutex, int type))0x14081DEF4;\nint(*mtx_lock_0)(void* mutex) = (int(*)(void* mutex))0x14081DF50;\nint(*mtx_unlock)(void* mutex) = (int(*)(void* mutex))0x14081DFD4;\n\ntypedef void streamingCallback(float* buffer, int64_t nFrames, void* userdata);\n\n#pragma pack(push, 1)\nstruct initClass; // define these earlier so they can be used in other structs\nstruct audioMixer;\n\n// known streaming channel variables\n// + 0x00 = pointer to mixer class\n// + 0x08 = buffer pointer (float)\n// + 0x10 = buffer size (frame count * 16)\n// + 0x18 = playing (32 bits, set to 0 for pause)\n// + 0x1c = reset (32 bits, set to 0 to kill channel)\n// + 0x20 = mutex pointer\n// + 0x28 = master volume float (multiply other volumes by this)\n// + 0x2c = ch1 volume\n// + 0x30 = ch2 volume\n// + 0x34 = ch3 volume\n// + 0x38 = ch4 volume\n//\n// + 0x40 = callback func\n// + 0x48 = callback userdata pointer\nstruct streamingChannel {\n\taudioMixer* mixer;\n\n\tfloat* buffer;\n\tuint64_t buffer_size; // in bytes\n\n\tuint32_t playing; // set to 0 for pause (usually ==1)\n\tuint32_t reset; // set to 1 to kill (usually ==0)\n\n\tvoid* mutex;\n\n\tfloat volume_master;\n\tfloat volume_channels[4];\n\tbyte padding3c[0x4];\n\n\tstreamingCallback callback;\n\tvoid* userdata;\n};\n\n// known SE channel variables\n// + 0x00 = pointer to mixer class\n// + 0x08 = some kind of toggle (is playing)?\n\n// + 0x10 = mutex pointer\n// + 0x18 = master volume float (multiply other volumes by this)\n// + 0x1c = ch1 volume\n// + 0x20 = ch2 volume\n// + 0x24 = ch3 volume\n// + 0x28 = ch4 volume\n\n// + 0x30 = buffer pointer (float)\n// + 0x38 = buffer size????? (frame count * 16)??? (buffers seem to hold whole sounds)\n// + 0x40 = num channels\n// + 0x48 = num frames\n// + 0x50 = sample rate???\n// + 0x58 = loop start frame???\n// + 0x60 = loop end frame???\n// + 0x68 = current playback time\nstruct seChannel {\n\taudioMixer* mixer;\n\n\tuint32_t unk1; // toggle on/off?\n\tbyte padding0c[0x4];\n\n\tvoid* mutex;\n\n\tfloat volume_master;\n\tfloat volume_channels[4];\n\tbyte padding2c[0x4];\n\n\tfloat* buffer;\n\tbyte padding38[0x8]; // probably buffer size\n\n\tint64_t nChannels; // seems to affect mapping\n\n\tuint64_t length; // in frames\n\tbyte padding50[0x8]; // sample rate?\n\tuint64_t loop_start; // ?\n\tuint64_t loop_end; // ?\n\tuint64_t curTime;\n};\n\n// known internal audio mixer variables (used by divaAudioFillbuffer and divaAudioAllocMixer)\n// cls + 0x00 = pointer to main audio/init class\n// cls + 0x08 = SE channels pointer\n// cls + 0x10 = SE channels count\n// cls + 0x18 = streaming channels pointer\n// cls + 0x20 = streaming channels count\n// cls + 0x28 = mixing buffer pointer (when a buffer is generated, this is filled with 32bit floats (four per frame)\n// cls + 0x30 = mixing buffer size (frame count * 16)\n//\n// cls + 0x38 = mutex lock for volume\n// cls + 0x40 = master volume float (multiply other volumes by this)\n// cls + 0x44 = ch1 volume\n// cls + 0x48 = ch2 volume\n// cls + 0x4c = ch3 volume\n// cls + 0x50 = ch4 volume\nstruct audioMixer {\n\tinitClass* audioClass;\n\n\tseChannel* seChannels;\n\tuint64_t seChannels_len;\n\tstreamingChannel* streamingChannels;\n\tuint64_t streamingChannels_len;\n\n\tfloat* mixbuffer;\n\tuint64_t mixbuffer_size;\n\n\tvoid* volume_mutex; // not sure if this is pointer or not\n\tfloat volume_master;\n\tfloat volume_channels[4];\n\n\tbyte padding54[4];\n};\n\n// known main/init audio class variables (used by divaAudioInit)\n// cls + 0x0 = WAVEFORMATEXTENSIBLE wave_format (null with old method) (length 0x28)\n// cls + 0x28 = IMMDeviceEnumerator *pEnumerator\n// cls + 0x30 = IMMDevice *pDevice (default device)\n// cls + 0x38 = IAudioClient *pAudioClient\n//\n// cls + 0x40 = buffer size in frames\n//\n// cls + 0x48 = IAudioRenderClient *pRenderClient\n//\n// cls + 0x50 = HANDLE hEvent (for original WASAPI buffer timing)\n//\n// cls + 0x58 = number of output channels\n// cls + 0x60 = audio sample rate\n// cls + 0x68 = audio bit depth (only 16bit works)\n//\n// cls + 0x70 = pointer to mixer class\n//\n// cls + 0x78 = HANDLE* hCallback (handle to original callback thread)\n//\n// cls + 0x80 = break flag dword (becomes 1 on exit)\nstruct initClass {\n\tWAVEFORMATEXTENSIBLE wave_format;\n\tIMMDeviceEnumerator *pEnumerator;\n\tIMMDevice *pDevice;\n\tIAudioClient *pAudioClient;\n\n\n\tuint64_t buffer_size;\n\n\tIAudioRenderClient *pRenderClient;\n\tHANDLE hEvent;\n\n\tuint64_t channels;\n\tuint64_t rate; // should always =44100\n\tuint64_t depth; // should always =16\n\n\taudioMixer* mixer;\n\t\n\tHANDLE* hCallback;\n\tint32_t breakDword;\n};\n#pragma pack(pop)\n\n\ninitClass *divaAudCls;\naudioMixer *divaAudioMixCls;\n\nstd::thread loopThread;\n\nma_context_config contextConfig;\nma_context context;\nma_device_config deviceConfig;\nma_device device;\n\nint maInternalBufferSizeInMilliseconds;\nint divaBufSizeInFrames;\nint divaBufSizeInMilliseconds;\n\nint nChannels; // this can only be 2 or 4\nint bitDepth; // signed 16/24 bit integer or 32 bit float\nint requestBuffer;\nint nPeriods;\nwchar_t backendName[32]; // wasapi or directsound\nma_backend maBackend;\nma_share_mode maSharemode;\nbool useAsio;\nint asioDevice;\nbool showAsioPanel;\n\nbool useOldInit;\n\nstd::wstring ExePath() {\n\tWCHAR buffer[MAX_PATH];\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\treturn std::wstring(buffer);\n}\n\nstd::wstring DirPath() {\n\tstd::wstring exepath = ExePath();\n\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\n\treturn exepath.substr(0, pos);\n}\n\nstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\DivaSound.ini\";\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();"
  },
  {
    "path": "source-code/source/plugins/DivaWig/DivaWig.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}</ProjectGuid>\n    <RootNamespace>DivaWig</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>detours.lib;evr.lib;mfplat.lib;mfuuid.lib;strmiids.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalDependencies>detours.lib;evr.lib;mfplat.lib;mfuuid.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"PluginConfigApi.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DivaWig/DivaWig.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"PluginConfigApi.h\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/DivaWig/PluginConfigApi.h",
    "content": "#pragma once\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n#include <windows.h>\n#include <vector>\n\n// resolution class to store and sort the width and height easily\nclass resolution\n{\npublic:\n\tunsigned int width;\n\tunsigned int height;\n\n\tresolution()\n\t{\n\t\twidth = 0;\n\t\theight = 0;\n\t}\n\n\tresolution(unsigned int width, unsigned int height)\n\t{\n\t\tresolution::width = width;\n\t\tresolution::height = height;\n\t}\n\n\tbool operator ==(const resolution &res2)\n\t{\n\t\treturn width == res2.width && height == res2.height;\n\t}\n\n\t// in comparisons width takes priority because it's usually displayed first\n\tbool operator <(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height < res2.height;\n\t\telse\n\t\t\treturn width < res2.width;\n\t}\n\tbool operator >(const resolution &res2)\n\t{\n\t\tif (width == res2.width)\n\t\t\treturn height > res2.height;\n\t\telse\n\t\t\treturn width > res2.width;\n\t}\n};\n\nnamespace PluginConfig\n{\n#pragma pack(push, 1)\n\tenum ConfigType {\n\t\tCONFIG_BOOLEAN,\n\t\tCONFIG_NUMERIC,\n\t\tCONFIG_STRING,\n\t\tCONFIG_DROPDOWN_INDEX,\n\t\tCONFIG_DROPDOWN_TEXT,\n\t\tCONFIG_DROPDOWN_NUMBER,\n\t\tCONFIG_RESOLUTION,\n\t\tCONFIG_GROUP_START,\n\t\tCONFIG_GROUP_END,\n\t\tCONFIG_BUTTON,\n\t\tCONFIG_SPACER\n\t};\n\n\tstruct PluginConfigBooleanData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tbool defaultVal;\n\t\tbool saveAsString;\n\t};\n\n\tstruct PluginConfigNumericData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tint minVal;\n\t\tint maxVal;\n\t};\n\n\tstruct PluginConfigStringData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownIndexData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t};\n\n\tstruct PluginConfigDropdownTextData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tLPCWSTR defaultVal;\n\t\tstd::vector<LPCWSTR> valueStrings;\n\t\tbool editable;\n\t\tbool useUtf8;\n\t};\n\n\tstruct PluginConfigDropdownNumberData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tint defaultVal;\n\t\tstd::vector<int> valueInts;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigResolutionData {\n\t\tLPCWSTR iniVarName;\n\t\tLPCWSTR iniVarName2;\n\t\tLPCWSTR iniSectionName;\n\t\tLPCWSTR iniFilePath;\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tresolution defaultVal;\n\t\tstd::vector<resolution> valueResolutions;\n\t\tbool editable;\n\t};\n\n\tstruct PluginConfigGroupData\n\t{\n\t\tLPCWSTR name;\n\t\tint height;\n\t};\n\n\tstruct PluginConfigButtonData {\n\t\tLPCWSTR friendlyName;\n\t\tLPCWSTR description;\n\t\tvoid(*func)();\n\t};\n\n\tstruct PluginConfigSpacerData {\n\t\tint height;\n\t};\n\n\tstruct PluginConfigOption\n\t{\n\t\tConfigType cfgType;\n\t\tvoid* data;\n\t};\n\n\tstruct PluginConfigArray\n\t{\n\t\tint len;\n\t\tPluginConfigOption* options;\n\t};\n#pragma pack(pop)\n}"
  },
  {
    "path": "source-code/source/plugins/DivaWig/dllmain.cpp",
    "content": "#include \"framework.h\"\n#include \"PluginConfigApi.h\"\n#include <detours.h>\n#include <string>\n#include <iostream>\n#include <windows.h>\n#include <tchar.h>\n#include <thread>\n\nstatic const enum module_part\n{\n\tHEAD_ACCESSORY,\n\tHAIR,\n\tUNKNOWN_1,\n\tUNKNOWN_2,\n\tFACE_ACCESSORY,\n\tUNKNOWN_3,\n\tFACE_TEXTURES,\n\tUNKNOWN_4,\n\tCHEST_ACCESSORY,\n\tUNKNOWN_5,\n\tBODY,\n\tUNKNOWN_6,\n\tUNKNOWN_7,\n\tUNKNOWN_8,\n\tHANDS,\n\tUNKNOWN_9,\n\tBACK_ACCESSORY,\n\tUNKNOWN_10,\n\tUNKNOWN_11,\n\tUNKNOWN_12,\n\tUNKNOWN_13,\n\tUNKNOWN_14,\n\tUNKNOWN_15,\n\tUNKNOWN_16,\n\tHEAD,\n\tALL = -1,\n\tNONE = -2\n};\n\nusing namespace std;\n\nvoid(__cdecl* originalWig)(void* cls, uint64_t unk, uint64_t unk2) = (void(__cdecl*)(void* cls, uint64_t unk, uint64_t unk2))0x14052AD90;\nvoid(__cdecl* originalSec)(unsigned int* a1, unsigned int module_part) = (void(__cdecl*)(unsigned int* a1, unsigned int module_part))0x14052ADF0;\nvoid(__cdecl* originalThi)(unsigned int* a1, unsigned int module_part) = (void(__cdecl*)(unsigned int* a1, unsigned int module_part))0x140521FA0;\nvoid(__cdecl* pvTimerUpdate)(__int64 a1) = (void(__cdecl*)(__int64 a1))0x1405BDF90;\nvoid(__cdecl* unloadFunc)(uint64_t* classp, unsigned int unk, __int64 performer) = (void(__cdecl*)(uint64_t * classp, unsigned int unk, __int64 performer))0x14052F720;\nvoid(__cdecl* loadFunc)(uint64_t* classp, unsigned int unk, __int64 performer) = (void(__cdecl*)(uint64_t * classp, unsigned int unk, __int64 performer))0x14052FC00;\n\nconst string Strings[25] = { \"Head accessory\", \"Hair\", \"Unknown 1\", \"Unknown 2\", \"Face accessory\", \"Unknown 3\", \"Face textures\", \"Unknown 4\", \"Chest accessory\", \"Unknown 5\", \"Body\", \"Unknown 6\", \"Unknown 7\", \"Unknown 8\", \"Hands\", \"Unknown 9\", \"Back accessory\", \"Unknown 10\", \"Unknown 11\", \"Unknown 12\", \"Unknown 13\", \"Unknown 14\", \"Unknown 15\", \"Unknown 16\", \"Head\" };\nchar part_to_update = -1;\n\n/*uint64_t *last_unload_a1 = 0, *last_reload_a1 = 0;\nunsigned int last_unload_a2 = 0, last_reload_a2 = 0;\n__int64 last_unload_a3 = 0, last_reload_a3 = 0;*/\n\nbool dobeep = true, allowReloading = true, debug = false;\n\nvoid loadConfig()\n{\n\tdobeep = GetPrivateProfileIntW(L\"general\", L\"beep\", 1, CONFIG_FILE) > 0 ? true : false;\n\tallowReloading = GetPrivateProfileIntW(L\"general\", L\"reloading\", 0, CONFIG_FILE) > 0 ? true : false;\n\tdebug = GetPrivateProfileIntW(L\"general\", L\"debug\", 0, CONFIG_FILE) > 0 ? true : false;\n\n\treturn;\n}\n\nvoid setPartToUpdate(char part, string message, unsigned short beepfreq)\n{\n\tpart_to_update = part;\n\tcout << \"[DivaWig] \" << message << endl;\n\tif (dobeep) Beep(beepfreq, 300);\n\n\tthis_thread::sleep_for(chrono::seconds(1));\n}\n\nvoid unloadAll()\n{\n\tunloadFunc((uint64_t*)0x1411B7060, 0, 5387286240);\n\tunloadFunc((uint64_t*)0x1411B7060, 0, 5387319280);\n\tunloadFunc((uint64_t*)0x1411B7060, 0, 5387352320);\n\tcout << \"[DivaWig] All unloaded!\" << endl;\n\tif (dobeep) Beep(500, 100);\n\tthis_thread::sleep_for(chrono::seconds(1));;\n}\n\nvoid unload(__int64 performer_address)\n{\n\tunloadFunc((uint64_t*)0x1411B7060, 0, performer_address);\n\tcout << \"[DivaWig] Performer \" << performer_address/33040 + 1 << \" unloaded!\" << endl;\n\tif (dobeep) Beep(500, 100);\n\tthis_thread::sleep_for(chrono::seconds(1));;\n}\n\nvoid loadAll()\n{\n\tloadFunc((uint64_t*)0x1411B7060, 0, 5387286240);\n\tloadFunc((uint64_t*)0x1411B7060, 0, 5387319280);\n\tloadFunc((uint64_t*)0x1411B7060, 0, 5387352320);\n\tcout << \"[DivaWig] All loaded!\" << endl;\n\tif (dobeep) Beep(600, 100);\n\tthis_thread::sleep_for(chrono::seconds(1));;\n}\n\nvoid load(__int64 performer_address)\n{\n\tloadFunc((uint64_t*)0x1411B7060, 0, performer_address);\n\tcout << \"[DivaWig] Performer \" << performer_address / 33040 + 1 << \" loaded!\" << endl;\n\tif (dobeep) Beep(600, 100);\n\tthis_thread::sleep_for(chrono::seconds(1));\n}\n\n/*void hookedUnload(uint64_t* a1, unsigned int a2, __int64 a3)\n{\n\tcout << \"[DivaWig] hookedUnload a1: \" << a1 << \"; a2: \" << a2 << \"; a3: \" << a3 << endl;\n\tlast_unload_a1 = a1;\n\tlast_unload_a2 = a2;\n\tlast_unload_a3 = a3;\n\tunloadFunc(a1, a2, a3);\n}\n\nvoid hookedLoad(uint64_t* a1, unsigned int a2, __int64 a3)\n{\n\tcout << \"[DivaWig] hookedReload a1: \" << a1 << \"; a2: \" << a2 << \"; a3: \" << a3 << endl;\n\tlast_reload_a1 = a1;\n\tlast_reload_a2 = a2;\n\tlast_reload_a3 = a3;\n\tloadFunc(a1, a2, a3);\n}*/\n\nvoid inputLoop(__int64 a1)\n{\n\t//if (GetKeyState(VK_CONTROL) < 0)\n\t{\n\t\tif (GetKeyState('0') < 0) setPartToUpdate(ALL, \"Update all module parts!\", 330);\n\t\tif (GetKeyState('1') < 0) setPartToUpdate(HAIR, \"Only update the hair!\", 440);\n\t\tif (GetKeyState('2') < 0) setPartToUpdate(HEAD_ACCESSORY, \"Only update the head accessory!\", 550);\n\t\tif (GetKeyState('3') < 0) setPartToUpdate(FACE_ACCESSORY, \"Only update the face accessory!\", 660);\n\t\tif (GetKeyState('4') < 0) setPartToUpdate(FACE_TEXTURES, \"Only update the face textures!\", 770);\n\t\tif (GetKeyState('5') < 0) setPartToUpdate(HEAD, \"Only update the head!\", 880);\n\t\tif (GetKeyState('6') < 0) setPartToUpdate(CHEST_ACCESSORY, \"Only update the chest accessory!\", 990);\n\t\tif (GetKeyState('7') < 0) setPartToUpdate(BODY, \"Only update the body!\", 1100);\n\t\tif (GetKeyState('8') < 0) setPartToUpdate(BACK_ACCESSORY, \"Only update the back accessory!\", 1210);\n\t\tif (GetKeyState('9') < 0) setPartToUpdate(NONE, \"Update nothing!\", 220);\n\t}\n\tif (allowReloading)\n\t{\n\t\tif (GetKeyState('U') < 0)\n\t\t{\n\t\t\tif (GetKeyState(VK_LCONTROL) < 0 || GetKeyState(VK_RCONTROL) < 0) unloadAll();\n\t\t\tif (GetKeyState('1') < 0) unload(5387286240);\n\t\t\tif (GetKeyState('2') < 0) unload(5387319280);\n\t\t\tif (GetKeyState('3') < 0) unload(5387352320);\n\t\t}\n\t\tif (GetKeyState('L') < 0)\n\t\t{\n\t\t\tif (GetKeyState(VK_LCONTROL) < 0 || GetKeyState(VK_RCONTROL) < 0) loadAll();\n\t\t\tif (GetKeyState('1') < 0) load(5387286240);\n\t\t\tif (GetKeyState('2') < 0) load(5387319280);\n\t\t\tif (GetKeyState('3') < 0) load(5387352320);\n\t\t}\n\t}\n\n\t\tpvTimerUpdate(a1);\n}\n\n__int64 hookedWig(__int64 classp, int module_part, int part_id)\n{\n\tif (debug) cout << \"[DivaWig] Performer: \" << (classp-5387286232)/33040+1 << \"; Module part: \" << module_part << \" (\" << Strings[module_part] << \")\" << \"; Default part: \" << part_id << \".\" << endl;\n\t\n\tif (part_to_update == ALL || part_to_update == module_part)\n\t\t*(int*)(classp + 4i64 * module_part + 8) = part_id;\n\n\treturn module_part;\n}\n\nvoid hookedSec(unsigned int* a1, unsigned int module_part)\n{\n\tif (part_to_update == ALL || part_to_update == module_part)\n\t\toriginalSec(a1, module_part);\n}\n\nvoid hookedThi(unsigned int* a1, unsigned int module_part)\n{\n\tif (part_to_update == ALL || part_to_update == module_part)\n\t\toriginalSec(a1, module_part);\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\tloadConfig();\n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tcout << \"[DivaWig] Hooking functions...\" << endl;\n\t\tDetourAttach(&(PVOID&)originalWig, (PVOID)hookedWig);\n\t\tDetourAttach(&(PVOID&)originalSec, (PVOID)hookedSec);\n\t\tDetourAttach(&(PVOID&)originalThi, (PVOID)hookedThi);\n\t\tDetourAttach(&(PVOID&)pvTimerUpdate, (PVOID)inputLoop);\n\t\tcout << \"[DivaWig] Functions hooked.\" << endl;\n\t\tDetourTransactionCommit();\n\n\t\t/*if (allowReloading)\n\t\t{\n\t\t\tDisableThreadLibraryCalls(hModule);\n\t\t\tDetourTransactionBegin();\n\t\t\tDetourUpdateThread(GetCurrentThread());\n\t\t\tDetourAttach(&(PVOID&)unloadFunc, (PVOID)hookedUnload);\n\t\t\tDetourTransactionCommit();\n\n\t\t\tDisableThreadLibraryCalls(hModule);\n\t\t\tDetourTransactionBegin();\n\t\t\tDetourUpdateThread(GetCurrentThread());\n\t\t\tDetourAttach(&(PVOID&)loadFunc, (PVOID)hookedLoad);\n\t\t\tDetourTransactionCommit();\n\t\t}*/\n\n\t\t//thread* inputThread = new thread(inputLoop);\n\t}\n\n\treturn TRUE;\n}\n\nPluginConfig::PluginConfigOption config[] = {\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"beep\", L\"general\", CONFIG_FILE, L\"Beep\", L\"Beep when selecting the part that should be updated.\", true } },\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"reloading\", L\"general\", CONFIG_FILE, L\"Unloading and loading (experimental)\", L\"Allow unloading (CTRL+U or U+number) and loading (CTRL+L or L+number).\", false } },\n\t{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L\"debug\", L\"general\", CONFIG_FILE, L\"Debug\", L\"Print extra information.\", false } },\n};\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"DivaWig\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"DivaWig Plugin by nas\\n\\nDivaWig lets you mix some module parts by pressing CTRL+0~9.\";\n}\n\nextern \"C\" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)\n{\n\treturn PluginConfig::PluginConfigArray{ _countof(config), config };\n}\n"
  },
  {
    "path": "source-code/source/plugins/DivaWig/framework.h",
    "content": "#include <windows.h>\n#include <string>\n\nstd::wstring ExePath() {\n\tWCHAR buffer[MAX_PATH];\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\treturn std::wstring(buffer);\n}\n\nstd::wstring DirPath() {\n\tstd::wstring exepath = ExePath();\n\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\n\treturn exepath.substr(0, pos);\n}\n\nstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\DivaWig.ini\";\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\n"
  },
  {
    "path": "source-code/source/plugins/Launcher/ConfigOption.h",
    "content": "#pragma once\r\n#pragma warning(push)\r\n#pragma warning(disable: 4947)\r\n\r\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\r\n// Windows Header Files\r\n#include <windows.h>\r\n#include <string>\r\n#include <fstream>\r\n#include <vector>\r\n\r\n#include <msclr\\marshal_cppstd.h>\r\n\r\n#include \"PluginConfigApi.h\"\r\n#include \"IniReader.h\"\r\n\r\nusing namespace System;\r\nusing namespace System::Windows::Forms;\r\n\r\nfloat BaseScaleSize = 96;\r\nint Col1Width = 110;\r\nint Col2Left = 140;\r\nint Col2Width = 90;\r\nint ConfigBtnLeft = 120;\r\nint ControlSpacing = 6;\r\n\r\n\r\n\r\n// declare this early (actual definitions below)\r\nclass ConfigOptionBase;\r\nPanel^ MakePanel(int width, int height, std::vector<ConfigOptionBase*> &cfg, ToolTip^ tooltip, bool* hasChanged);\r\n\r\n\r\n#define RESOPT_MATCH_WINDOW_TEXT \"Match Window\"\r\n#define RESOPT_MATCH_SCREEN_TEXT \"Match Screen\"\r\n#define RESOPT_DEFAULT_TEXT \"Default\"\r\n\r\nref class ComboboxValidation\r\n{\r\npublic:\r\n\tComboBox^ cb;\r\n\r\n\tComboboxValidation(ComboBox^ combobox)\r\n\t{\r\n\t\tcb = combobox;\r\n\t}\r\n\r\n\tSystem::Void CheckNumberLeave(System::Object^ sender, System::EventArgs^ e)\r\n\t{\r\n\t\tSystem::String^ text = cb->Text;\r\n\r\n\t\tcli::array<Char>^ digitsarray = gcnew cli::array<Char>{ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9' };\r\n\t\tSystem::Collections::Generic::List<Char>^ digitslist = gcnew System::Collections::Generic::List<Char>(digitsarray);\r\n\r\n\t\tif (text->Length <= 0)\r\n\t\t\treturn;\r\n\r\n\t\twhile (text->Length > 0 && text[0] != L'-' && !digitslist->Contains(text[0]))\r\n\t\t{\r\n\t\t\ttext = text->Remove(0, 1);\r\n\t\t}\r\n\r\n\t\tif (text->Length <= 1) // can discard up to 1 now because first digit is known good\r\n\t\t{\r\n\t\t\tcb->Text = text;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (int i = 1; i < text->Length; i++)\r\n\t\t{\r\n\t\t\tif (!digitslist->Contains(text[i]))\r\n\t\t\t{\r\n\t\t\t\ttext = text->Remove(i, 1);\r\n\t\t\t\ti--; // negate the upcoming ++\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcb->Text = text;\r\n\t}\r\n\r\n\tSystem::Void CheckResolutionLeave(System::Object^ sender, System::EventArgs^ e)\r\n\t{\r\n\t\tSystem::String^ text = cb->Text;\r\n\r\n\t\tif (text == RESOPT_MATCH_WINDOW_TEXT || text == RESOPT_MATCH_SCREEN_TEXT || text == RESOPT_DEFAULT_TEXT)\r\n\t\t\treturn;\r\n\r\n\t\tcli::array<Char>^ digitsarray = gcnew cli::array<Char>{ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9' };\r\n\t\tSystem::Collections::Generic::List<Char>^ digitslist = gcnew System::Collections::Generic::List<Char>(digitsarray);\r\n\r\n\t\tint numX = 0;\r\n\r\n\t\twhile (text->Length > 0 && text[0] != L'x' && !digitslist->Contains(text[0]))\r\n\t\t{\r\n\t\t\ttext = text->Remove(0, 1);\r\n\t\t}\r\n\r\n\t\tif (text->Length <= 0)\r\n\t\t{\r\n\t\t\tcb->Text = \"x\";\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (text[0] == L'x')\r\n\t\t{\r\n\t\t\tnumX++;\r\n\t\t}\r\n\r\n\t\tif (text->Length <= 1) // can discard up to 1 now because first digit is known good\r\n\t\t{\r\n\t\t\tif (numX == 0) // if that digit wasn't an x though, add one\r\n\t\t\t{\r\n\t\t\t\ttext += \"x\";\r\n\t\t\t}\r\n\t\t\tcb->Text = text;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (int i = 1; i < text->Length; i++)\r\n\t\t{\r\n\t\t\tif (!digitslist->Contains(text[i]) && !(numX == 0 && text[i] == L'x' && ++numX))\r\n\t\t\t{\r\n\t\t\t\ttext = text->Remove(i, 1);\r\n\t\t\t\ti--; // negate the upcoming ++\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (numX == 0)\r\n\t\t{\r\n\t\t\ttext += \"x\";\r\n\t\t}\r\n\r\n\t\tcb->Text = text;\r\n\t}\r\n\r\n};\r\n\r\nref class PluginConfigHandler\r\n{\r\npublic:\r\n\tForm^ form;\r\n\r\n\tPluginConfigHandler(Panel^ optspanel, String^ title, float btnScaleSize)\r\n\t{\r\n\t\tform = gcnew Form();\r\n\r\n\t\tform->Text = title;\r\n\r\n\t\tform->FormBorderStyle = FormBorderStyle::FixedDialog;\r\n\t\tform->StartPosition = FormStartPosition::CenterScreen;\r\n\t\tform->MaximizeBox = false;\r\n\t\tform->MinimizeBox = false;\r\n\t\tform->ShowInTaskbar = false;\r\n\t\tform->ShowIcon = false;\r\n\t\t//form->TopMost = true;\r\n\r\n\t\tform->BackColor = Drawing::Color::FromArgb(64, 64, 64);\r\n\t\tform->ForeColor = Drawing::Color::White;\r\n\r\n\t\tform->Font = optspanel->Font;\r\n\r\n\t\toptspanel->Left = 0;\r\n\t\toptspanel->Top = 0;\r\n\r\n\t\tButton^ OkBtn = gcnew Button();\r\n\t\tOkBtn->Scale(btnScaleSize);\r\n\t\tOkBtn->Text = L\"OK\";\r\n\t\tOkBtn->Left = 4;\r\n\t\tOkBtn->Top = optspanel->Bottom + 4;\r\n\t\tOkBtn->AutoSize = true;\r\n\t\tOkBtn->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tform->ClientSize = Drawing::Size(optspanel->Width, OkBtn->Bottom + 4);\r\n\r\n\t\tform->Controls->Add(optspanel);\r\n\t\tform->Controls->Add(OkBtn);\r\n\t\tform->AcceptButton = OkBtn;\r\n\r\n\t\tform->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &PluginConfigHandler::FormClosing);\r\n\t\tOkBtn->Click += gcnew EventHandler(this, &PluginConfigHandler::OkClick);\r\n\t}\r\n\r\n\tSystem::Void OpenForm(System::Object^ sender, System::EventArgs^ e)\r\n\t{\r\n\t\t// ShowDialog seems to prevent disposal by copying the panel...\r\n\t\t// which would be fine if I didn't rely on using the control handles\r\n\t\t// MessageBox::Show(form->Controls[0]->Handle.ToString());\r\n\r\n\t\t//Application::OpenForms[0]->Enabled = false;\r\n\t\tform->Owner = Application::OpenForms[0];\r\n\t\tif (form->Visible)\r\n\t\t\tform->Hide();\r\n\t\tform->Show();\r\n\t}\r\n\r\n\tSystem::Void FormClosing(System::Object^ sender, FormClosingEventArgs^ e)\r\n\t{\r\n\t\tif (e->CloseReason == CloseReason::UserClosing)\r\n\t\t{\r\n\t\t\tform->Hide();\r\n\t\t\t//Application::OpenForms[0]->Enabled = true;\r\n\t\t\te->Cancel = true;\r\n\t\t}\r\n\t}\r\n\r\n\tSystem::Void OkClick(System::Object^ sender, System::EventArgs^ e)\r\n\t{\r\n\t\tform->Close();\r\n\t}\r\n};\r\n\r\nref class ChangeHandler\r\n{\r\npublic:\r\n\tbool* changebool;\r\n\r\n\tChangeHandler(bool* onchangebool)\r\n\t{\r\n\t\tchangebool = onchangebool;\r\n\t}\r\n\r\n\tSystem::Void SetChanged(System::Object^ sender, System::EventArgs^ e)\r\n\t{\r\n\t\t*changebool = true;\r\n\t}\r\n};\r\n\r\nref class CustomFuncHandler\r\n{\r\npublic:\r\n\tvoid(*_func)();\r\n\r\n\tCustomFuncHandler(void(*func)())\r\n\t{\r\n\t\t_func = func;\r\n\t}\r\n\r\n\tSystem::Void RunFunc(System::Object^ sender, System::EventArgs^ e)\r\n\t{\r\n\t\t_func();\r\n\t}\r\n};\r\n\r\n\r\nclass ConfigOptionBase\r\n{\r\npublic:\r\n\tLPCWSTR _iniVarName;\r\n\tLPCWSTR _iniSectionName;\r\n\tLPCWSTR _iniFilePath;\r\n\r\n\tLPCWSTR _friendlyName;\r\n\tLPCWSTR _description;\r\n\t\r\n\tSystem::IntPtr mainControlHandle;\r\n\tbool* hasChanged;\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\treturn;\r\n\t}\r\n};\r\n\r\n\r\nclass OptionMetaGroupStart : public ConfigOptionBase\r\n{\r\npublic:\r\n\tint _height;\r\n\r\n\tOptionMetaGroupStart(LPCWSTR friendlyName, int height)\r\n\t{\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_height = height;\r\n\t}\r\n};\r\nclass OptionMetaGroupEnd : public ConfigOptionBase\r\n{\r\npublic:\r\n\tOptionMetaGroupEnd()\r\n\t{\r\n\t}\r\n};\r\n\r\nclass OptionMetaSectionLabel : public ConfigOptionBase\r\n{\r\npublic:\r\n\tOptionMetaSectionLabel(LPCWSTR friendlyName)\r\n\t{\r\n\t\t_friendlyName = friendlyName;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ lab = gcnew Label();\r\n\r\n\t\tlab->Text = gcnew String(_friendlyName);\r\n\t\tlab->Left = left + 2;\r\n\t\tlab->Top = top;\r\n\t\tlab->Font = gcnew System::Drawing::Font(lab->Font->Name, 12.0f, System::Drawing::FontStyle::Bold);\r\n\t\tlab->AutoSize = true;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlab->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\tpanel->Controls->Add(lab);\r\n\t\tmainControlHandle = lab->Handle;\r\n\r\n\t\tint ControlHeight = lab->Font->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n};\r\n\r\nclass OptionMetaSpacer : public ConfigOptionBase\r\n{\r\npublic:\r\n\tint _height;\r\n\r\n\tOptionMetaSpacer(int height)\r\n\t{\r\n\t\t_height = height;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\treturn _height;\r\n\t}\r\n};\r\n\r\nclass OptionMetaSeparator : public ConfigOptionBase\r\n{\r\npublic:\r\n\tOptionMetaSeparator()\r\n\t{\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ lab = gcnew Label();\r\n\t\t\r\n\t\tlab->Text = \"_____________________________________\";\r\n\t\tlab->Left = left + 2;\r\n\t\tlab->Top = top;\r\n\t\tlab->AutoSize = true;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlab->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\tpanel->Controls->Add(lab);\r\n\t\tmainControlHandle = lab->Handle;\r\n\r\n\t\tint ControlHeight = lab->Font->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n};\r\n\r\n\r\nclass BooleanOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tbool _defaultVal;\r\n\tbool _saveAsString;\r\n\r\n\tBooleanOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, bool defaultVal, bool saveAsString)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_saveAsString = saveAsString;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tCheckBox^ cb = gcnew CheckBox();\r\n\r\n\t\tcb->Text = gcnew String(_friendlyName);\r\n\t\tcb->Checked = GetIniBool(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath);\r\n\t\tcb->Left = left + 2;\r\n\t\tcb->Top = top;\r\n\t\tcb->AutoSize = true;\r\n\t\tcb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\t// hack to ensure high contrast\r\n\t\tcb->BackColor = System::Drawing::Color::FromArgb(0, 127, 127, 127);\r\n\t\t\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tcb->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(cb, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tcb->CheckedChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(cb);\r\n\t\tmainControlHandle = cb->Handle;\r\n\r\n\t\tint ControlHeight = cb->Font->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\tSetIniBool(_iniSectionName, _iniVarName, ((CheckBox^)CheckBox::FromHandle(mainControlHandle))->Checked, _iniFilePath, _saveAsString);\r\n\t}\r\n};\r\n\r\n\r\nclass NumericOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tint _defaultVal;\r\n\tint _minVal;\r\n\tint _maxVal;\r\n\r\n\tNumericOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, int defaultVal, int minVal, int maxVal)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_minVal = minVal;\r\n\t\t_maxVal = maxVal;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ label = gcnew Label();\r\n\t\tNumericUpDown^ numberbox = gcnew NumericUpDown();\r\n\r\n\t\tlabel->Text = gcnew String(_friendlyName);\r\n\t\tlabel->Left = left;\r\n\t\tlabel->Top = top + 3;\r\n\t\tlabel->Width = Col1Width;\r\n\t\tlabel->AutoSize = true;\r\n\t\tlabel->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tnumberbox->Minimum = _minVal;\r\n\t\tnumberbox->Maximum = _maxVal;\r\n\r\n\t\tnumberbox->Value = GetIniInt(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath);\r\n\r\n\t\tnumberbox->Left = left + Col2Left;\r\n\t\tnumberbox->Top = top;\r\n\t\tnumberbox->Width = Col2Width;\r\n\t\tnumberbox->AutoSize = true;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlabel->Scale(ScaleWidth, ScaleHeight);\r\n\t\tnumberbox->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(label, gcnew String(_description));\r\n\t\ttooltip->SetToolTip(numberbox, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tnumberbox->ValueChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(label);\r\n\t\tpanel->Controls->Add(numberbox);\r\n\t\tmainControlHandle = numberbox->Handle;\r\n\r\n\t\tint ControlHeight = numberbox->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\tSetIniInt(_iniSectionName, _iniVarName, Convert::ToInt32(((NumericUpDown^)NumericUpDown::FromHandle(mainControlHandle))->Value), _iniFilePath);\r\n\t}\r\n};\r\n\r\n\r\nclass StringOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tLPCWSTR _defaultVal;\r\n\tbool _useUtf8;\r\n\r\n\tStringOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, LPCWSTR defaultVal, bool useUtf8)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_useUtf8 = useUtf8;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ label = gcnew Label();\r\n\t\tTextBox^ textbox = gcnew TextBox();\r\n\r\n\t\tconst wchar_t* stringBuf;\r\n\r\n\t\tlabel->Text = gcnew String(_friendlyName);\r\n\t\tlabel->Left = left;\r\n\t\tlabel->Top = top + 3;\r\n\t\tlabel->Width = Col1Width;\r\n\t\tlabel->AutoSize = true;\r\n\t\tlabel->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tstringBuf = GetIniString(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath, _useUtf8);\r\n\r\n\t\ttextbox->Text = gcnew String(stringBuf);\r\n\t\ttextbox->Left = left + Col2Left;\r\n\t\ttextbox->Top = top;\r\n\t\ttextbox->Width = Col2Width;\r\n\t\ttextbox->AutoSize = true;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlabel->Scale(ScaleWidth, ScaleHeight);\r\n\t\ttextbox->Scale(ScaleWidth, ScaleHeight);\r\n\t\t\r\n\t\t// disable editing for utf8 mode because the ANSI hack used may not work correctly\r\n\t\t//if (_useUtf8) {\r\n\t\t//\ttextbox->Enabled = false;\r\n\t\t//}\r\n\r\n\t\ttooltip->SetToolTip(label, gcnew String(_description));\r\n\t\ttooltip->SetToolTip(textbox, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\ttextbox->TextChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(label);\r\n\t\tpanel->Controls->Add(textbox);\r\n\t\tmainControlHandle = textbox->Handle;\r\n\r\n\t\tint ControlHeight = textbox->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\t// disable saving for utf8 mode because the ANSI hack used may not work correctly\r\n\t\t//if (_useUtf8)\r\n\t\t//\treturn;\r\n\r\n\t\tSystem::String^ tempSysStr;\r\n\t\tstd::wstring tempWStr;\r\n\r\n\t\ttempSysStr = ((TextBox^)TextBox::FromHandle(mainControlHandle))->Text;\r\n\t\ttempWStr = msclr::interop::marshal_as<std::wstring>(tempSysStr);\r\n\r\n\t\tSetIniString(_iniSectionName, _iniVarName, tempWStr.c_str(), _iniFilePath, _useUtf8);\r\n\t}\r\n};\r\n\r\n\r\nclass DropdownOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tint _defaultVal;\r\n\tint _indexOffset;\r\n\tstd::vector<LPCWSTR> _valueStrings;\r\n\tSystem::IntPtr labelHandle;\r\n\r\n\tDropdownOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, int defaultVal, std::vector<LPCWSTR> valueStrings, int indexOffset=0)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_valueStrings = valueStrings;\r\n\t\t_indexOffset = indexOffset;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ label = gcnew Label();\r\n\t\tComboBox^ combobox = gcnew ComboBox();\r\n\r\n\t\tlabel->Text = gcnew String(_friendlyName);\r\n\t\tlabelHandle = label->Handle;\r\n\t\tlabel->Left = left;\r\n\t\tlabel->Top = top + 3;\r\n\t\tlabel->Width = Col1Width;\r\n\t\tlabel->AutoSize = true;\r\n\t\tlabel->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tfor (LPCWSTR& choice : _valueStrings) {\r\n\t\t\tcombobox->Items->Add(msclr::interop::marshal_as<System::String^>(choice));\r\n\t\t}\r\n\t\tcombobox->SelectedIndex = GetIniInt(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath)-_indexOffset;\r\n\t\tcombobox->Left = left + Col2Left;\r\n\t\tcombobox->Top = top;\r\n\t\tcombobox->Width = Col2Width;\r\n\t\tcombobox->AutoSize = true;\r\n\t\tcombobox->FlatStyle = System::Windows::Forms::FlatStyle::System;\r\n\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDownList;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlabel->Scale(ScaleWidth, ScaleHeight);\r\n\t\tcombobox->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(label, gcnew String(_description));\r\n\t\ttooltip->SetToolTip(combobox, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tcombobox->SelectedIndexChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(label);\r\n\t\tpanel->Controls->Add(combobox);\r\n\t\tmainControlHandle = combobox->Handle;\r\n\r\n\t\tint ControlHeight = combobox->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\tSetIniInt(_iniSectionName, _iniVarName, Convert::ToInt32(((ComboBox^)ComboBox::FromHandle(mainControlHandle))->SelectedIndex+_indexOffset), _iniFilePath);\r\n\t}\r\n};\r\n\r\n\r\nclass DropdownTextOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tLPCWSTR _defaultVal;\r\n\tstd::vector<LPCWSTR> _valueStrings;\r\n\tbool _editable;\r\n\tbool _useUtf8;\r\n\r\n\tDropdownTextOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, LPCWSTR defaultVal, std::vector<LPCWSTR> valueStrings, bool editable, bool useUtf8)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_valueStrings = valueStrings;\r\n\t\t_editable = editable;\r\n\t\t_useUtf8 = useUtf8;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ label = gcnew Label();\r\n\t\tComboBox^ combobox = gcnew ComboBox();\r\n\r\n\t\tconst wchar_t* stringBuf;\r\n\r\n\t\tlabel->Text = gcnew String(_friendlyName);\r\n\t\tlabel->Left = left;\r\n\t\tlabel->Top = top + 3;\r\n\t\tlabel->Width = Col1Width;\r\n\t\tlabel->AutoSize = true;\r\n\t\tlabel->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tfor (LPCWSTR& choice : _valueStrings) {\r\n\t\t\tcombobox->Items->Add(msclr::interop::marshal_as<System::String^>(choice));\r\n\t\t}\r\n\t\t\r\n\t\tstringBuf = GetIniString(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath, _useUtf8);\r\n\r\n\t\tcombobox->Text = gcnew String(stringBuf);\r\n\t\tcombobox->Left = left + Col2Left;\r\n\t\tcombobox->Top = top;\r\n\t\tcombobox->Width = Col2Width;\r\n\t\tcombobox->AutoSize = true;\r\n\t\tcombobox->FlatStyle = System::Windows::Forms::FlatStyle::System;\r\n\r\n\t\tif (_editable)\r\n\t\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDown;\r\n\t\telse\r\n\t\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDownList;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlabel->Scale(ScaleWidth, ScaleHeight);\r\n\t\tcombobox->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\t// disable editing for utf8 mode because the ANSI hack used may not work correctly\r\n\t\t//if (_useUtf8) {\r\n\t\t//\tlabel->Enabled = false;\r\n\t\t//\tcombobox->Enabled = false;\r\n\t\t//}\r\n\r\n\t\ttooltip->SetToolTip(label, gcnew String(_description));\r\n\t\ttooltip->SetToolTip(combobox, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tif (_editable)\r\n\t\t\tcombobox->TextChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\t\telse\r\n\t\t\tcombobox->SelectedIndexChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(label);\r\n\t\tpanel->Controls->Add(combobox);\r\n\t\tmainControlHandle = combobox->Handle;\r\n\r\n\t\tint ControlHeight = combobox->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\t// disable saving for utf8 mode because the ANSI hack used may not work correctly\r\n\t\t//if (_useUtf8)\r\n\t\t//\treturn;\r\n\r\n\t\tSystem::String^ tempSysStr;\r\n\t\tstd::wstring tempWStr;\r\n\r\n\t\ttempSysStr = ((ComboBox^)ComboBox::FromHandle(mainControlHandle))->Text;\r\n\t\ttempWStr = msclr::interop::marshal_as<std::wstring>(tempSysStr);\r\n\r\n\t\tSetIniString(_iniSectionName, _iniVarName, tempWStr.c_str(), _iniFilePath, _useUtf8);\r\n\t}\r\n};\r\n\r\n\r\nclass DropdownNumberOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tint _defaultVal;\r\n\tstd::vector<int> _valueInts;\r\n\tbool _editable;\r\n\r\n\tDropdownNumberOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, int defaultVal, std::vector<int> valueInts, bool editable)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_valueInts = valueInts;\r\n\t\t_editable = editable;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ label = gcnew Label();\r\n\t\tComboBox^ combobox = gcnew ComboBox();\r\n\r\n\t\tSystem::String^ tempSysStr;\r\n\r\n\t\tlabel->Text = gcnew String(_friendlyName);\r\n\t\tlabel->Left = left;\r\n\t\tlabel->Top = top + 3;\r\n\t\tlabel->Width = Col1Width;\r\n\t\tlabel->AutoSize = true;\r\n\t\tlabel->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tfor (int& choice : _valueInts) {\r\n\t\t\tcombobox->Items->Add(Convert::ToInt32(choice).ToString());\r\n\t\t}\r\n\r\n\t\ttempSysStr = Convert::ToInt32(GetIniInt(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath)).ToString();\r\n\r\n\t\tcombobox->Text = gcnew String(tempSysStr);\r\n\t\tcombobox->Left = left + Col2Left;\r\n\t\tcombobox->Top = top;\r\n\t\tcombobox->Width = Col2Width;\r\n\t\tcombobox->AutoSize = true;\r\n\t\tcombobox->FlatStyle = System::Windows::Forms::FlatStyle::System;\r\n\t\t\r\n\t\tif (_editable)\r\n\t\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDown;\r\n\t\telse\r\n\t\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDownList;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlabel->Scale(ScaleWidth, ScaleHeight);\r\n\t\tcombobox->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(label, gcnew String(_description));\r\n\t\ttooltip->SetToolTip(combobox, gcnew String(_description));\r\n\r\n\t\tComboboxValidation^ validation = gcnew ComboboxValidation(combobox);\r\n\t\tcombobox->Leave += gcnew System::EventHandler(validation, &ComboboxValidation::CheckNumberLeave);\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tif (_editable)\r\n\t\t\tcombobox->TextChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\t\telse\r\n\t\t\tcombobox->SelectedIndexChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(label);\r\n\t\tpanel->Controls->Add(combobox);\r\n\t\tmainControlHandle = combobox->Handle;\r\n\r\n\t\tint ControlHeight = combobox->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\tSystem::String^ tempSysStr;\r\n\t\tstd::wstring tempWStr;\r\n\r\n\t\ttempSysStr = ((ComboBox^)ComboBox::FromHandle(mainControlHandle))->Text;\r\n\t\ttempWStr = msclr::interop::marshal_as<std::wstring>(tempSysStr);\r\n\r\n\t\tSetIniString(_iniSectionName, _iniVarName, tempWStr.c_str(), _iniFilePath, false);\r\n\t}\r\n};\r\n\r\n\r\nenum ResolutionOptionOpts\r\n{\r\n\tRESOPT_NONE,\r\n\tRESOPT_INCLUDE_MATCH_WINDOW,\r\n\tRESOPT_INCLUDE_MATCH_SCREEN,\r\n\tRESOPT_INCLUDE_DEFAULT = 4\r\n};\r\n\r\nclass ResolutionOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tLPCWSTR _iniVarName2;\r\n\tresolution _defaultVal;\r\n\tstd::vector<resolution> _valueResolutions;\r\n\tbool _editable;\r\n\tResolutionOptionOpts _opts;\r\n\r\n\tResolutionOption(LPCWSTR iniVarName, LPCWSTR iniVarName2, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, resolution defaultVal, std::vector<resolution> valueResolutions, bool editable, ResolutionOptionOpts opts)\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniVarName2 = iniVarName2;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_valueResolutions = valueResolutions;\r\n\t\t_editable = editable;\r\n\t\t_opts = opts;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tLabel^ label = gcnew Label();\r\n\t\tComboBox^ combobox = gcnew ComboBox();\r\n\r\n\t\tSystem::String^ tempSysStr;\r\n\r\n\t\tlabel->Text = gcnew String(_friendlyName);\r\n\t\tlabel->Left = left;\r\n\t\tlabel->Top = top + 3;\r\n\t\tlabel->Width = Col1Width;\r\n\t\tlabel->AutoSize = true;\r\n\t\tlabel->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tif (_opts & RESOPT_INCLUDE_MATCH_WINDOW)\r\n\t\t\tcombobox->Items->Add(RESOPT_MATCH_WINDOW_TEXT);\r\n\t\telse if (_opts & RESOPT_INCLUDE_MATCH_SCREEN)\r\n\t\t\tcombobox->Items->Add(RESOPT_MATCH_SCREEN_TEXT);\r\n\t\telse if (_opts & RESOPT_INCLUDE_DEFAULT)\r\n\t\t\tcombobox->Items->Add(RESOPT_DEFAULT_TEXT);\r\n\r\n\t\tfor (resolution& choice : _valueResolutions) {\r\n\t\t\ttempSysStr = Convert::ToInt32(choice.width).ToString() + L\"x\" + Convert::ToInt32(choice.height).ToString();\r\n\t\t\tcombobox->Items->Add(tempSysStr);\r\n\t\t}\r\n\r\n\t\tint width = GetIniInt(_iniSectionName, _iniVarName, -39, _iniFilePath);\r\n\t\tint height = GetIniInt(_iniSectionName, _iniVarName2, -39, _iniFilePath);\r\n\t\tif (width == -39 || height == -39) {\r\n\t\t\tif (_defaultVal.width == -1 || _defaultVal.height == -1)\r\n\t\t\t\twidth = -1;\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\ttempSysStr = Convert::ToInt32(_defaultVal.width).ToString() + L\"x\" + Convert::ToInt32(_defaultVal.height).ToString();\r\n\t\t\t\tcombobox->Text = tempSysStr;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (width == -1 || height == -1) { // -1 -> Match window/screen\r\n\t\t\tif (_opts & RESOPT_INCLUDE_MATCH_WINDOW)\r\n\t\t\t\tcombobox->Text = RESOPT_MATCH_WINDOW_TEXT;\r\n\t\t\telse if (_opts & RESOPT_INCLUDE_MATCH_SCREEN)\r\n\t\t\t\tcombobox->Text = RESOPT_MATCH_SCREEN_TEXT;\r\n\t\t\telse if (_opts & RESOPT_INCLUDE_DEFAULT)\r\n\t\t\t\tcombobox->Text = RESOPT_DEFAULT_TEXT;\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttempSysStr = Convert::ToInt32(width).ToString() + L\"x\" + Convert::ToInt32(height).ToString();\r\n\t\t\tcombobox->Text = tempSysStr;\r\n\t\t}\r\n\r\n\t\tcombobox->Left = left + Col2Left;\r\n\t\tcombobox->Top = top;\r\n\t\tcombobox->Width = Col2Width;\r\n\t\tcombobox->AutoSize = true;\r\n\t\tcombobox->FlatStyle = System::Windows::Forms::FlatStyle::System;\r\n\r\n\t\tif (_editable)\r\n\t\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDown;\r\n\t\telse\r\n\t\t\tcombobox->DropDownStyle = ComboBoxStyle::DropDownList;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tlabel->Scale(ScaleWidth, ScaleHeight);\r\n\t\tcombobox->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(label, gcnew String(_description));\r\n\t\ttooltip->SetToolTip(combobox, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tif (_editable)\r\n\t\t\tcombobox->TextChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\t\telse\r\n\t\t\tcombobox->SelectedIndexChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tComboboxValidation^ validation = gcnew ComboboxValidation(combobox);\r\n\t\tcombobox->Leave += gcnew System::EventHandler(validation, &ComboboxValidation::CheckResolutionLeave);\r\n\r\n\t\tpanel->Controls->Add(label);\r\n\t\tpanel->Controls->Add(combobox);\r\n\t\tmainControlHandle = combobox->Handle;\r\n\r\n\t\tint ControlHeight = combobox->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\tSystem::String^ tempSysStr;\r\n\t\tstd::wstring tempWStr;\r\n\t\tcli::array<String^>^ resolutionArray;\r\n\r\n\t\ttempSysStr = ((ComboBox^)ComboBox::FromHandle(mainControlHandle))->Text;\r\n\r\n\t\t// Match window/screen -> -1x-1\r\n\t\tif (tempSysStr == RESOPT_MATCH_WINDOW_TEXT || tempSysStr == RESOPT_MATCH_SCREEN_TEXT || tempSysStr == RESOPT_DEFAULT_TEXT)\r\n\t\t\ttempSysStr = \"-1x-1\";\r\n\r\n\t\tresolutionArray = tempSysStr->Split('x');\r\n\r\n\t\ttempSysStr = resolutionArray[0];\r\n\t\ttempWStr = msclr::interop::marshal_as<std::wstring>(tempSysStr);\r\n\t\tSetIniString(_iniSectionName, _iniVarName, tempWStr.c_str(), _iniFilePath, false);\r\n\r\n\t\ttempSysStr = resolutionArray[1];\r\n\t\ttempWStr = msclr::interop::marshal_as<std::wstring>(tempSysStr);\r\n\t\tSetIniString(_iniSectionName, _iniVarName2, tempWStr.c_str(), _iniFilePath, false);\r\n\r\n\t}\r\n};\r\n\r\n\r\nclass ButtonOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tvoid(*_func)();\r\n\r\n\tButtonOption(LPCWSTR friendlyName, LPCWSTR description, void(*func)())\r\n\t{\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_func = func;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tButton^ button = gcnew Button();\r\n\r\n\t\tbutton->Text = gcnew String(_friendlyName);\r\n\t\tbutton->Left = left;\r\n\t\tbutton->Top = top;\r\n\t\tbutton->AutoSize = true;\r\n\t\tbutton->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tbutton->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(button, gcnew String(_description));\r\n\r\n\t\tCustomFuncHandler^ funchandler = gcnew CustomFuncHandler(_func);\r\n\t\tbutton->Click += gcnew System::EventHandler(funchandler, &CustomFuncHandler::RunFunc);\r\n\r\n\t\tpanel->Controls->Add(button);\r\n\r\n\t\tint ControlHeight = button->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n};\r\n\r\n\r\nclass PluginOption : public ConfigOptionBase\r\n{\r\npublic:\r\n\tbool _defaultVal;\r\n\tstd::wstring _builddate;\r\n\tstd::vector<ConfigOptionBase*> _configopts;\r\n\r\n\tPluginOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, bool defaultVal, std::vector<ConfigOptionBase*> configopts, std::wstring builddate = L\"Unknown\")\r\n\t{\r\n\t\t_iniVarName = iniVarName;\r\n\t\t_iniSectionName = iniSectionName;\r\n\t\t_iniFilePath = iniFilePath;\r\n\t\t_friendlyName = friendlyName;\r\n\t\t_description = description;\r\n\t\t_defaultVal = defaultVal;\r\n\t\t_configopts = configopts;\r\n\t\t_builddate = builddate;\r\n\t}\r\n\r\n\tvirtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)\r\n\t{\r\n\t\tCheckBox^ cb = gcnew CheckBox();\r\n\t\tButton^ button = gcnew Button();\r\n\r\n\t\tcb->Text = gcnew String(_friendlyName);\r\n\t\tcb->Checked = GetIniBool(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath);\r\n\t\tcb->Left = left + 2;\r\n\t\tcb->Top = top + 3;\r\n\t\tcb->AutoSize = true;\r\n\t\tcb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\t// hack to ensure high contrast\r\n\t\tcb->BackColor = System::Drawing::Color::FromArgb(0, 127, 127, 127);\r\n\r\n\t\tbutton->Text = L\"Config\";\r\n\t\tbutton->Left = left + ConfigBtnLeft;\r\n\t\tbutton->Top = top;\r\n\t\tbutton->AutoSize = true;\r\n\t\tbutton->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\r\n\t\tForm^ RootForm = panel->FindForm();\r\n\t\tfloat ScaleWidth = 1.0f;\r\n\t\tfloat ScaleHeight = 1.0f;\r\n\t\tif (RootForm)\r\n\t\t{\r\n\t\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t\t}\r\n\t\tcb->Scale(ScaleWidth, ScaleHeight);\r\n\t\tbutton->Scale(ScaleWidth, ScaleHeight);\r\n\r\n\t\ttooltip->SetToolTip(cb, gcnew String(_description));\r\n\r\n\t\tif (hasChanged == nullptr)\r\n\t\t\thasChanged = new bool(false);\r\n\t\tChangeHandler^ changehandler = gcnew ChangeHandler(hasChanged);\r\n\t\tcb->CheckedChanged += gcnew System::EventHandler(changehandler, &ChangeHandler::SetChanged);\r\n\r\n\t\tpanel->Controls->Add(cb);\r\n\t\tmainControlHandle = cb->Handle;\r\n\r\n\t\tif (_configopts.size() > 0)\r\n\t\t{\r\n\t\t\tToolTip^ paneltooltip = gcnew ToolTip();\r\n\t\t\tPanel^ configPanel = MakePanel((Col2Left + Col2Width + 76), 250, _configopts, paneltooltip, hasChanged);\r\n\t\t\tconfigPanel->Scale(ScaleWidth, ScaleHeight);\r\n\t\t\tif (RootForm)\r\n\t\t\t\tconfigPanel->Font = RootForm->Font;\r\n\t\t\tPluginConfigHandler^ confighandler = gcnew PluginConfigHandler(configPanel, gcnew String(_friendlyName) + \" Options\", ScaleHeight);\r\n\t\t\tbutton->Click += gcnew System::EventHandler(confighandler, &PluginConfigHandler::OpenForm);\r\n\r\n\t\t\tpanel->Controls->Add(button);\r\n\t\t}\r\n\r\n\t\tint ControlHeight = button->Height / ScaleHeight;\r\n\t\treturn ControlHeight + ControlSpacing;\r\n\t}\r\n\r\n\tvirtual void SaveOption()\r\n\t{\r\n\t\tSetIniBool(_iniSectionName, _iniVarName, ((CheckBox^)CheckBox::FromHandle(mainControlHandle))->Checked, _iniFilePath, false);\r\n\r\n\t\tfor (ConfigOptionBase* opt : _configopts)\r\n\t\t{\r\n\t\t\topt->SaveOption();\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\nPanel^ MakePanel(int width, int height, std::vector<ConfigOptionBase*> &cfg, ToolTip^ tooltip, bool* hasChanged)\r\n{\r\n\tPanel^ outpanel = gcnew Panel();\r\n\toutpanel->Width = width;\r\n\toutpanel->Height = height;\r\n\toutpanel->AutoScroll = true;\r\n\r\n\tForm^ RootForm = outpanel->FindForm();\r\n\tfloat ScaleWidth = 1.0f;\r\n\tfloat ScaleHeight = 1.0f;\r\n\tif (RootForm)\r\n\t{\r\n\t\tDrawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;\r\n\t\tScaleWidth = CurrentScaleSize.Width / BaseScaleSize;\r\n\t\tScaleHeight = CurrentScaleSize.Height / BaseScaleSize;\r\n\t}\r\n\r\n\tint curX = 12;\r\n\tint curY = 3;\r\n\r\n\tfor (int i = 0; i < cfg.size(); i++)\r\n\t{\r\n\t\tif (typeid(*cfg[i]).hash_code() == typeid(OptionMetaGroupEnd).hash_code())\r\n\t\t\tcontinue;\r\n\r\n\t\tif (typeid(*cfg[i]).hash_code() == typeid(OptionMetaGroupStart).hash_code())\r\n\t\t{\r\n\t\t\tOptionMetaGroupStart* groupData = (OptionMetaGroupStart*)(cfg[i]);\r\n\t\t\tGroupBox^ groupbox = gcnew GroupBox();\r\n\t\t\tgroupbox->Width = width - (ScaleWidth * 28);\r\n\t\t\tgroupbox->Height = ScaleHeight * (groupData->_height);\r\n\t\t\tgroupbox->Left = ScaleWidth * 4;\r\n\t\t\tgroupbox->Top = ScaleHeight * curY;\r\n\t\t\tgroupbox->Text = gcnew String(groupData->_friendlyName);\r\n\t\t\tgroupbox->ForeColor = Drawing::Color::White;\r\n\r\n\t\t\t// find the end of this group by simple iteration keeping track of indent level\r\n\t\t\tint level = 1;\r\n\t\t\tint endidx;\r\n\t\t\tfor (endidx = i + 1; endidx < cfg.size(); endidx++)\r\n\t\t\t{\r\n\t\t\t\tif (typeid(*cfg[endidx]).hash_code() == typeid(OptionMetaGroupStart).hash_code())\r\n\t\t\t\t\tlevel++;\r\n\t\t\t\tif (typeid(*cfg[endidx]).hash_code() == typeid(OptionMetaGroupEnd).hash_code())\r\n\t\t\t\t\tlevel--;\r\n\r\n\t\t\t\tif (level == 0)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tPanel^ groupPanel = MakePanel(groupbox->Width - (ScaleWidth * 12), groupbox->Height - (ScaleHeight * 20), std::vector<ConfigOptionBase*>(&(cfg[i + 1]), &(cfg[endidx])), tooltip, hasChanged);\r\n\t\t\tgroupPanel->Left = ScaleWidth * 2;\r\n\t\t\tgroupPanel->Top = ScaleHeight * 14;\r\n\r\n\t\t\tgroupbox->Controls->Add(groupPanel);\r\n\t\t\toutpanel->Controls->Add(groupbox);\r\n\r\n\t\t\ti = endidx;\r\n\t\t\tcurY += groupData->_height;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcfg[i]->hasChanged = hasChanged;\r\n\t\t\tcurY += cfg[i]->AddToPanel(outpanel, curX, curY, tooltip);\r\n\t\t}\r\n\t}\r\n\r\n\treturn outpanel;\r\n}\r\n\r\n#pragma warning(pop)"
  },
  {
    "path": "source-code/source/plugins/Launcher/IniReader.h",
    "content": "#pragma once\n\n// kinda rushed and hacky wrapper around simpleini for use by ConfigOption\n// (has a similar API to windows GetPrivateProfile/SetPrivateProfile stuff)\n\n#include <SimpleIni.h>\nCSimpleIniW ini_reader;\nstd::wstring loaded_ini_file;\n\nbool LoadIni(const wchar_t* filename, bool use_utf8=false)\n{\n\tif (ini_reader.IsUnicode() == use_utf8 && loaded_ini_file == filename)\n\t{\n\t\treturn true;\n\t}\n\n\tini_reader.Reset();\n\tini_reader.SetUnicode(use_utf8);\n\n\tif (ini_reader.LoadFile(filename) != 0)\n\t{\n\t\t// if the path doesn't exist, this isn't an error so we can still save filename and return true\n\t\t// (writing config will create the file)\n\t\tDWORD dwAttrib = GetFileAttributesW(filename);\n\t\tif (dwAttrib == INVALID_FILE_ATTRIBUTES)\n\t\t{\n\t\t\tloaded_ini_file = filename;\n\t\t\treturn true;\n\t\t}\n\n\t\tloaded_ini_file = L\"\";\n\t\treturn false;\n\t}\n\telse\n\t{\n\t\tloaded_ini_file = filename;\n\t\treturn true;\n\t}\n}\n\nconst wchar_t* GetIniString(const wchar_t* section, const wchar_t* key, const wchar_t* default, const wchar_t* filename, bool use_utf8)\n{\n\tif (!LoadIni(filename, use_utf8))\n\t{\n\t\treturn default;\n\t}\n\n\treturn ini_reader.GetValue(section, key, default);\n}\n\nint GetIniInt(const wchar_t* section, const wchar_t* key, int default, const wchar_t* filename)\n{\n\tif (!LoadIni(filename))\n\t{\n\t\treturn default;\n\t}\n\n\treturn ini_reader.GetLongValue(section, key, default);\n}\n\nbool GetIniBool(const wchar_t* section, const wchar_t* key, bool default, const wchar_t* filename)\n{\n\tif (!LoadIni(filename))\n\t{\n\t\treturn default;\n\t}\n\n\treturn ini_reader.GetBoolValue(section, key, default);\n}\n\nvoid SetIniString(const wchar_t* section, const wchar_t* key, const wchar_t* value, const wchar_t* filename, bool use_utf8)\n{\n\tif (!LoadIni(filename, use_utf8))\n\t{\n\t\treturn;\n\t}\n\n\tini_reader.SetValue(section, key, value);\n\tini_reader.SaveFile(filename);\n}\n\nvoid SetIniInt(const wchar_t* section, const wchar_t* key, int value, const wchar_t* filename)\n{\n\tif (!LoadIni(filename))\n\t{\n\t\treturn;\n\t}\n\n\tini_reader.SetLongValue(section, key, value);\n\tini_reader.SaveFile(filename);\n}\n\nvoid SetIniBool(const wchar_t* section, const wchar_t* key, bool value, const wchar_t* filename, bool use_string)\n{\n\tif (!LoadIni(filename))\n\t{\n\t\treturn;\n\t}\n\n\tif (use_string)\n\t\tini_reader.SetValue(section, key, value ? L\"true\" : L\"false\");\n\telse\n\t\tini_reader.SetValue(section, key, value ? L\"1\" : L\"0\");\n\n\tini_reader.SaveFile(filename);\n}"
  },
  {
    "path": "source-code/source/plugins/Launcher/Launcher.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"ui.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"constants.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Launcher/Launcher.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{60d5e9f4-335f-402b-9a07-d78674dffc9b}</ProjectGuid>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <Keyword>ManagedCProj</Keyword>\n    <RootNamespace>Launcher</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n    <ProjectName>Launcher</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CLRSupport>true</CLRSupport>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CLRSupport>true</CLRSupport>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetExt>.dva</TargetExt>\n    <TargetName>$(ProjectName)</TargetName>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\simpleini;..\\..\\..\\dependencies\\WineVer;..\\..\\..\\dependencies\\GPUModel;..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>User32.lib</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <EntryPointSymbol>\n      </EntryPointSymbol>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n      <WarningLevel>Level3</WarningLevel>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\simpleini;..\\..\\..\\dependencies\\WineVer;..\\..\\..\\dependencies\\GPUModel;..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>User32.lib</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <EntryPointSymbol>\n      </EntryPointSymbol>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n    <ClCompile Include=\"TabPadding.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"composition.h\" />\n    <ClInclude Include=\"ConfigOption.h\" />\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"IniReader.h\" />\n    <ClInclude Include=\"PluginConfig.h\" />\n    <ClInclude Include=\"SkinnedMessageBox.h\" />\n    <ClInclude Include=\"TabPadding.h\" />\n    <ClInclude Include=\"ui.h\">\n      <FileType>CppForm</FileType>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"SkinnedMessageBox.resx\" />\n    <EmbeddedResource Include=\"ui.resx\">\n      <DependentUpon>ui.h</DependentUpon>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <Image Include=\"FeelsThinkMan.gif\" />\n    <Image Include=\"Help.png\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Launcher/PluginConfig.h",
    "content": "#pragma once\n#include \"ConfigOption.h\"\n#include \"PluginConfigApi.h\"\n\nnamespace PluginConfig\n{\n\tConfigOptionBase* GetConfigOption(PluginConfigOption cfg)\n\t{\n\t\tPluginConfigBooleanData* boolData = (PluginConfigBooleanData*)(cfg.data);\n\t\tPluginConfigNumericData* numericData = (PluginConfigNumericData*)(cfg.data);\n\t\tPluginConfigStringData* stringData = (PluginConfigStringData*)(cfg.data);\n\t\tPluginConfigDropdownIndexData* ddIdxData = (PluginConfigDropdownIndexData*)(cfg.data);\n\t\tPluginConfigDropdownTextData* ddTextData = (PluginConfigDropdownTextData*)(cfg.data);\n\t\tPluginConfigDropdownNumberData* ddNumberData = (PluginConfigDropdownNumberData*)(cfg.data);\n\t\tPluginConfigResolutionData* resData = (PluginConfigResolutionData*)(cfg.data);\n\t\tPluginConfigGroupData* groupData = (PluginConfigGroupData*)(cfg.data);\n\t\tPluginConfigButtonData* btnData = (PluginConfigButtonData*)(cfg.data);\n\t\tPluginConfigSpacerData* spacerData = (PluginConfigSpacerData*)(cfg.data);\n\n\t\tswitch (cfg.cfgType)\n\t\t{\n\t\tcase CONFIG_BOOLEAN:\n\t\t\treturn new BooleanOption(boolData->iniVarName, boolData->iniSectionName, boolData->iniFilePath, boolData->friendlyName, boolData->description, boolData->defaultVal, boolData->saveAsString);\n\t\tcase CONFIG_NUMERIC:\n\t\t\treturn new NumericOption(numericData->iniVarName, numericData->iniSectionName, numericData->iniFilePath, numericData->friendlyName, numericData->description, numericData->defaultVal, numericData->minVal, numericData->maxVal);\n\t\tcase CONFIG_STRING:\n\t\t\treturn new StringOption(stringData->iniVarName, stringData->iniSectionName, stringData->iniFilePath, stringData->friendlyName, stringData->description, stringData->defaultVal, stringData->useUtf8);\n\t\tcase CONFIG_DROPDOWN_INDEX:\n\t\t\treturn new DropdownOption(ddIdxData->iniVarName, ddIdxData->iniSectionName, ddIdxData->iniFilePath, ddIdxData->friendlyName, ddIdxData->description, ddIdxData->defaultVal, ddIdxData->valueStrings);\n\t\tcase CONFIG_DROPDOWN_TEXT:\n\t\t\treturn new DropdownTextOption(ddTextData->iniVarName, ddTextData->iniSectionName, ddTextData->iniFilePath, ddTextData->friendlyName, ddTextData->description, ddTextData->defaultVal, ddTextData->valueStrings, ddTextData->editable, ddTextData->useUtf8);\n\t\tcase CONFIG_DROPDOWN_NUMBER:\n\t\t\treturn new DropdownNumberOption(ddNumberData->iniVarName, ddNumberData->iniSectionName, ddNumberData->iniFilePath, ddNumberData->friendlyName, ddNumberData->description, ddNumberData->defaultVal, ddNumberData->valueInts, ddNumberData->editable);\n\t\tcase CONFIG_RESOLUTION:\n\t\t\treturn new ResolutionOption(resData->iniVarName, resData->iniVarName2, resData->iniSectionName, resData->iniFilePath, resData->friendlyName, resData->description, resData->defaultVal, resData->valueResolutions, resData->editable, (ResolutionOptionOpts)0);\n\t\tcase CONFIG_GROUP_START:\n\t\t\treturn new OptionMetaGroupStart(groupData->name, groupData->height);\n\t\tcase CONFIG_GROUP_END:\n\t\t\treturn new OptionMetaGroupEnd();\n\t\tcase CONFIG_BUTTON:\n\t\t\treturn new ButtonOption(btnData->friendlyName, btnData->description, btnData->func);\n\t\tcase CONFIG_SPACER:\n\t\t\treturn new OptionMetaSpacer(spacerData->height);\n\t\tdefault:\n\t\t\treturn new ConfigOptionBase();\n\t\t}\n\t}\n\n\tstd::vector<ConfigOptionBase*> GetConfigOptionVec(PluginConfigArray &in)\n\t{\n\t\tstd::vector<ConfigOptionBase*> outvec;\n\t\tfor (int i = 0; i < in.len; i++)\n\t\t{\n\t\t\t// basic check for validity\n\t\t\tif (in.options[i].data == nullptr && in.options[i].cfgType != CONFIG_GROUP_END)\n\t\t\t\tbreak;\n\n\t\t\toutvec.push_back(GetConfigOption(in.options[i]));\n\t\t}\n\t\treturn outvec;\n\t}\n\n\t/*std::vector<PluginConfigOption> testcfg = \n\t{\n\t\tPluginConfigOption{ CONFIG_GROUP_START, new PluginConfigGroupData{L\"Screen Resolution\", 400 } },\n\t\tPluginConfigOption{ CONFIG_DROPDOWN_INDEX, new PluginConfigDropdownIndexData{ L\"display\", RESOLUTION_SECTION, CONFIG_FILE, L\"Display:\", L\"Sets the window/screen mode.\", 0, std::vector<LPCWSTR>({ L\"Windowed\", L\"Borderless\", L\"Fullscreen\" }) } },\n\t\tPluginConfigOption{ CONFIG_RESOLUTION, new PluginConfigResolutionData{ L\"width\", L\"height\", RESOLUTION_SECTION, CONFIG_FILE, L\"Resolution:\", L\"Sets the display resolution.\", resolution(1280, 720), getScreenResolutionsVec(screenModes) } }\n\t};*/\n\n\t//std::vector<ConfigOptionBase*> testcfgconfigopts = GetConfigOptionVec(testcfg);\n};"
  },
  {
    "path": "source-code/source/plugins/Launcher/SkinnedMessageBox.h",
    "content": "#pragma once\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n\nusing namespace System;\nusing namespace System::Windows::Forms;\nusing namespace System::Drawing;\n\n// ported from https://stackoverflow.com/a/7785745\n// original code by user LarsTech https://stackoverflow.com/users/719186/larstech\n\nstatic ref class SkinnedMessageBox\n{\nprivate: ref class SkinnedMessageBoxForm : Form\n\t{\n\tprivate:\n\t\tvoid SkinnedMessageBoxForm_Shown(Object^ sender, EventArgs^ e)\n\t\t{\n\t\t\tActivate();\n\t\t}\n\n\t\tvoid SkinnedMessageBoxForm_FormClosed(Object^ sender, FormClosedEventArgs^ e)\n\t\t{\n\t\t\tif (CancelButton && (DialogResult == System::Windows::Forms::DialogResult::None || DialogResult == System::Windows::Forms::DialogResult::Cancel))\n\t\t\t\tDialogResult = CancelButton->DialogResult;\n\t\t}\n\n\t\tvoid InitComponentNew()\n\t\t{\n\t\t\tthis->SuspendLayout();\n\n\t\t\tthis->AutoSize = true;\n\t\t\tthis->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog;\n\t\t\tthis->Width = 350;\n\t\t\tthis->Height = 140;\n\t\t\tthis->StartPosition = FormStartPosition::CenterScreen;\n\t\t\tthis->MaximizeBox = false;\n\t\t\tthis->MinimizeBox = false;\n\t\t\tthis->ShowInTaskbar = false;\n\t\t\tthis->ShowIcon = false;\n\t\t\t__try\n\t\t\t{\n\t\t\t\tthis->Icon = Application::OpenForms[0]->Icon;\n\t\t\t}\n\t\t\t__except (1) { }\n\t\t\tthis->Shown += gcnew EventHandler(this, &SkinnedMessageBoxForm::SkinnedMessageBoxForm_Shown);\n\t\t\tthis->FormClosed += gcnew FormClosedEventHandler(this, &SkinnedMessageBoxForm::SkinnedMessageBoxForm_FormClosed);\n\n\t\t\t//this->Font = SystemFonts::MessageBoxFont;\n\t\t\t//this->Font = gcnew Font(SystemFonts::MessageBoxFont->FontFamily, SystemFonts::MessageBoxFont->SizeInPoints);\n\t\t\tthis->AutoScaleMode = System::Windows::Forms::AutoScaleMode::None;\n\n\t\t\tthis->ResumeLayout(false);\n\t\t\tthis->PerformLayout();\n\t\t}\n\n\t\tfloat ScaleWidth = 1.0;\n\t\tfloat ScaleHeight = 1.0;\n\t\tint btnWidth = 85;\n\t\tint btnHeight = 23;\n\t\tint btnPadding = 12;\n\n\t\tstatic cli::array<Button^>^ buttonrefs = gcnew cli::array<Button^>{ gcnew Button, gcnew Button, gcnew Button };\n\t\tint numbuttons = 1;\n\n\t\tButton^ AddBtn(String^ text, System::Windows::Forms::DialogResult result, int btnNumber)\n\t\t{\n\t\t\tButton^ btn = buttonrefs[btnNumber];\n\t\t\tbtn->Text = text;\n\t\t\tbtn->DialogResult = result;\n\t\t\tbtn->Anchor = AnchorStyles::Bottom | AnchorStyles::Right;\n\t\t\tbtn->Width = btnWidth;\n\t\t\tbtn->Height = btnHeight;\n\n\t\t\tbtn->Location = Point(ClientSize.Width - btnWidth * (numbuttons - btnNumber) - btnPadding * (numbuttons - btnNumber), ClientSize.Height - btnHeight - btnPadding);\n\t\t\tControls->Add(btn);\n\n\t\t\t//buttonrefs[btnNumber] = btn;\n\t\t\treturn btn;\n\t\t}\n\n\t\tvoid SetBackCol(Control^ elem, Color color)\n\t\t{\n\t\t\tType^ elemType = elem->GetType();\n\n\t\t\tif ((elem->HasChildren || elemType == Button::typeid || elemType == ComboBox::typeid) && elemType != NumericUpDown::typeid)\n\t\t\t{\n\t\t\t\telem->BackColor = color;\n\n\t\t\t\tfor (int i = 0; i < elem->Controls->Count; i++)\n\t\t\t\t{\n\t\t\t\t\tSetBackCol(elem->Controls[i], color);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvoid SetForeCol(Control^ elem, Color color)\n\t\t{\n\t\t\tType^ elemType = elem->GetType();\n\n\t\t\tif (elemType != NumericUpDown::typeid && elemType != TextBox::typeid)\n\t\t\t{\n\t\t\t\telem->ForeColor = color;\n\t\t\t}\n\t\t\tif (elem->HasChildren && elemType != NumericUpDown::typeid)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < elem->Controls->Count; i++)\n\t\t\t\t{\n\t\t\t\t\tSetForeCol(elem->Controls[i], color);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvoid SetUIStyle(Control^ elem, FlatStyle style)\n\t\t{\n\t\t\tType^ elemType = elem->GetType();\n\n\t\t\tif (elemType == Button::typeid)\n\t\t\t{\n\t\t\t\t((Button^)elem)->FlatStyle = style;\n\t\t\t}\n\t\t\telse if (elemType  == ComboBox::typeid)\n\t\t\t{\n\t\t\t\t((ComboBox^)elem)->FlatStyle = style;\n\t\t\t}\n\t\t\telse if (elemType == CheckBox::typeid)\n\t\t\t{\n\t\t\t\t((CheckBox^)elem)->FlatStyle = style;\n\t\t\t}\n\n\t\t\tif (elem->HasChildren && elemType != NumericUpDown::typeid)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < elem->Controls->Count; i++)\n\t\t\t\t{\n\t\t\t\t\tSetUIStyle(elem->Controls[i], style);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tpublic:\n\t\tSkinnedMessageBoxForm(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton, MessageBoxOptions options)\n\t\t{\n\t\t\tInitComponentNew();\n\t\t\tGraphics^ grfx = Graphics::FromHwnd(Handle);\n\t\t\tScaleWidth = Font->SizeInPoints / 72 * grfx->DpiX / 10.67f;\n\t\t\tScaleHeight = ScaleWidth;\n\t\t\tbtnWidth *= ScaleWidth;\n\t\t\tbtnHeight *= ScaleHeight;\n\t\t\tbtnPadding *= ScaleWidth;\n\n\t\t\tWidth *= ScaleWidth;\n\t\t\tHeight *= ScaleHeight;\n\n\t\t\tif (owner->Handle != IntPtr::Zero)\n\t\t\t{\n\t\t\t\tOwner = Control::FromHandle(owner->Handle)->FindForm();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tOwner = ActiveForm;\n\t\t\t}\n\n\t\t\tText = caption;\n\n\t\t\tSystem::Windows::Forms::Padding lblMargin = System::Windows::Forms::Padding(14 * ScaleWidth, 0 * ScaleHeight, 14 * ScaleWidth, 45 * ScaleHeight);\n\t\t\tPoint lblLocation = Point(14 * ScaleWidth, 14 * ScaleHeight);\n\t\t\tDrawing::Size lblMinSize = Drawing::Size(ClientSize.Width - lblLocation.X - lblMargin.Right, 0);\n\t\t\tDrawing::Size lblMaxSize = Drawing::Size(600 * ScaleWidth, 0 * ScaleHeight);\n\n\t\t\tLabel^ MessageLbl = gcnew Label();\n\t\t\tMessageLbl->Text = message;\n\t\t\tMessageLbl->AutoSize = true;\n\t\t\tMessageLbl->Margin = lblMargin;\n\t\t\tMessageLbl->Location = lblLocation;\n\t\t\tMessageLbl->MinimumSize = lblMinSize;\n\t\t\tMessageLbl->MaximumSize = lblMaxSize;\n\n\t\t\tControls->Add(MessageLbl);\n\n\t\t\tif (buttons == MessageBoxButtons::OK)\n\t\t\t{\n\t\t\t\tnumbuttons = 1;\n\t\t\t\tButton^ OkBtn = AddBtn(\"&OK\", System::Windows::Forms::DialogResult::OK, 0);\n\t\t\t\tCancelButton = OkBtn;\n\t\t\t\t//(not sure why, but this matches official .NET behaviour)\n\t\t\t}\n\t\t\telse if (buttons == MessageBoxButtons::OKCancel)\n\t\t\t{\n\t\t\t\tnumbuttons = 2;\n\t\t\t\tAddBtn(\"&OK\", System::Windows::Forms::DialogResult::OK, 0);\n\t\t\t\tButton^ CancelBtn = AddBtn(\"&Cancel\", System::Windows::Forms::DialogResult::Cancel, 1);\n\t\t\t\tCancelButton = CancelBtn;\n\t\t\t}\n\t\t\telse if (buttons == MessageBoxButtons::YesNo)\n\t\t\t{\n\t\t\t\tnumbuttons = 2;\n\t\t\t\tAddBtn(\"&Yes\", System::Windows::Forms::DialogResult::Yes, 0);\n\t\t\t\tButton^ NoBtn = AddBtn(\"&No\", System::Windows::Forms::DialogResult::No, 1);\n\t\t\t\tCancelButton = NoBtn;\n\t\t\t\t//(official .NET doesn't set cancel button, but this seems pretty clear to me...)\n\t\t\t}\n\t\t\telse if (buttons == MessageBoxButtons::RetryCancel)\n\t\t\t{\n\t\t\t\tnumbuttons = 2;\n\t\t\t\tAddBtn(\"&Retry\", System::Windows::Forms::DialogResult::Retry, 0);\n\t\t\t\tButton^ CancelBtn = AddBtn(\"&Cancel\", System::Windows::Forms::DialogResult::Cancel, 1);\n\t\t\t\tCancelButton = CancelBtn;\n\t\t\t}\n\t\t\telse if (buttons == MessageBoxButtons::YesNoCancel)\n\t\t\t{\n\t\t\t\tnumbuttons = 3;\n\t\t\t\tAddBtn(\"&Yes\", System::Windows::Forms::DialogResult::Yes, 0);\n\t\t\t\tAddBtn(\"&No\", System::Windows::Forms::DialogResult::No, 1);\n\t\t\t\tButton^ CancelBtn = AddBtn(\"&Cancel\", System::Windows::Forms::DialogResult::Cancel, 2);\n\t\t\t\tCancelButton = CancelBtn;\n\t\t\t}\n\t\t\telse if (buttons == MessageBoxButtons::AbortRetryIgnore)\n\t\t\t{\n\t\t\t\tnumbuttons = 3;\n\t\t\t\tAddBtn(\"&Abort\", System::Windows::Forms::DialogResult::Abort, 0);\n\t\t\t\tAddBtn(\"&Retry\", System::Windows::Forms::DialogResult::Retry, 1);\n\t\t\t\tAddBtn(\"&Ignore\", System::Windows::Forms::DialogResult::Ignore, 2);\n\t\t\t\t//this.CancelButton = IgnoreBtn;\n\t\t\t\t//(official .NET doesn't set cancel button)\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow gcnew System::ComponentModel::InvalidEnumArgumentException(\"buttons\", (int)buttons, MessageBoxButtons::typeid);\n\t\t\t}\n\n\t\t\tif (!CancelButton)\n\t\t\t\tControlBox = false;\n\n\n\t\t\tif (icon != MessageBoxIcon::None)\n\t\t\t{\n\t\t\t\tint iconsize = 32 * ScaleWidth;\n\t\t\t\tint iconpadding = 12 * ScaleWidth;\n\t\t\t\tint textpadding = -8 * ScaleWidth;\n\n\t\t\t\tPictureBox^ iconPB = gcnew PictureBox();\n\t\t\t\ticonPB->Width = iconsize;\n\t\t\t\ticonPB->Height = iconsize;\n\t\t\t\ticonPB->Top = 10 * ScaleHeight;\n\t\t\t\ticonPB->Left = 10 * ScaleWidth;\n\t\t\t\ticonPB->AccessibleName = \"Icon\";\n\t\t\t\ticonPB->SizeMode = PictureBoxSizeMode::Zoom;\n\n\t\t\t\tSystem::Resources::ResourceManager^ ResMgr = gcnew System::Resources::ResourceManager(\"Launcher.SkinnedMessageBox\", SkinnedMessageBox::typeid->Assembly);\n\n\t\t\t\t// there are many duplicated values:\n\t\t\t\t// https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.messageboxicon?view=netframework-4.7.2\n\t\t\t\tif (icon == MessageBoxIcon::Error) // also Hand and Stop\n\t\t\t\t{\n\t\t\t\t\ticonPB->Image = (Image^)(ResMgr->GetObject(\"FeelsThinkMan\"));\n\t\t\t\t\ticonPB->AccessibleDescription = \"Error\";\n\t\t\t\t\t//this.Icon = SystemIcons.Error;\n\t\t\t\t\tSystem::Media::SystemSounds::Hand->Play();\n\t\t\t\t}\n\t\t\t\telse if (icon == MessageBoxIcon::Question)\n\t\t\t\t{\n\t\t\t\t\ticonPB->Image = (Image^)(ResMgr->GetObject(\"PokeWhat4xvc2\"));\n\t\t\t\t\ticonPB->AccessibleDescription = \"Question\";\n\t\t\t\t\t//this.Icon = SystemIcons.Question;\n\t\t\t\t\tSystem::Media::SystemSounds::Question->Play();\n\t\t\t\t}\n\t\t\t\telse if (icon == MessageBoxIcon::Warning) // also Exclamation\n\t\t\t\t{\n\t\t\t\t\ticonPB->Image = (Image^)(ResMgr->GetObject(\"PokeSnarf4xd\"));\n\t\t\t\t\ticonPB->AccessibleDescription = \"Warning\";\n\t\t\t\t\t//this.Icon = SystemIcons.Warning;\n\t\t\t\t\t//textpadding -= 2 * ScaleWidth; // triangle shape looks worse without this\n\t\t\t\t\tSystem::Media::SystemSounds::Exclamation->Play();\n\t\t\t\t}\n\t\t\t\telse if (icon == MessageBoxIcon::Information) // also Asterisk\n\t\t\t\t{\n\t\t\t\t\t/*Drawing::Icon^ infoicon = gcnew Drawing::Icon(SystemIcons::Information, iconsize, iconsize);\n\t\t\t\t\ticonPB->Image = infoicon->ToBitmap();\n\t\t\t\t\ticonPB->AccessibleDescription = \"Information\";\n\t\t\t\t\t//this.Icon = SystemIcons.Question;\n\t\t\t\t\tSystem::Media::SystemSounds::Asterisk->Play();*/\n\n\t\t\t\t\ticonPB->Image = (Image^)(ResMgr->GetObject(\"Help\"));\n\t\t\t\t\ticonPB->AccessibleDescription = \"Question\";\n\t\t\t\t\t//this.Icon = SystemIcons.Question;\n\t\t\t\t\tSystem::Media::SystemSounds::Question->Play();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthrow gcnew System::ComponentModel::InvalidEnumArgumentException(\"icon\", (int)icon, MessageBoxIcon::typeid);\n\t\t\t\t}\n\n\t\t\t\tMessageLbl->MinimumSize = Drawing::Size(MessageLbl->MinimumSize.Width - (iconsize + iconpadding + textpadding), MessageLbl->MinimumSize.Height);\n\t\t\t\tMessageLbl->Left += (iconsize + iconpadding + textpadding);\n\t\t\t\tControls->Add(iconPB);\n\t\t\t}\n\n\t\t\tif (defaultbutton == MessageBoxDefaultButton::Button1)\n\t\t\t{\n\t\t\t\tAcceptButton = buttonrefs[0];\n\t\t\t\tActiveControl = buttonrefs[0];\n\t\t\t}\n\t\t\telse if (defaultbutton == MessageBoxDefaultButton::Button2)\n\t\t\t{\n\t\t\t\tif (!Controls->Contains(buttonrefs[1])) throw gcnew ArgumentOutOfRangeException(\"defaultbutton\", \"defaultbutton cannot be set to a button number that does not exist\");\n\t\t\t\tAcceptButton = buttonrefs[1];\n\t\t\t\tActiveControl = buttonrefs[1];\n\t\t\t}\n\t\t\telse if (defaultbutton == MessageBoxDefaultButton::Button3)\n\t\t\t{\n\t\t\t\tif (!Controls->Contains(buttonrefs[2])) throw gcnew ArgumentOutOfRangeException(\"defaultbutton\", \"defaultbutton cannot be set to a button number that does not exist\");\n\t\t\t\tAcceptButton = buttonrefs[2];\n\t\t\t\tActiveControl = buttonrefs[2];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow gcnew System::ComponentModel::InvalidEnumArgumentException(\"defaultbutton\", (int)defaultbutton, MessageBoxDefaultButton::typeid);\n\t\t\t}\n\n\n\t\t\t// TODO: TEXT ALIGNMENT AND RTL MODE\n\t\t\t/*\n\t\t\t\t// MessageBoxOptions are more like flags than concrete settings.\n\t\t\t\t// For ease of use, we assume default value is whatever winforms gives us in current locale -- but we override if any value is set\n\t\t\t\tif ((options & MessageBoxOptions.RightAlign) == MessageBoxOptions.RightAlign) MessageLbl.TextAlign = ContentAlignment.TopRight;\n\t\t\t\telse if (options != 0) MessageLbl.TextAlign = ContentAlignment.TopLeft;\n\t\t\t\t\n\t\t\t\t// RtlReading should be what actually affects layout, and RightAlign only affects the text label\n\t\t\t\tif ((options & MessageBoxOptions.RtlReading) == MessageBoxOptions.RtlReading)\n\t\t\t\t{\n\t\t\t\t    foreach (Control control in this.Controls)\n\t\t\t\t    {\n\t\t\t\t        control.Left = this.ClientSize.Width - control.Right;\n\t\t\t\t        control.RightToLeft = RightToLeft.Yes;\n\t\t\t\t    }\n\t\t\t\t    this.RightToLeft = RightToLeft.Yes;\n\t\t\t\t    this.RightToLeftLayout = true;\n\t\t\t\t}\n\t\t\t\telse if (options != 0)\n\t\t\t\t{\n\t\t\t\t    foreach (Control control in this.Controls)\n\t\t\t\t    {\n\t\t\t\t        control.RightToLeft = RightToLeft.No;\n\t\t\t\t    }\n\t\t\t\t    this.RightToLeft = RightToLeft.No;\n\t\t\t\t    this.RightToLeftLayout = false;\n\t\t\t\t}\n\t\t\t*/\n\n\t\t\tSetBackCol(this, Color::FromArgb(64, 64, 64));\n\t\t\tSetForeCol(this, Color::White);\n\t\t\tSetUIStyle(this, FlatStyle::Flat);\n\t\t}\n\n\t\tSkinnedMessageBoxForm(String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton, MessageBoxOptions options)\n\t\t{\n\t\t\tSkinnedMessageBoxForm(NativeWindow::FromHandle((IntPtr::Zero)), message, caption, buttons, icon, defaultbutton, options);\n\t\t}\n\t};\n\npublic:\n\tstatic DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton, MessageBoxOptions options)\n\t{\n\t\t// I probably shouldn't do this, but from what I can tell this should be safe enough -- out of thread owner is allowed\n\t\t// and it only seems to appear when debugging (???)\n\t\tControl::CheckForIllegalCrossThreadCalls = false;\n\t\tSkinnedMessageBoxForm^ mb = gcnew SkinnedMessageBoxForm(owner, message, caption, buttons, icon, defaultbutton, options);\n\t\tDialogResult res = mb->ShowDialog();\n\t\tControl::CheckForIllegalCrossThreadCalls = true;\n\t\treturn res;\n\t}\n\n\tstatic DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton)\n\t{\n\t\treturn Show(owner, message, caption, buttons, icon, defaultbutton, (MessageBoxOptions)0);\n\t}\n\n\tstatic DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon)\n\t{\n\t\treturn Show(owner, message, caption, buttons, icon, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);\n\t}\n\n\tstatic DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons)\n\t{\n\t\treturn Show(owner, message, caption, buttons, MessageBoxIcon::None, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);\n\t}\n\n\tstatic DialogResult Show(IWin32Window^ owner, String^ message, String^ caption)\n\t{\n\t\treturn Show(owner, message, caption, MessageBoxButtons::OK, MessageBoxIcon::None, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);\n\t}\n\n\tstatic DialogResult Show(IWin32Window^ owner, String^ message)\n\t{\n\t\treturn Show(owner, message, \"\", MessageBoxButtons::OK, MessageBoxIcon::None, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);\n\t}\n};"
  },
  {
    "path": "source-code/source/plugins/Launcher/SkinnedMessageBox.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"FeelsThinkMan\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>FeelsThinkMan.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Help\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"PokeSnarf4xd\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>PokeSnarf4xd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"PokeWhat4xvc2\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>PokeWhat4xvc2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n</root>"
  },
  {
    "path": "source-code/source/plugins/Launcher/TabPadding.cpp",
    "content": "#include \"TabPadding.h\"\n//#include <Windows.h>\n\n// ported from https://stackoverflow.com/a/7785745\n// original code by user LarsTech https://stackoverflow.com/users/719186/larstech\n\nTabPadding::TabPadding(TabControl^ tc)\n{\n\ttabControl = tc;\n\ttabControl->Selected += gcnew TabControlEventHandler(this, &TabPadding::tabControl_Selected);\n\tAssignHandle(tc->Handle);\n}\n\nvoid TabPadding::tabControl_Selected(Object^ sender, TabControlEventArgs^ e)\n{\n\ttabControl->Invalidate();\n}\n\nvoid TabPadding::WndProc(Message %m) {\n\tNativeWindow::WndProc(m);\n\n\tif (m.Msg == 15) { //WM_PAINT\n\t\tGraphics^ g = Graphics::FromHwnd(m.HWnd);\n\n\t\t//Replace the outside white borders:\n\t\tif (tabControl->Parent) {\n\t\t\tg->SetClip(System::Drawing::Rectangle(0, 0, tabControl->Width - 2, tabControl->Height - 1), Drawing2D::CombineMode::Exclude);\n\t\t\tg->FillRectangle(gcnew SolidBrush(tabControl->Parent->BackColor),\n\t\t\t\tSystem::Drawing::Rectangle(0, tabControl->ItemSize.Height + 2, tabControl->Width, tabControl->Height - (tabControl->ItemSize.Height + 2)));\n\t\t}\n\t\t\t\t\n\n\t\t//Replace the inside white borders:\n\t\tif (tabControl->SelectedTab) {\n\t\t\tg->ResetClip();\n\t\t\tSystem::Drawing::Rectangle r = tabControl->SelectedTab->Bounds;\n\t\t\tg->SetClip(r, Drawing2D::CombineMode::Exclude);\n\t\t\tg->FillRectangle(gcnew SolidBrush(tabControl->SelectedTab->BackColor),\n\t\t\t\tSystem::Drawing::Rectangle(r.Left - 3, r.Top - 1, r.Width + 4, r.Height + 3));\n\t\t}\n\n\t\tdelete g;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/Launcher/TabPadding.h",
    "content": "#pragma once\nusing namespace System::Windows::Forms;\nusing namespace System::Drawing;\n\n// ported from https://stackoverflow.com/a/7785745\n// original code by user LarsTech https://stackoverflow.com/users/719186/larstech\n\nref class TabPadding : public NativeWindow\n{\npublic:\n\tTabPadding(TabControl^ tc);\n\nprivate:\n\tTabControl^ tabControl;\n\tvoid tabControl_Selected(Object^ sender, TabControlEventArgs^ e);\n\nprotected:\n\tvirtual void WndProc(Message %m) override;\n};"
  },
  {
    "path": "source-code/source/plugins/Launcher/composition.h",
    "content": "#pragma once\n#include <windows.h>\n\nenum AccentState {\n\tACCENT_DISABLED = 0,\n\tACCENT_ENABLE_GRADIENT = 1,\n\tACCENT_ENABLE_TRANSPARENTGRADIENT = 2,\n\tACCENT_ENABLE_BLURBEHIND = 3,\n\tACCENT_ENABLE_ACRYLICBLURBEHIND = 4,\n\tACCENT_ENABLE_HOSTBACKDROP = 5,\n\tACCENT_INVALID_STATE = 6\n};\n\nenum WindowCompositionAttribute {\n\tWCA_ACCENT_POLICY = 19,\n\tWCA_USEDARKMODECOLORS = 26\n};\n\nstruct AccentPolicy {\n\tAccentState accentState;\n\tint accentFlags;\n\tint gradientColor;\n\tint animationId;\n};\n\nstruct WindowCompositionAttributeData {\n\tWindowCompositionAttribute attribute;\n\tPVOID pData;\n\tULONG dataSize;\n};\n\nbool setBlur(HWND hWnd, AccentState accentState)\n{\n\tHKEY CurrentVersion;\n\tauto result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L\"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\", 0, KEY_QUERY_VALUE, &CurrentVersion);\n\tif (result == ERROR_SUCCESS)\n\t{\n\t\tDWORD DataSize = 32;\n\t\tWCHAR* DataPtr = (WCHAR*)malloc(DataSize);\n\t\tmemset(DataPtr, 0, DataSize);\n\t\tbool queryBuild = RegQueryValueEx(CurrentVersion, L\"CurrentBuild\", NULL, NULL, (LPBYTE)DataPtr, &DataSize) == ERROR_SUCCESS;\n\t\tRegCloseKey(CurrentVersion);\n\t\tif (queryBuild)\n\t\t{\n\t\t\tint BuildNum = _wtoi(DataPtr);\n\t\t\t//MessageBox::Show(BuildNum.ToString());\n\t\t\tif (BuildNum < 19042) return 0;\n\t\t}\n\t\telse return 0;\n\t}\n\telse return 0;\n\n\tconst HINSTANCE hModule_user32 = LoadLibrary(TEXT(\"user32.dll\"));\n\tif (hModule_user32)\n\t{\n\t\ttypedef BOOL(WINAPI* p_SetWindowCompositionAttribute)(HWND, WindowCompositionAttributeData*);\n\n\t\tconst p_SetWindowCompositionAttribute SetWindowCompositionAttribute = (p_SetWindowCompositionAttribute)GetProcAddress(hModule_user32, \"SetWindowCompositionAttribute\");\n\n\t\tbool result = false;\n\n\t\tif (SetWindowCompositionAttribute)\n\t\t{\n\t\t\tAccentPolicy policy;\n\t\t\tpolicy.accentState = accentState;\n\t\t\tpolicy.accentFlags = 2;\n\t\t\tpolicy.gradientColor = 0x01000000;\n\t\t\tpolicy.animationId = 0;\n\n\t\t\tWindowCompositionAttributeData data;\n\t\t\tdata.attribute = WCA_ACCENT_POLICY;\n\t\t\tdata.pData = &policy;\n\t\t\tdata.dataSize = sizeof(AccentPolicy);\n\n\t\t\tresult = SetWindowCompositionAttribute(hWnd, &data);\n\t\t}\n\t\tFreeLibrary(hModule_user32);\n\n\t\treturn result;\n\t}\n\n\treturn 0;\n}\n\nvoid setDarkTheme(HWND hWnd, bool dark=true)\n{\n\tconst HINSTANCE hModule_dwmapi = LoadLibrary(TEXT(\"dwmapi.dll\"));\n\tif (hModule_dwmapi)\n\t{\n\t\ttypedef BOOL(WINAPI* p_DwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD);\n\t\tconst p_DwmSetWindowAttribute DwmSetWindowAttribute = (p_DwmSetWindowAttribute)GetProcAddress(hModule_dwmapi, \"DwmSetWindowAttribute\");\n\n\t\tif (DwmSetWindowAttribute)\n\t\t{\n\t\t\tLONG useDarkModeColors = dark;\n\t\t\tif(DwmSetWindowAttribute(hWnd, 20, &useDarkModeColors, sizeof(useDarkModeColors)))\n\t\t\t\tDwmSetWindowAttribute(hWnd, 19, &useDarkModeColors, sizeof(useDarkModeColors));\n\t\t}\n\t\tFreeLibrary(hModule_dwmapi);\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/Launcher/dllmain.cpp",
    "content": "#include \"ui.h\"\n#include \"framework.h\"\n#include <detours.h>\n#pragma comment(lib, \"detours.lib\")\n\nusing namespace System;\nusing namespace System::Windows::Forms;\n\n[STAThread]\nint showUI() {\n\tSetProcessDPIAware();\n\tApplication::EnableVisualStyles();\n\tApplication::SetCompatibleTextRenderingDefault(false);\n\tApplication::Run(gcnew Launcher::ui());\n\treturn 0;\n}\n\nint hookedMain(int argc, const char** argv, const char** envp)\n{\n\tfor (int i = 0; i < argc; ++i)\n\t{\n\t\targ = argv[i];\n\t\tif (arg == \"--launch\" || nSkipLauncher)\n\t\t\treturn divaMain(argc, argv, envp);\n\t}\n\treturn showUI();\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule,\n\tDWORD  ul_reason_for_call,\n\tLPVOID lpReserved\n)\n{\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaMain, hookedMain);\n\t\tDetourTransactionCommit();\n\t}\n\treturn TRUE;\n}"
  },
  {
    "path": "source-code/source/plugins/Launcher/framework.h",
    "content": "﻿#pragma once\r\n\r\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\r\n// Windows Header Files\r\n#include <windows.h>\r\n#include <string>\r\n#include <fstream>\r\n#include <vector>\r\n#include <algorithm>\r\n\r\n#include \"ConfigOption.h\"\r\n#include \"PluginConfig.h\"\r\n#include <iostream>\r\n\r\nint (__cdecl* divaMain)(int argc, const char** argv, const char** envp) = (int(__cdecl*)(int argc, const char** argv, const char** envp))0x140194D90;\r\n\r\nusing namespace std;\r\n\r\nstring arg;\r\n\r\nwstring ExePath() {\r\n\tWCHAR buffer[MAX_PATH];\r\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\r\n\treturn wstring(buffer);\r\n}\r\n\r\nwstring DirPath() {\r\n\twstring exepath = ExePath();\r\n\twstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\r\n\treturn exepath.substr(0, pos);\r\n}\r\n\r\nwstring DIVA_EXECUTABLE_STRING = ExePath();\r\nLPCWSTR DIVA_EXECUTABLE = DIVA_EXECUTABLE_STRING.c_str();\r\n\r\nwstring DIVA_DIRPATH_STRING = DirPath();\r\nLPCWSTR DIVA_DIRPATH = DIVA_DIRPATH_STRING.c_str();\r\n\r\nwstring DIVA_EXECUTABLE_LAUNCH_STRING = DIVA_EXECUTABLE_STRING + L\" --launch\";\r\nLPWSTR DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING.c_str());\r\n\r\nwstring PLUGINS_DIR = DirPath() + L\"\\\\plugins\";\r\nwstring PATCHES_DIR = DirPath() + L\"\\\\patches\";\r\n\r\nwstring CONFIG_FILE_STRING = PLUGINS_DIR + L\"\\\\config.ini\";\r\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\r\n\r\nwstring COMPONENTS_FILE_STRING = PLUGINS_DIR + L\"\\\\components.ini\";\r\nLPCWSTR COMPONENTS_FILE = COMPONENTS_FILE_STRING.c_str();\r\n\r\nwstring PLAYERDATA_FILE_STRING = PLUGINS_DIR + L\"\\\\playerdata.ini\";\r\nLPCWSTR PLAYERDATA_FILE = PLAYERDATA_FILE_STRING.c_str();\r\n\r\nwstring KEYCONFIG_FILE_STRING = PLUGINS_DIR + L\"\\\\keyconfig.ini\";\r\nLPCWSTR KEYCONFIG_FILE = KEYCONFIG_FILE_STRING.c_str();\r\n\r\nLPCWSTR PATCHES_SECTION = L\"patches\";\r\nLPCWSTR GRAPHICS_SECTION = L\"graphics\";\r\nLPCWSTR RESOLUTION_SECTION = L\"resolution\";\r\nLPCWSTR LAUNCHER_SECTION = L\"launcher\";\r\nLPCWSTR COMPONENTS_SECTION = L\"components\";\r\nLPCWSTR PLAYERDATA_SECTION = L\"playerdata\";\r\nLPCWSTR KEYCONFIG_SECTION = L\"keyconfig\";\r\n\r\nint nSkipLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L\"skip\", FALSE, CONFIG_FILE);\r\nint nNoGPUDialog = GetPrivateProfileIntW(LAUNCHER_SECTION, L\"no_gpu_dialog\", FALSE, CONFIG_FILE);\r\n\r\n\r\nresolution getCurrentScreenResolution() {\r\n\treturn resolution(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));\r\n}\r\n\r\nstd::vector<DEVMODEW> getScreenModes() {\r\n\tstatic std::vector<DEVMODEW> outVec = std::vector<DEVMODEW>();\r\n\r\n\tDEVMODEW dm = { 0 };\r\n\tdm.dmSize = sizeof(dm);\r\n\tfor (int iModeNum = 0; EnumDisplaySettingsW(NULL, iModeNum, &dm) != 0; iModeNum++)\r\n\t{\r\n\t\toutVec.push_back(dm);\r\n\t}\r\n\r\n\treturn outVec;\r\n}\r\n\r\nstd::vector<resolution> getScreenResolutionsVec(std::vector<DEVMODEW> &screenModes) {\r\n\tstatic std::vector<resolution> outVec = std::vector<resolution>();\r\n\r\n\tfor (DEVMODEW &dm : screenModes)\r\n\t{\r\n\t\tresolution res = resolution(dm.dmPelsWidth, dm.dmPelsHeight);\r\n\r\n\t\tif (std::find(outVec.begin(), outVec.end(), res) == outVec.end()) {\r\n\t\t\toutVec.push_back(res);\r\n\t\t}\r\n\t}\r\n\r\n\tconst resolution defaultres(1280, 720);\r\n\tif (std::find(outVec.begin(), outVec.end(), defaultres) == outVec.end()) {\r\n\t\toutVec.push_back(defaultres);\r\n\t}\r\n\r\n\tstd::sort(outVec.begin(), outVec.end());\r\n\r\n\treturn outVec;\r\n}\r\n\r\nstatic std::vector<int> getScreenDepthsVec(std::vector<DEVMODEW> &screenModes) {\r\n\tstatic std::vector<int> outVec = std::vector<int>();\r\n\r\n\tfor (DEVMODEW &dm : screenModes)\r\n\t{\r\n\t\tint depth = dm.dmBitsPerPel;\r\n\r\n\t\tif (depth < 24)\r\n\t\t\tcontinue;\r\n\r\n\t\tif (std::find(outVec.begin(), outVec.end(), depth) == outVec.end()) {\r\n\t\t\toutVec.push_back(depth);\r\n\t\t}\r\n\t}\r\n\r\n\tstd::sort(outVec.begin(), outVec.end());\r\n\r\n\treturn outVec;\r\n}\r\n\r\nstatic std::vector<int> getScreenRatesVec(std::vector<DEVMODEW> &screenModes) {\r\n\tstatic std::vector<int> outVec = std::vector<int>();\r\n\r\n\tfor (DEVMODEW &dm : screenModes)\r\n\t{\r\n\t\tint rate = dm.dmDisplayFrequency;\r\n\r\n\t\tif (std::find(outVec.begin(), outVec.end(), rate) == outVec.end()) {\r\n\t\t\toutVec.push_back(rate);\r\n\t\t}\r\n\t}\r\n\r\n\tstd::sort(outVec.begin(), outVec.end());\r\n\r\n\treturn outVec;\r\n}\r\n\r\nstd::vector<DEVMODEW> screenModes = getScreenModes();\r\n\r\nconst std::vector<resolution> internalResOptions = { resolution(320,240), resolution(426,240), resolution(640,480), resolution(854,480), resolution(960,540), resolution(1280,720),  resolution(1366,768), resolution(1600,900), resolution(1920,1080), resolution(2560,1440), resolution(3200,1800), resolution(3840,2160), resolution(5120,2880), resolution(7680,4320) };\r\n\r\nDropdownOption* DisplayModeDropdown = new DropdownOption(L\"display\", RESOLUTION_SECTION, CONFIG_FILE, L\"Display:\", L\"Sets the window/screen mode.\", 1, std::vector<LPCWSTR>({ L\"Windowed\", L\"Fast\", L\"Exclusive\", L\"Safe\" }));\r\nResolutionOption* DisplayResolutionOption = new ResolutionOption(L\"width\", L\"height\", RESOLUTION_SECTION, CONFIG_FILE, L\"Resolution:\", L\"Sets the display resolution.\", resolution(-1, -1), getScreenResolutionsVec(screenModes), true, RESOPT_INCLUDE_MATCH_SCREEN);\r\nDropdownNumberOption* RefreshRateOption = new DropdownNumberOption(L\"refreshrate\", RESOLUTION_SECTION, CONFIG_FILE, L\"Refresh Rate:\", L\"Sets the display refresh rate.\", 60, getScreenRatesVec(screenModes), true);\r\n\r\nConfigOptionBase* screenResolutionArray[] = {\r\n\tDisplayModeDropdown,\r\n\tDisplayResolutionOption,\r\n\t//new DropdownNumberOption(L\"bitdepth\", RESOLUTION_SECTION, CONFIG_FILE, L\"Bit Depth:\", L\"Sets the display bit depth.\", 32, getScreenDepthsVec(screenModes), true),\r\n\tRefreshRateOption,\r\n};\r\n\r\nBooleanOption* InternalResolutionCheckbox = new BooleanOption(L\"r.enable\", RESOLUTION_SECTION, CONFIG_FILE, L\"Enable\", L\"Enable or disable custom internal resolution.\", false, false);\r\nResolutionOption* InternalResolutionOption = new ResolutionOption(L\"r.width\", L\"r.height\", RESOLUTION_SECTION, CONFIG_FILE, L\"Resolution:\", L\"Sets the internal resolution (instead of 1280x720).\", resolution(1920, 1080), internalResOptions, true, RESOPT_INCLUDE_MATCH_WINDOW);\r\n\r\nConfigOptionBase* internalResolutionArray[] = {\r\n\tInternalResolutionCheckbox,\r\n\tInternalResolutionOption\r\n};\r\n\r\nConfigOptionBase* graphicsArray[] = {\r\n\tnew DropdownOption(L\"model\", L\"GPU\", CONFIG_FILE, L\"Nvidia GPU:\", L\"Select your Nvidia GPU's architecture to apply the necessary workarounds.\\n\\nNOTE: Automatic detection does not currently work on GNU/Linux.\", -1, std::vector<LPCWSTR>({ L\"Automatic\", L\"Kepler\", L\"Maxwell/Pascal\", L\"Turing\", L\"Ampere\", L\"Ada Lovelace\", L\"Blackwell or newer\"}), -1),\r\n\tnew BooleanOption(L\"TAA\", GRAPHICS_SECTION, CONFIG_FILE, L\"TAA\", L\"Temporal Anti-Aliasing\", true, false),\r\n\tnew BooleanOption(L\"MLAA\", GRAPHICS_SECTION, CONFIG_FILE, L\"MLAA\", L\"Morphological Anti-Aliasing\", true, false),\r\n\tnew DropdownOption(L\"MAG\", GRAPHICS_SECTION, CONFIG_FILE, L\"Filter:\", L\"Image filter.\\n\\nBilinear: default filter\\nNearest-neighbour: sharpest, but blocky\\nSharpen: sharp filter\\nCone: smooth filter\", 0, std::vector<LPCWSTR>({ L\"Bilinear\", L\"Nearest-neighbour\", L\"Sharpen\", L\"Cone\" })),\r\n\tnew BooleanOption(L\"DOF\", GRAPHICS_SECTION, CONFIG_FILE, L\"Depth of Field\", L\"Blurs the background. Disable for better performance.\", true, false),\r\n\tnew BooleanOption(L\"reflections\", GRAPHICS_SECTION, CONFIG_FILE, L\"Reflections\", L\"Enable or disable reflections.\", true, false),\r\n\tnew ResolutionOption(L\"reflect_res_width\", L\"reflect_res_height\", GRAPHICS_SECTION, CONFIG_FILE, L\"Reflection Res:\", L\"Sets the reflection buffer resolution (instead of 512x256).\", resolution(512, 256), std::vector<resolution>({resolution(256,256), resolution(512,256), resolution(512,512), resolution(640,480), resolution(854,480), resolution(960,540), resolution(1280,720),  resolution(1366,768), resolution(1600,900), resolution(1920,1080), resolution(2560,1440), resolution(3200,1800), resolution(3840,2160), resolution(5120,2880), resolution(7680,4320)}), true, RESOPT_NONE),\r\n\tnew ResolutionOption(L\"refract_res_width\", L\"refract_res_height\", GRAPHICS_SECTION, CONFIG_FILE, L\"Refraction Res:\", L\"Sets the refraction buffer resolution (instead of 512x256).\", resolution(512, 256), std::vector<resolution>({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, RESOPT_NONE),\r\n\tnew BooleanOption(L\"shadows\", GRAPHICS_SECTION, CONFIG_FILE, L\"Shadows\", L\"Enable or disable shadows.\", true, false),\r\n\tnew ResolutionOption(L\"shadow_res_width\", L\"shadow_res_height\", GRAPHICS_SECTION, CONFIG_FILE, L\"Shadow Res:\", L\"Sets the shadow buffer resolution (instead of 2048x2048).\", resolution(2048, 2048), std::vector<resolution>({resolution(256,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096), resolution(8192,8192)}), true, RESOPT_NONE),\r\n\tnew NumericOption(L\"gamma\", GRAPHICS_SECTION, CONFIG_FILE, L\"Gamma:\", L\"Increase to darken shadows.\\nSet to 125 for a console-like experience.\\n\\nDefault: 0 or 100\", 100, 0, 200),\r\n\tnew BooleanOption(L\"punchthrough\", GRAPHICS_SECTION, CONFIG_FILE, L\"Transparent Meshes\", L\"Show transparent meshes.\", true, false),\r\n\tnew BooleanOption(L\"glare\", GRAPHICS_SECTION, CONFIG_FILE, L\"Glare\", L\"Enable or disable glare.\", true, false),\r\n\tnew BooleanOption(L\"shader\", GRAPHICS_SECTION, CONFIG_FILE, L\"Shader\", L\"Enable or disable high-quality shaders.\", true, false),\r\n\tnew DropdownOption(L\"NPR1\", GRAPHICS_SECTION, CONFIG_FILE, L\"Toon (F9):\", L\"NPR1 shader\\n\\nPress F9 to toggle.\", 0, std::vector<LPCWSTR>({ L\"Default\", L\"Force on\", L\"Force off\" })),\r\n\tnew BooleanOption(L\"2D\", GRAPHICS_SECTION, CONFIG_FILE, L\"Disable 3D rendering\", L\"Disable all 3D passes.\\n\\nWARNING: The extended data will be deleted unless Prevent Data Deletion is enabled.\", false, false),\r\n\r\n};\r\n\r\nConfigOptionBase* optionsArray[] = {\r\n\tnew OptionMetaSectionLabel(L\"Compatibility\"),\r\n\tnew BooleanOption(L\"no_movies\", PATCHES_SECTION, CONFIG_FILE, L\"Disable Movies\", L\"Disable movies (enable this if the game hangs when loading certain PVs).\", false, false),\r\n\tnew BooleanOption(L\"mp4_movies\", PATCHES_SECTION, CONFIG_FILE, L\"Custom MP4 Adv Movies\", L\"Enable MP4 (instead of WMV) advertise/attract movies.\", false, false),\r\n\tnew BooleanOption(L\"cursor\", PATCHES_SECTION, CONFIG_FILE, L\"Cursor\", L\"Enable or disable the mouse cursor.\", true, false),\r\n\tnew BooleanOption(L\"stereo\", PATCHES_SECTION, CONFIG_FILE, L\"Stereo\", L\"Use 2 channels instead of 4 (when not using DivaSound).\", true, false),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"Controller Options\"),\r\n\tnew BooleanOption(L\"rumble\", KEYCONFIG_SECTION, KEYCONFIG_FILE, L\"XInput Rumble\", L\"Enables rumble during chainslides.\", true, true),\r\n\tnew NumericOption(L\"xinput_rumble_intensity_left\", KEYCONFIG_SECTION, KEYCONFIG_FILE, L\"Left motor:\", L\"Left rumble motor intensity (XInput).\\n\\nDefault: 8000\", 8000, 0, USHRT_MAX),\r\n\tnew NumericOption(L\"xinput_rumble_intensity_right\", KEYCONFIG_SECTION, KEYCONFIG_FILE, L\"Right motor:\", L\"Right rumble motor intensity (XInput).\\n\\nDefault: 4000\", 4000, 0, USHRT_MAX),\r\n\tnew NumericOption(L\"xinput_preferred\", KEYCONFIG_SECTION, KEYCONFIG_FILE, L\"XInput Controller Num:\", L\"Sets the preferred XInput controller.\\nIf unavailable, the next connected controller is used.\", 0, 0, 3),\r\n\tnew BooleanOption(L\"hardware_slider\", PATCHES_SECTION, CONFIG_FILE, L\"Use Hardware Slider\", L\"Enable this if using a real arcade slider.\\n(set the slider to port COM11)\", false, false),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"PV Selector\"),\r\n\tnew DropdownOption(L\"quick_start\", PATCHES_SECTION, CONFIG_FILE, L\"Quick Start:\", L\"Skip one or more menus.\", 1, std::vector<LPCWSTR>({ L\"Disabled\", L\"Guest\", L\"Guest + Normal\" })),\r\n\tnew BooleanOption(L\"no_scrolling_sfx\", PATCHES_SECTION, CONFIG_FILE, L\"Disable Scrolling SFX\", L\"Disable the scrolling sound effect.\", false, false),\r\n\tnew BooleanOption(L\"unlock_pseudo\", PATCHES_SECTION, CONFIG_FILE, L\"Unlock PSEUDO modules (incomplete)\", L\"Lets you play any PV with any performer.\\n(incomplete, recommended modules will default to Miku)\", false, false),\r\n\tnew BooleanOption(L\"card\", PATCHES_SECTION, CONFIG_FILE, L\"Unlock card menu (incomplete)\", L\"Enables the card menu.\\n(incomplete, it doesn't bypass the card prompt)\", false, false),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"Stages/Songs\"),\r\n\tnew BooleanOption(L\"Auto_Databank\", PATCHES_SECTION, CONFIG_FILE, L\"Auto Databank\", L\"Automatically generate databank for missing entries and allow multiple PvList files to be used.\", true, false),\r\n\tnew NumericOption(L\"Enhanced_Stage_Manager\", PATCHES_SECTION, CONFIG_FILE, L\"Number of Stages:\", L\"Set the number of stages (0 = default).\", 0, 0, INT_MAX),\r\n\tnew BooleanOption(L\"Enhanced_Stage_Manager_Encore\", PATCHES_SECTION, CONFIG_FILE, L\"Encore\", L\"Enable encore stages.\", true, false),\r\n\tnew BooleanOption(L\"sing_missed\", PATCHES_SECTION, CONFIG_FILE, L\"Sing Missed\", L\"Sing missed notes.\", false, false),\r\n\tnew BooleanOption(L\"autopause\", KEYCONFIG_SECTION, KEYCONFIG_FILE, L\"Pause Automatically\", L\"Pause when focus is lost.\", true, true),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"PV Customization\"),\r\n\tnew BooleanOption(L\"enable_pv_customization\", PATCHES_SECTION, CONFIG_FILE, L\"Enable PV Customization\", L\"Enable the options below.\", false, false),\r\n\tnew DropdownOption(L\"force_mouth\", PATCHES_SECTION, CONFIG_FILE, L\"Mouth Type:\", L\"Change the mouth animations.\", 0, std::vector<LPCWSTR>({ L\"Default\", L\"Force PDA\", L\"Force FT\" })),\r\n\tnew DropdownOption(L\"force_expressions\", PATCHES_SECTION, CONFIG_FILE, L\"Expression Type:\", L\"Change the expressions.\", 0, std::vector<LPCWSTR>({ L\"Default\", L\"Force PDA\", L\"Force FT\" })),\r\n\tnew DropdownOption(L\"force_look\", PATCHES_SECTION, CONFIG_FILE, L\"Look Type:\", L\"Change the look animations.\", 0, std::vector<LPCWSTR>({ L\"Default\", L\"Force PDA\", L\"Force FT\" })),\r\n\tnew BooleanOption(L\"no_hand_scaling\", PATCHES_SECTION, CONFIG_FILE, L\"No Hand Scaling\", L\"Disable hand scaling.\", false, false),\r\n\tnew NumericOption(L\"default_hand_size_uint\", PATCHES_SECTION, CONFIG_FILE, L\"Default Hand Size:\", L\"0-10000: default\\n12200: PDA\\n1000000: maximum\", 0, 0, 1000000),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"UI Elements\"),\r\n\tnew BooleanOption(L\"hide_volume\", PATCHES_SECTION, CONFIG_FILE, L\"Hide Volume Buttons\", L\"Hide the volume and SE control buttons.\", false, false),\r\n\tnew BooleanOption(L\"no_pv_ui\", PATCHES_SECTION, CONFIG_FILE, L\"Disable PV UI\", L\"Remove the photo controls during PV playback.\", false, false),\r\n\tnew BooleanOption(L\"hide_pv_watermark\", PATCHES_SECTION, CONFIG_FILE, L\"Hide PV Watermark\", L\"Hide the watermark that's usually shown in PV viewing mode.\", false, false),\r\n\tnew BooleanOption(L\"hide_status_icons\", PATCHES_SECTION, CONFIG_FILE, L\"Hide Network Icons\", L\"Hide the top-right corner status icons.\", false, false), // technically reduntant, but somehow a lot of users miss the dropdown\r\n\tnew DropdownOption(L\"status_icons\", PATCHES_SECTION, CONFIG_FILE, L\"Network Icons Status:\", L\"Set the state of card reader and network status icons.\", 3, std::vector<LPCWSTR>({ L\"Default\", L\"Hidden\", L\"Error\", L\"OK\", L\"Partial OK\" })),\r\n\tnew BooleanOption(L\"no_lyrics\", PATCHES_SECTION, CONFIG_FILE, L\"Disable Lyrics\", L\"Disable showing lyrics.\", false, false),\r\n\tnew BooleanOption(L\"no_error\", PATCHES_SECTION, CONFIG_FILE, L\"Disable Error Banner\", L\"Disable the error banner on the attract screen.\", true, false),\r\n\tnew BooleanOption(L\"hide_freeplay\", PATCHES_SECTION, CONFIG_FILE, L\"Hide \\\"FREE PLAY\\\"/\\\"CREDIT(S)\\\"\", L\"Hide the \\\"FREE PLAY\\\"/\\\"CREDIT(S)\\\" text.\", false, false),\r\n\tnew BooleanOption(L\"freeplay\", PATCHES_SECTION, CONFIG_FILE, L\"FREE PLAY\", L\"Show \\\"FREE PLAY\\\" instead of \\\"CREDIT(S)\\\" and don't require credits.\", true, false),\r\n\tnew BooleanOption(L\"pdloadertext\", PATCHES_SECTION, CONFIG_FILE, L\"PD Loader FREE PLAY\", L\"Show \\\"PD Loader\\\" instead of \\\"FREE PLAY\\\".\", true, false),\r\n\tnew BooleanOption(L\"no_timer\", PATCHES_SECTION, CONFIG_FILE, L\"Freeze Timer\", L\"Disable the timer.\", true, false),\r\n\tnew BooleanOption(L\"no_timer_sprite\", PATCHES_SECTION, CONFIG_FILE, L\"Disable Timer Sprite\", L\"Disable the timer sprite.\", true, false),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"Framerate\"),\r\n\tnew BooleanOption(L\"FPS.Limit.LightMode\", GRAPHICS_SECTION, CONFIG_FILE, L\"Use Lightweight Limiter\", L\"Makes the FPS limiter use less CPU.\\nMay have less consistent performance.\", true, false),\r\n\tnew NumericOption(L\"FPS.Limit\", GRAPHICS_SECTION, CONFIG_FILE, L\"FPS Limit:\", L\"Allows you to set a frame rate cap. Set to -1 to unlock the frame rate.\", 60, -1, INT_MAX),\r\n\tnew NumericOption(L\"frm.motion.rate\", GRAPHICS_SECTION, CONFIG_FILE, L\"FRM Motion Rate:\", L\"Sets the motion rate (fps) for the Frame Rate Manager component.\\nLarger values should be smoother, but more CPU intensive and possibly buggier.\", 300, 1, INT_MAX),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\t//new OptionMetaSectionLabel(L\"Advanced Compatibility\"),\r\n\t//new BooleanOption(L\"opengl_patch_a\", LAUNCHER_SECTION, CONFIG_FILE, L\"OpenGL Patch A\", L\"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.\", false, false),\r\n\t//new BooleanOption(L\"opengl_patch_b\", LAUNCHER_SECTION, CONFIG_FILE, L\"OpenGL Patch B\", L\"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.\", false, false),\r\n\t//new OptionMetaSeparator(),\r\n\t//new OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"Loader\"),\r\n\tnew BooleanOption(L\"custom_patches\", PATCHES_SECTION, CONFIG_FILE, L\"Enable Custom Patches\", L\"Enables all custom patches.\", true, false),\r\n\t//new BooleanOption(L\"prevent_data_deletion\", PATCHES_SECTION, CONFIG_FILE, L\"Prevent Data Deletion\", L\"Prevents the game from deleting files.\", false, false),\r\n\tnew OptionMetaSeparator(),\r\n\tnew OptionMetaSpacer(8),\r\n\r\n\tnew OptionMetaSectionLabel(L\"Launcher\"),\r\n\tnew BooleanOption(L\"dark_launcher\", LAUNCHER_SECTION, CONFIG_FILE, L\"Dark Launcher\", L\"Sets the dark colour scheme in the launcher.\", false, false),\r\n\t//new BooleanOption(L\"acrylic_blur\", LAUNCHER_SECTION, CONFIG_FILE, L\"Acrylic Blur\", L\"Enables acrylic blur in the launcher on Windows 10 20H2 or later.\", false, false),\r\n\tnew BooleanOption(L\"no_gpu_dialog\", LAUNCHER_SECTION, CONFIG_FILE, L\"Disable GPU Warning\", L\"Disables the warning dialog for unsupported GPUs.\", false, false),\r\n\t//new BooleanOption(L\"ignore_exe_checksum\", PATCHES_SECTION, CONFIG_FILE, L\"Ignore exe checksum\", L\"Use at your own risk.\", false, false),\r\n\tnew StringOption(L\"command_line\", LAUNCHER_SECTION, CONFIG_FILE, L\"Command Line:\", L\"Allows setting command line parameters for the game when using the launcher.\\nDisabling the launcher will bypass this.\", L\"\", false),\r\n\tnew BooleanOption(L\"use_divahook_bat\", LAUNCHER_SECTION, CONFIG_FILE, L\"Use divahook.bat/start.bat\", L\"Launches divahook.bat/start.bat intead of diva.exe.\", false, false),\r\n};\r\n\r\nConfigOptionBase* playerdataArray[] = {\r\n\tnew StringOption(L\"player_name\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Player Name:\", L\"Player name shown in game.\", L\"ＮＯ－ＮＡＭＥ\", true),\r\n\tnew StringOption(L\"level_name\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Level Name:\", L\"Level (plate) name shown in game.\", L\"忘れないでね私の声を\", true),\r\n\r\n\tnew NumericOption(L\"level_plate_id\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Level Plate:\", L\"Sets the level background image (plate).\", 0, 0, INT_MAX),\r\n\tnew NumericOption(L\"level_plate_effect\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Level Plate Effect:\", L\"Sets the effect on the level background image (plate).\", -1, -1, 2),\r\n\tnew NumericOption(L\"skin_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Skin:\", L\"Sets the gameplay UI skin.\", 0, 0, INT_MAX),\r\n\r\n\tnew NumericOption(L\"btn_se_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Button Sound:\", L\"Sets the sound effect for buttons.\\n-1 = song default\", -1, -1, INT_MAX),\r\n\tnew NumericOption(L\"slide_se_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Slide Sound:\", L\"Sets the sound effect for slides.\\n-1 = song default\", -1, -1, INT_MAX),\r\n\tnew NumericOption(L\"chainslide_se_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Chainslide Sound:\", L\"Sets the sound effect for chain slides.\\n-1 = song default\", -1, -1, INT_MAX),\r\n\tnew NumericOption(L\"slidertouch_se_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Slider Touch Sound:\", L\"Sets the sound effect for touching the slider with no note.\\n-1 = song default\", -1, -1, INT_MAX),\r\n\tnew BooleanOption(L\"act_toggle\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Button SE\", L\"Enables button/slider sounds.\", true, true),\r\n\r\n\tnew BooleanOption(L\"border_great\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Clear Border (Great)\", L\"Shows the clear border for a great rating on the progress bar.\", true, true),\r\n\tnew BooleanOption(L\"border_excellent\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Clear Border (Excellent)\", L\"Shows the clear border for an excellent rating on the progress bar.\", true, true),\r\n\tnew BooleanOption(L\"border_rival\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Clear Border (Rival)\", L\"Shows the clear border for beating your rival on the progress bar.\", false, true),\r\n\r\n\tnew BooleanOption(L\"use_card\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Use Card\", L\"Enables IC card. This allows module selection.\", true, true),\r\n\tnew BooleanOption(L\"module_card_workaround\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Fast Module Selection (buggy)\", L\"Allows module selection without card and tries to improve menu performance.\\nKnown to cause issues, especially with song-specific modules.\", false, true),\r\n\tnew BooleanOption(L\"use_pv_module_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Song Specific Modules\", L\"Allows song-specific module selection.\", true, true),\r\n\tnew BooleanOption(L\"use_pv_skin_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Song Specific Skins\", L\"Allows song-specific skin settings.\\nValues stored in skins.ini\", true, true),\r\n\tnew BooleanOption(L\"use_pv_sfx_equip\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Song Specific Sound Effects\", L\"Allows song-specific sound effect settings.\\nValues stored in sfx.ini\", true, true),\r\n\r\n\tnew BooleanOption(L\"gamemode_options\", PLAYERDATA_SECTION, PLAYERDATA_FILE, L\"Game Modifiers\", L\"Allows use of game mode modifiers (hi-speed, hidden, and sudden).\", true, true),\r\n};\r\n\r\n\r\nConfigOptionBase* componentsArray[] = {\r\n\tnew BooleanOption(L\"input_emulator\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Input Emulator\", L\"Emulates input through keyboard and/or mouse.\", false, true),\r\n\tnew BooleanOption(L\"touch_slider_emulator\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Slider Emulator\", L\"Emulates slider through keyboard and/or mouse.\", false, true),\r\n\tnew BooleanOption(L\"touch_panel_emulator\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Touch Panel Emulator\", L\"Emulates touch panel through mouse.\", false, true),\r\n\r\n\tnew BooleanOption(L\"player_data_manager\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Player Data Manager\", L\"Loads user-defined values into the PlayerData struct.\\nRequired for modules and game mode modifiers.\", false, true),\r\n\r\n\tnew BooleanOption(L\"frame_rate_manager\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Frame Rate Manager\", L\"Adjusts animations to the correct speed at different frame rates.\\nOnly needed when FPS isn't locked at 60.\", false, true),\r\n\r\n\tnew BooleanOption(L\"fast_loader\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Fast Loader\", L\"Skip or speed up unnecessary loading steps.\", false, true),\r\n\r\n\tnew NumericOption(L\"fast_loader_speed\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Fast Loader Speed\", L\"Set this to 4 or less when playing online.\\nDefault: 39\", 39, 2, 1024),\r\n\r\n\tnew BooleanOption(L\"camera_controller\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Camera Controller\", L\"Enables freecam (toggled using F3).\\nWASD to move, SPACE/CTRL for up/down, Q/R to rotate, R/F for zoom.\\nHolding SHIFT/ALT changes control speed.\", false, true),\r\n\r\n\tnew BooleanOption(L\"scale_component\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Scale Component\", L\"Scales the graphics output framebuffer to fill the screen/window.\", false, true),\r\n\r\n\tnew BooleanOption(L\"debug_component\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Debug Component\", L\"Allows for changing game state (F4-F8 keys), using dev GUI and tests, and speeding up 2d animations/menus (hold SHIFT+TAB).\", false, true),\r\n\r\n\tnew BooleanOption(L\"target_inspector\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Target Inspector\", L\"Enables hold transfers.\", false, true),\r\n\r\n\tnew BooleanOption(L\"score_saver\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Score Saver\", L\"Saves high scores to plugins/scores.ini.\", false, true),\r\n\r\n\tnew BooleanOption(L\"pause\", COMPONENTS_SECTION, COMPONENTS_FILE, L\"Pause\", L\"Adds a pause menu.\", false, true),\r\n};\r\n\r\nbool IsLineInFile(LPCSTR searchLine, LPCWSTR fileName)\r\n{\r\n\tbool result = false;\r\n\r\n\tstd::ifstream fileStream(fileName);\r\n\r\n\tif (!fileStream.is_open())\r\n\t\treturn false;\r\n\r\n\tstd::string line;\r\n\r\n\t// check for BOM\r\n\tstd::getline(fileStream, line);\r\n\tif (line.size() >= 3 && line.rfind(\"\\xEF\\xBB\\xBF\", 0) == 0)\r\n\t\tfileStream.seekg(3);\r\n\telse\r\n\t\tfileStream.seekg(0);\r\n\r\n\twhile (std::getline(fileStream, line))\r\n\t{\r\n\t\tif (line.compare(searchLine) == 0)\r\n\t\t{\r\n\t\t\tresult = true;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfileStream.close();\r\n\treturn result;\r\n}\r\n\r\nvoid PrependFile(LPCSTR newStr, LPCWSTR fileName)\r\n{\r\n\tstd::fstream fileStream(fileName);\r\n\r\n\tif (!fileStream.is_open())\r\n\t\treturn;\r\n\r\n\r\n\tstd::string origStr;\r\n\r\n\t// this is apparently more efficient than just going straight into the string\r\n\tfileStream.seekg(0, std::ios::end);\r\n\torigStr.reserve(fileStream.tellg());\r\n\tfileStream.seekg(0, std::ios::beg);\r\n\r\n\t// check for BOM\r\n\tstd::string BOMcheckLine;\r\n\tstd::getline(fileStream, BOMcheckLine);\r\n\tif (BOMcheckLine.size() >= 3 && BOMcheckLine.rfind(\"\\xEF\\xBB\\xBF\", 0) == 0)\r\n\t\tfileStream.seekg(3);\r\n\telse\r\n\t\tfileStream.seekg(0);\r\n\r\n\torigStr.assign((std::istreambuf_iterator<char>(fileStream)), std::istreambuf_iterator<char>());\r\n\r\n\r\n\tstd::string outStr = newStr;\r\n\toutStr += origStr;\r\n\r\n\tfileStream.seekg(0, std::ios::beg);\r\n\tfileStream << outStr;\r\n\tfileStream.close();\r\n}\r\n\r\n\r\nstruct PluginInfo {\r\n\tHMODULE handle;\r\n\tstd::wstring filename;\r\n\tstd::wstring name;\r\n\tstd::wstring description;\r\n\tstd::wstring builddate;\r\n\tstd::vector<ConfigOptionBase*> configopts;\r\n};\r\nstd::vector<PluginInfo> LoadPlugins()\r\n{\r\n\tstd::vector<PluginInfo> outvec;\r\n\r\n\tHANDLE hFind;\r\n\tWIN32_FIND_DATAW ffd;\r\n\r\n\thFind = FindFirstFileW((PLUGINS_DIR + L\"\\\\*.dva\").c_str(), &ffd);\r\n\tif (hFind != INVALID_HANDLE_VALUE) {\r\n\t\tdo {\r\n\t\t\tif (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\r\n\t\t\t{\r\n\t\t\t\tif (ffd.cFileName[0] == '.' && ffd.cFileName[1] == '_') continue; // exclude macOS metadata\r\n\r\n\t\t\t\tauto pos = wcslen(ffd.cFileName);\r\n\r\n\t\t\t\tif (ffd.cFileName[pos - 4] == '.' &&\r\n\t\t\t\t\t(ffd.cFileName[pos - 3] == 'd' || ffd.cFileName[pos - 3] == 'D') &&\r\n\t\t\t\t\t(ffd.cFileName[pos - 2] == 'v' || ffd.cFileName[pos - 2] == 'V') &&\r\n\t\t\t\t\t(ffd.cFileName[pos - 1] == 'a' || ffd.cFileName[pos - 1] == 'A'))\r\n\t\t\t\t{\r\n\t\t\t\t\tPluginInfo thisplugin;\r\n\t\t\t\t\tthisplugin.handle = LoadLibraryW((PLUGINS_DIR + L\"\\\\\" + ffd.cFileName).c_str());\r\n\t\t\t\t\tthisplugin.filename = ffd.cFileName;\r\n\r\n\t\t\t\t\tif (thisplugin.handle == NULL)\r\n\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\tauto nameFunc = (LPCWSTR(*)())GetProcAddress(thisplugin.handle, \"GetPluginName\");\r\n\t\t\t\t\tauto descFunc = (LPCWSTR(*)())GetProcAddress(thisplugin.handle, \"GetPluginDescription\");\r\n\t\t\t\t\tauto dateFunc = (LPCWSTR(*)())GetProcAddress(thisplugin.handle, \"GetBuildDate\");\r\n\t\t\t\t\tauto optsFunc = (PluginConfig::PluginConfigArray(*)())GetProcAddress(thisplugin.handle, \"GetPluginOptions\");\r\n\r\n\t\t\t\t\tif (nameFunc != NULL)\r\n\t\t\t\t\t\tthisplugin.name = nameFunc();\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tthisplugin.name = thisplugin.filename;\r\n\r\n\t\t\t\t\tif (descFunc != NULL)\r\n\t\t\t\t\t\tthisplugin.description = descFunc();\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tthisplugin.description = (thisplugin.filename + L\" Plugin\").c_str();\r\n\r\n\t\t\t\t\tif (dateFunc != NULL)\r\n\t\t\t\t\t\tthisplugin.builddate = dateFunc();\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tthisplugin.builddate = L\"Unknown\";\r\n\r\n\t\t\t\t\tthisplugin.description += L\"\\n\\nVersion: \" + thisplugin.builddate;\r\n\r\n\t\t\t\t\tif (optsFunc != NULL)\r\n\t\t\t\t\t\tthisplugin.configopts = PluginConfig::GetConfigOptionVec(optsFunc());\r\n\r\n\t\t\t\t\t// sometimes this might screw with custom button config, so let's just not free stuff\r\n\t\t\t\t\t// FreeLibrary(thisplugin.handle);\r\n\r\n\t\t\t\t\toutvec.push_back(thisplugin);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (FindNextFileW(hFind, &ffd));\r\n\t\tFindClose(hFind);\r\n\t}\r\n\r\n\treturn outvec;\r\n}\r\n// don't load until actually needed to avoid loading disabled plugins\r\nstd::vector<PluginInfo> AllPlugins; // = LoadPlugins();\r\n\r\nstd::vector<PluginOption*> GetPluginOptions(std::vector<PluginInfo>* plugins)\r\n{\r\n\tstd::vector<PluginOption*> outvec;\r\n\r\n\tfor (PluginInfo &pi : *plugins)\r\n\t{\r\n\t\tPluginOption* opt = new PluginOption(pi.filename.c_str(), L\"plugins\", CONFIG_FILE, pi.name.c_str(), pi.description.c_str(), true, pi.configopts, pi.builddate);\r\n\t\toutvec.push_back(opt);\r\n\t}\r\n\r\n\treturn outvec;\r\n}\r\n// don't load until actually needed to avoid loading disabled plugins\r\nstd::vector<PluginOption*> AllPluginOpts; // = GetPluginOptions(&AllPlugins);\r\n\r\nstd::vector<PluginInfo> LoadCustom()\r\n{\r\n\tstd::vector<PluginInfo> outvec;\r\n\r\n\tHANDLE hFind;\r\n\tWIN32_FIND_DATAW ffd;\r\n\r\n\thFind = FindFirstFileW((PATCHES_DIR + L\"\\\\*.p*\").c_str(), &ffd);\r\n\tif (hFind != INVALID_HANDLE_VALUE) {\r\n\t\tdo {\r\n\t\t\tif (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\r\n\t\t\t{\r\n\t\t\t\tif (ffd.cFileName[0] == '.' && ffd.cFileName[1] == '_') continue; // exclude macOS metadata\r\n\r\n\t\t\t\tauto pos = wcslen(ffd.cFileName);\r\n\r\n\t\t\t\tif ((ffd.cFileName[pos - 2] == '.' && (ffd.cFileName[pos - 1] == 'p' || ffd.cFileName[pos - 1] == 'P')) ||\r\n\t\t\t\t\t(ffd.cFileName[pos - 3] == '.' && (ffd.cFileName[pos - 2] == 'p' || ffd.cFileName[pos - 2] == 'P') && (ffd.cFileName[pos - 1] == '2')))\r\n\t\t\t\t{\r\n\t\t\t\t\tPluginInfo thisplugin;\r\n\t\t\t\t\tthisplugin.filename = ffd.cFileName;\r\n\r\n\t\t\t\t\tthisplugin.name = thisplugin.filename;\r\n\t\t\t\t\tif (thisplugin.filename[pos - 1] == '2')\r\n\t\t\t\t\t\tthisplugin.name.resize(thisplugin.name.size() - 3);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tthisplugin.name.resize(thisplugin.name.size() - 2);\r\n\t\t\t\t\t\r\n\t\t\t\t\tthisplugin.description = L\"Custom patch\";\r\n\r\n\t\t\t\t\toutvec.push_back(thisplugin);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (FindNextFileW(hFind, &ffd));\r\n\t\tFindClose(hFind);\r\n\t}\r\n\r\n\treturn outvec;\r\n}\r\nstd::vector<PluginInfo> AllCustomPatches; // = LoadCustom();\r\n\r\nstd::vector<PluginOption*> GetCustomOptions(std::vector<PluginInfo>* patches)\r\n{\r\n\tstd::vector<PluginOption*> outvec;\r\n\r\n\tfor (PluginInfo& pi : *patches)\r\n\t{\r\n\t\tPluginOption* opt = new PluginOption(pi.filename.c_str(), L\"plugins\", CONFIG_FILE, pi.name.c_str(), pi.description.c_str(), true, pi.configopts);\r\n\t\toutvec.push_back(opt);\r\n\t}\r\n\r\n\treturn outvec;\r\n}\r\n// don't load until actually needed to avoid loading disabled plugins\r\nstd::vector<PluginOption*> AllCustomOpts; // = GetCustomOptions(&AllCustomPatches);\r\n\r\n// used to trick Optimus into switching to the NVIDIA GPU\r\nHMODULE nvcudaModule = LoadLibraryW(L\"nvcuda.dll\");\r\n// cuInit actually returns a CUresult, but we don't really care about it\r\nvoid(WINAPI * cuInit)(unsigned int flags) = (void(WINAPI*)(unsigned int flags))GetProcAddress(nvcudaModule, \"cuInit\");\r\n\r\n// needed to close the OpenGL window (freeglut only)\r\nHMODULE glutModule = LoadLibraryW(L\"glut32.dll\");\r\nvoid(__stdcall * glutMainLoopEventDynamic)() = (void(__stdcall*)())GetProcAddress(glutModule, \"glutMainLoopEvent\");\r\n\r\n\r\nusing namespace PluginConfig;\r\n\r\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\r\n{\r\n\treturn L\"Launcher\";\r\n}\r\n\r\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\r\n{\r\n\treturn L\"PD Launcher is the window you currently have open.\\nYou can disable it if you want, but you'll need to edit config.ini if you ever want to re-enable it.\";\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/Launcher/ui.h",
    "content": "﻿#pragma once\r\n#include \"framework.h\"\r\n#include <msclr\\marshal_cppstd.h>\r\n#include <cstdlib>\r\n#include \"TabPadding.h\"\r\n#include <GL\\freeglut.h>\r\n#include <GL\\GL.h>\r\n#include \"SkinnedMessageBox.h\"\r\n#include \"PluginConfig.h\"\r\n#include \"GPUModel.h\"\r\n#include \"WineVer.h\"\r\n#include \"composition.h\"\r\n#include <filesystem>\r\n\r\nnamespace Launcher {\r\n\r\n\tusing namespace System;\r\n\tusing namespace System::ComponentModel;\r\n\tusing namespace System::Collections;\r\n\tusing namespace System::Windows::Forms;\r\n\tusing namespace System::Data;\r\n\tusing namespace System::Drawing;\r\n\tusing namespace msclr::interop;\r\n\r\n\tHWND hWnd;\r\n\r\n\t/// <summary>\r\n\t/// Summary for ui\r\n\t/// </summary>\r\n\tpublic ref class ui : public System::Windows::Forms::Form\r\n\t{\r\n\tpublic:\r\n\t\tui(void)\r\n\t\t{\r\n\t\t\tInitializeComponent();\r\n\r\n\t\t\thWnd = (HWND)Control::Handle.ToPointer();\r\n\r\n\t\t\tthis->ClientSize = Drawing::Size(444, 323);\r\n\t\t\tTabPadding^ tabpad = gcnew TabPadding(tabControl);\r\n\r\n\t\t\t// if components.ini has no section name, add one\r\n\t\t\tif (!IsLineInFile(\"[components]\", COMPONENTS_FILE))\r\n\t\t\t{\r\n\t\t\t\tPrependFile(\"[components]\\n\", COMPONENTS_FILE);\r\n\t\t\t}\r\n\r\n\t\t\t// if playerdata.ini has no section name, add one\r\n\t\t\tif (!IsLineInFile(\"[playerdata]\", PLAYERDATA_FILE))\r\n\t\t\t{\r\n\t\t\t\tPrependFile(\"[playerdata]\\n\", PLAYERDATA_FILE);\r\n\t\t\t}\r\n\r\n\t\t\t// if keyconfig.ini has no section name, add one\r\n\t\t\tif (!IsLineInFile(\"[keyconfig]\", KEYCONFIG_FILE))\r\n\t\t\t{\r\n\t\t\t\tPrependFile(\"[keyconfig]\\n\", KEYCONFIG_FILE);\r\n\t\t\t}\r\n\r\n\r\n\t\t\tthis->panel_ScreenRes->SuspendLayout();\r\n\r\n\t\t\t// populate options (patches) from array in framework\r\n\t\t\t// (easier than manually setting everything up)\r\n\t\t\tint screenresY = 3;\r\n\t\t\tfor (ConfigOptionBase* option : screenResolutionArray)\r\n\t\t\t{\r\n\t\t\t\toption->hasChanged = ResolutionConfigChanged;\r\n\t\t\t\tscreenresY += option->AddToPanel(panel_ScreenRes, 12, screenresY, toolTip1);\r\n\t\t\t}\r\n\t\t\t((ComboBox^)ComboBox::FromHandle(DisplayModeDropdown->mainControlHandle))->SelectedIndexChanged += gcnew System::EventHandler(this, &ui::DisplayTypeChangedHandler);\r\n\t\t\tDisplayTypeChangedHandler(this, gcnew EventArgs); // run handler now\r\n\t\t\tthis->panel_ScreenRes->ResumeLayout(false);\r\n\t\t\tthis->panel_ScreenRes->PerformLayout();\r\n\r\n\r\n\t\t\tthis->panel_IntRes->SuspendLayout();\r\n\r\n\t\t\t// populate options (patches) from array in framework\r\n\t\t\t// (easier than manually setting everything up)\r\n\t\t\tint intresY = 3;\r\n\t\t\tfor (ConfigOptionBase* option : internalResolutionArray)\r\n\t\t\t{\r\n\t\t\t\toption->hasChanged = ResolutionConfigChanged;\r\n\t\t\t\tintresY += option->AddToPanel(panel_IntRes, 12, intresY, toolTip1);\r\n\t\t\t}\r\n\t\t\t((CheckBox^)CheckBox::FromHandle(InternalResolutionCheckbox->mainControlHandle))->CheckedChanged += gcnew System::EventHandler(this, &ui::InternalResEnabledChangedHandler);\r\n\t\t\tInternalResEnabledChangedHandler(this, gcnew EventArgs); // run handler now\r\n\t\t\tthis->panel_IntRes->ResumeLayout(false);\r\n\t\t\tthis->panel_IntRes->PerformLayout();\r\n\r\n\r\n\t\t\tthis->panel_Details->SuspendLayout();\r\n\r\n\t\t\t// populate details (patches) from array in framework\r\n\t\t\t// (easier than manually setting everything up)\r\n\t\t\tint detailsY = 3;\r\n\t\t\tfor (ConfigOptionBase* option : graphicsArray)\r\n\t\t\t{\r\n\t\t\t\toption->hasChanged = OptionsConfigChanged;\r\n\t\t\t\tdetailsY += option->AddToPanel(panel_Details, 12, detailsY, toolTip1);\r\n\t\t\t}\r\n\t\t\ttrackBar_LagCompensation->Value = GetIniInt(GRAPHICS_SECTION, L\"lag_compensation\", 0, CONFIG_FILE);\r\n\t\t\tthis->panel_Details->ResumeLayout(false);\r\n\t\t\tthis->panel_Details->PerformLayout();\r\n\r\n\r\n\t\t\tthis->panel_Patches->SuspendLayout();\r\n\r\n\t\t\t// populate options (patches) from array in framework\r\n\t\t\t// (easier than manually setting everything up)\r\n\t\t\tint optionsY = 3;\r\n\t\t\tfor (ConfigOptionBase* option : optionsArray)\r\n\t\t\t{\r\n\t\t\t\toption->hasChanged = OptionsConfigChanged;\r\n\t\t\t\toptionsY += option->AddToPanel(panel_Patches, 12, optionsY, toolTip1);\r\n\t\t\t}\r\n\t\t\tthis->panel_Patches->ResumeLayout(false);\r\n\t\t\tthis->panel_Patches->PerformLayout();\r\n\r\n\r\n\r\n\t\t\tthis->panel_Playerdata->SuspendLayout();\r\n\r\n\t\t\t// populate playerdata options from array in framework\r\n\t\t\t// (easier than manually setting everything up)\r\n\t\t\tint playerdataY = 3;\r\n\t\t\tfor (ConfigOptionBase* option : playerdataArray)\r\n\t\t\t{\r\n\t\t\t\toption->hasChanged = PlayerdataConfigChanged;\r\n\t\t\t\tplayerdataY += option->AddToPanel(panel_Playerdata, 12, playerdataY, toolTip1);\r\n\t\t\t}\r\n\t\t\tthis->panel_Playerdata->ResumeLayout(false);\r\n\t\t\tthis->panel_Playerdata->PerformLayout();\r\n\r\n\r\n\t\t\tthis->panel_Components->SuspendLayout();\r\n\r\n\t\t\t// populate components from array in framework\r\n\t\t\t// (easier than manually setting everything up)\r\n\t\t\tint componentsY = 3;\r\n\t\t\tfor (ConfigOptionBase* component : componentsArray)\r\n\t\t\t{\r\n\t\t\t\tcomponent->hasChanged = ComponentsConfigChanged;\r\n\t\t\t\tcomponentsY += component->AddToPanel(panel_Components, 12, componentsY, toolTip1);\r\n\t\t\t}\r\n\t\t\tthis->panel_Components->ResumeLayout(false);\r\n\t\t\tthis->panel_Components->PerformLayout();\r\n\r\n\r\n\t\t\tAllPlugins = LoadPlugins();\r\n\t\t\tAllPluginOpts = GetPluginOptions(&AllPlugins);\r\n\r\n\t\t\tthis->panel_Plugins->SuspendLayout();\r\n\r\n\t\t\tint pluginsY = 3;\r\n\t\t\tfor (ConfigOptionBase* option : AllPluginOpts)\r\n\t\t\t{\r\n\t\t\t\toption->hasChanged = new bool(false);\r\n\t\t\t\tpluginsY += option->AddToPanel(panel_Plugins, 12, pluginsY, toolTip1);\r\n\t\t\t}\r\n\t\t\tthis->panel_Plugins->ResumeLayout(false);\r\n\t\t\tthis->panel_Plugins->PerformLayout();\r\n\r\n\r\n\t\t\tAllCustomPatches = LoadCustom();\r\n\t\t\tAllCustomOpts = GetPluginOptions(&AllCustomPatches);\r\n\r\n\t\t\tthis->panel_Custom->SuspendLayout();\r\n\r\n\t\t\tint customY = 3;\r\n\t\t\tfor (ConfigOptionBase* custom : AllCustomOpts)\r\n\t\t\t{\r\n\t\t\t\tcustom->hasChanged = new bool(false);\r\n\t\t\t\tcustomY += custom->AddToPanel(panel_Custom, 12, customY, toolTip1);\r\n\t\t\t}\r\n\r\n\t\t\tthis->panel_Custom->ResumeLayout(false);\r\n\t\t\tthis->panel_Custom->PerformLayout();\r\n\r\n\r\n\t\t\t// trick Optimus into switching to the NVIDIA GPU\r\n\t\t\tif (cuInit != NULL) cuInit(0);\r\n\r\n\t\t\tint argc = 1;\r\n\t\t\tchar* argv[1] = { (char*)\"\" };\r\n\r\n\r\n\t\t\tupdateLagCompMsec();\r\n\r\n\t\t\tupdateStyle();\r\n\r\n\t\t\tcheckHasInvalidGLUT();\r\n\r\n\t\t\tglutInit(&argc, argv);\r\n\t\t\tint window = glutCreateWindow(\"glut\"); // a context must be created to use glGetString\r\n\t\t\tglutHideWindow();\r\n\r\n\t\t\tString^ vendor = gcnew String((char*)glGetString(GL_VENDOR));\r\n\t\t\tvendor = vendor->Replace(\" Corporation\", \"\"); // this is useless..  remove it to help ensure the GPU type line fits\r\n\t\t\tString^ renderer = gcnew String((char*)glGetString(GL_RENDERER));\r\n\t\t\trenderer = renderer->Replace(\"Apple \", \"\"); // \"Apple Apple M1\" -> \"Apple M1\"\r\n\t\t\tString^ version = gcnew String((char*)glGetString(GL_VERSION));\r\n\t\t\tversion = version->Replace(\" Profile Context\", \"\") // we don't need this, either\r\n\t\t\t\t// misleading - the Metal layer always provides 2.1 as well as 4.1 Core (with the forwards compatiblity bit)\r\n\t\t\t\t// even though the GLUT context is technically 2.1, inform the user that 4.1 fwcompat is supported (in case they want to use mods)\r\n\t\t\t\t->Replace(\"2.1 Metal\", \"2.1/4.1 (forward-compatible) Metal\");\r\n\r\n\t\t\tString^ gpuModel = gcnew String(GPUModel::getGpuName().c_str());\r\n\r\n\t\t\tString^ wineVersion = gcnew String(WineVer::getWineVer().c_str());\r\n\r\n\t\t\tint driver_version_major = 1;\r\n\t\t\tint driver_version_minor = 0;\r\n\t\t\tauto version_split = version->Split(' ');\r\n\t\t\tif (version_split->Length > 1) // make sure we don't use the OpenGL version instead of the driver version\r\n\t\t\t{\r\n\t\t\t\tString^ driver_version = gcnew String(version_split[version_split->Length - 1]);\r\n\t\t\t\tauto driver_version_split_major_minor = driver_version->Split('.');\r\n\t\t\t\tif (driver_version_split_major_minor->Length >= 2)\r\n\t\t\t\t{\r\n\t\t\t\t\tdriver_version_major = int::Parse(driver_version_split_major_minor[0]);\r\n\t\t\t\t\tdriver_version_minor = int::Parse(driver_version_split_major_minor[1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tglutDestroyWindow(window); // destroy the window so it doesn't remain on screen\r\n\t\t\tif (glutMainLoopEventDynamic != NULL) glutMainLoopEventDynamic(); // freeglut needs this\r\n\r\n\t\t\tif (wineVersion != \"\")\r\n\t\t\t{\r\n\t\t\t\tthis->labelGPU->Text = \"Wine \" + wineVersion + \" (remember to disable movies!)\\n\";\r\n\t\t\t}\r\n\t\t\telse this->labelGPU->Text = \"GPU Info:\\n\";\r\n\t\t\tthis->labelGPU->Text += vendor + \" \" + renderer + \"\\n\";\r\n\t\t\tthis->labelGPU->Text += \"OpenGL: \" + version + \"\\n\";\r\n\r\n\t\t\tint linkStart = this->labelGPU->Text->Length;\r\n\t\t\tbool showGpuDialog = false;\r\n\t\t\tbool showGpuTypeWarning = false;\r\n\r\n\t\t\tbool hasNovidia = false;\r\n\t\t\tbool novidiaEnabled = false;\r\n\r\n\t\t\tbool hasDivaGL = false;\r\n\t\t\tbool divaGLEnabled = false;\r\n\r\n\t\t\tfor (PluginInfo i : AllPlugins)\r\n\t\t\t{\r\n\t\t\t\tif (i.name == L\"Novidia\")\r\n\t\t\t\t{\r\n\t\t\t\t\thasNovidia = true;\r\n\t\t\t\t\tnovidiaEnabled = GetIniBool(L\"plugins\", i.filename.c_str(), 1, CONFIG_FILE);\r\n\t\t\t\t}\r\n\t\t\t\telse if (i.name == L\"DivaGL\")\r\n\t\t\t\t{\r\n\t\t\t\t\thasDivaGL = true;\r\n\t\t\t\t\tdivaGLEnabled = GetIniBool(L\"plugins\", i.filename.c_str(), 1, CONFIG_FILE);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (hasNovidia && hasDivaGL) break;\r\n\t\t\t}\r\n\r\n\t\t\tif (divaGLEnabled)\r\n\t\t\t{\r\n\t\t\t\tthis->labelGPU->Text += L\"Rendering provided by DivaGL.\";\r\n\t\t\t\tGPUIssueText = L\"Please check DivaGL's requirements to ensure compatibility with your graphics driver.\";\r\n\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::HotPink;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tif (vendor->Contains(\"AMD\") || vendor->Contains(\"ATI\")) // check OpenGL to get actual GPU being used for vendor check (to get accurate results for iGPU)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (hasNovidia)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (novidiaEnabled)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (wineVersion == \"\" && (driver_version_major < 21 || (driver_version_major == 21 && driver_version_minor < 6)))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif (driver_version_major == 21 && driver_version_minor == 5)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tthis->labelGPU->Text += L\"Driver may have issues.\";\r\n\t\t\t\t\t\t\t\t\tGPUIssueText = L\"The graphics driver you're using should be able to play movies without issues, but may crash while loading a song after playing multiple stages in one session.\\nIf possible, please install the latest driver from your GPU vendor's website.\\nHowever, note that if your GPU is old, you may not be able to install a more recent driver.\";\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tthis->labelGPU->Text += L\"Driver has known issues.\";\r\n\t\t\t\t\t\t\t\t\tGPUIssueText = L\"The graphics driver you're using has known issues. Movies may not play back correctly.\\nPlease install the latest driver from your GPU vendor's website.\";\r\n\t\t\t\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Orange;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (wineVersion == \"\" && (driver_version_major > 22 || (driver_version_major == 22 && driver_version_minor > 6)))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis->labelGPU->Text += \"Issues: Unsupported GPU driver.\";\r\n\t\t\t\t\t\t\t\tGPUIssueText = \"The graphics driver you're using is too new for Novidia.\\nThe game will not run unless you install driver version 22.6.1 or earlier from AMD's website.\\n\\nAlternatively, you can try mods such as DivaGL.\";\r\n\t\t\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Red;\r\n\t\t\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis->labelGPU->Text += \"Issues: AMD GPU support is unofficial.\";\r\n\t\t\t\t\t\t\t\tGPUIssueText = \"AMD GPUs are not supported without mods.\\nThe PD Loader AMDPack seems to be installed, but please keep in mind that it may have issues.\";\r\n\t\t\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Yellow;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tthis->labelGPU->Text += \"Issues: Mods needed for AMD compatibility!\";\r\n\t\t\t\t\t\t\tGPUIssueText = \"AMD GPUs are not supported without mods.\\n\" +\r\n\t\t\t\t\t\t\t\t(hasDivaGL ? \"DivaGL/\" : \"\") + \"Novidia is installed, but disabled; please enable it to use your AMD GPU.\\n\\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\";\r\n\t\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Red;\r\n\t\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (hasDivaGL)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += \"Issues: Mods needed for AMD compatibility!\";\r\n\t\t\t\t\t\tGPUIssueText = \"AMD GPUs are not supported without mods.\\nDivaGL is installed, but disabled; please enable it to use your AMD GPU.\\n\\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Red;\r\n\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += \"Issues: Mods needed for AMD compatibility!\";\r\n\t\t\t\t\t\tGPUIssueText = \"AMD GPUs are not supported without mods.\\nEither DivaGL or Novidia is required. Please download either plugin and check its requirements to ensure compatibility with your graphics driver.\\n\\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Red;\r\n\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse if (vendor->Contains(\"NVIDIA\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tif (wineVersion == \"\" && (driver_version_major < 391 || (driver_version_major > 446 && driver_version_major < 460)))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Driver has known issues.\";\r\n\t\t\t\t\t\tGPUIssueText = L\"The graphics driver you're using has known issues. Please install the latest driver from your GPU vendor's website.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Orange;\r\n\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"GB\")) // unconfirmed??\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Blackwell GPU detected! Possible noise.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"On Blackwell GPUs (RTX 50xx), some important character shaders have issues resulting in lines/noise.\\nPlease make sure the ShaderPatch plugin is enabled.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Yellow;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"AD\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Ada Lovelace GPU detected! Possible noise.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"On Ada Lovelace GPUs (RTX 40xx), some important character shaders have issues resulting in lines/noise.\\nPlease make sure the ShaderPatch plugin is enabled.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Yellow;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"GA\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Ampere GPU detected! Possible noise.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"On Ampere GPUs (RTX 30xx), some important character shaders have issues resulting in lines/noise.\\nPlease make sure the ShaderPatch plugin is enabled.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Yellow;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"TU\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Turing GPU detected! Possible noise.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"On Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\\nPlease make sure the ShaderPatch plugin is enabled.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Yellow;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"GV\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Volta GPU detected! Possible noise.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"On Volta GPUs (TITAN V), some important character shaders have issues resulting in lines/noise.\\nPlease make sure the ShaderPatch plugin is enabled.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Yellow;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"GM\") || gpuModel->StartsWith(\"GP\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: May have minor noise on some stages.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"On Maxwell GPUs (~GTX 900) and newer, some minor stage shaders create noise.\\nPlease make sure the ShaderPatch plugin is enabled.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Teal;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"GK\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: None.\";\r\n\t\t\t\t\t\tGPUIssueText = L\"Your GPU should have no issues running the game.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::LightBlue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"GF\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (version[0] < '4')\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Driver too old.\";\r\n\t\t\t\t\t\t\tGPUIssueText = L\"Your GPU should be able to run the game, but it looks like your OpenGL version is too old.\\nA driver update should fix this.\";\r\n\t\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Orange;\r\n\t\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: No known issues.\";\r\n\t\t\t\t\t\t\tGPUIssueText = L\"Your GPU should have no issues running the game, but it is older than the GPU the game was originally designed for (GTX 650 Ti).\\nThere may be some issues with graphics.\\nPlease report any issues so that they can be analysed and potentially fixed.\";\r\n\t\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Teal;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (gpuModel->StartsWith(\"G\") || gpuModel->StartsWith(\"NV\") || gpuModel->StartsWith(\"NB\") || gpuModel->StartsWith(\"N10\") || gpuModel->StartsWith(\"MCP\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: GPU too old! 3D rendering might be broken.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"Your GPU is very old and does not support rendering techniques used by the game.\\nYou may be able to play, but graphics will likely have major issues.\\nPlease upgrade to a GTX 600 series or later GPU.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Orange;\r\n\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (version[0] >= '4' && gpuModel->Length > 0 && !gpuModel->StartsWith(\"Unk\") && !gpuModel->StartsWith(\"Oth\"))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: GPU may be too new.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"It looks like your GPU may be too new. Only up to Ada Lovelace (RTX 40xx) is currently supported.\\nYou will likely see lines/noise on important character shaders and some minor stage shaders.\\nPlease report any issues so that ShaderPatch can be updated.\\n\\nTo try to get rid of any artifacts, try selecting a specific GPU architecture in Graphics -> Nvidia GPU (e.g. \\\"Ada or newer\\\"), or use DivaGL.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Orange;\r\n\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t\tshowGpuTypeWarning = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthis->labelGPU->Text += L\"Issues: Unable to detect GPU architecture.\\n(Click for more information)\";\r\n\t\t\t\t\t\tGPUIssueText = L\"It looks like you have an NVIDIA GPU, but something went wrong while trying to determine your GPU's architecture (type).\\nThis may be a caused by a bug, but it probably indicates potential issues.\\nPlease make sure you have a GTX 600 series or later GPU. (GTX 400 series or later should also work)\\n\\nIf the game runs but has artifacts, try selecting a specific GPU architecture in Graphics -> Nvidia GPU (e.g. \\\"Ada or newer\\\"), or use DivaGL.\";\r\n\t\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Orange;\r\n\t\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t\t\tshowGpuTypeWarning = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse //if (gpuModel->Length == 0 || gpuModel->StartsWith(\"Unk\") || gpuModel->StartsWith(\"Oth\"))\r\n\t\t\t\t{\r\n\t\t\t\t\tthis->labelGPU->Text += L\"Issues: UNSUPPORTED GPU!\";\r\n\t\t\t\t\tGPUIssueText = L\"Your graphics card is not supported. Only NVIDIA GPUs are recommended (though others can be used with mods).\\nPlease use a GTX 600 series or later NVIDIA GPU.\\n\\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\\n\\nOwners of other GPUs may be able to run the game using plugins or mods, such as DivaGL, Novidia, or DivaImGui.\";\r\n\t\t\t\t\tthis->labelGPU->LinkColor = System::Drawing::Color::Red;\r\n\t\t\t\t\tshowGpuDialog = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tint linkEnd = this->labelGPU->Text->Length - linkStart;\r\n\r\n\t\t\tthis->labelGPU->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::LinkLabelLinkClickedGPUIssueHandler);\r\n\t\t\tthis->labelGPU->LinkArea = System::Windows::Forms::LinkArea(linkStart, linkEnd);\r\n\r\n\t\t\tif (!nNoGPUDialog)\r\n\t\t\t{\r\n\t\t\t\tif (showGpuDialog)\r\n\t\t\t\t\tSkinnedMessageBox::Show(this, GPUIssueText + \"\\n\\nYou can disable this message from the Options tab.\", \"PD Launcher\", MessageBoxButtons::OK, MessageBoxIcon::Warning);\r\n\r\n\t\t\t\tif (showGpuTypeWarning)\r\n\t\t\t\t{\r\n\t\t\t\t\tLabel^ gpuTypeLabel = ((Label^)Control::FromHandle(((DropdownOption*)(graphicsArray[0]))->labelHandle));\r\n\t\t\t\t\tComboBox^ gpuTypeCtrl = ((ComboBox^)Control::FromHandle(((DropdownOption*)(graphicsArray[0]))->mainControlHandle));\r\n\t\t\t\t\tgpuTypeLabel->Text = \"/!\\\\ \" + gpuTypeLabel->Text;\r\n\t\t\t\t\tgpuTypeLabel->BackColor = System::Drawing::Color::Gold;\r\n\t\t\t\t\tgpuTypeLabel->ForeColor = System::Drawing::Color::Crimson;\r\n\t\t\t\t\tgpuTypeCtrl->Items[0] = \"SELECT ONE\";\r\n\t\t\t\t\tgpuTypeCtrl->BackColor = System::Drawing::Color::Gold;\r\n\t\t\t\t\tgpuTypeCtrl->ForeColor = System::Drawing::Color::Crimson;\r\n\t\t\t\t\tgpuTypeCtrl->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\tprotected:\r\n\t\t/// <summary>\r\n\t\t/// Clean up any resources being used.\r\n\t\t/// </summary>\r\n\t\t~ui()\r\n\t\t{\r\n\t\t\tif (components)\r\n\t\t\t{\r\n\t\t\t\tdelete components;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvoid OnPaintBackground(PaintEventArgs e) override\r\n\t\t{\r\n\t\t}\r\n\r\n\t\t/*property System::Windows::Forms::CreateParams^ CreateParams\r\n\t\t{\r\n\t\t\tvirtual System::Windows::Forms::CreateParams^ get() override\r\n\t\t\t{\r\n\t\t\t\tSystem::Windows::Forms::CreateParams^ params = Form::CreateParams;\r\n\t\t\t\tparams->ExStyle |= 0x00200000L;\r\n\r\n\t\t\t\treturn params;\r\n\t\t\t}\r\n\t\t}*/\r\n\r\n\t\tvoid updateLagCompMsec()\r\n\t\t{\r\n\t\t\tthis->groupBox_Lag->Text = \"Lag Compensation (\" + this->trackBar_LagCompensation->Value + \" msec)\";\r\n\t\t}\r\n\r\n\t\tvoid updateStyle()\r\n\t\t{\r\n\t\t\tint nDarkLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L\"dark_launcher\", FALSE, CONFIG_FILE);\r\n\r\n\t\t\tColor colourBg, colourBg2, colourFg;\r\n\r\n\t\t\tif (nDarkLauncher)\r\n\t\t\t{\r\n\t\t\t\tsetDarkTheme(hWnd);\r\n\t\t\t\tcolourFg = Color::White;\r\n\t\t\t\tcolourBg = Color::FromArgb(32, 32, 32); // tabControl\r\n\t\t\t\tcolourBg2 = Color::FromArgb(25, 25, 25);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tsetDarkTheme(hWnd, false);\r\n\t\t\t\tcolourFg = Color::FromArgb(64, 64, 64);\r\n\t\t\t\tcolourBg = Color::White; // tabControl\r\n\t\t\t\tcolourBg2 = Color::FromArgb(242, 242, 242);\r\n\t\t\t}\r\n\r\n\r\n\t\t\tthis->button_Discord->BackColor = Color::Transparent;\r\n\t\t\tthis->button_github->BackColor = Color::Transparent;\r\n\t\t\tthis->button_Wiki->BackColor = Color::Transparent;\r\n\r\n\t\t\tthis->tabPage_Resolution->BackColor = colourBg;\r\n\t\t\tthis->tabPage_Resolution->ForeColor = colourFg;\r\n\t\t\tthis->tabPage_Patches->BackColor = colourBg;\r\n\t\t\tthis->tabPage_Patches->ForeColor = colourFg;\r\n\t\t\tthis->tabPage_Playerdata->BackColor = colourBg;\r\n\t\t\tthis->tabPage_Playerdata->ForeColor = colourFg;\r\n\t\t\tthis->tabPage_Plugins->BackColor = colourBg;\r\n\t\t\tthis->tabPage_Plugins->ForeColor = colourFg;\r\n\t\t\tthis->tabPage_Components->BackColor = colourBg;\r\n\t\t\tthis->tabPage_Components->ForeColor = colourFg;\r\n\t\t\tthis->creditsTextBox->BackColor = colourBg;\r\n\t\t\tthis->creditsTextBox->ForeColor = colourFg;\r\n\r\n\t\t\tthis->tabControl->BackColor = colourBg;\r\n\t\t\tthis->tabControl->ForeColor = colourFg;\r\n\r\n\t\t\tthis->BackColor = colourBg2;\r\n\r\n\t\t\tthis->button_Launch->BackColor = colourBg;\r\n\t\t\tthis->button_Launch->ForeColor = colourFg;\r\n\t\t\tthis->button_Apply->BackColor = colourBg;\r\n\t\t\tthis->button_Apply->ForeColor = colourFg;\r\n\r\n\t\t\tthis->labelGPU->ForeColor = colourFg;\r\n\r\n\t\t\tthis->groupBox_Details->ForeColor = colourFg;\r\n\t\t\tthis->groupBox_InternalRes->ForeColor = colourFg;\r\n\t\t\tthis->groupBox_Lag->ForeColor = colourFg;\r\n\t\t\tthis->groupBox_ScreenRes->ForeColor = colourFg;\r\n\t\t}\r\n\r\n\tprivate:\r\n\r\n\r\n\tprivate: System::Windows::Forms::Button^ button_Launch;\r\n\r\n\tprivate: System::Windows::Forms::GroupBox^ groupBox_ScreenRes;\r\n\tprivate: System::Windows::Forms::TabControl^ tabControl;\r\n\tprivate: System::Windows::Forms::TabPage^ tabPage_Resolution;\r\n\tprivate: System::Windows::Forms::GroupBox^ groupBox_InternalRes;\r\n\tprivate: System::Windows::Forms::TabPage^ tabPage_Components;\r\n\tprivate: System::Windows::Forms::Panel^ panel_Components;\r\n\tprivate: System::Windows::Forms::TabPage^ tabPage_Patches;\r\n\tprivate: System::Windows::Forms::Panel^ panel_Patches;\r\n\tprivate: System::Windows::Forms::TabPage^ tabPage_Plugins;\r\n\tprivate: System::Windows::Forms::Panel^ panel_Plugins;\r\n\tprivate: System::Windows::Forms::Button^ button_Discord;\r\n\tprivate: System::Windows::Forms::Button^ button_github;\r\n\tprivate: System::Windows::Forms::TabPage^  tabPage_Playerdata;\r\n\tprivate: System::Windows::Forms::Panel^  panel_Playerdata;\r\n\tprivate: System::Windows::Forms::ToolTip^  toolTip1;\r\n\tprivate: System::Windows::Forms::Panel^  panel_ScreenRes;\r\n\tprivate: System::Windows::Forms::Panel^  panel_IntRes;\r\n\tprivate: System::Windows::Forms::LinkLabel^ labelGPU;\r\n\r\n\r\n\r\nprivate: System::Windows::Forms::TabPage^ tabPage_Credits;\r\nprivate: System::Windows::Forms::TextBox^ creditsTextBox;\r\nprivate: System::Windows::Forms::GroupBox^ groupBox_Details;\r\nprivate: System::Windows::Forms::Panel^ panel_Details;\r\nprivate: System::Windows::Forms::Panel^ panel_Custom;\r\nprivate: System::Windows::Forms::Button^ button_Apply;\r\nprivate: System::Windows::Forms::GroupBox^ groupBox_Lag;\r\nprivate: System::Windows::Forms::TrackBar^ trackBar_LagCompensation;\r\nprivate: System::Windows::Forms::Button^ button_Wiki;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate: System::ComponentModel::IContainer^ components;\r\n\r\n\tprivate:\r\n\t\t/// <summary>\r\n\t\t/// Required designer variable.\r\n\t\t/// </summary>\r\n\r\n\r\n#pragma region Windows Form Designer generated code\r\n\t\t/// <summary>\r\n\t\t/// Required method for Designer support - do not modify\r\n\t\t/// the contents of this method with the code editor.\r\n\t\t/// </summary>\r\n\t\tvoid InitializeComponent(void)\r\n\t\t{\r\n\t\t\tthis->components = (gcnew System::ComponentModel::Container());\r\n\t\t\tSystem::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ui::typeid));\r\n\t\t\tthis->button_Launch = (gcnew System::Windows::Forms::Button());\r\n\t\t\tthis->groupBox_ScreenRes = (gcnew System::Windows::Forms::GroupBox());\r\n\t\t\tthis->panel_ScreenRes = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->tabControl = (gcnew System::Windows::Forms::TabControl());\r\n\t\t\tthis->tabPage_Resolution = (gcnew System::Windows::Forms::TabPage());\r\n\t\t\tthis->groupBox_Lag = (gcnew System::Windows::Forms::GroupBox());\r\n\t\t\tthis->trackBar_LagCompensation = (gcnew System::Windows::Forms::TrackBar());\r\n\t\t\tthis->groupBox_Details = (gcnew System::Windows::Forms::GroupBox());\r\n\t\t\tthis->panel_Details = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->labelGPU = (gcnew System::Windows::Forms::LinkLabel());\r\n\t\t\tthis->groupBox_InternalRes = (gcnew System::Windows::Forms::GroupBox());\r\n\t\t\tthis->panel_IntRes = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->tabPage_Patches = (gcnew System::Windows::Forms::TabPage());\r\n\t\t\tthis->panel_Patches = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->tabPage_Playerdata = (gcnew System::Windows::Forms::TabPage());\r\n\t\t\tthis->panel_Playerdata = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->tabPage_Components = (gcnew System::Windows::Forms::TabPage());\r\n\t\t\tthis->panel_Components = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->tabPage_Plugins = (gcnew System::Windows::Forms::TabPage());\r\n\t\t\tthis->panel_Custom = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->panel_Plugins = (gcnew System::Windows::Forms::Panel());\r\n\t\t\tthis->tabPage_Credits = (gcnew System::Windows::Forms::TabPage());\r\n\t\t\tthis->creditsTextBox = (gcnew System::Windows::Forms::TextBox());\r\n\t\t\tthis->button_Discord = (gcnew System::Windows::Forms::Button());\r\n\t\t\tthis->button_github = (gcnew System::Windows::Forms::Button());\r\n\t\t\tthis->toolTip1 = (gcnew System::Windows::Forms::ToolTip(this->components));\r\n\t\t\tthis->button_Apply = (gcnew System::Windows::Forms::Button());\r\n\t\t\tthis->button_Wiki = (gcnew System::Windows::Forms::Button());\r\n\t\t\tthis->groupBox_ScreenRes->SuspendLayout();\r\n\t\t\tthis->tabControl->SuspendLayout();\r\n\t\t\tthis->tabPage_Resolution->SuspendLayout();\r\n\t\t\tthis->groupBox_Lag->SuspendLayout();\r\n\t\t\t(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->trackBar_LagCompensation))->BeginInit();\r\n\t\t\tthis->groupBox_Details->SuspendLayout();\r\n\t\t\tthis->groupBox_InternalRes->SuspendLayout();\r\n\t\t\tthis->tabPage_Patches->SuspendLayout();\r\n\t\t\tthis->tabPage_Playerdata->SuspendLayout();\r\n\t\t\tthis->tabPage_Components->SuspendLayout();\r\n\t\t\tthis->tabPage_Plugins->SuspendLayout();\r\n\t\t\tthis->tabPage_Credits->SuspendLayout();\r\n\t\t\tthis->SuspendLayout();\r\n\t\t\t// \r\n\t\t\t// button_Launch\r\n\t\t\t// \r\n\t\t\tthis->button_Launch->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->button_Launch->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;\r\n\t\t\tthis->button_Launch->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->button_Launch->Location = System::Drawing::Point(344, 778);\r\n\t\t\tthis->button_Launch->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->button_Launch->Name = L\"button_Launch\";\r\n\t\t\tthis->button_Launch->Size = System::Drawing::Size(434, 46);\r\n\t\t\tthis->button_Launch->TabIndex = 20;\r\n\t\t\tthis->button_Launch->Text = L\"Launch\";\r\n\t\t\tthis->button_Launch->UseVisualStyleBackColor = false;\r\n\t\t\tthis->button_Launch->Click += gcnew System::EventHandler(this, &ui::Button_Launch_Click);\r\n\t\t\t// \r\n\t\t\t// groupBox_ScreenRes\r\n\t\t\t// \r\n\t\t\tthis->groupBox_ScreenRes->Controls->Add(this->panel_ScreenRes);\r\n\t\t\tthis->groupBox_ScreenRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->groupBox_ScreenRes->Location = System::Drawing::Point(10, 12);\r\n\t\t\tthis->groupBox_ScreenRes->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_ScreenRes->Name = L\"groupBox_ScreenRes\";\r\n\t\t\tthis->groupBox_ScreenRes->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_ScreenRes->Size = System::Drawing::Size(526, 226);\r\n\t\t\tthis->groupBox_ScreenRes->TabIndex = 10;\r\n\t\t\tthis->groupBox_ScreenRes->TabStop = false;\r\n\t\t\tthis->groupBox_ScreenRes->Text = L\"Screen Resolution\";\r\n\t\t\t// \r\n\t\t\t// panel_ScreenRes\r\n\t\t\t// \r\n\t\t\tthis->panel_ScreenRes->AutoScroll = true;\r\n\t\t\tthis->panel_ScreenRes->Location = System::Drawing::Point(10, 38);\r\n\t\t\tthis->panel_ScreenRes->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_ScreenRes->Name = L\"panel_ScreenRes\";\r\n\t\t\tthis->panel_ScreenRes->Size = System::Drawing::Size(506, 178);\r\n\t\t\tthis->panel_ScreenRes->TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// tabControl\r\n\t\t\t// \r\n\t\t\tthis->tabControl->Controls->Add(this->tabPage_Resolution);\r\n\t\t\tthis->tabControl->Controls->Add(this->tabPage_Patches);\r\n\t\t\tthis->tabControl->Controls->Add(this->tabPage_Playerdata);\r\n\t\t\tthis->tabControl->Controls->Add(this->tabPage_Components);\r\n\t\t\tthis->tabControl->Controls->Add(this->tabPage_Plugins);\r\n\t\t\tthis->tabControl->Controls->Add(this->tabPage_Credits);\r\n\t\t\tthis->tabControl->Location = System::Drawing::Point(0, 0);\r\n\t\t\tthis->tabControl->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabControl->Name = L\"tabControl\";\r\n\t\t\tthis->tabControl->SelectedIndex = 0;\r\n\t\t\tthis->tabControl->Size = System::Drawing::Size(1120, 768);\r\n\t\t\tthis->tabControl->TabIndex = 10;\r\n\t\t\t// \r\n\t\t\t// tabPage_Resolution\r\n\t\t\t// \r\n\t\t\tthis->tabPage_Resolution->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->tabPage_Resolution->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;\r\n\t\t\tthis->tabPage_Resolution->Controls->Add(this->groupBox_Lag);\r\n\t\t\tthis->tabPage_Resolution->Controls->Add(this->groupBox_Details);\r\n\t\t\tthis->tabPage_Resolution->Controls->Add(this->labelGPU);\r\n\t\t\tthis->tabPage_Resolution->Controls->Add(this->groupBox_InternalRes);\r\n\t\t\tthis->tabPage_Resolution->Controls->Add(this->groupBox_ScreenRes);\r\n\t\t\tthis->tabPage_Resolution->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->tabPage_Resolution->Location = System::Drawing::Point(8, 39);\r\n\t\t\tthis->tabPage_Resolution->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Resolution->Name = L\"tabPage_Resolution\";\r\n\t\t\tthis->tabPage_Resolution->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Resolution->Size = System::Drawing::Size(1104, 721);\r\n\t\t\tthis->tabPage_Resolution->TabIndex = 0;\r\n\t\t\tthis->tabPage_Resolution->Text = L\"Graphics\";\r\n\t\t\t// \r\n\t\t\t// groupBox_Lag\r\n\t\t\t// \r\n\t\t\tthis->groupBox_Lag->Controls->Add(this->trackBar_LagCompensation);\r\n\t\t\tthis->groupBox_Lag->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->groupBox_Lag->Location = System::Drawing::Point(10, 564);\r\n\t\t\tthis->groupBox_Lag->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_Lag->Name = L\"groupBox_Lag\";\r\n\t\t\tthis->groupBox_Lag->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_Lag->Size = System::Drawing::Size(526, 146);\r\n\t\t\tthis->groupBox_Lag->TabIndex = 21;\r\n\t\t\tthis->groupBox_Lag->TabStop = false;\r\n\t\t\tthis->groupBox_Lag->Text = L\"Lag Compensation\";\r\n\t\t\t// \r\n\t\t\t// trackBar_LagCompensation\r\n\t\t\t// \r\n\t\t\tthis->trackBar_LagCompensation->LargeChange = 1;\r\n\t\t\tthis->trackBar_LagCompensation->Location = System::Drawing::Point(14, 40);\r\n\t\t\tthis->trackBar_LagCompensation->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->trackBar_LagCompensation->Maximum = 500;\r\n\t\t\tthis->trackBar_LagCompensation->Name = L\"trackBar_LagCompensation\";\r\n\t\t\tthis->trackBar_LagCompensation->Size = System::Drawing::Size(500, 90);\r\n\t\t\tthis->trackBar_LagCompensation->TabIndex = 0;\r\n\t\t\tthis->trackBar_LagCompensation->TickStyle = System::Windows::Forms::TickStyle::None;\r\n\t\t\tthis->trackBar_LagCompensation->Scroll += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_Scroll);\r\n\t\t\t// \r\n\t\t\t// groupBox_Details\r\n\t\t\t// \r\n\t\t\tthis->groupBox_Details->Controls->Add(this->panel_Details);\r\n\t\t\tthis->groupBox_Details->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->groupBox_Details->Location = System::Drawing::Point(548, 12);\r\n\t\t\tthis->groupBox_Details->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_Details->Name = L\"groupBox_Details\";\r\n\t\t\tthis->groupBox_Details->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_Details->Size = System::Drawing::Size(544, 698);\r\n\t\t\tthis->groupBox_Details->TabIndex = 11;\r\n\t\t\tthis->groupBox_Details->TabStop = false;\r\n\t\t\tthis->groupBox_Details->Text = L\"Details\";\r\n\t\t\t// \r\n\t\t\t// panel_Details\r\n\t\t\t// \r\n\t\t\tthis->panel_Details->AutoScroll = true;\r\n\t\t\tthis->panel_Details->Location = System::Drawing::Point(10, 23);\r\n\t\t\tthis->panel_Details->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_Details->Name = L\"panel_Details\";\r\n\t\t\tthis->panel_Details->Size = System::Drawing::Size(522, 667);\r\n\t\t\tthis->panel_Details->TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// labelGPU\r\n\t\t\t// \r\n\t\t\tthis->labelGPU->AutoSize = true;\r\n\t\t\tthis->labelGPU->BackColor = System::Drawing::Color::Transparent;\r\n\t\t\tthis->labelGPU->ForeColor = System::Drawing::Color::Black;\r\n\t\t\tthis->labelGPU->Location = System::Drawing::Point(10, 418);\r\n\t\t\tthis->labelGPU->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);\r\n\t\t\tthis->labelGPU->MinimumSize = System::Drawing::Size(526, 26);\r\n\t\t\tthis->labelGPU->Name = L\"labelGPU\";\r\n\t\t\tthis->labelGPU->Size = System::Drawing::Size(526, 26);\r\n\t\t\tthis->labelGPU->TabIndex = 21;\r\n\t\t\tthis->labelGPU->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;\r\n\t\t\t// \r\n\t\t\t// groupBox_InternalRes\r\n\t\t\t// \r\n\t\t\tthis->groupBox_InternalRes->Controls->Add(this->panel_IntRes);\r\n\t\t\tthis->groupBox_InternalRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->groupBox_InternalRes->Location = System::Drawing::Point(10, 248);\r\n\t\t\tthis->groupBox_InternalRes->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_InternalRes->Name = L\"groupBox_InternalRes\";\r\n\t\t\tthis->groupBox_InternalRes->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->groupBox_InternalRes->Size = System::Drawing::Size(526, 166);\r\n\t\t\tthis->groupBox_InternalRes->TabIndex = 20;\r\n\t\t\tthis->groupBox_InternalRes->TabStop = false;\r\n\t\t\tthis->groupBox_InternalRes->Text = L\"Internal Resolution (Quality)\";\r\n\t\t\t// \r\n\t\t\t// panel_IntRes\r\n\t\t\t// \r\n\t\t\tthis->panel_IntRes->AutoScroll = true;\r\n\t\t\tthis->panel_IntRes->Location = System::Drawing::Point(10, 38);\r\n\t\t\tthis->panel_IntRes->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_IntRes->Name = L\"panel_IntRes\";\r\n\t\t\tthis->panel_IntRes->Size = System::Drawing::Size(506, 118);\r\n\t\t\tthis->panel_IntRes->TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// tabPage_Patches\r\n\t\t\t// \r\n\t\t\tthis->tabPage_Patches->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->tabPage_Patches->Controls->Add(this->panel_Patches);\r\n\t\t\tthis->tabPage_Patches->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->tabPage_Patches->Location = System::Drawing::Point(8, 39);\r\n\t\t\tthis->tabPage_Patches->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Patches->Name = L\"tabPage_Patches\";\r\n\t\t\tthis->tabPage_Patches->Size = System::Drawing::Size(1104, 721);\r\n\t\t\tthis->tabPage_Patches->TabIndex = 1;\r\n\t\t\tthis->tabPage_Patches->Text = L\"Options\";\r\n\t\t\t// \r\n\t\t\t// panel_Patches\r\n\t\t\t// \r\n\t\t\tthis->panel_Patches->AutoScroll = true;\r\n\t\t\tthis->panel_Patches->Location = System::Drawing::Point(0, 0);\r\n\t\t\tthis->panel_Patches->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_Patches->Name = L\"panel_Patches\";\r\n\t\t\tthis->panel_Patches->Size = System::Drawing::Size(1104, 716);\r\n\t\t\tthis->panel_Patches->TabIndex = 9;\r\n\t\t\t// \r\n\t\t\t// tabPage_Playerdata\r\n\t\t\t// \r\n\t\t\tthis->tabPage_Playerdata->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->tabPage_Playerdata->Controls->Add(this->panel_Playerdata);\r\n\t\t\tthis->tabPage_Playerdata->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->tabPage_Playerdata->Location = System::Drawing::Point(8, 39);\r\n\t\t\tthis->tabPage_Playerdata->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Playerdata->Name = L\"tabPage_Playerdata\";\r\n\t\t\tthis->tabPage_Playerdata->Size = System::Drawing::Size(1104, 721);\r\n\t\t\tthis->tabPage_Playerdata->TabIndex = 3;\r\n\t\t\tthis->tabPage_Playerdata->Text = L\"Player\";\r\n\t\t\t// \r\n\t\t\t// panel_Playerdata\r\n\t\t\t// \r\n\t\t\tthis->panel_Playerdata->AutoScroll = true;\r\n\t\t\tthis->panel_Playerdata->Location = System::Drawing::Point(0, 0);\r\n\t\t\tthis->panel_Playerdata->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_Playerdata->Name = L\"panel_Playerdata\";\r\n\t\t\tthis->panel_Playerdata->Size = System::Drawing::Size(1104, 716);\r\n\t\t\tthis->panel_Playerdata->TabIndex = 1;\r\n\t\t\t// \r\n\t\t\t// tabPage_Components\r\n\t\t\t// \r\n\t\t\tthis->tabPage_Components->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->tabPage_Components->Controls->Add(this->panel_Components);\r\n\t\t\tthis->tabPage_Components->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->tabPage_Components->Location = System::Drawing::Point(8, 39);\r\n\t\t\tthis->tabPage_Components->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Components->Name = L\"tabPage_Components\";\r\n\t\t\tthis->tabPage_Components->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Components->Size = System::Drawing::Size(1104, 721);\r\n\t\t\tthis->tabPage_Components->TabIndex = 2;\r\n\t\t\tthis->tabPage_Components->Text = L\"Components\";\r\n\t\t\t// \r\n\t\t\t// panel_Components\r\n\t\t\t// \r\n\t\t\tthis->panel_Components->AutoScroll = true;\r\n\t\t\tthis->panel_Components->Location = System::Drawing::Point(0, 0);\r\n\t\t\tthis->panel_Components->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_Components->Name = L\"panel_Components\";\r\n\t\t\tthis->panel_Components->Size = System::Drawing::Size(1104, 716);\r\n\t\t\tthis->panel_Components->TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// tabPage_Plugins\r\n\t\t\t// \r\n\t\t\tthis->tabPage_Plugins->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->tabPage_Plugins->Controls->Add(this->panel_Custom);\r\n\t\t\tthis->tabPage_Plugins->Controls->Add(this->panel_Plugins);\r\n\t\t\tthis->tabPage_Plugins->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->tabPage_Plugins->Location = System::Drawing::Point(8, 39);\r\n\t\t\tthis->tabPage_Plugins->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Plugins->Name = L\"tabPage_Plugins\";\r\n\t\t\tthis->tabPage_Plugins->Padding = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->tabPage_Plugins->Size = System::Drawing::Size(1104, 721);\r\n\t\t\tthis->tabPage_Plugins->TabIndex = 3;\r\n\t\t\tthis->tabPage_Plugins->Text = L\"Plugins and Patches\";\r\n\t\t\t// \r\n\t\t\t// panel_Custom\r\n\t\t\t// \r\n\t\t\tthis->panel_Custom->AutoScroll = true;\r\n\t\t\tthis->panel_Custom->Location = System::Drawing::Point(552, 0);\r\n\t\t\tthis->panel_Custom->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_Custom->Name = L\"panel_Custom\";\r\n\t\t\tthis->panel_Custom->Size = System::Drawing::Size(552, 716);\r\n\t\t\tthis->panel_Custom->TabIndex = 3;\r\n\t\t\t// \r\n\t\t\t// panel_Plugins\r\n\t\t\t// \r\n\t\t\tthis->panel_Plugins->AutoScroll = true;\r\n\t\t\tthis->panel_Plugins->Location = System::Drawing::Point(0, 0);\r\n\t\t\tthis->panel_Plugins->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->panel_Plugins->Name = L\"panel_Plugins\";\r\n\t\t\tthis->panel_Plugins->Size = System::Drawing::Size(552, 716);\r\n\t\t\tthis->panel_Plugins->TabIndex = 0;\r\n\t\t\t// \r\n\t\t\t// tabPage_Credits\r\n\t\t\t// \r\n\t\t\tthis->tabPage_Credits->Controls->Add(this->creditsTextBox);\r\n\t\t\tthis->tabPage_Credits->Location = System::Drawing::Point(8, 39);\r\n\t\t\tthis->tabPage_Credits->Margin = System::Windows::Forms::Padding(4);\r\n\t\t\tthis->tabPage_Credits->Name = L\"tabPage_Credits\";\r\n\t\t\tthis->tabPage_Credits->Padding = System::Windows::Forms::Padding(4);\r\n\t\t\tthis->tabPage_Credits->Size = System::Drawing::Size(1104, 721);\r\n\t\t\tthis->tabPage_Credits->TabIndex = 5;\r\n\t\t\tthis->tabPage_Credits->Text = L\"Credits\";\r\n\t\t\tthis->tabPage_Credits->UseVisualStyleBackColor = true;\r\n\t\t\t// \r\n\t\t\t// creditsTextBox\r\n\t\t\t// \r\n\t\t\tthis->creditsTextBox->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->creditsTextBox->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->creditsTextBox->Location = System::Drawing::Point(0, 0);\r\n\t\t\tthis->creditsTextBox->Margin = System::Windows::Forms::Padding(4);\r\n\t\t\tthis->creditsTextBox->Multiline = true;\r\n\t\t\tthis->creditsTextBox->Name = L\"creditsTextBox\";\r\n\t\t\tthis->creditsTextBox->ReadOnly = true;\r\n\t\t\tthis->creditsTextBox->ScrollBars = System::Windows::Forms::ScrollBars::Both;\r\n\t\t\tthis->creditsTextBox->Size = System::Drawing::Size(1100, 712);\r\n\t\t\tthis->creditsTextBox->TabIndex = 0;\r\n\t\t\tthis->creditsTextBox->Text = resources->GetString(L\"creditsTextBox.Text\");\r\n\t\t\t// \r\n\t\t\t// button_Discord\r\n\t\t\t// \r\n\t\t\tthis->button_Discord->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(242)));\r\n\t\t\tthis->button_Discord->Cursor = System::Windows::Forms::Cursors::Hand;\r\n\t\t\tthis->button_Discord->FlatAppearance->BorderSize = 0;\r\n\t\t\tthis->button_Discord->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->button_Discord->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L\"button_Discord.Image\")));\r\n\t\t\tthis->button_Discord->Location = System::Drawing::Point(992, 768);\r\n\t\t\tthis->button_Discord->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->button_Discord->Name = L\"button_Discord\";\r\n\t\t\tthis->button_Discord->Size = System::Drawing::Size(64, 64);\r\n\t\t\tthis->button_Discord->TabIndex = 31;\r\n\t\t\tthis->button_Discord->UseVisualStyleBackColor = false;\r\n\t\t\tthis->button_Discord->Click += gcnew System::EventHandler(this, &ui::button_Discord_Click);\r\n\t\t\t// \r\n\t\t\t// button_github\r\n\t\t\t// \r\n\t\t\tthis->button_github->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(242)));\r\n\t\t\tthis->button_github->Cursor = System::Windows::Forms::Cursors::Hand;\r\n\t\t\tthis->button_github->FlatAppearance->BorderSize = 0;\r\n\t\t\tthis->button_github->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->button_github->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L\"button_github.Image\")));\r\n\t\t\tthis->button_github->Location = System::Drawing::Point(1056, 768);\r\n\t\t\tthis->button_github->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->button_github->Name = L\"button_github\";\r\n\t\t\tthis->button_github->Size = System::Drawing::Size(64, 64);\r\n\t\t\tthis->button_github->TabIndex = 32;\r\n\t\t\tthis->button_github->UseVisualStyleBackColor = false;\r\n\t\t\tthis->button_github->Click += gcnew System::EventHandler(this, &ui::button_github_Click);\r\n\t\t\t// \r\n\t\t\t// button_Apply\r\n\t\t\t// \r\n\t\t\tthis->button_Apply->BackColor = System::Drawing::Color::White;\r\n\t\t\tthis->button_Apply->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;\r\n\t\t\tthis->button_Apply->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->button_Apply->Location = System::Drawing::Point(8, 778);\r\n\t\t\tthis->button_Apply->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->button_Apply->Name = L\"button_Apply\";\r\n\t\t\tthis->button_Apply->Size = System::Drawing::Size(138, 46);\r\n\t\t\tthis->button_Apply->TabIndex = 33;\r\n\t\t\tthis->button_Apply->Text = L\"Apply\";\r\n\t\t\tthis->button_Apply->UseVisualStyleBackColor = false;\r\n\t\t\tthis->button_Apply->Click += gcnew System::EventHandler(this, &ui::button_Apply_Click);\r\n\t\t\t// \r\n\t\t\t// button_Wiki\r\n\t\t\t// \r\n\t\t\tthis->button_Wiki->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(242)));\r\n\t\t\tthis->button_Wiki->BackgroundImage = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L\"button_Wiki.BackgroundImage\")));\r\n\t\t\tthis->button_Wiki->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;\r\n\t\t\tthis->button_Wiki->Cursor = System::Windows::Forms::Cursors::Hand;\r\n\t\t\tthis->button_Wiki->FlatAppearance->BorderSize = 0;\r\n\t\t\tthis->button_Wiki->FlatStyle = System::Windows::Forms::FlatStyle::Flat;\r\n\t\t\tthis->button_Wiki->Location = System::Drawing::Point(928, 768);\r\n\t\t\tthis->button_Wiki->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->button_Wiki->Name = L\"button_Wiki\";\r\n\t\t\tthis->button_Wiki->Size = System::Drawing::Size(64, 64);\r\n\t\t\tthis->button_Wiki->TabIndex = 34;\r\n\t\t\tthis->button_Wiki->UseVisualStyleBackColor = false;\r\n\t\t\tthis->button_Wiki->Click += gcnew System::EventHandler(this, &ui::button_Wiki_Click);\r\n\t\t\t// \r\n\t\t\t// ui\r\n\t\t\t// \r\n\t\t\tthis->AcceptButton = this->button_Launch;\r\n\t\t\tthis->AutoScaleDimensions = System::Drawing::SizeF(192, 192);\r\n\t\t\tthis->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Dpi;\r\n\t\t\tthis->AutoSize = true;\r\n\t\t\tthis->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;\r\n\t\t\tthis->BackColor = System::Drawing::Color::Magenta;\r\n\t\t\tthis->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;\r\n\t\t\tthis->ClientSize = System::Drawing::Size(1120, 834);\r\n\t\t\tthis->Controls->Add(this->button_Wiki);\r\n\t\t\tthis->Controls->Add(this->button_Apply);\r\n\t\t\tthis->Controls->Add(this->tabControl);\r\n\t\t\tthis->Controls->Add(this->button_Launch);\r\n\t\t\tthis->Controls->Add(this->button_github);\r\n\t\t\tthis->Controls->Add(this->button_Discord);\r\n\t\t\tthis->DoubleBuffered = true;\r\n\t\t\tthis->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),\r\n\t\t\t\tstatic_cast<System::Int32>(static_cast<System::Byte>(64)));\r\n\t\t\tthis->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D;\r\n\t\t\tthis->HelpButton = true;\r\n\t\t\tthis->Icon = (cli::safe_cast<System::Drawing::Icon^>(resources->GetObject(L\"$this.Icon\")));\r\n\t\t\tthis->KeyPreview = true;\r\n\t\t\tthis->Margin = System::Windows::Forms::Padding(6);\r\n\t\t\tthis->MaximizeBox = false;\r\n\t\t\tthis->Name = L\"ui\";\r\n\t\t\tthis->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;\r\n\t\t\tthis->Text = L\"PD Launcher -- TEST VERSION --\";\r\n\t\t\tthis->TransparencyKey = System::Drawing::Color::Magenta;\r\n\t\t\tthis->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &ui::Ui_FormClosing);\r\n\t\t\tthis->FormClosed += gcnew System::Windows::Forms::FormClosedEventHandler(this, &ui::Ui_FormClosed);\r\n\t\t\tthis->groupBox_ScreenRes->ResumeLayout(false);\r\n\t\t\tthis->tabControl->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Resolution->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Resolution->PerformLayout();\r\n\t\t\tthis->groupBox_Lag->ResumeLayout(false);\r\n\t\t\tthis->groupBox_Lag->PerformLayout();\r\n\t\t\t(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->trackBar_LagCompensation))->EndInit();\r\n\t\t\tthis->groupBox_Details->ResumeLayout(false);\r\n\t\t\tthis->groupBox_InternalRes->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Patches->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Playerdata->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Components->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Plugins->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Credits->ResumeLayout(false);\r\n\t\t\tthis->tabPage_Credits->PerformLayout();\r\n\t\t\tthis->ResumeLayout(false);\r\n\r\n\t\t}\r\n#pragma endregion\r\nprivate: System::Void SaveSettings() {\r\n\tif (*ResolutionConfigChanged)\r\n\t{\r\n\t\tfor (ConfigOptionBase* option : screenResolutionArray)\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\tfor (ConfigOptionBase* option : internalResolutionArray)\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\t*ResolutionConfigChanged = false;\r\n\t}\r\n\r\n\tif (*OptionsConfigChanged)\r\n\t{\r\n\t\tfor (ConfigOptionBase* option : optionsArray)\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\tfor (ConfigOptionBase* option : graphicsArray)\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\t*OptionsConfigChanged = false;\r\n\t}\r\n\r\n\tif (*PlayerdataConfigChanged)\r\n\t{\r\n\t\tfor (ConfigOptionBase* option : playerdataArray)\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\t*PlayerdataConfigChanged = false;\r\n\t}\r\n\r\n\tif (*ComponentsConfigChanged)\r\n\t{\r\n\t\tfor (ConfigOptionBase* component : componentsArray)\r\n\t\t{\r\n\t\t\tcomponent->SaveOption();\r\n\t\t}\r\n\r\n\t\t*ComponentsConfigChanged = false;\r\n\t}\r\n\r\n\tif (*LagCompensationConfigChanged)\r\n\t{\r\n\t\tSetIniInt(GRAPHICS_SECTION, L\"lag_compensation\", trackBar_LagCompensation->Value, CONFIG_FILE);\r\n\t\t*LagCompensationConfigChanged = false;\r\n\t}\r\n\r\n\tfor (ConfigOptionBase* option : AllPluginOpts)\r\n\t{\r\n\t\tif (*(option->hasChanged))\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\t*(option->hasChanged) = false;\r\n\t}\r\n\r\n\tfor (ConfigOptionBase* option : AllCustomOpts)\r\n\t{\r\n\t\tif (*(option->hasChanged))\r\n\t\t{\r\n\t\t\toption->SaveOption();\r\n\t\t}\r\n\r\n\t\t*(option->hasChanged) = false;\r\n\t}\r\n}\r\nprivate: System::Void Button_Help_Click(System::Object^ sender, System::EventArgs^ e) {\r\n\tSystem::Diagnostics::Process::Start(\"https://github.com/PDModdingCommunity/PD-Loader/wiki\");\r\n}\r\nprivate: System::Boolean hasInvalidGLUT = false;\r\nprivate: System::Void checkHasInvalidGLUT()\r\n{\r\n\tHMODULE glutHm = GetModuleHandleW(L\"glut32.dll\");\r\n\thasInvalidGLUT = glutHm != NULL && GetProcAddress(glutHm, \"__glutGetFCB\") == NULL;\r\n\r\n\tif (hasInvalidGLUT)\r\n\t{\r\n\t\tSkinnedMessageBox::Show(this, \"Support for custom versions of \\\"glut32.dll\\\" is deprecated and will be removed in future versions of PD Loader.\\nPlease restore a valid copy of the original file, then validate your files and make sure \\\"glut32.dll\\\" passes.\\n\\nPlease DO NOT ASK for a copy of the file in our support channels!\\nWe cannot provide it to you.\", \"PD Launcher\", MessageBoxButtons::OK, MessageBoxIcon::Warning);\r\n\t}\r\n}\r\nprivate: System::Boolean launchanyway_divagl_novidia()\r\n{\r\n\treturn (SkinnedMessageBox::Show(\r\n\t\tthis,\r\n\t\t\"Plugins: Novidia and ShaderPatch should be disabled if DivaGL is enabled.\\n\\nLaunch anyway?\",\r\n\t\t\"PD Launcher\",\r\n\t\tMessageBoxButtons::YesNo,\r\n\t\tMessageBoxIcon::Error\r\n\t) == System::Windows::Forms::DialogResult::Yes);\r\n}\r\nprivate: System::Boolean invalid_divagl_freeglut()\r\n{\r\n\tSkinnedMessageBox::Show(\r\n\t\tthis,\r\n\t\t\"Plugins: DivaGL does not support custom versions of \\\"glut32.dll\\\".\\nPlease restore a valid copy of the original file, then validate your files and make sure \\\"glut32.dll\\\" passes.\\n\\nPlease DO NOT ASK for a copy of the file in our support channels!\\nWe cannot provide it to you.\",\r\n\t\t\"PD Launcher\",\r\n\t\tMessageBoxButtons::OK,\r\n\t\tMessageBoxIcon::Error\r\n\t);\r\n\treturn true;\r\n}\r\nprivate: System::Boolean invalid_divagl_divaimguiold()\r\n{\r\n\tSkinnedMessageBox::Show(\r\n\t\tthis,\r\n\t\t\"Plugins: Your version of DivaImGui is too old for DivaGL; please either update or disable it.\",\r\n\t\t\"PD Launcher\",\r\n\t\tMessageBoxButtons::OK,\r\n\t\tMessageBoxIcon::Error\r\n\t);\r\n\treturn true;\r\n}\r\nprivate: System::Boolean hasInvalidSettings()\r\n{\r\n\tbool divaGLEnabled = false;\r\n\tbool novidiaEnabled = false;\r\n\tbool shaderPatchEnabled = false;\r\n\tbool divaImGuiOldEnabled = false;\r\n\r\n\tfor (PluginOption* option : AllPluginOpts)\r\n\t{\r\n\t\tauto handle = option->mainControlHandle;\r\n\t\tif (handle == IntPtr::Zero) continue;\r\n\r\n\t\tauto checkbox = dynamic_cast<CheckBox^>(CheckBox::FromHandle(handle));\r\n\t\tif (checkbox == nullptr) continue;\r\n\r\n\t\tif (lstrcmpW(option->_friendlyName, L\"DivaGL\") == 0)\r\n\t\t\tdivaGLEnabled = checkbox->Checked;\r\n\t\telse if (lstrcmpW(option->_friendlyName, L\"Novidia\") == 0)\r\n\t\t\tnovidiaEnabled = checkbox->Checked;\r\n\t\telse if (lstrcmpW(option->_friendlyName, L\"ShaderPatch\") == 0)\r\n\t\t\tshaderPatchEnabled = checkbox->Checked;\r\n\t\telse if (lstrcmpW(option->_friendlyName, L\"DivaImGui\") == 0 && option->_builddate == L\"Unknown\")\r\n\t\t\tdivaImGuiOldEnabled = checkbox->Checked;\r\n\t}\r\n\r\n\tif (divaGLEnabled)\r\n\t{\r\n\t\tif (hasInvalidGLUT) return invalid_divagl_freeglut();\r\n\t\tif (divaImGuiOldEnabled) return invalid_divagl_divaimguiold();\r\n\t\tif ((novidiaEnabled || shaderPatchEnabled) && !launchanyway_divagl_novidia())\r\n\t\t\treturn true;\r\n\t}\r\n\r\n\treturn false;\r\n}\r\nprivate: System::Boolean warnCheck()\r\n{\r\n\tif (((ComboBox^)Control::FromHandle(((DropdownOption*)(graphicsArray[0]))->mainControlHandle))->Text == \"SELECT ONE\" &&\r\n\t\tSkinnedMessageBox::Show(this, L\"GPU detection has failed and no Nvidia GPU architecture has been selected.\\nAs such, characters and stages may exhibit artifacts, such as noisy shadows and stages.\\nIf unsure, try all of the options starting from Kepler.\\n\\nLaunch anyway?\", \"PD Launcher\", MessageBoxButtons::YesNo, MessageBoxIcon::Error) != System::Windows::Forms::DialogResult::OK)\r\n\t\t\treturn false;\r\n\r\n\treturn true;\r\n}\r\nprivate: System::Void Button_Launch_Click(System::Object^ sender, System::EventArgs^ e) {\r\n\t\r\n\t//SkinnedMessageBox::Show(this, \"It looks like the executable has been tampered with, or the version of the game is not 7.10.\\n\\nPlease use the \\\"patches\\\" folder instead of modifying the executable directly (or disable verification).\", \"PD Launcher\", MessageBoxButtons::OK, MessageBoxIcon::Error);\r\n\r\n\tif (!warnCheck()) return;\r\n\tif (hasInvalidSettings()) return;\r\n\r\n\tSaveSettings();\r\n\r\n\tif (GetPrivateProfileIntW(LAUNCHER_SECTION, L\"use_divahook_bat\", FALSE, CONFIG_FILE))\r\n\t{\r\n\t\tif (GetPrivateProfileIntW(L\"patches\", L\"quick_start\", 1, CONFIG_FILE) > 0)\r\n\t\t{\r\n\t\t\tSkinnedMessageBox::Show(this, L\"\\\"Quick Start\\\" and \\\"Use divahook.bat / start.bat\\\" cannot be enabled at the same time.\", \"PD Launcher\", MessageBoxButtons::OK, MessageBoxIcon::Error);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tDIVA_EXECUTABLE = NULL;\r\n\t\twstring DIVA_EXECUTABLE_LAUNCH_STRING_cmd = L\"cmd.exe /C \\\"\";\r\n\t\tconst wstring DIVA_EXECUTABLE_LAUNCH_STRING_path = DIVA_DIRPATH;\r\n\r\n\t\twstring DIVAHOOK_BAT_PATH = DIVA_EXECUTABLE_LAUNCH_STRING_path;\r\n\t\tDIVAHOOK_BAT_PATH.append(L\"\\\\divahook.bat\");\r\n\t\tif (std::filesystem::exists(DIVAHOOK_BAT_PATH))\r\n\t\t{\r\n\t\t\tDIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(DIVAHOOK_BAT_PATH);\r\n\t\t\tDIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(L\"\\\"\");\r\n\t\t\tDIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING_cmd.c_str());\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\twstring START_BAT_PATH = DIVA_EXECUTABLE_LAUNCH_STRING_path;\r\n\t\t\tSTART_BAT_PATH.append(L\"\\\\start.bat\");\r\n\t\t\tif (std::filesystem::exists(START_BAT_PATH))\r\n\t\t\t{\r\n\t\t\t\tDIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(START_BAT_PATH);\r\n\t\t\t\tDIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(L\"\\\"\");\r\n\t\t\t\tDIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING_cmd.c_str());\r\n\t\t\t}\r\n\t\t\telse if (SkinnedMessageBox::Show(this, L\"divahook.bat/start.bat not found.\\nThe game will start normally/offline.\\n\\nNOTE: Disable \\\"Use divahook.bat / start.bat\\\" to avoid this warning.\", \"PD Launcher\", MessageBoxButtons::OKCancel, MessageBoxIcon::Warning) != System::Windows::Forms::DialogResult::OK) return;\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\t// read the command line here so it'll be up to date even if the user changed it\r\n\t\tWCHAR stringBuf[256];\r\n\t\tGetPrivateProfileStringW(LAUNCHER_SECTION, L\"command_line\", L\"\", stringBuf, 256, CONFIG_FILE);\r\n\r\n\t\tDIVA_EXECUTABLE_LAUNCH_STRING += L\" \" + wstring(stringBuf);\r\n\t\tDIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING.c_str());\r\n\t}\r\n\r\n\tSTARTUPINFOW si;\r\n\tPROCESS_INFORMATION pi;\r\n\r\n\tZeroMemory(&si, sizeof(si));\r\n\tsi.cb = sizeof(si);\r\n\tZeroMemory(&pi, sizeof(pi));\r\n\tCreateProcessW(DIVA_EXECUTABLE, DIVA_EXECUTABLE_LAUNCH, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);\r\n\t\r\n\t// this->Close won't work in here since it will prompt the user to save the settings\r\n\tTerminateProcess(GetCurrentProcess(), EXIT_SUCCESS);\r\n}\r\nprivate: System::Void InternalResEnabledChangedHandler(System::Object^ sender, System::EventArgs^ e) {\r\n\tif (((CheckBox^)CheckBox::FromHandle(InternalResolutionCheckbox->mainControlHandle))->Checked)\r\n\t{\r\n\t\t((Control^)Control::FromHandle(InternalResolutionOption->mainControlHandle))->Enabled = true;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t((Control^)Control::FromHandle(InternalResolutionOption->mainControlHandle))->Enabled = false;\r\n\t}\r\n}\r\nprivate: System::Void DisplayTypeChangedHandler(System::Object^ sender, System::EventArgs^ e) {\r\n\tint idx = ((ComboBox^)ComboBox::FromHandle(DisplayModeDropdown->mainControlHandle))->SelectedIndex;\r\n\r\n\tif (idx == 2) // fullscreen\r\n\t{\r\n\t\tfor (ConfigOptionBase* option : screenResolutionArray)\r\n\t\t{\r\n\t\t\tif (option == RefreshRateOption)\r\n\t\t\t{\r\n\t\t\t\t((Control^)Control::FromHandle(option->mainControlHandle))->Enabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfor (ConfigOptionBase* option : screenResolutionArray)\r\n\t\t{\r\n\t\t\tif (option == RefreshRateOption)\r\n\t\t\t{\r\n\t\t\t\t((Control^)Control::FromHandle(option->mainControlHandle))->Enabled = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\nprivate: System::Void Ui_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {\r\n\tif (!AnyConfigChanged())\r\n\t\treturn;\r\n\r\n\tswitch (SkinnedMessageBox::Show(this, \"Do you want to save your settings?\", \"PD Launcher\", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Question))\r\n\t{\r\n\tcase System::Windows::Forms::DialogResult::Yes:\r\n\t\tSaveSettings();\r\n\t\tbreak;\r\n\r\n\tcase System::Windows::Forms::DialogResult::No:\r\n\t\tbreak;\r\n\r\n\tcase System::Windows::Forms::DialogResult::Cancel:\r\n\t\te->Cancel = true;\r\n\t\tbreak;\r\n\t}\r\n}\r\nprivate: System::Void Ui_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {\r\n\t// Prevents abnormal termination messages, remember that the game is still technically running and must be killed!\r\n\tTerminateProcess(GetCurrentProcess(), EXIT_SUCCESS);\r\n}\r\nprivate: System::Void button_Discord_Click(System::Object^ sender, System::EventArgs^ e) {\r\n\tswitch (SkinnedMessageBox::Show(this, \"Would you like to read the user guide for troubleshooting?\", \"PD Launcher\", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Information))\r\n\t{\r\n\tcase System::Windows::Forms::DialogResult::Yes:\r\n\t\tSystem::Diagnostics::Process::Start(\"https://github.com/PDModdingCommunity/PD-Loader/wiki\");\r\n\t\tbreak;\r\n\r\n\tcase System::Windows::Forms::DialogResult::No:\r\n\t\tSystem::Diagnostics::Process::Start(\"https://discord.gg/cvBVGDZ\");\r\n\t\tbreak;\r\n\t}\r\n}\r\nprivate: System::Void button_github_Click(System::Object^ sender, System::EventArgs^ e) {\r\n\tSystem::Diagnostics::Process::Start(\"https://github.com/PDModdingCommunity/PD-Loader\");\r\n}\r\nprivate: System::Void button_Apply_Click(System::Object^ sender, System::EventArgs^ e) {\r\n\tSaveSettings();\r\n\tupdateStyle();\r\n\tShowWindow(hWnd, SW_HIDE);\r\n\tShowWindow(hWnd, SW_SHOW);\r\n}\r\nprivate: System::Void Ui_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {\r\n\tif (e->KeyCode == Keys::Escape) this->Close();\r\n}\r\n\r\nprivate: bool* ResolutionConfigChanged = new bool(false);\r\n\t\t bool* OptionsConfigChanged = new bool(false);\r\n\t\t bool* PlayerdataConfigChanged = new bool(false);\r\n\t\t bool* ComponentsConfigChanged = new bool(false);\r\n\t\t bool* LagCompensationConfigChanged = new bool(false);\r\n\r\nprivate: bool AnyConfigChanged() {\r\n\tif (*ResolutionConfigChanged || *OptionsConfigChanged || *PlayerdataConfigChanged || *ComponentsConfigChanged || *LagCompensationConfigChanged)\r\n\t\treturn true; // fast case\r\n\r\n\tfor (ConfigOptionBase* option : AllPluginOpts)\r\n\t{\r\n\t\tif (*(option->hasChanged)) return true; // slow case for iterating over individual plugins\r\n\t}\r\n\r\n\treturn false;\r\n}\r\n\r\nprivate: String^ GPUIssueText;\r\nprivate: System::Void LinkLabelLinkClickedGPUIssueHandler(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {\r\n\tSkinnedMessageBox::Show(this, GPUIssueText, \"PD Launcher\", MessageBoxButtons::OK, MessageBoxIcon::Information);\r\n}\r\nprivate: System::Void trackBar_LagCompensation_Scroll(System::Object^ sender, System::EventArgs^ e) {\r\n\t*LagCompensationConfigChanged = true;\r\n\r\n\tupdateLagCompMsec();\r\n}\r\nprivate: System::Void tabPage_Resolution_Click(System::Object^ sender, System::EventArgs^ e) {\r\n}\r\nprivate: System::Void button_Wiki_Click(System::Object^ sender, System::EventArgs^ e) {\r\n\tSystem::Diagnostics::Process::Start(\"https://github.com/PDModdingCommunity/PD-Loader/wiki\");\r\n}\r\n};\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/Launcher/ui.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n              <xsd:attribute ref=\"xml:space\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <data name=\"creditsTextBox.Text\" xml:space=\"preserve\">\r\n    <value>PD Loader is intended for educational purposes only; not for piracy.\r\nUsers should possess a legally-obtained dump of the game to use this software.\r\nPlease check your local laws/regulations to verify the legality of tampering\r\nwith and dumping data from protected arcade machine hardware.\r\n\r\nProject Contributors:\r\nano, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,\r\nNezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat\r\n\r\n\r\nPD Loader and the included plugins are distributed under MIT License:\r\n  \r\n  Copyright (c) Project DIVA Modding 2nd Community\r\n  Copyright (c) samyuu (nop) (original TLAC code)\r\n  Copyright (c) ThirteenAG (original Ultimate ASI Loader code)\r\n  \r\n  Permission is hereby granted, free of charge, to any person obtaining a copy\r\n  of this software and associated documentation files (the \"Software\"), to deal\r\n  in the Software without restriction, including without limitation the rights\r\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n  copies of the Software, and to permit persons to whom the Software is\r\n  furnished to do so, subject to the following conditions:\r\n  \r\n  The above copyright notice and this permission notice shall be included in all\r\n  copies or substantial portions of the Software.\r\n  \r\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n  SOFTWARE.\r\n\r\n\r\nMicrosoft Detours, utilized by many plugins, is licensed under MIT License:\r\n  \r\n  # Copyright (c) Microsoft Corporation\r\n  \r\n  All rights reserved.\r\n  \r\n  # MIT License\r\n  \r\n  Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n  this software and associated documentation files (the \"Software\"), to deal in\r\n  the Software without restriction, including without limitation the rights to\r\n  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\n  of the Software, and to permit persons to whom the Software is furnished to do\r\n  so, subject to the following conditions:\r\n  \r\n  The above copyright notice and this permission notice shall be included in all\r\n  copies or substantial portions of the Software.\r\n  \r\n  THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n  SOFTWARE.\r\n\r\n\r\nLauncher, Patches, Render and TLAC plugins utilize files from FreeGLUT:\r\n  \r\n  Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r\n  Permission is hereby granted, free of charge,  to any person obtaining a copy\r\n  of this software and associated documentation files (the \"Software\"), to deal\r\n  in the Software without restriction,  including without limitation the rights\r\n  to use, copy,  modify, merge,  publish, distribute,  sublicense,  and/or sell\r\n  copies or substantial portions of the Software.\r\n  \r\n  The above  copyright notice  and this permission notice  shall be included in\r\n  all copies or substantial portions of the Software.\r\n  \r\n  THE SOFTWARE  IS PROVIDED \"AS IS\",  WITHOUT WARRANTY OF ANY KIND,  EXPRESS OR\r\n  IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO THE WARRANTIES  OF MERCHANTABILITY,\r\n  FITNESS  FOR  A PARTICULAR PURPOSE  AND NONINFRINGEMENT.  IN  NO EVENT  SHALL\r\n  PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM,  DAMAGES OR OTHER LIABILITY, WHETHER\r\n  IN  AN ACTION  OF CONTRACT,  TORT OR OTHERWISE,  ARISING FROM,  OUT OF  OR IN\r\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n  \r\n  Except as contained in this notice,  the name of Pawel W. Olszta shall not be\r\n  used  in advertising  or otherwise to promote the sale, use or other dealings\r\n  in this Software without prior written authorization from Pawel W. Olszta.\r\n\r\n\r\nLauncher uses SimpleIni, licensed under MIT License:\r\n  \r\n  The MIT License (MIT)\r\n  \r\n  Copyright (c) 2006-2013 Brodie Thiesfield\r\n  \r\n  Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n  this software and associated documentation files (the \"Software\"), to deal in\r\n  the Software without restriction, including without limitation the rights to\r\n  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n  the Software, and to permit persons to whom the Software is furnished to do so,\r\n  subject to the following conditions:\r\n  \r\n  The above copyright notice and this permission notice shall be included in all\r\n  copies or substantial portions of the Software.\r\n  \r\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n\r\nDivaSound uses miniaudio (public domain or MIT-0) and BASSASIO (free for\r\nnon-commercial use only)\r\n\r\n\r\nAMD compatibilty pack dependencies have additional licenses, detailed in the AMD</value>\r\n  </data>\r\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\r\n  <data name=\"button_Discord.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAACoAAAApCAYAAABDV7v1AAAABGdBTUEAALGPC/xhBQAAA7hJREFUWEft\r\n        mEtME0EYgIshUY/GqwcPevbsjYMXb95MPHnTKAUWEVADNQLdFnlUUHkEA4IKmMhD8BEf1IiCUQERIt3t\r\n        g7ZIodBCS+mDbbu/MyUtLaVAYbYa7CSTbbrT///+50xHJEqOpAeiPXBeMnkgvZg5S0nZIopmS4WYmVKG\r\n        zqA1YrFEfWRHMaCoqYOUjOnIlrOQiEnJWO1FyeTRuGEzSibECNCfCMigjiwZMywWq/fHBYvC7EgkZEiX\r\n        jDmxbdC0NGXqX4FEaZYlVZ9MgpL0/v/t0bxyNZQ36qGiSQ/5Fatt7EopCzm3Vz/nlrGgaNZDTasRbt7T\r\n        bKvNEfdo9SMDDI3boLlrGrrem+HT0AL80i6DweQG44w78Bz+ZYd3AxZo6zXBGLsEfV+scL1SvSkwUdCW\r\n        bhPMWz0wxtiB4/yw1fD5eFDpsBEuZIwjcaAagxM8K1sDrjfA7+eB53moQtGIVYDEPFpcq93KgVu+ty1x\r\n        gVzeCJYY6CgK924H5/WDvGFSONBrqBDWhxyH0uH0wtKyF3Bow4fT7QW7wwsYDK8LDvy558OccKCKZgN4\r\n        kdJwhaMqOxTX6qCwWgMfvy+E3lltHJQ1TsINhRraXs1G/A4v6kddQrDQ9yrnozwjrVsLYf3T3yHQps7p\r\n        EIjkrhYW7FyEt3EXEAz0zWdLhDIcQtyqggofPFsDHRxZDH1/674OnC5vxG9XOJ9woP1hocVaMSjOv+6+\r\n        OXjyYgZWVnwRaTEwssg3dU3zZos7IhLBRXnl0ZVPpOoHR20hEA+CMpndUQUUqyO4PL5Aw8fNPzgKqqK3\r\n        VSKgr/vXctSPvPmTtUPLcxNoDMsxgXGXGPyxCK1oG11a5kKetSxycBWdBdbnKRHQXBQq5dcFsDlWFeJp\r\n        tnhA8VAPhahgatunoP3lDHS8nYXHPSa402KEfHRwwbntcq+mhdfnB+2UE6paNt6diIAGrS+p00E3OohM\r\n        oH37GzqY4FPUZmfSyiYDaI1OwAVW02YMtCzBt1CSh2TB2pPQkFg+0dALCbw3QUUiyT50c+Em7TlKzvJI\r\n        rgM/iRQT/l9NSZkK0qCBHKRV9ehGpDMWbFyhx6Dn8g2H0N3T+GbW78QQSqZqTZMoU7Notm0j2XGDYtgL\r\n        RZrjSGBBtoxtREKbiUwZ04BlX5ZOHM6kVTVIJhdu8I5Aw65WUkQiIDhDklOyaEYWfhm3W9BtXwfFu/A0\r\n        ur1DOZuDiswadx+NVxmJ9elS5gwlZ1z/rEfDjRTTzKlL9PgxEoYnZewZD/wB4r+Nvne+oTwAAAAASUVO\r\n        RK5CYII=\r\n</value>\r\n  </data>\r\n  <data name=\"button_github.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAACoAAAAnCAYAAAB5XdqFAAABgWlDQ1BJQ0MgcHJvZmlsZQAAKM+VkUso\r\n        RFEcxn9zEXlkYZJkcRfDihKSpYZIUZoZZbBw7x0z1Nw7070jG0tlqyw8Nl4LG2u2FrZKKY+Sja0VsZGu\r\n        /5mZmkmNcup0fn3nfF/nfAe0w7Rle9W9YDs5NzIe1mfjc3rtC3VotNIAhuVlp6JjMSqOzzsCar3tUVn8\r\n        bzQlljwLArrwsJV1c8KLwoNruaziXeGgtWwkhM+Eu125oPCD0s0CvypO5VlTmUE3FhkRDgrrqTI2y9ha\r\n        dm3hAeFQwnYkX5stcELxumI7vWoV76le2LjkzESVLrODcSaYYhodk1VWSJOjR1ZHFI+I7Icr+Nvz/mlx\r\n        meJawRLHKBlsjLwf9Qe/u/WS/X2FpMYw1Dz7/nsn1G7D95bvfx35/vcxVD3BpVPyZw5h6EP0rZIWOoDm\r\n        DTi/KmnmDlxsQttj1nCNvFQlU0sm4e1UvikOLTdQP1/orbjPyT3EpKvJa9jbh66UZC9UeHddeW9/nin2\r\n        9wPzU3J08NKhyQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAAd0SU1FB+MIAhYLMBv7dmMAAAYJSURBVFhH\r\n        xZh5bGVTHIDb6qpU7dWxDEVQprWLNWhRuxgSKmPoWFOEMCS2igmmsUVim4jaNamREcZWa6h9iTQSLSYm\r\n        mfGHIDomaahxfF9z3+R6W+/rtOlJvtzXe88953d++21R0fSNHVh6r+lbPvfKxTySJKOKSbfCHVCS5IWp\r\n        nFPBYtvCRhMs6mF2gzfhESifSiGSrKWATXDcBJuX8fxceBbug+oki0/1nK1Z8Ba4Mo+wW/HsSbgAFsIm\r\n        Uy1EkvXU1oHwGrRCus/qj8dAH8yBNtg4ycLTMWdLFr0a3gB/x4d+fDfMBzXbmEfz6bJ5aINwH9g7ixIK\r\n        Pkspb+wLH8I8iEf1FpE21apBVJv2PNtmvu97+v5dcG902MPShS0k7aQ22pwfnfAu1Md235nfb0UHyZfK\r\n        fOZBdoEOeAEegFNBjSr09bBf/GSarwFOhGPhUDgA9oDNsqmAe2pVsz4DZ0cnd3MXfh9MT9mGrjEbTofH\r\n        YAAMvLNgVzDwjIOdIlku5Orhx4cv7whHwClwDlwKRrenPAGyBYTmcqEnoBJMX5r8PZiVWjy6al5T2zL4\r\n        Br6Eh+FM2B02hbgLudb2cDjoZuufpUxRy83tQJOoMTfuAgVuBjWZGprOw6lBtaEm1MzbEA8y13bTF+Fx\r\n        MMcqwGwwx+aqXN6vAw/i2lmHi/tQ0+sCF8HrcD8cFC3uQprY6D8PjNjLYTnUxFbVnLdBPxwMWsJDJinH\r\n        znEtNT7hUIs2GGfAp7AKdHYFtQCYjl6Jft/JVZ9TaIcCtYOmPgkmW6XilswpsCe6DB6CG0BTD4FuoWmu\r\n        gZ8i4Z+PBNfvUz77dfR+rsDMuXHSB6rdNq0XPoGn4Tt4NRL2R66fwy+wDn6GEXgObF7MAJ+B/q2PJjF1\r\n        UtnWz/P08+ELsAMyG+ib+upX8GskXOCazlgk7Edc9VdLqaYTs4fa3uCh4+tLOr5+pVkPATVkCjK69UE1\r\n        mE3I1D2fD0YHbOZqg2LO/QCWwclgUBWkZScbLObPd0AT2lSYajS9ATC+YFlZ2dH19fW/lZeX5xPSZ3+B\r\n        LqJgP4AuYGk0+nUN/fxl6ALztCnIapc3aMx51u0/QVNfC0eCpXH8xerq6qKOjo7avr6+5YODg6Gnpyc0\r\n        NDSEkpKS0NTUFBobG0NxcXFc+L8jAXu4XgIGnom7Gax8Zg0rmkF6O6gYrag/q+msw3LlCW8Czf4/LfoG\r\n        QhQtXbp07tq1a8fWrFkTFi1aFNra2sLixYvDihUrwsDAwPjfTE0xzO+nwL7VEqhLmapEF6oFrWiXpOC2\r\n        jObibrgKsn5F7MmDR8H6bl7MmFRTU1OENueNjo6uY4TVq1eH7u7usHLlyjA2NhaWLFkSFixYEKqqqhT0\r\n        d7AIWKG+B0tntqE7aTEPYTW0GbHX0KIGYMbYnzv3gPU5q3Or0fb29jkIu2poaCig3dDa2hqGh4eDY2Rk\r\n        JPT29oaKiorRSCu2a/qenyIWgSTfWWYDg7UFzDIZ76h6GxAb3XxjFsH0cV1dXSgtLR33yc7OztDf3x84\r\n        QGhpafmHl18Cg7AL7Bfs8E1RaivJ0C3UplbIEPQobpqG0rv19IXNrZZLBVrvj5WVlQaVgbg00obV6wpw\r\n        U3uBm0F/TVo+DSbjJCMDGJFG5kQlziZFHzIzKOy/8AeY2K8DO3IFM8UZlGrE8muE2yNY85PkTXsIfTbj\r\n        M7uZmzbNqUaCnzmHif80uBG64GI4HtSAQeFBvgXNp1Buao50vpmlNt/isWcKmdHaWYdNExM5vOs4R2EV\r\n        xLyo87u59zWVKU6NbhPb1AMcDTY11v9JD9UcXzjJQgomcVMq0INgEo9bxznmarv585MsnmuOzpuzgy5g\r\n        4QbmGjTNkN61G1hq06Ymw/eS7jHpF2MbKNhcWAjZSqBa9btMf04a/UnlL2iem5vkTXW5rGNWsVWcsf+c\r\n        eCKDy6KRs7rxzMpj0M6YoJrdftPcqS/mGprfT5d8cwoyY6GTLb3+V8PIniihmynSA63Q/SY9367Ljn3G\r\n        TJpEcpO8JdjSOWOaSiKotdz8mOgfBEkWnK45tSzst85EvrnB+/8H9IFAujdzCzQAAAAASUVORK5CYII=\r\n</value>\r\n  </data>\r\n  <metadata name=\"toolTip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\r\n    <value>17, 17</value>\r\n  </metadata>\r\n  <data name=\"button_Wiki.BackgroundImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        iVBORw0KGgoAAAANSUhEUgAAAikAAAIrCAYAAAAqWwkVAAABgWlDQ1BJQ0MgcHJvZmlsZQAAKM+VkUso\r\n        RFEcxn8uIo0sjDyyuAusTAnJUkOkqGmMMli4944Zau413TuysVS2ysJj47WwsWZrYauU8ijZ2VkRG+n6\r\n        n5mpmdQop07n13fO93XOd0A7TFu2V9UDtpN1o2NhfSY+q9e8oNFKE800G5aXmZwajVF2fN5RodbbkMri\r\n        f6M+sehZUKELD1kZNyu8IDywls0o3hUOWktGQvhMuNuVCwo/KN3M86viVI41lRl0Y9Fh4aCwniphs4St\r\n        JdcW7hfuSNiO5GszeU4oXldsp1etwj3VCwOLzvSU0mW2M8Y4k0TQMVllmTRZQrI6onhEZT9cxt+W80fE\r\n        ZYprGUscI6xgY+T8qD/43a2X7OvNJwXCUP3s+++dULMN31u+/3Xk+9/HUPkEl07Rv3IIgx+ibxW1jgNo\r\n        2IDzq6Jm7sDFJrQ8ZgzXyEmVMrVkEt5O5Zvi0HgDdXP53gr7nNxDTLqauIa9fehKSfZ8mXfXlvb255lC\r\n        fz93xXKpDPMGbQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+UCGRUXHaHk4jAAAEcySURBVHhe\r\n        7Z3vz2XXddct8Q/MC14ghOEFvAAJCfGCViABL1CFLKqiItWVkJAAVQipiFd2RYWgAygSwq6nbUjj0E4z\r\n        LmoDFlarUbFo62baOh7/mPGPmdhOHDlKMk3Gjh0nntjzw3bsy7Nmeh7fuc+99+xzzlp7r7XXZ6QrN33O\r\n        3Weftb5rrc9de59z7litVnfwwQZoAA1YaeDGlWvH5PMnT371729+5P9vdV7GRdNoIL4GABQgDQ2gAVUN\r\n        CHicOX76hHx+/s57V6UfOV4gBnCJX1iAA3yopQHV5KQ1KcZB4GgglgYGMCkFkrHjBmBBB7F0gL/wl7YG\r\n        gBR+RaMBNDBbA9pwsg1epLuinfgYj2KKBmJoYHZywsExHIyf8JOFBmrAySawACto2ULLjOlbV0AKv6LR\r\n        ABqYpAGBhbHlGqu/s2fFd0Gh4OMfbQ1MSk7aJ2c8BI0GYmmgJaCsgw9dlVi6Ic7x11wNACn8ikYDaKBI\r\n        A1Pv1rHqpgArFLy5BY/vxdNOUXLCsfEci8/wmaYGPALKACvcCYTWNbXOWL70BKTwKxoNoIG9GvAMKHRV\r\n        fBUUCjz+0NYABYoChQbQwE4NRAEUYIXiqF0cGc+HpihQFCg0gAa2asDLJtk5e1tYAvJRYCj0+GGpBihQ\r\n        FCg0gAaOaCAyoNBVoTAuLYx834+GKFAUKDSABm7TQC+AAqz4KTQUfXwxVwMUKAoUGkADhxroEVCAFQrk\r\n        3ALJ99prhwJFgUIDaOCmBnoHlAFWeBBc+8JD8ccHpRqgQFGg0AAaSAModFUojqXFkeN8aIUCRYFCA8k1\r\n        kKWDsusuITorPooRUIAftmmAApW8QJEYcieG7IDCElBu/ZP//PsfSAFS0EBSDQAo9642uyt0VfwXLcAi\r\n        l48oUEkLFIGeK9A3/Q2gHAUU9qvkjglyok//AylAChpIpgEAZT+gsATks1gBETn9QoFKVqAI9JyBPvgd\r\n        QCkDFLoqueOEPOnH/0AKkIIGkmjgxpVrx+a8B4fv3AIb9qv4KVxARB5fUKCSFCiCOk9Qb/M1gDK9g7IN\r\n        zgCV3HFEHq3vfyAFSEEDnWsAQNEBFJaA6hcooACbU6A6L1AEee4gB1D0AQVYyR1T5NS6/gdSgBQ00KkG\r\n        ABRbQFm/C0hsTfGqW7ywdw57U6A6LVAEcI4A3udnNrzWgRRuWSbWyLd2GgBSgBQ00KEGzhw/fQJIqQsp\r\n        wIpdoQIC8tqWAtVhgSKg8wa0+B5AaQMnm3tVWALKHYfkYR3/AylAChroSAMASntAYWOtTnGiyGNH0QAF\r\n        qqMCRVDnDmoAxRegACu545F8rON/IAVIQQMdaABA8QsoA6yIj3gYnE7hAgDy2JEC1UGBImDzBOw2XwMo\r\n        /gGFrkruGCVHz/c/kAKkoIHAGuCFgbEABViZX6wo9DltR4EKXKAI2pxByxuN44LJ5m3hLAHljmFy+Lj/\r\n        gRQgBQ0E1AAdlH5AhTcsjxcqinleG1GgAhYoAjZvwIrvAZS+AIUloNzxTD7f738gBUhBA4E0AKD0CyjA\r\n        CrACsBzVAAUqUIFCwLmTGICSA1B4vH7uOCfP3+5/IAVIQQMBNACg5AIUuiqACrBySwMUqAAFCrHmTlgA\r\n        Sl5AAVZyxz65H0gB0oA01xoAUAAUQAVQyQwrrhN0Zsdw7SQmAAVA2XyuCvtVyAvZagOQQicBDTjUAIAC\r\n        oOwCFDorgEomUKFAOSxQmQTItR5NuAAKgFICKHRVgJUM+RNIAVLQgCMN3Lhy7diUAsWxAA2wAqz0DCsU\r\n        KEcFqmehcW3jiRRAATg0oFM6ccTbeLxhoxg2AlKAFDTgQAMACoCiASh0VWIUXgCp3E8UKAcFCsGWC7ZH\r\n        WwEoAIomoLCxNnc+6S1HAilAChpoqAEABUCxAhRgBVjpAVgoUA0LVA8C4hqWJcIaBYpzAEKiAdmrIlBM\r\n        zC6LWexX135ACpCCBhpp4Mzx0ycACACitgbYWFu3yAI1y+xNgWpUoBDuMuFGtx+AApzUhpPN8wEruXNQ\r\n        lBwKpAApaKCyBgAUAKU1oKzfBcQSELDiGVgoUJULlGcxMDf7ZAWgACheAIWNtfbxTk5dbmMgBUhBA5U0\r\n        AKAAKB4BBVhZXkiBETsbUqAqFShEbCfiCLblfTwAindAGeYnMM1+ldz5ylNOBVKAFDRgrAEABUCJAih0\r\n        VYATT4Aic6FAGRcobw5nPnWTEIACoEQEFGClbp4gL++2N5ACpKABIw0AKABKdEBhCQhYaQ1QFCijAtXa\r\n        sZy/bXIBUACUXgCFrkrbXJI9lwMpQAoaUNYAgAKg9AgowAqw0gKYKFDKBaqFEzmnn+QBoAAovQMKsOIn\r\n        32TI/UAKkIIGlDQAoAAomQBl/am1GYol19gGzihQSgUKAbcRsBe7AygASkZAoauSO+/VyL9ACpCCBhZq\r\n        AEABULIDCrACrFgBCwVqYYGycgzjxgh6AAVAAVCOaoAn1sbIXxHqDJACpKCBmRoAUAAUAGW/BoAVYGUp\r\n        CFGgZhaopYbn+7GDV15vT4ECUtBAmQaAldj5rmW9AlKAFDQwUQMASllhooBjJ/aqACdLAYcCNbFALTU4\r\n        348dtAAKhRf4WqYBuiqxc2DtGgakAClooFADAMqy4kRxx350VgCUqZBDgSosUFMNy/F9BSOAQoEFsvQ1\r\n        QFelrzxpUfeAFCAFDRRogAKlX6CwKTblqbVAyhjYUKAKCtSYEfl734F25vjpExRUCioasNcAnZW+c+mc\r\n        WgmkACloYI8GABT7wkTxx8abe1VkeXVOQeM7/UEOBQpIQQM7NACgUDwBqHYaoKvSH3DMgUgKFJCCBrZo\r\n        AEBpV5wAA2zPXUAAygA0FCggBQ1saABAoUgCSr40IF0VloByggsFCkhBA2sa4H08vooTsIA/6KrkhBM6\r\n        KcAJcLKhAQCFgggUxdAA+1XygAuFClhBAwcaAFBiFCcgAj8NGpBlWWClf1ihQAEp6TUAoFD4gJ+4GgBU\r\n        +gaV9AVqzi1RfKefoABQ4hYnwALfsV+ln1y8q64CKXRS0moAQPFd5B6++8FV6Qdg8e3LWv5hCag/aElb\r\n        oOiG9CfmKT4FUNoWtQE+zj7we6tLZ189/Bz4cPG/YTwZWz5yrlpFkvO01RXvAuovrwMpdFLSaQBAqVtI\r\n        BBIGGFlMIAsHEIAZ4AWgqKuDFvZmv0p8aElXoKb82ubY+ALf9CGAYl+YBEqGbsZCpqjydaDFXhMtAIX9\r\n        Kn3kbyCFTkoaDQAoNsVoWLoRMIn+b+i0tC6qnF9fq3RVYkJLmgJFVySmQLX8BqDoJ/2hYxIdTHbNH2DR\r\n        14wH+AJWYtUCIIVOSvcaAFD0ik3vYAKw6GnFA5DsmwOwEgNWui9QWr/EGSeGoDf9JC8l854sI8wvK5xs\r\n        gxb2sPQDMoCK/7wOpNBJ6VYDAMryYgKc7F7MYjloub68ADqw4hdWui1QdD78iq6GbwCUZQUEOJm200a6\r\n        K14KLvOYr31gxV/dAFLopHSnAQBlfpIGTqbByebRwMp87XmBK0DFF6h0V6Bq/ErnHL5EvO4PAGVekQBO\r\n        lsEJsDJPd17AZNs8gBUfeR5IoZPSjQYAlHmFQn7988/GAnRW5mnSE7wAK21hpZsCRXejrZA82F9eLuYp\r\n        uXmfC90TGzDZdUeQdz0wv91ABai0qy9ACp2ULjQAoEz7xUr3pB6grJ+Jzso0nXoDJ2ClPqx0UaA8/Ipn\r\n        DvXFO9gcQClP/HRP2sAJoFKuUW9gwn6VdrldcjyQQicltAYAlPLkT/ekPaAAK+V69Q4r0lWRfXD8QLWF\r\n        mNAFCnHYisO7fQGU8oTfw8v/fCGG3mxYAirXsUdwYQnItg4BKXRSQmoAQClL7LK8wz//FgBUyvTsEVKG\r\n        OQErNrASskB5/4XP/GzEOtiVFwaWJXSWd/zDCc9XKdOyZzhZnxtLQPq5H0ihkxJKAwBKWVIHUOIByjBj\r\n        uiplGvcMLnRV9GAlVIGiQ6Hn+Ii2BFDKkjeAEhdQ2FhbpnHPgLLZWYmYaz3NGUihkxJCAwBKWfJmg2wf\r\n        gEJXpUzvEWBF9s/RWZn/AztEgfJEdcxlvtjm2g5AKUvYAEpfgDJcjfg1QjFmjvvjFFCZVzuAFDoprjUA\r\n        oAAofaLH9Ktir0pZLHiHJWBlGqy4LlBzf3nzvWki8GovAKUsKdNBmV7wo34DUCmLCe+gwhJQeY0CUuik\r\n        uNQAgFKWjAGUqLgxf96ASllseAcVmR9dlXFYcVmgvP6yZ17jgtKwEYBSloQBlPmFPvo32adSFiMRQAVY\r\n        2V9XgBQ6Ka40AKCUJV9uM46OGTrzlycKRynEzHM8tumsHAUWVwVK41c4Y9TpdljYGUAZT2KS6AEUnQLf\r\n        yygs/5TFTRRIAlRur2FACp0UFxoAUMoSLYDSC1roXgegUhY/UUCFJaCPQcVFgbL4Vc6YcToq8rrzSMmj\r\n        1VwBFN3C3ttogEp/oAKsrO4AUuikNNUAgFKeWHsrqlyPvgUAlfJ4avVjY855My8BNS1QdDvidDssfAWg\r\n        lCdU7uTRL+i9jgiolMfVHGBo+Z2MsAKk0ElpogEApTyRsszTK07YXRegUh5fLaFj7rkzwUqTAmXxq5wx\r\n        43RlAJTyBAqg2BXy3kcGVMrjbC4stPxeFlABUuikVNdAy8COdu7eCynXZ2sBQKVvUMmwsbZ6gaLjEafj\r\n        YeEreWdFNFBoNd/MXRTZgyMfsYE8sGz47PLF8Hc5fviwj+cWAAEq/YNKz7ACpNBJqaYBAKU8WWYDFAGK\r\n        MRCZC4sy7gAutn0Lv6PzZNry2JurMw/f63EJqFqBsvhVzphxujIAyrQkmaELMIBJ7eQ+QItfpLCZGaAy\r\n        LQZr61LzfD3BCpBCJ8VcAwDK9ORoU6baj9oKTPYtE2XpWvFSwulxqAkOLcbqAVbMCxTdjjjdDgtfASjT\r\n        E6P84u3tnzc42VYwMiwJASrT47EFXGieU0BF7qi0yO81xgRS6KSYaYD38cxLiD1BSgQ42SwIvS8HsZF2\r\n        XlxqgkOLsaJ2VcwKVA3C4hx+uzQAyvxE2AOkRISTXd2V3rpacj3sT5kfny0AQ/Oc0WAFSKGToq4BAGV5\r\n        AoxcGHv8pd7jvhVAZXmcasJDzbEiLQGpFyi6G367GzV8A6DoJL6Id/f00j3ZVSx627PC/hSdWK0JF9rn\r\n        itBVAVLopKhpAEDRS3rRlnx67J7sg5XIna71uWfym3aB72k8z7CiVqBq/ErnHH67NACKHqAMyS9CN6X3\r\n        7sm+QtTLEhDLPvqxGxFg5E5Mj7ACpNBJWawBAMUuyXn+xc6v8HtvPsk2+j+WfeziNyKseAOVxQWK7obf\r\n        7kYN3wAotglOfuV67KgAKLf7PTqs4E/bOAZW5tdJIIVOymwNACj1EpunIsjywHa/e/LRnO4Ofq0Xz1Gg\r\n        xcMS0OwCVeNXOueYT5/WtgNQ2iS01oWQQjbud4+drxJoYdln3LdR4EJ7ni2XgIAUOimTNQCgtE1mLUAl\r\n        8wbZOQm/hY9KQGTsGJZ92sb2HK3V/E4LWJlcoKx/oTO+3+6J+AZA8ZPEahVCfmHP83kt/4yBx9S/0y2b\r\n        5++asND6XDVhBUihk1KsAXlJVevg4PxHE6hlMQRQlhWsaM+7EaDB58t8niVH1QKV4gJFh8N3h8PaPwCK\r\n        78RlASoUKx2fRwQVuik6vs8ALNawAqTQSRnVAIASJ2FpwkqGBFvzGiNtqAVQ48R8TQ3vO5cVrIwWKOtf\r\n        6Izvu0MDoMRMVkthhV/SNn6PBCpowEYDXqDCYh4WoAKk0EnZqQEAJXaSmgMq3MVj7/MooEI3xV4LFqDg\r\n        YUxNWAFSgJSdGvAgduawPFGWwgq3ny63daleo4AK3ZR6mijVTqTjNGAFSAFStmpAnjQYKRiY63gyFQiR\r\n        jxTI4SP/m0I0bjttfUXZTEs3pb42tLXWeryloAKkAClHNACgkJhaJ7YM548CKkAs+UAjHufCCpACpNym\r\n        AQCFhKSRkBijTEelS3FTH8imeTzdlDJfovkyO02FFSAFSDnUAIBSFmQkI+ykqYEIoEI3Bc1ran4KqAAp\r\n        QMpNDQAoJCHNJMRY0/TkfSMt3ZRp/kT/4/YqBRUgBUjhfTx3jgcUSQcbWWtAc4nGYizr62f8fDEmP47H\r\n        npUGpCSHFF4YmC8xUAx8+tz7RlqWfHzqJno8j4EKkJIYUgAUkk70BNfb/D0v+7DkQ76wird9Sz9ASlJI\r\n        AVBIOFYJh3GXactiqUZrTLopy3xLbOy23y5QAVISQgqAQqIhWfrVgOdlHyDFr256iGl5FcvmHhUgJRmk\r\n        ACgkmR6SWe/X4HXZhyUf8odl7G3bnwKkJIIUAIUEY5lgGFtPX3RT9GyJLmPZcnPZB0hJAikASqxAJbHi\r\n        L6/dFJZ80KZ1flpf8gFSEkAKgEJSsU4qjK+vMa/dFJZ89H1N/Nxu0/VuCpDSOaQAKCQUEmBcDXjtpqCp\r\n        uJqK4Lv1vSlASseQAqCQSCIkJOa4W6deuyks+ZBbrON2uNMHSOkUUgAUkoh1EmH8Ohrz2E1hyaeO7zPH\r\n        2NBNAVI6hBQh0Mzi5tpJoD1pwGM3BUghxmrEmGygBVI6gxQAheRRI3lwjro689hNQQN1NZDR3lLPgJSO\r\n        IAVAIWlkTGQZrtljN4V9KeQb69gDUgCUlbXIGJ9EhgaWawBIWW5DdBjPhrIvhU5KB6BCByVe8JEw8dlU\r\n        DXhb8mFfChqequGpxwMpAAqdlDtJNFMTB8e30Yy3bgqQ0kYHmeIPSOkAUsSJmUTLtZIYs2rAG6Qc3HnB\r\n        jxx+5JhrgOWewKACoFCwsxbsrNctYODpX1Y/cN31ci+QEhRSAJR6QUJCwtZeNOBtXwp3+BAb1rEBpASE\r\n        FACFxGCdGBjfp8bOPvB7nhopKyDFp056iV/2pAAo5uuJvQQL10Ey9qABb/tSBJo82IU59BmfQEowSKGD\r\n        0mcgkmDxa6kGgBS0UqqVHo6Td9Cx3BMEVHhhIMmph6TDNSzTMZCyzH7oL5b9gBQAhVYttxCigWAa8LQp\r\n        hWelxCr60SCNx+IHgBQ6KCSBaImF+dpqFkixtS/69WNf3oLsHFIAFD/BQuLCF140AKSgRS9atJyH7MEE\r\n        UhxDCoBCIrJMAIwdV19ASlzfEXflvpMaCKQ4hRQApVzIBD22yqYBIAXNZ9C8AAqQ4hBSABQSUIYExDXO\r\n        1zmQMt926C6G7YYuCpDiDFIAlBgBRKLDTy01AKSgv5b6q3HuoYsCpDiCFACFxFMj+DlHbJ15e04KtyDH\r\n        1pPHfLDeRQFSnEAKgEKge0wWzMmfLr29uwdI8aeR6HG73kUBUhxACoBCkEdPKsy/noaBlHq2Rtf1bb3Z\r\n        RQFSGkMKgFI/CEg82DyyBqRz4ekfLxgknrTiaRugACkNIUUe96vlXMYhUaCBHBrwBCgyFyAlh+5q5JfN\r\n        ZR5uQQZQeGdLsHe21EgUnMNv0fG2aRZI8auVaHEsP9qBlIZQsm58OigEdrQEwnx9aNbbfhQgxYcuosfn\r\n        PkBhuacyuAAoBHX0hML822nY21KPzEe6O2iinSai237XPhSek1IZTsTgAAqBHD2hMP92Gva41COQgiba\r\n        aSK67f/g/tOP71riAVIaQEp0QTF/khEaaKcBj0s9QEo7PUSPxf9zz6nVpUuXTgApDWBkm9HlldPRRcX8\r\n        SUhooJ0GPC718CC3dnqIHIsCKOfPnwdSSgitxjEACoEcOaEw9/b69dpF4fbj9tqIFp8DoAApdFBYK+b2\r\n        YjTQiQY8dlG4swdAmQpI64ACpDiAFDooBPHUIOZ4NLOpAa9dFO7sQatT8tUmoAApjSEFQCGApwQwx6KX\r\n        XRrw2kVh0yyaLc1b2wAFSGkIKbyPh+AtDV6OQyv7NOC5i8KmWbRbkr92AQqQ0ghSABQCtyRwOQadlGjA\r\n        cxeFTbNoeEzD+wAFSGkAKQAKQTsWtPwdjZRqwHMXhf0o6HhMx2OAAqRUhhQAhaAdC1r+jkZKNeAdUNiP\r\n        gpb3abkEUICUipACoBCwpcWH49BKiQY8L/Nw6zEa3qfhk3fdd/NBbSUfnjhbAVQAFAK2pOhwDDop1YBs\r\n        SPX+j/0o6HmbnqcACp0UAIUHeXXyIK/S4sZx8QtHhGUelnri68wiV0wFFCDFGFLooBCoFoHOmHl1FQVQ\r\n        6KLk1eiu/DQHUIAUQ0gBUAhSYAINaGrg4bsf9L7Cczg/IAXtr2t/LqAAKUaQAqAQoJrFibHQUyRAYakH\r\n        vWoBCpBiACkACgEKVKABTQ1EAxS6KOh/Xf8ld/DsO4a7exRBBUAhODWLE2Ohp2iAQhcFza7nrcdOPVp0\r\n        mzGQoggiB0F4x7bPjSvXjlFUCFA0gAa0NBARUOiioP9B/xqAwnKPErwAKASmVmFiHLQkGohyF8/mTl70\r\n        i35FA1qAAqQoQAqAQlCSmNGApgaiAgpdFOJAG1CAlIWQAqAQlJrFibFy60mWdyI8SXbXfdDoN7d+LQAF\r\n        SFkAKQAKAUlSRgNaGojaPRmAhS4KsVD6wsCpd/twd89MUNFKToxDcKOBvBqIuDl2WycFDefVsPjeClDo\r\n        pMwElDPHT58gKHMHJf7H/0s0EH1pZx1U6KLkjgVLQAFSZkAKgJI7IJcUJr6bWzsCJtGXdeii5NbwZg6z\r\n        BhQgZSKkACgEKKCBBqZqoKeuySak0EXJGw81AAVImQApAEreYJxalDgerQxgEvlunbG3Gcq1ofWcWq8F\r\n        KEBKIaQAKDkDkQSM36doIAOYsBeFmKgJKEBKAaTwPh6Cckqh4thceskGJtxynEvfLfagbN6izC3Ie0AF\r\n        QMkdkAAH/t/UgEBJz3tMxpZ4hr8TG/lio3YHZYAVIGUHpAAo+YKQxIvPt2kga7dkF7CwWTZfnLQCFJZ7\r\n        ABQ2vh08iAg4wQaDBtY7JT1vei3tmHA3D7HRElCAlC2QQgeFoARa8mgAKCnHFe7myRMXQw5sDShAygak\r\n        ACj5ghAgyeNzgKQcSLYdKfYjXvLEy8m77ltNfc+OxfHsSflTUAFQ8gQfiTaHr9lLsgxKuN04R5xsy4de\r\n        AIVOCoDCLyP2pHShAbokekDCPpS8cCLA4glQgJQDSKGDkjsg6arE9D+3AttBCR2UmDGhkcu8AUp6SAFQ\r\n        8gajRkAzRj39ACV1oGT9LGyUradvD7nEI6CkhhQAJVcAekgCzGGa5thTUh9MhjMCKNO02kNsW2x61Rgz\r\n        5cZZACVfAPaQRHq/BoESeVAYzydpByfDmbmTJ1eOfOzUoy7u5NkGNekg5caVa8d6T/ZcX64EE9nfPGK+\r\n        PZBszgBAyZU/PANKuuUeACVX8EUu3j3PHTDxByZ0UHLmRu+AkgpSAJScQdhzsY90bYCJXzCRmckSGx2U\r\n        XDkyAqCkgRQAJVfwRSrevc8VOPENJwOg9K5Dru/2GhAFUFJACoACoJCg6mtANsDyz78FeKNx/dhonY8i\r\n        AUr3kAKg5AvA1gkg+/mBE/9gMswQQMmXHz28MHDqbclP/c7jX5dafqDbO/Z99v5x7Mut/p69YHD9+ZJQ\r\n        K58DJ3HgRGbK/pN8uSEioAjQSOdH8toYqISDlDPHT59olbA5b74EkNXn7DmJBSc8pC1nbooKKOuQIjm2\r\n        m04KgJIzELOCQovrBk5iwYnMluWdnHkxMqBsQorU9l2gEqaTAqDkDMQWhTrrOVnaiQUo3F6cNydGB5RN\r\n        SJGcK0+M3wYqISAFQMkbjFmBoeZ10z2JBSfsPcmdD3sAlG2Qsmt/intIAVByB2TNYp3xXHRPYgEKSzu5\r\n        82EvgLILUrbtT3ENKbwwMHdAZoSGWtdM9yQWnLC0Qy7sCVD2Qcrmso9bSAFQCMpaBTvbeeiexAEU4IQ8\r\n        KPmpN0DZBymbyz4uIQVAITCzgUOt6wVQYgAKcEIOHHJCj4AyBinrd/u4gxQAheCsVbCznUcKH/98WwA4\r\n        If+t56VeAWUMUtb3priCFACFAM0GDrWuF0ABTmppjfPo5PGeAaUEUoYn0bqBFABFR9gkCOy4qQEAxSeg\r\n        0DUhVnfl65N33bea+i6caMcPj8XfZYNhyccFpAAoBCtwpa8B7uDxByeAib7Oe8sdGQBFgOqRex+6+e6e\r\n        fR95uFtzSAFQCNoxofL3eRqhg9IeUsQHgMk8/WaM+yyAIpAi1zrmY1nyaQopAArBOyZS/j5PIwBKG0BZ\r\n        hxLeSDxPu1ljPhOglHRRRAfCCM0gBUAhgLMmI+vrBlDqAQpQQh7TiGcAZbuOZF9KE0gBUAhsjcBmjKM6\r\n        4jkotoAClJC7LPJOtE2vc+db2kEZbNwEUgAUgtwiyBnz3hWAogsoAAm5qkZekbtc5hb9SN+bCihi++qQ\r\n        Iptgajidc5BcsmkAQFkGKAAJOaNFzgBQxnVXbbkHQBl3Rosg4Zx9+GVZic71bYCkD81Hz10ASpkOq0AK\r\n        gFLmjOhBx/zb+JmNsvshS+wjnSbutmmjT/LCUbsDKOVaNIcUAKXcGQQztpqqAZZ5jgLK8FwSoIR4mhpP\r\n        NY4HUMp1ab4nBUApd0aN4OAcffkDQLkFKEBJX7ruOU/1/j6eYSPvnE2y2/xuDik9i41rIzG21kCunSQf\r\n        Xy1PcSX2WsfenPNnAZSxd/JMsZ3pw9yEgKZMhmNJPGigXAPZuiiASbk2iCN/tgJQ5vnEDFIAlHkOIblg\r\n        txINZAEUwIR4KIkH78cAKPN1bPLuHgBlvkO8Bxvz8+Hb3u/m4YV8PnRGvC/3A4CyzIbqb0EGUJY5hKSA\r\n        /cY00GsXBTBB+2Paj/Z3AGWZpmWpRxVSAJRlDokWgMy3jb972ywLnLTREfFra/csgCJ388jLES30pAop\r\n        vI/HVvAWAmDMeD7rqYsCnMTTHzmjzGcASpmdxvQkXRSVTgqAouOQMYfxd+zcQxcFOEHHPecyAEVH30MX\r\n        ZTGkACg6Duk5aLk2HY1E76IAJzo6IJ782hFA0fPN0EVZBCkAip5DSDzYcp8GogOKzB+No/GeNQCg6Ol7\r\n        vYsyG1IAFD2H9By4XJuOTiJDCu/P0dEAseTXjpkARetx9/v0vN5FmQUpAIrfYCGR9eebqIAiyzvosT89\r\n        4tPbfSp3tgzvq+n9vzUAZbOLMhlSABSSDkmqrgYibpZleaeuRojJNvYGUHTtvg1QJkEKgKLrEBIL9hzT\r\n        QMQuCoCCrsd03cPfARRdnctz1jaXeSbdggyg6DqkhyDlGuw1Ea2LAqDYa4K4a29jAEXXB/sApaiTAqDo\r\n        OoQkgz1LNBCtiwKgoOsSXUc/BkDR1fkYoIxCCoCi65DoAcr86+kh0ksEAZR6uiAG29kaQNG3vbzleNcy\r\n        z+hyj3yZgNB3CjbFpiUaiLLUA6Cg5xI993DMY6ceTXEnT427eEQPJYCyt5PSg6i4BhJoVA1EgZSo9mXe\r\n        5IYpGgBQdPVSCig7IYVlHl2HTAkGjsX2ooEI/3hQG1rNkK+yAIpcZw1/TgGUrZACoJB4agiVc+zXmXdI\r\n        YZmHPJEhhgEUXZ1PBZStkJJBeFyjrvCwp749PW+cBVD0/U0M+bMpgKLrkzmAcgRS6KLoOoXEgz3nasAz\r\n        pMy9Jr5HPETRAICiq9VdT5Mdu7PnCKREERDz1BUQ9vRnT9nv4fEfXRR/WiF+dX2S6YWBNbSzBFBugxS6\r\n        KLpCr+F8ztG3z7x1UwCUvvVGPrl3lQlQ5Lkv1j5fCii3QYo8+c16woxPkkMD5Rrw1k3Bd+W+w1bxbAWg\r\n        6PpMA1Bug5T1oLr/4BbIn7/znh2Udc/q1t/5YAM0YK0BL4/Hp4uC1q213nJ8AEVX31qAcggpLPXoOqhl\r\n        sHHu/nzpAVTQVX+6wqe3fAqg6GpbE1CAFLpBdMSCaKAlqNBF0U3iwIEfe2YClBqPu9cGlENIIWj8BA2+\r\n        wBf7NFAbVgAU9NhrTgJQdLVtAShASpBf0b0mCa5rXpIQcKh15w+Pvp/nI7Tt224Aiq5/rADlJqTwtmNd\r\n        Z5GcsGctDVh3VeiioOVaWq55HgBFV9eWgPIxpPyFhZNe+n06GuwNQQOzNWAFKzULB+damIOJn6L4AVB0\r\n        dWYNKHRSCOyiwKaA6Aa2hT21l4Doovj3uYWOeh4TQNHVdA1AAVKAFCClMw1odFUAFN1k3nPhj3JtAIqu\r\n        puXhryXv3dE4hj0pnRWpKEmDeeomjU17zoUVAMXWL+i+vn3l8e/nz59P8alxm3FNQKGTAqDQSelYAwIc\r\n        pbAidwtxJ0/9Agq02NocQNG1b21AAVI6LlAkP93gjGzPfbACnKCTyNreN3cARVfbLQCF56QAKXRS0AAa\r\n        QAPdaSAToDx26lFz/7UCFCCF5GQu7l5/pXFdur/SsCf21NIAgKKvJY0NsHPHuEO++Jkf+sQlLYEwjr5A\r\n        sCk2RQNoAA2UaSDLJtkaHRTRnDzwdS5gaHzvJqT89k899FsEQFkAYCfshAbQABrwqQEp3BkgJQugHC73\r\n        ACk+A45EiF/QABpAA2UayAIoAmE1NNG6gzJ0YW52Un7/Zx/5dI2L5hxlwYadsBMaQANooFwDmQBF9txY\r\n        a8MLoBx2UoCU8mCwFgfj4ws0gAbQQLkGAJRyW5XoyhOgACnc3WNO5CVBwTG6SQZ7Ys8sGgBQdLVe6308\r\n        UzbUstwDqAAqaAANoIFwGsj0Pp4aSzweAYVOCokpXGLy+gtRHikvT2+Vz+a/4YmvXufOvHR/jWJPe3tm\r\n        ApQa7+PxCihACpACpCzUwAAnR8hky/9DYIX349gXMCChbxsDKLr+9QwoQMrCAkUy1A2WaPYsfXnfts5K\r\n        tGtlvrm17sX/AIquDr0DCpACpNBJmamBuYCyDiwyhpfkzzx0kz/21LcngKJr0wiAAqTMLFAkIN1giWZP\r\n        DUAZYEX2sAArufUUTf8t5gug6MZIFEABUoAUfsnP0EDJ/pOpxwAqukm4RSHlnDY+BFB07RoJUICUGQWK\r\n        RKQbMNHsqdlF2QYywEpufUWLB+v5Aii68RANUIAUIIVOykQNTO2QzDmeJSDdxGxdSBnfxl8Aiq5dIwIK\r\n        kDKxQJGMdIMmmj2tuyjcBZRbX9HiwXK+AIpuLEQFFCAFSKGTUqiB2oDCXUC6SdqyoDK2rq8AFF17RgYU\r\n        IKWwQJGEdIMmoj1bQsoALOxXQYcRY2fKnDMBirx3aIpt5hx75vjpE1Pek+PxWN7dA6iYB8qc4PL0HQ+A\r\n        AqgAKJ5iwmIu8n6a8+fPp/gAKKub7FHyAVKAFCBlRANzNr9af4euCtBiAQqtxgRQdPXcQwdlABgVSPnc\r\n        j3+KB1IBO13CjqcuCrcs6ybyVgWZ897uRwBFV9c9AYranhSBFNrRukIjkfmwp3VHRGN8uio+tELMTvdD\r\n        JkCRpSxrjfQGKCaQIkmXpDk9WK3Fy/jTfeK9i8IdQNN9Shz4sVk2QJHrtdRfj4BiBil0VfwkAsug6H1s\r\n        jS5HzTEevvtB0yTYu7+5vnp5C0DRt3XJJtSIx6jtSdmXjOms6AuShGpr00hdlCH25Em16MJWF9hXx75Z\r\n        7uKR67TuoIgmb1y5diwigJTMuQqksASkE9gkyDp2jAgoA6jQTamjEWJxvp3l9tsskAKglN1mvA9WqkEK\r\n        S0Dzg5qEWNd2kSGFbkpdrRCb0+ydCVAeufch885mzx0U9VuQp669swQ0LbhJhnXsFRlQJAaBlDo6IR6n\r\n        2xlAmW6zfTrLACjmG2fHwAVQ0RUtiXO5Pcc0G+Hv6GC5DrChrg0BFF17ZgGU5pDCEpCucEmsy+wZvYsy\r\n        xBM6WKYD7KdrPwBF157RXxhYsll2/Zjqe1K4C0hXsCRUPXtG6JKUzBFN6GkCWy6zZaYXBtbYg5INUNx0\r\n        UjYfSsUdCssSA4l1uv166aJILOH/6f7HZvo2A1B0bZoRUFxCCktAusIm+ZbZs6RDEeEYNs6W+Zu4sLUT\r\n        gKJr36yA4hpSgBVdkZOUd9uzpy4Km9GJm9axDqDoajAzoISAlOFBcCwB6Qq/dSLzdP4IHZLSOXqyK3PJ\r\n        F7MAiq7PswNKGEihq6IrfIrHx/aki4K2iAcdDWQCFLljyVo3AMqtp9W6urun9NciLW2dpGIdZBHG7wlS\r\n        ItibOfYZuwCKrl8BlI8fpx8SUoYnawIruoGRsYDIRtMe/hELxEKr+AVQdLUHoNz+vp+wkMISkG5gtEpw\r\n        rc/bC6S0tiPnzxmPAIqu3wGUoy8kDA8pwIpukGQrNj1ACl0UYqBF3AIouroDULa/MbkbSGEJSDdgWiS9\r\n        FueMDik8FwXdt4ibTIBy/vz51cm77jPdKAugbAeUsBtnx/YQ8MuSxF2auOXW9sj/0DpaL9W61nEAiq7m\r\n        zhw/fUKKMZ8EnZTNYkMC1w0mrSTnaZzIkIK+0XftWJKOgnQWsnysOygAyjicdbXcs+sXMcmcZL4vmUdd\r\n        8qldoDhf7jgCUHT9D6CMA0q3yz3bYAVQ0Q2wngpWxG4KekbPNWMQQNHVG4BSBiipIIW7gHSDrGaCrHGu\r\n        aA91q2ETzkHMiAayAcoj9z5kukkWQCkHlJSQAqyQeHcV3yigQhcFDdcCSABFX2tskAVSim/WINnrB2Ct\r\n        5Gl1ngigYnXtjEs8bGogywZZuU7rDorY9saVa8eAFCClGFLoqpCUtxVm2aPiFVYAazRbCyblJXpZIAVA\r\n        mQYONUErxd09pdRCAaAArBcAb6CCPtEngKJ/+zOA4hdQUu9J4XZlEn5pwvcCK0AKmi3V7JLj6KDo6owl\r\n        nmUQRCdlB61QEHQDdUnS9PDd1ktA6BE91ogDAEVXZwDKMkChk1KwDkRx0A3aGonW8hytuiqW18TYaFw0\r\n        AKDo6gBAWQ4oQEoBpMghgIpu8PZQFGvCCvpDf9YxA6DoaowXBuoACpBSCCncBaQbwNYJt+b4NWCl5vVw\r\n        rnxaz/TCQIExa40DKHqAAqRMhBRgJV8CL0lolqBCFwXNlWhw7jEAiq6+ABRdQAFSZkLKsAQkmynnJge+\r\n        p5scPNhTG1bkxYceros59KdV8SmAoutXAEUfUICUBZBCV0U3wHsqhFqwAgSjMau4AFB0tQWg2AAKkKIA\r\n        KcCKbrBbJeXa4y4FFQAFXVlpNhOgyBNzrew4jAug2AEKkKIIKSwBUVS2JcOpsCJLPAAKWrIqrNkARV6Q\r\n        aGVLGRdAsQUUIEUZUuiqUFx2JcQxWAFO0I5lMc22B0U6KACKPUDUeIcPT5w1AhWer0LR2VZ0hifXCrTI\r\n        R/43nRO0AqDovpMHQOkDUOikGALKMLT8QuY2UoqQdRFifDS2SwMs8ehqgyWeugBEJ6UCqNBV0U0SFGTs\r\n        iQbKNJANUKzfaAyg1AUUOimVAGX9NHRVypIrRQg7oYFlGgBQltlvU38ASn1AAVIaQIqckiUg3eRBMcOe\r\n        aOB2DQAoujFx5vjpEzU2iXKOoyDEck8jUGEJSDeJUKSwJxq4pQHZNCp3t2T5WC/xAChtOigDsAEpDSGF\r\n        W5YprBRWNKCpAQBFV08ASltAYbnHAaBwF5BuUtFM+IyFbyJpAEDR1SuA0h5QgBRHkEJXRTfBRCouzBXf\r\n        L9UAgKKrIQDFB6AAKQ4hBVjRTTZLkz/fxx/eNQCg6GuUDaxAimM88DU1blnWT0Deiw7zw+dTNJBlg6xc\r\n        p/UmWbH7jSvXjgEpQIovEnA+G0CFojWlaHFsHr08dupR7uI5AAstzQMofuCEu3ucg8m26QEreslIK6kx\r\n        Dj5ppYFMgCLXam1nAMUfoBzuSfntn3rot5YI4HM//qmAJT/ulIEVCuOSeOW78fUDoOj6EEDxCSiHkPKb\r\n        P/bJJ5ckLiClPvAAKrpJaon++S6+qKkBAEVXbwCKX0A5hJTP/NAnLi0JMiClPqRwF5Buolqif76LL2pp\r\n        AEDR1Rrv4/ENKIeQsjTAgJR2kAKs6CatpbHA9/GHlQayvY/Hyo7DuACKf0AJCymXLl1avfHGG+3JwNkM\r\n        WAKiQFondsZvo7FsgCLPfrHUGoASA1BuQoqsxy0VQ81Oyte+9rXVCy+8cPO2u+eff3715ptvOkOF9tMB\r\n        VtoUkqVxxPfx2zYNACi6ugBQ4gBKOEj5xje+cQgowwOMBFguXLiw+s53vtOeDpzNAFjRTW5ABPasrQEA\r\n        RVdzAEosQAkFKbLEI52TbU9XfPbZZ1df/OIXb8LKd7/7XWeo0HY6gIpukqtdpDhfXv8BKLq+B1DiAUoY\r\n        SPnmN7+5E1A2oeXixYsr+Xzve99rSwfOzg6s6CY84AF7WmogG6BYP+4eQIkJKCEg5Vvf+taRJZ6Sd1UI\r\n        qEh35e2333aGC22nA6xQXC2LK2Mv1xeAstyG6zoEUOICintIuXz5cnEHZRe4yBLQV77yldX3v//9tnTg\r\n        6OwCKg/f/aDp7nmKlW6ixZ457Amg6PoZQIkNKGqQIglUCp/mv9dee20xoAzgcu7cuZvdmFdffXX1zjvv\r\n        aE4z9Fh0VXQTIiCBPZdoAEDR1Q+AEh9Q1J6TMgSmFqh8+9vfXj333HMmb/eUzbdf/epXV1evXg0NGJqT\r\n        B1Z0k+OSQsV3c/oCQNH1O4DSB6AcQsrSx+JvJtYlsCIPaRueg1Ky92TOMdJZEQiSZ65cu3ZNs96HHYsl\r\n        IN0kCWxgz1INACi6WgFQ+gGUQ0j5Hz+87N09u4JxKqzIg9kEHuSW4jnwMec7cj55/sr169fDAobmxOmq\r\n        6CbM0kLFcTntDqDo+v3M8dMnpLDx6ccGN535h//59ANWSbIUVORhbLuegzIHPuZ8R57F8t5772nW/LBj\r\n        ASu6ydMqvhg3rp/k0e9z8lTU71jfZgyg9AMm65B5E1Je+Z0LP2Gd7PbByltvvWW2B2VKQMsykBwvz2V5\r\n        //33wwKG1sQvnX315oZoa20wftxCi+/m+Q5AmWe3XXoDUPoElMPlno8+/OjP1Eg220BFHrpWc3lnDFoG\r\n        UJHj5BktH3zwgVbNDzsOoKKbUGvEGufw6zMARdc3AEq/gHIIKfJ/PPfZJ/7NrMT2F39m8i/tAVbkQWtj\r\n        0ND677JnRZ7X8tFHH4WFDK2JAyu6yXVWvB3c7s/34togG6A8dupRU70CKH0Dym2QIv/j/okJcOrx68n1\r\n        1/7R/TcBZb1z0RpI9p1fYOX111/Xqvdhx2EJKG6BBG7a+g5A0bU/gNI/oByBlK//0Ss/UiOR/eo//G+r\r\n        c0/f2v8R7SN3IPFvxV6ViUBfI644h24R1LQngKLvmxtXrh3jLp7+QeXIrVoSmPffec/eFt3Y3/cF96/8\r\n        g/+6eubs0672oZSC0ssvvwyfbFiAJSD95KtZHBnLh39k2aM0z0Q/znqJRzQNoPQPJwOAHoEUcb5VYnvw\r\n        731i9fQXngoXrLIkBaDs5zNgxUcxtIpdxp3v30yAIoBlrRUAJQ+gHFnuGchF1vq0hfbpv/1fVk/98ZPh\r\n        AEWCTgDlww8/pIsyYgFAZX4h0443xvPhi2yAIstaltoDUHIByk5IkT9oCu2X/9Z/Wj35h2dDAspLL720\r\n        +sEPfgCgTLAAsOKjQGrGMGNN9ymAMt1m+3QGoOQDlL2QorXs89//5s+tnvz8EyEB5cUXXwRQJsDJ5qHA\r\n        im6SBhTi2BNA0fUVgJITUPZCivxRXtS0JDF+8q//h9XZ3/9CSEC5ePEiD3JbACjDVwEV3WS9JB75bh1f\r\n        ACi6duaFgXkBZRRSloDKL/7Vf7964nf/OCSgXLhwgcfiKwDK+hDAim7iBjh82pMXBur6BUDJDShFkDIH\r\n        VH7hr/zs6guP/lFYQOElg8qEsjYcsKKbxIEVP/YEUHR9AaAAKMWQIgcW71H5Sz+z+sL/jQco8v4g6aAA\r\n        KHaAwhKQbhIHUPzYE0DR9QWAAqDsfE7K8Idd/x3bp/L53/jdkB2U559/fnXjxg37Cs0ZDi1AV0U3sQMt\r\n        bewJoOjaHUABUNb548jD3MYgZd/yzx/8+v8LCyjXr18HHxpZAFjRTfLASj17Aii6tgZQAJRNBpkFKcMg\r\n        612Vxz4b87HP8uLAa9euNSrPnJYlIN0kD6DUsyeAomtrAAVA2dYkWQQpw4AvPP7c56O9b0IedS9LPACK\r\n        L1Ciq6Kb+IEWG3sCKLp2BVAAlF2rOIsh5fLly/8xGqDIfKWDcvXqVV8VmtmwX4W3K5s+Vl0D2gAUAKVk\r\n        WwTH6IDXIkh57bXX/l1EQJE7ed555x2QwLkFpKvy8N0Pui9aGoWPMXQLn5U9ARRdP9FB0SnkPQPRIkg5\r\n        6EZcjQYpAIpzMtkyPZaAdAuDVQHvfdxsgCJPzrX0KYACoJTA1SJIiQYo58+dX7361JfjVWlmfNMCwAqw\r\n        Ylk0940NoOhqD0ABUEoARY7JAykHgPJrP3r/zV8GUuz4F9MCLAHpFotWRT/SeQEUXc2dOX76RGmB4jhg\r\n        Jg2kfPYfP3CkdQmsxAQVuiq6RSMSMNSe68m77gv57Ke5XW7rJR4ABeiYCp5dQ4rsPzn3zLnVqX/yCzvX\r\n        VgGVuKACrAArltACoOjqC0ABUKYCSvfLPeeePrd66Cd+sWjzF7ASF1YunX2V/SrculwU56VQkw1QpPMi\r\n        11xqn6nHASgAyhxA6RpSzj31zOrXf/KXJgWdgIoUPP7FtAAba3V/+U4tRL0cD6Do6ghAAVDmAkq/kHKw\r\n        xPM//+knJwHKeoKlqxITUoZZAyu6RaYX+Ci5DgBFXztLChTfBXC62pMij7p/5qCD8hv/7FOzAQVYiQ0o\r\n        w+xZAtIvNiVFPvoxczecRv2e5RKPaOHGlWvHAA1AY4kGuoKUm4Dyz39ZBVCGZEtXJTa00FUBVkrBSe5s\r\n        iQobc+YNoAAPS+Ch1ne7gZRnnnxm9Zv/8tOqgEJXJTagrM8eWAFW9sFKNkB55N6HzHIlHRTgRxNguoCU\r\n        p88+vfrcv/qMadAND4FjY21ccGEJCFDZBioAiq4uWOIBUoCUg9vlhvbm0088tfpf//pXzAGFrkpcONmc\r\n        OV0V3aJUupzi8TgARVcLAAqAogko4e/uEUD53z/9q1UBBVgBVjwWW+Y0vdgCKNNttk9nvI8HQNEGlNCQ\r\n        8vQXnlo9/G9PNgMUNtYCK4CBbpGrac9s7+Ox3oMCoAAoFoASFlLkVuN3333370hg1Exs+87FXUCxoYUl\r\n        oLjAMTUHACi6vgZQABQrQAkLKbIfZd0oXmCFJ9bGBhWZPbCiW8CmAoT18QCKrn8BFADFElC6gRS5EC+g\r\n        MtwFFL9c574CYEW3mFnDR8n4AIquTwEUAMUaULqClMFYwEpuuNC8ekBFt6iVgITVMQCKri8BFAClBqB0\r\n        CSneYIW9KprY0GYsYEW3wFmByK5xswGK3LVkaWMABUCpBShdQwpLQG0Kes9nBVbiwQqAouszAAVAqQko\r\n        3UOKx64KT6yNjTGAim7Rs/zFD6Do+gpAAVBqA0oaSPEIK7FLNbMHVnQLoDasACi6/gFQAJQWgJIOUlgC\r\n        Ai60LQCs6BZDDVjJBijySAYNu+0aA0ABUFoBSkpIoauiXaYZD1DxAyoZAeXkXfeZQQqAAqC0BJTUkAKs\r\n        ABfaFgBW2sIKgKJr/zPHT59oXaA4P5B0xxIRDG8ibvHfJfPe/K6XZ6vwxFptbGgzHrCiWyxLljKkm9Ai\r\n        D7U8p2UHBUABDjRr7JKxgJSDp9XSVWlTzHs+q4DKw3c/aNaGLyncWY4BUHShEEABUJZAhfZ3gZQ1SAFW\r\n        esaGNtdGV0W3gG6CV0ZAsXyjMYACoGhDxtLxgJQtkCJGlSUgCdjWv0Z5Ym0buNA+K7CiDysAiq5NARQA\r\n        ZSlQWHwfSNkBKXRVtMs047EEpFdUARQ9W8oPMQAFQLEADI0xF0HKl7/85cfnbhw7+O4Tzz777OzNbhoX\r\n        P2UMD5tr2VjbB+jQVVlWYAGUZfbb1h2ekgs5FqCpqYFFkLJkoh988MGfPQCcD8+dOzcLVJace+53WQLq\r\n        AxK8XAWwMq/Yzv1hFPV7lntQBFhuXLl2bG5O5HsAi7UGmkGKXNj777//5w66KdfnJA9rw+wb30NXRZIL\r\n        +1W84Mb8eci7nICVcliRN/zOyRdRvwOgAAEta52HczeFFDHAe++9d+cLL7zwvalJxIPxPMAKoDIfEDx9\r\n        E1AZBxUAZdxGUzb600EBgDzU0bE5NIcUmeCNGzf+8oULF16fAipjF1br7xLowIqnch97LsDK9kIMoAAo\r\n        tXI65/EFby4gRURx/fr1v3bx4sWvl4KKNyF5ARVZPuBfbAuwBHR7QQZQABRv+Z751AMZN5AiTr969erf\r\n        ePHFF18pARWvIvECK7HLNLMXC9BVuXcFoOgCCi8MrFdcvdaoaPNyBSlivHffffeHX3rppQtjoOLZ0CwB\r\n        ARmaFsgKK9leGChANmVPydRjARQAxXPd3DU3d5AiE33nnXf+7ssvv3zAKed37uSPYGy6KpqlmrEywQqA\r\n        QgclQo5njvbg5xJSxPFXrlz5kS996UtP7AKVSOIAVgAMLQtkABUABUCJlN+Zqy2ouIUUcfzbb7/9Y6+8\r\n        8srntz3wLaIwWsMKT6zVQoX24/QKKwAKgBIxtzNnO1BxDSni+Lfeeusnt22mjSqK1qDCQ+DaA4bmDHqC\r\n        lWyAIl3iqftKphzPHhS7whm1/kSct3tIEaO++eab/+IAVF5aX/qJaOz1OQMrmqU691g9gEpGQJF3EE2B\r\n        jinHAigASvQaOcw/BKTIZN94442fXr/rpxcHtIYVnljbD+BEhRUAhSWeXvI516EPh2EgRZz/+uuv33Ow\r\n        mfY56aj0JIbWoMISUD+gIlcSCVYAFAClp1zOtSSHFBHA5cuXf643SBmE3RpW2FjbD6xEABUABUChqOsX\r\n        9d5sGqqTMhj/4O3Jf743R3jar8ISELAyZf/DnGMzAorlG43Zg0Kx77UmhoSUXp3hCVRYAuoHVLwtAQEo\r\n        dFAy5HCuUQccgZSDJSTPYvKwBNRXuc57NR6WgLK9i0eWpi07KGeOnz7hOX8xN9/1JYJ/XBfoCAasNUdg\r\n        JS9caF95C1iR223H3sfV498BFIp0rRrR63mAFOedFE9LQA/f/eDq0tlXtWsm4zWyQA1YETjJ2D2hgwKc\r\n        9AoNta8LSAkEKYM46Ko0quqdntYCVjLDCYACoNQu5D2fD0gJCCnASqe00PiyBFaWAMsAJlk7J8NyFUs8\r\n        QErP0FD72oCUwJAiYpGuimyem3MbqMZ3uF25MVkYnV6W9QZoOfWjD6wEQLZ95E6d7FCyvpfGElAkXmsX\r\n        CM4HcLXWAJASHFLoqhhVaYY9tMDBm8hTbnqdupHXGlBuXLl2rHXB4PxAS20NACmdQIoHWGFjbZ9kA6Sc\r\n        H4U0AIXiXbt4ZzkfkNIZpLAE1CcotLwqIGU/pMhyl8bS6a4x6KAAQFmAZNt1AikdQoqHrgpPrG2JFbrn\r\n        BlJ2QwqAAkBkBoga1w6kdAwpHmCFjbW6wNBiNCBlO6QAKABKjSKd/RxASgJIYQmoRWnv55xAylFIAVAA\r\n        lOzwUOv6gZQkkOKhq8LG2pjgAqQchRTLPSi80RgAqgUAEc4DpCSDFA+wwhJQLFgBUm6HFHlejBWkACgA\r\n        SgRwqDlHICUppIjI5K6Blo/YB1ZiwAqQ8jGkAChARM0CzblWdwApiSGFrkoMSGg9SyDlFqQAKAAK0FBf\r\n        A0AKkHKoAboqrXHA5/mBFACF4ly/OGPzWzYHUoCU2zTQcgmIjbVAytRH0dc43vJpsuxBofgDI/s1AKQA\r\n        KVs1QFfFJzC0mFXmTgqAAkQAEW01AKQAKXs1AKy0wAJf58wKKQBK2+IEHGB/lnsAlGJIbQUr3AHUHlgy\r\n        QgqAQoEEknxooLhI4TAfDmvph1agwnuA2oJKNkgBUMh1LfMs575df0AK3ZTJGmgFK2ysbQMrmSAFQAFQ\r\n        gARfGphcoHCgLwe29EcrWGEJqC6sZIEUAIXc1jKfcu7t+gNS6KQs0kArUGEJqB6oZIAUS0A5c/z0CQoQ\r\n        AIQG5mlgUYHC6POM3qPdWsEKXRV7WOkdUgAU8liPObmXawJS6KSoagBYsYeG2mfoGVIAFACll2Le63Wo\r\n        FqhejcR1TUtkrUCFjbU2+NIrpDx26lGztxmzxDMtZ5BjsdcuDQApdFLMNNAKVlgC0oWVHiEFQKEoAkYx\r\n        NGBWoBBADAHU8BOwogsNtUfrDVIsAUU2dNeIKc5Bfs2iASCFTkoVDQAqtdFC73w9QYo1oMgLOrMUD64T\r\n        UKqhgSoFqsaFcI4YAQOs6MFDrZF6gpSTd91ntg8FQImRg6gVsfwEpNBJaaKBFrDCxtp5WNMLpAAosYoT\r\n        MIG/RANNChTiQ3yiAQEVuQtC1vFrfthYOw1WeoAUAIWcQ92JqQEghU5Kcw206KrwxNpyUIkOKQBKzOIE\r\n        VOA3OikASnNAWU9ELWCFrso4rESGFEtAEb1SSCmkaMBWA66KFM62dXYE+7IENA4NtY+ICimWT5MFUMhV\r\n        EfJpD3MEUuimuNRAi64KG2u3409ESAFQgIgeCjTXwMZZlwUaYX6cYFvACktAt8NKNEgBUAAUcmg/GqBI\r\n        00lxrwF5/gSwUnuR5+PzRYIUAKWf4gRo4Es2zgIo7gGFjbXt4GQ4cxRIAVAoaoBNfxoIVaQQYH8CnONT\r\n        uip1wSUCpAAo5IY5uYTv+NcNkEI3JaQGWiwBZd1Y6x1SABT/hQYYwEdzNRCyQM29WL7XX6DQVbHvqniG\r\n        FAClv5gmT+PTdQ0AKXRSutAAsGIHK14hBUChmAE0/WugiwKFUPsXaqmPa8NKhtuVPULKY6ceNXvfEw9q\r\n        I5+U5huOs9cKkEInpTsN1AaV3t8D5A1SABT7wkDxxcZeNNBdgfJiWObRPshrw0qvG2s9QYoloMgbuYnb\r\n        9nGLD/ABe1LonqSC09qw0tsSkBdIAVAoXgBMPg2kKlYIPJ/AB5/XBpWeloA8QAqAkjd2ydu5fQ+k0FVJ\r\n        pYHasNJDV8UDpJy86z6TjbIs8eQugACQf/+nKlAI0r8ga/kIWCm/Zbk1pAAoxG2tvMB5/GkNSKGTklYD\r\n        tUEl6sbalpACoPgrGhRyfFJTA2kLVE0jcy7fQV0bVqItAbWCFCtAkf1C8loF4tJ3XOIf/CMaAFLopKCB\r\n        P9UAsLJ9CagFpFg+TRZAofgBQHE0QIECUtDAmgYAlaOgUhtSAJQ4BYRij6+sNUCBAlLQwBYNACsfw0pN\r\n        SAFQKHrWRY/xY2mMAgWkoIE9GqgJK1431taCFAAlVvGg2OOvGhqgQAEpaGBEAwIq8jwN2XBZ4+NtY20N\r\n        SAFQKHg1Ch7niKczChSQggYKNVCzq+LpibXWkGIJKLzROF5RAiTwGe/uKSxKBAvBsk0DNWHFQ1fFElIA\r\n        FGKMPIsG9mmAX9EACxqYoYFMS0BWkAKgUJwAFDQwpgEK1IwCNWZU/p4n8Gp2VWRjbYvOigWkACh5YoR8\r\n        iK+XaABIAVLQgIIGasJKbVDRhhQAhaK1pGjx3Vz6oUApFCiCJlfQ7PJ3r0tAmpDy2KlHze6QYpMscUgu\r\n        7k8DQAqQggaUNdBbV0ULUgCU/goIUIBPrTVAgVIuUNYOY/w4SaEXWNGAFAAljm7JMfjKkwaAFCAFDRhq\r\n        QF5mVwtWrDbWLoUUAIWi56noMZdYeqRAGRYogiFWMFj6qxaoWDwEbimkWD2llz0oxJdlzDK2D30BKUAK\r\n        GqiogYiwsgRSTt51n8lGWQDFRwGhkOMHaw1QoCoWKGtnMn6MhFFzCUjjduW5kAKgxNAjeQM/edYAkAKk\r\n        oIFGGojSVZkDKVaAIi969JxQmRsFHw3oaoAC1ahAIWRdIUe2Zy1YmbuxdiqkAChoO3I8Mndf+gVSgBQ0\r\n        4EQDtWBl6hLQFEixeposHRRfhYNCjj9qaYAC5aRA1XI45/GdXGqBypS7gEohBUDxrS1iH/9E1ACQAqSg\r\n        AYcaqAUrJV2VEkgBUCiAEQsgc/avWwqUwwJF4PgPnFo+8gArY5BiBSjS7allZ85DzKEBnxoAUoAUNOBc\r\n        A7VAZdfG2n2QYgkocqs2hcNn4cAv+KWWBihQzgtULSFwHv9JpxasbC4B7YIUAMW/ZohrfBRdA0AKkIIG\r\n        gmmgNqxsgxQAheIXvfgx/xgapkAFK1AEVozAsvZTTVC5fPny6vz584efpx953ORR97IHhSUe9G0dO4wf\r\n        S2NACpCCBgJroBasCJhcPPfCCkCJleApyPgrugYoUIELVHTxMX+9BFoLVnijsZ7P0D+2RAPjGgBSgBQ0\r\n        0IkGooIKbzQeT9QUM2yUVQMUqE4KVFYBc91Hk3ckWAFQKL7EMBrYpwEgBUhBA51qwDusACgUJwAFDYxp\r\n        gALVaYEaczx/z5EcBATk5XxWe0nmjgug5NAfeQY/L9UAkAKkoIEEGvDUVeE2YwrX0sLF9/NoiAKVoEAR\r\n        0HkCeszXLWFFOjoACloc0yh/RyPrGgBSgBQ0kEwDLZaAWN6h8AAfaGCOBihQyQrUHJHwnT6TS42uinRP\r\n        0E+f+sGv+LWGBoAUIAUNJNeAwIomsAiYyHgs7VDEahQxztG3zihQyQsUAd53gE/179ylIAET9pygpal6\r\n        43g0M6YBIAVIQQNoYKsGpBMin6HTsvnf4e9jSYa/U4jQABqYq4H/Dx9K5BQhRG+7AAAAAElFTkSuQmCC\r\n</value>\r\n  </data>\r\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n    <value>\r\n        AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AADt7e0m6+zrw+rq6vXq6ur86unp9+rp6e/q6Ojj6uDk/enX3/7p0tz/6cnY/em/1f/pss396KzK/ui3\r\n        zubowNKq6MXVVejI1hQAAAAAn4qSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl6+0B5OrtDeTr\r\n        7Szi6uxR4ertbuHq7ZDg6uyt3+rt197q7eze6ezs3ens993p7Pjd6ez73Ojr+d3o7Prd6Ov03ejr597o\r\n        69rf6eu53+nrneDp7Hji6es84+nrFOTn6gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOe2zSTnrcjt56HC/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3t7q7s7Oz/6+vr/+rq6v/q6en/6ejp/+no\r\n        6f/p6Oj/6ejo/+no6f/q4eX/6tDd/+m60v/oocX/55i+/+aVvf/mpMT/5a3I9Oe80JToydcYAAAAAAAA\r\n        AAAAAAAAAAAAAOTq7RTi6uw94ersiN/q7L7e6ezv3Ons/9vp7f/a6e3/2unt/9np7P/Y6ez/2Ons/9bp\r\n        7f/X6e3/1ejs/9bo7P/W6Oz/1ufr/9fo7P/X6Oz/1+js/9jo7P/Y6Oz/2Ojr/9ro7P/b6Ovz3ejrxt7n\r\n        6oHh5+k14+nqCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmVngDowtIR57DJyeem\r\n        xP/nnr//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAD38vAB7e3u5uzs7P/s6+v/6+nq/+ro6f/p5+j/6efo/+nn6P/p5ef/6OHl/+jf5P/o4OT/6LTO/+eT\r\n        vf/mgbH/5YGw/+SMtv/lk7r/5aHB/+awyOznwNJy5ObqI+Hq7Gff6ey73ens79vp7P/Y6e3/1ujt/9Tp\r\n        7f/U6e7/1ent/9Tp7f/U6O3/0uju/9Lo7f/R6O3/z+jt/8/o7v/P6O7/z+jt/9Lo7f/Q5+3/0Ojt/9Po\r\n        7f/T6O3/1Ojt/9Pp7f/S6O3/1unt/9bo7P/X5+v/1+fr/9nn6//b5+vj3ufqmeDo6jPr6ekBAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADRrr8A57rPEOe0y8Pno8L/55u9/+aWu/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu7u7L7Ozs/+zq6//r6uv/6ujp/+rn\r\n        6P/p5uj/6ebn/+nj5f/o2OD/6MjY/+jT3f/nosb/6IW0/+dxpv/lbqX/5XGm/+V+r//mlLr/5b7Q/+Le\r\n        5P/d6ez52Ons/9fp7P/V6O3/0enu/9Dp7v/O6O7/zOju/83o7v/L6O7/zeju/8/o7f/H5+7/yuft/8jn\r\n        7v/G6O//xefv/8Xo7//M6O7/zuft/8nn7v/K5+7/yefu/9Do7f/Q6O3/z+ju/83o7v/U6O3/0ejt/9Ho\r\n        7f/T6Oz/1efr/9bn6//Y5+v/2ufq+d3n6svf5+lh4+bqCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASj5EAOW+0Qnmtsy+5qTC/+Wa\r\n        vf/mkLj/5o23/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAO/v73bt7Oz/7Orr/+vp6v/r6On/6ujp/+rm5//p5ef/6eHl/+nZ4f/ovdT/57HN/+ma\r\n        v//qeab/5Wad/+N1qP/ldaT/5bXJ/+Di6P/c6u3/2Onu/9Tp7v/Q6O3/zejt/83o7v/N6O7/y+ju/8rn\r\n        7v/G5+7/x+fu/8zm7f/F5u7/yebt/8Lm7v/E5u3/v+bu/8Tn7//E5+7/wefu/8Hn7v/B5+//x+fv/8vo\r\n        7v/C5u7/xObu/8rn7f/N5+3/yOfu/8/o7f/M6O3/zujt/8zo7f/Q6O3/0Ofs/9Pn6//U5uv/1ubr/9nn\r\n        6v/c5urc3+fqW+Lo6gcAAAAAKy0tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAABMPEQDksc8B5q/ImeWfwP/lmbz/5Y21/+aFsf/lirT/AAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+/vEu7t7u3s6+v/7Orq/+vo\r\n        6f/r5+n/6ubo/+nk5//q4uX/6t7k/+vF2P/pk7//6m2i/+htof/jdKf/4ajB/9/h5v/Z6u3/1+ru/9Tp\r\n        7v/Q6O3/zOju/8bn7v/H5+7/xufu/8fn7v/F5+7/xebu/8jm7f/G5u3/w+bu/8Lm7v+/5u7/u+bu/8Ll\r\n        7f+55e7/uObv/73m7v/A5e3/uuXu/7/m7v+85+//w+fu/77m7v++5u7/w+bt/8Pm7f+55u//xefu/8Pn\r\n        7v/I5+7/xufu/8rn7f/N5+z/zufs/8/m7P/S5uv/0ubq/9Xm6v/Y5+r/3Obq19/m6Vfi6OsIAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa0ylHlosD+5ZW6/+ST\r\n        uv/ljLb/5oWw/+WBrv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA7+ztlu3r7P/s6er/6+jp/+vo6f/r5Of/6uXn/+rg5f/r2eH/7sbW/+uE\r\n        sv/paJz/53ml/+HO2f/b6e3/1unu/9Hp7v/Q6O7/yufu/8jn7v/F5+7/x+fu/8Xn7v/E5u7/x+bu/8Hm\r\n        7//D5+//zObt/8bm7v/G5u7/xOXt/7zk7f+55O7/vOPt/7fk7v+65O7/tuTu/73k7f+65O3/uuXu/7nm\r\n        7/+45e//vOXt/7rl7v+05O7/vuXu/7bl7//C5u7/webu/7zm7v/B5u7/x+bt/8bm7f/M5+3/xebt/83n\r\n        7P/O5+z/zufs/9Hm6//V5uv/2ebq/tzm6szf5+lZ4uXrApmdnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADnus1A5qjD8+WNtf/kibP/5JC3/+V2qP/mfav/5Yey/wAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAuLwDu3+Yh7uXp+O3o\r\n        6v/s5un/7Obp/+zk5//s4eb/7c7b/+2tyf/tiq//6n2r/+aeuv/f4OX/2ent/9Tp7v/Q6O7/0ejt/8rn\r\n        7v/C5+//vOfw/8Hm7v+/5u//v+bu/8Dl7v/B5e7/vOXu/7fk7v+x4u3/rOHt/63h7f+s4O3/r+Ht/7Dh\r\n        7v+w4u7/sePu/7Lj7f+y4u3/seLt/6/i7v+24u3/suPt/7bk7f+w4+7/tOTu/7Xj7v+34+7/s+Tu/7vl\r\n        7v+85e3/veXt/7bl7v+95u7/wubu/8fm7P/G5u3/yebt/83n7P/N5+z/zufs/9Hm6//T5ur/1ubq/9jm\r\n        6v7c5um43+XpHgAAAAAqKioAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5a3GQeajwfXkl7v/44mz/+WE\r\n        sf/liLP/5nqp/+eCrv/lbaH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3D1APtwtXV7dfh/+7g5v/u2OL/7svb/++zzP/ujrj/6nWn/+ho\r\n        m//norr/3ujr/9bp7v/R6e7/z+ju/83o7v/J5+7/yObu/77m7v/A5u7/wOTt/7Tk7/+34+3/suHt/6Le\r\n        6/+c3Ov/jNjp/4DT5v+B0uf/idbp/4HT5/+O2On/rt7s/6bd7f+j3ez/ptzt/6Td7f+k3u3/qd7t/6Pe\r\n        7v+o3+7/q+Dt/6ng7f+s4e3/sOLt/7bh7P+14+3/t+Pt/7Xk7v+85e3/v+Tt/73k7f/B5e3/wObt/73m\r\n        7v/J5u3/y+bs/8fm7f/J5u3/z+fs/9Hm6//R5uv/0+br/9bl6v/a5unw3eXpgeDl5wkAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAOawyCvloL/t5JK4/+OPtv/kgK//5Xur/+WDsP/mfq3/5Yez/+Znmf8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOmr\r\n        xqzqmr3/6pq//+yQuP/shbL/6n2r/+pyo//pap3/5qW9/9/n6//V6e7/zuju/8zn7v/K5+7/yefu/8Lm\r\n        7//B5e7/uOXv/7fj7f+14u3/suHt/7Pi7v+u4O3/g9Po/3HB4f9eo9b/QHrL/zJfx/82Ycj/NmDH/zBc\r\n        yv9CYsr/P2HK/z5fyf8/ZMn/Q2vK/0x4zf9dkNL/cqTZ/4K94v+Tzun/oNns/6He7f+l3u3/pt/t/6rg\r\n        7f+t4u7/tePt/7Xj7f++5Oz/seTu/8Ll7f++5e3/t+Xu/7/l7f/E5u3/wubu/8Tm7v/F5u3/zefs/8vn\r\n        7P/R5uv/0ebr/9Tl6v/W5er/2uTo0d3j5zkAAAAArK6xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZ0iADlrsYO5aLB1OSUuf/kj7b/5Iay/+V8\r\n        q//meKj/5oSx/+dclP/lga//5XGi/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA56vDf+acvf/mh7H/6YCu/+hvof/nb6L/6Xan/+mM\r\n        rf/f5+v/1urv/8/o7v/K5+7/xufu/8Lm7v+/5u7/t+Xv/7Pj7v+y4u7/rODt/6Te7f+Tzuj/eq/c/2KJ\r\n        0P8rSsT/CwC//wwAv/8IBL7/BAG4/wIBrP8BAa//AAC3/wYEwP8MBsT/EgfF/xMIxf8SBsb/DwTG/w8F\r\n        x/8NAcX/BADE/w0axf8yUsr/UobT/3Kl2/+Jx+b/ndnr/6Xc7P+k3u3/p9/t/7Dh7f+04u3/vOPt/7nk\r\n        7P+25O3/u+Tt/7nk7v++5e3/wuXt/8Xm7v/E5u3/x+bt/8/m7P/P5uz/0ebs/9Hm6v/U5er/2OTp+Nzj\r\n        54/f4uQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AABmVVwA477NBeWiwKnjlLn/44iy/+OLtP/kirT/5H+t/+V7qv/kg7D/5mSZ/+SArf/kdqf/AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AADoqcNk557A/+WFr//ngq7/54q1/+d3p//peKT/4dzi/9Xp7v/K6O//yOfv/8Xm7v+75e//tuTv/7bk\r\n        7v+t4e7/rODt/5jV6v9up9j/PWbH/xMev/8HAL//BAG9/wEAtv8AAKX/AACg/wwEsf8zIcb/UDvb/2NN\r\n        5P9yW+f/fGPo/4Fo6f+Daun/hWno/4Bk5/94XOf/cVTn/2VL5v9cQuX/Ujvj/0Uw4f82It7/IxDZ/xYY\r\n        0/86Ydf/aZ3d/5DO6P+g3Oz/p97t/6vg7f+w4e3/suPt/7Tj7f+54+z/u+Ps/7rl7f+95e3/wOXt/77m\r\n        7v/A5u7/yObt/83m7P/O5uz/zebs/9Dm6//T5er/1+To/9vj59Dd4+Y3AAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFBUAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOS0yRLkqcSw45e6/+OKs//khrD/4oey/+KF\r\n        sf/jeKn/43+t/+OCsP/lYpn/5Hmo/+Vwo/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOipxE3ooMD/55K3/+Z8qv/mibL/6IWy/+XF\r\n        0f/W6e7/0eju/8Ln7/+75u//uePu/7bi7f+v4u7/rN/t/5jU6v9mnNT/GzW8/woEvf8DAb3/AQC2/wAA\r\n        p/8DAZj/Ixaz/0851P92XOb/kXfp/6GJ6/+okuz/rpnr/7Kd6/+0n+v/tJ/r/7Oe6/+znev/sp3s/7Ca\r\n        6/+sluv/po/r/56G6v+Xfen/knbo/4tw5/9+Y+b/Zkzk/0sz4f81IN7/Kifa/1uK3/+Nyej/oNzs/6be\r\n        7P+p3+3/rOHt/7ri6/+34+z/t+Tt/7Xk7v+55e3/vuXt/7fl7v/B5u3/x+bs/8vm7P/H5uz/zebs/8/m\r\n        6//Q5er/1OXp/9jj6PTg2+G75sbUvebD0sHmxdTE58XTxObE08PmxNO+5sXTuebG1LLmxdOu5sbUrObG\r\n        1Kvmx9Wp5sfVp+bH1J/mx9SW5snVjObI1YDmyNV05snVZ+bK1lbmy9ZH58vXNebN2CPmzdgU583YCubN\r\n        2AXjsMdE46PA3uSZu//ij7b/44aw/+KCrv/hhLD/4oCu/+KDr//jcaT/5Hen/+Vyof/keKf/42ab/wAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAwKCoA6KnEQ+mdv//ojLX/5oi0/+d8qv/mo7//3Ont/87p7//J5+7/t+Xu/63j7/+t4e7/p97t/5zZ\r\n        7P9wqtn/IEC+/wgBu/8DAbz/AACz/wAAn/8MBJr/RjPE/3Vd5P+UfOr/qZLr/7Oe7P+5pez/vqzs/8Gw\r\n        7P/Dsu3/xLTt/8W17f/Gt+3/x7ju/8i47v/Iue3/x7ft/8W17f/Csuz/v67s/7uo6/+0oOv/r5nq/6uU\r\n        6f+ljuj/ln7n/4Np5f9oTeX/UDbi/zss3v9ah+D/jMnp/6Lc7P+n3+z/seDr/6zi7f+y5O7/tuTt/7bk\r\n        7f+95O3/tuTt/73l7f/A5e3/x+bt/8nm7P/M5uz/yObs/87l6//R5er/0+Xq/9fk6P/e2OD/5L7P/+S4\r\n        zP/ktsv/5bbL/+W1y//lt8z/5bbL/+S1yv/ltsv/5LfM/+S3zP/kuMz/5LrN/+W6zf/lu83/5bvN/+W9\r\n        z//lvs//5b/P/+XA0P/lwtH/5cPR/+XF0vzlwtHw5LLI3+Ogv/3jlbn/4ouz/+GIsv/if6z/4X+s/+F9\r\n        q//ifaz/4n2r/+N+rP/lZ5r/5WOY/+Rzo//jdaT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoqMI1556+/+eOtv/mfq3/5Yax/+HY\r\n        4P/V6e7/yOjv/73m7/+t4+//o9/t/57d7f+Iy+j/QHHG/wUAuP8DAbr/AAC1/wAApv8DAJb/Uj7C/4lw\r\n        5f+pkuv/uabs/8Gw7f/Gtu3/yLnu/8m77v/LvO7/zL3u/82+7v/OwO7/zsHu/8/C7v/Pwu7/zsHu/83A\r\n        7v/Mvu7/y73u/8q77f/Iue3/x7ft/8S07P/BsOz/vavr/7uo6v+2oun/rJfp/6CI5/+Ocub/eVzl/2NH\r\n        4v9EOd//YI/h/5PQ6v+k3Oz/pt/t/67i7f+x4+3/tOPt/7nj7P+25O3/uuTt/7Pk7v/D5e3/xeXs/8vl\r\n        6//K5uz/yebs/8nl6//R5er/0uXr/9bk6f/b3eP/48TS/+W7zf/luc3/5LbL/+Syyf/ksMj/5LDI/+Sv\r\n        x//krMb/5KzG/+Sux//kq8X/5KnE/+Ssxv/krcb/463H/+Stxv/jrcb/5K7H/+Oqxf/kq8X/5KfE/+Oi\r\n        wP/jmLv/45G3/+KLs//hhrD/4YKu/+F3p//hfqz/4Xin/+Jzpf/icqP/43mq/+Ztn//mZZf/5HWl/+N5\r\n        qP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAOmrxSvnocD/5pK4/+aRuP/kuMz/2Ont/87o7v/D5u//s+Lu/6Pf7v+b2+z/esLj/yA+\r\n        u/8GAbj/AgC2/wAAr/8AAJv/PCyt/4hx4f+slev/vavs/8W17f/KvO7/zb/u/87B7v/Qw+//0cXv/9HG\r\n        7//Sxu//0sfv/9PI7//TyO//08jv/9LH7//QxO//z8Lu/83A7v/Mvu7/y73u/8q87f/Ju+3/ybrt/8e4\r\n        7f/Ftez/w7Ps/8Cv6/+9q+v/uabq/7Gd6P+ji+j/lHnn/4Fm5f9gRuL/QEff/32s5P+a2ev/o93s/6jg\r\n        7P+s4e3/tOLs/7Pj7P+34+z/tuTt/7rk7f/D5e3/xeXt/8bm7P/F5ez/yubs/87l6//O5ev/0eXr/9Xk\r\n        6f/Z3+X/4cHS/+SxyP/ktMr/5LbL/+S3y//ktcr/5LDI/+Stxv/kq8X/5KjE/+Omw//jpsP/46PB/+Sg\r\n        wP/kocD/45y+/+Ofv//jnb7/45m9/+OXu//jlLn/45O5/+KOtv/iibL/4YSu/+GFsP/hgKz/4Xqo/+B6\r\n        qP/hd6f/4m+h/+N2pv/jc6P/5WCT/+Rmmv/kaJz/5Gmd/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6KrGH+egwPvokbj/55W6/93j\r\n        6P/R6O7/xOfv/7vk7v+o4O7/oN3t/4XF5f8bO7f/BgK0/wEAtf8AAKv/BgOZ/2dUyf+nkOr/uqbs/8S0\r\n        7f/Juu7/zL7u/87A7v/Pwu//0sXv/9PJ7//Vyu//1czv/9bM7//Wze//1s3v/9bM7//Vy+//08fv/9HE\r\n        7//Pwu7/zsDu/82/7v/Mvu3/y73t/8q87f/Ju+3/ybrt/8e47P/Gt+z/xbbs/8Oz7P/Bsev/vq3q/7im\r\n        6v+vm+n/ppDn/5mA5f98YeT/UDfh/1yF4f+S0ur/n9zs/6He7P+s4Ov/s+Hr/7Ti7P+v4+3/t+Pt/7nk\r\n        7f+85e3/weXt/8Hl7f/H5ez/yubs/83l6//O5ev/0OXr/9Pk6v/X4eb/38nW/+Slwv/kp8P/5KrE/+St\r\n        xv/kr8f/5K3G/+Sux//krcb/46rF/+Skwv/koMD/5Jy+/+Sdvv/knL7/5Ja7/+SXvP/jlbv/45G4/+OP\r\n        t//ijLX/4ou0/+GGsP/ghbD/4H2s/+CCrv/gfav/33im/+Brnv/ib5//4myd/+Nvov/kZJf/42+e/+Vn\r\n        mv/lZ5n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADpqsMV6aHA9emSuf/lxNT/1unt/8vm7f+95e7/tuLt/6nf7f+O0On/KFC7/wUC\r\n        tf8BALX/AACq/w4Hmf98Z9j/tJ7r/7+u7P/Ht+3/yrzu/8y+7v/NwO7/z8Hu/9HD7//Tx+//1cvv/9fN\r\n        7//Yz+//2M/v/9jQ7//Yz+//187v/9XL7//Tx+//0cTu/8/B7v/Nv+7/zL7t/8u97f/LvO3/yrzt/8q7\r\n        7f/Ju+3/ybrs/8i57P/HuOz/xrfs/8W17P/Ds+v/wLDr/72s6v+3pen/sJzo/6SN5/+MceX/ZUnj/1Ri\r\n        3/+Kx+j/mtrs/6Hc6/+s3uv/r+Hs/7Ti7P+54uz/tOPt/7vk7f+85e3/veXt/7/l7f/G5ez/xuXs/8vm\r\n        7P/M5ez/0OXr/9Hk6f/V4uf/3srX/+Oiwf/jnL//45+//+Ojwf/jn7//46bD/+Olwv/jp8P/46TB/+Oi\r\n        wf/jnr//45i7/+SUuv/jlLr/45C4/+OTuf/jj7f/44y2/+KHs//ijLX/4YSw/+B9q//gean/4H6s/998\r\n        q//fd6b/4Gqb/+BnmP/gcaD/4GaY/+Fyov/ic6L/42KW/+Rjl/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOiuxhHppMPy6Jq8/97l\r\n        6v/Q5+3/w+Ts/7rj7v+r4O3/mtns/0R4xf8EALP/AQC0/wAAqv8MBZv/g23a/7ei6//Csez/yLnt/8u8\r\n        7v/Mvu7/zb/u/87A7v/Pwe7/0cTv/9PH7//Vy+//187v/9nQ7//Y0O//2NDv/9jQ7//Xzu//1cvv/9PG\r\n        7//Qwu7/zcDu/8u97f/LvO3/yrzt/8q77f/Ku+z/yrvs/8m67P/Juuz/yLns/8i57P/HuOz/xrfs/8W1\r\n        7P/Ds+v/wrLr/7+v6/+8qur/taPp/6uV6P+VfOb/b1Tk/1JT4f9/uOb/mtnr/57b6/+k3uz/quHs/7Hi\r\n        7P+14+z/uePs/7rk7f+15O3/v+Xt/8bl7P/H5uz/yuXs/8nl7P/L5ez/0OXr/9Lk6f/V4uj/3NDb/+Kc\r\n        vv/jmLv/4pW7/+Obvf/jm73/45y+/+Ocvv/jmrz/45+//+Obvf/jmr3/45e7/+OSuf/jjrf/45C4/+KM\r\n        tv/ijrf/4omz/+KEsf/hfqz/4Xuq/+Bil//feaj/3nGh/99voP/geKb/33Kh/99mmP/fdKP/33in/+Fh\r\n        lf/jYpT/422d/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA6K3FDemjwu3lwNH/1+nt/8vn7v++5O3/r+Ht/6Dc7f9pqNj/AQCw/wEA\r\n        s/8AAKv/AACc/3xm0/+4pOv/w7Ps/8e47f/LvO7/zL7u/8y+7v/Mvu7/zb/u/87A7v/Pwu7/0sbv/9XL\r\n        7//Xzu//2M/v/9jP7//Xzu//187v/9bM7//UyO//0cTu/83A7f/Lve3/yrvt/8m77P/Juuz/ybvs/8q7\r\n        7P/Ku+z/ybrs/8m67P/Iuez/yLjs/8e37P/Gt+z/xrbs/8W17P/EtOv/wrPr/8Cw6/++rer/uKfq/6+b\r\n        6P+Zgef/e2Lk/1pI4f9tquP/kNXq/53b6v+h3uz/qeHt/7Hi7f+24+z/tuPt/7Xk7v+/5Oz/veTt/8Pl\r\n        7P/H5ez/x+Xs/8jl7P/L5ev/0eTq/9Lk6f/V4uj/3NLc/+KZvP/ilLr/4pS6/+KVu//jl7v/45W6/+OV\r\n        uv/jmbz/45a7/+OTuf/jlrv/45O5/+OPt//jibT/4oq0/+KGsv/ifq3/4n+u/+KBr//hean/4GaX/99w\r\n        oP/fbJz/3VWH/952pP/eapr/3mqa/952pf/eaJr/4GaY/+Jkl//iZ5r/AAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjucoF6aHA4+Hd\r\n        5P/Q6O3/w+bu/7jj7v+q3uz/iM/o/xo9tP8CALL/AACu/wAAof9iUcH/taHq/8Sz7P/Juu3/yrzt/8y9\r\n        7f/Mvu3/zL7t/8y97f/Mve3/zL7t/87A7v/Qw+7/08fv/9TJ7//Vyu//1Mrv/9TJ7//TyO//0sbu/9DE\r\n        7v/OwO3/y73t/8q77P/Juuz/yLns/8i57P/Juuz/ybrs/8m67P/Iuez/yLjs/8e37P/Gt+z/xrfs/8a3\r\n        7P/Gt+z/xbbs/8W16//Etev/w7Pr/8Gx6/+/r+r/u6rq/7Gf6P+Yg+X/e2Hg/0w42v9knN7/kdTp/5na\r\n        6/+l3uv/reDs/7Di7P+y4+3/tuPt/7nk7f/A5e3/veXt/8Tl7P/F5ez/yOXs/8rl7P/M5ev/0OTr/9Hk\r\n        6f/U4uf/29Db/+Gbvf/ikbj/4pC4/+OUuv/ikrn/4pS5/+OTuf/jlLn/45O5/+OTuf/jjrb/44+3/+OH\r\n        s//jiLP/44Cv/+OCsP/jgrD/4nmr/+J9rP/gaZz/33Cg/99unf/ebZv/3WOV/95ik//ea5r/3m2e/95u\r\n        nf/gZ5j/4GmY/99Qhf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADotszE2ujs/87n7f++5O7/seHt/6Db7P9bmdH/AgCv/wAA\r\n        sf8AAKj/LySn/6qW6P/Csez/x7nt/8q87f/LvO3/y73t/8u97f/LvO3/yrzt/8q87f/LvO3/zL7t/87A\r\n        7v/Pwu7/0MPu/9DD7v/Pwu7/z8Hu/87A7v/NwO3/zL7t/8q77P/Juuz/yLns/8e47P/HuOz/x7js/8i5\r\n        7P/Iuev/yLnr/8e47P/Gt+z/xrfs/8a37P/Gt+z/xrfs/8a36//Gt+v/xbbr/8S16//DtOv/w7Pr/8Ky\r\n        6/+/sOr/uKjo/6iU5f+LdN//bFPZ/0Mx0/9cmNz/ktXp/5ra6v+j3er/reDr/7Th6/+64uz/tePt/7rk\r\n        7f+55O3/vOTt/8Pl7P/A5ez/x+Xs/8jl7P/K5ez/zeXr/8/k6//V4ej/2tHc/+GXu//ijLb/4om0/+KQ\r\n        uP/ikrn/45C4/+ONtv/jj7f/4462/+OMtf/jjLX/44m0/+OHs//jgq//4nys/+OBr//hX5P/4n2r/+Bz\r\n        pf/fbaD/3mWY/95sm//dRnn/3VmM/91dkP/dW47/3miX/99De//gapv/31iK/wAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTY\r\n        4KLU6O7/x+bt/7fj7v+o3u3/kdXr/x5Etf8BALH/AACt/wAAnP+GdNT/vqzs/8a37f/Ju+3/yrzt/8u9\r\n        7f/Lve3/y73t/8q87f/Ku+3/ybvt/8q77P/Ku+z/yrzs/8u97f/Lve3/y7zt/8q87f/Ku+z/ybvs/8m6\r\n        7P/Iuez/xrjs/8a36//Ftev/xbXr/8W26//Gt+v/xrfr/8a26//Gtuv/xbXr/8W16//Ftev/xbbr/8W2\r\n        6//Ftuv/xrbr/8a26//Ftuv/xLXr/8S06//Ds+v/wLDq/7ur6f+zoef/qZTk/5mD4P+EbNz/aU/Y/0Is\r\n        0v9hnN3/jtTp/5ja6v+l3Or/rN/r/7Th6/+t4u3/tePt/7Xk7f+65O3/weXs/8Hl7P/C5Oz/yeXs/8fl\r\n        7P/M5ev/zOXr/9Dk6v/U4uj/2tPd/+CXu//ijLb/4ou1/+KGsv/ijrf/4oez/+OIs//jirT/44q0/+OF\r\n        sv/jibP/4oey/+KFsf/ifqz/4n2s/+Jxo//icKP/4nin/+BtoP/gcqP/3muc/95Pgv/dUYL/3F2O/95w\r\n        oP/cWYv/3WOS/95nmP/eXY//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3urtp83n7f/A5O3/reDt/6Ld7P9zt9//AACp/wAA\r\n        rv8AAKf/Niqn/7Wi6v/Etez/ybrt/8q87f/KvO3/yrzt/8u87f/KvOz/yrvs/8m67P/Iuez/yLns/8i5\r\n        7P/Iuev/x7ns/8e47P/Ht+z/xrfs/8a36//Gtuv/xbXr/8S16//Ds+r/w7Pq/8Oz6v/Ds+r/w7Pq/8S0\r\n        6v/EtOr/w7Pr/8Oy6//Csuv/wrLr/8Oz6//DtOv/xLXr/8S16//Etev/xLXr/8W16//Ftev/xLXr/8Gy\r\n        6v+7q+n/s6Hm/6yX5P+mkeL/oYzh/5eC3/+Gbt3/Z07Y/0Au0f9qpN3/lNbo/5vY6P+g3Or/pd/s/6zi\r\n        7P+v4u3/rePt/7Xj7f+55O3/vuTs/7/l7f++5Oz/vuTs/8vl7P/N5ev/zOTr/9Dj6v/U4ej/2tPe/+CP\r\n        t//hhrP/4oez/+KMtv/ih7P/44Wy/+ONtv/ji7X/44Wx/+OKtP/ih7L/4oGv/+F/rf/hfKv/4Xmp/+F8\r\n        q//gcKL/4W2g/+Btof/fZpr/3maW/9xcj//ccqH/3Guc/9tglP/ecKH/3WaX/95jlP8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx4eAODq\r\n        7g7Y6e7pyebt/7jj7f+s3+3/l9ns/1CNyv8AAKb/AACo/wAAmP+BcMv/wbDs/8e57f/KvO3/yr3t/8q8\r\n        7f/KvOz/yrvs/8m67P/Iuez/yLns/8e47P/Gtuv/xbXr/8W16//EtOv/xLTr/8S06//Ds+v/w7Pq/8Oy\r\n        6v/Csur/wbHq/8Cw6v/AsOr/wbDq/8Gx6v/Bser/wbHq/8Gx6v/AsOr/wK/q/7+v6v/AsOr/wbHq/8Gx\r\n        6v/Bsur/wbLq/8Gx6v/Bser/wLDq/7+v6f+9rOn/uafo/7Sh5v+tmeT/qZTj/6eS4v+lkOL/oYzg/5iD\r\n        3/+FbNv/ZErX/z8z0f9wseD/j9bp/5nZ6f+e3On/pt/s/6rh7P+t4uz/tOLr/7rj7P+55O3/uuTt/7vk\r\n        7f+/5ez/yeXs/8nl7P/E5ez/zuTr/9Hj6v/U4ej/2dDc/+B/sv/hdKz/4oi0/+KGs//ihLD/44m0/+OJ\r\n        s//ihLD/4oiy/+KJs//ihrH/4Xur/+F/rf/hdaf/4Xao/+Fvov/hc6X/4Gug/+Bmm//dU4n/3mud/9tt\r\n        nf/aXZD/3FyN/9xunv/bVob/3FKF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ursQ9Lo7v/D5u7/tOLt/6Ld7P+P0+r/Klu0/wAA\r\n        n/8AAJn/AACN/66c5f/Ftu3/ybvt/8q87P/KvOz/yrvs/8m67P/Iuez/x7js/8a37P/Gtuv/xbXr/8S0\r\n        6//Ds+r/wrLq/8Gx6v/BsOr/wbDq/8Cw6v/AsOr/wK/p/7+u6f++ren/va3p/72t6f++ren/v67p/76u\r\n        6f++run/vq7p/72s6f+9rOn/vKzp/76t6f++run/vq7q/76u6v+/r+r/va3p/7uq6P+5puf/taPm/7Gd\r\n        5f+smOT/qpbj/6mV4/+plOP/p5Pj/6aS4v+jj+H/n4vg/5eB3v+Badr/XkbV/0JC0f94uuH/jdTo/5TZ\r\n        6f+e3er/ouDs/6nh7P+s4ez/t+Lr/7bi7P+65Oz/ueTt/77k7P/H5ev/xeXs/8Tl7P/N5ev/zuTr/9Lj\r\n        6f/V4uf/2s3a/+CGs//hgLH/4oi0/+KIs//ji7X/43+u/+KEsP/ihrL/4oWx/+GCr//hdKX/4Xmq/+Fw\r\n        pP/hdaf/4XKl/+Fwpf/gX5j/4Wee/95Xjf/eZZn/21+T/9xpmf/dYpT/20l8/9xgjf/cXYz/AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AADc6e2byuft/7zk7f+p4O3/ltnr/3rK6P8SK6H/AACb/wAAj/9SRKj/va3r/8e57P/Ju+3/yrzs/8m7\r\n        7P/Iuuz/x7js/8a36//Ftuv/xLTr/8Oz6//Csuv/wrHq/8Gx6v+/r+r/vq3p/76t6f++ren/va3p/72t\r\n        6f+9rOj/vKzo/7uq6f+7qen/u6rp/7yr6P+8q+j/u6vo/7ur6P+6quj/uajo/7qp6P+7quj/vKvo/7ur\r\n        6P+6quj/uqno/7in5/+0o+b/sZ7l/62Z5P+qlOP/ppDi/6WP4f+lkOH/ppHi/6aR4v+lkOL/pJDi/6OP\r\n        4f+ijuH/n4rg/5V/3f96Ytr/XETU/0NO0P97xOT/i9bp/5XZ6f+e3uz/pODs/7Hg6v+t4ez/seLs/7Pj\r\n        7P+24+z/u+Ts/73k7P/A5ez/xuXs/8jl6//K5ev/zuTq/87j6v/T4ef/28jX/+CDs//hh7P/4Xet/+KH\r\n        s//jhrL/44ey/+N/rf/if67/4oiz/+J7qv/hf63/4Xeo/+F2qP/hc6b/4Wqg/+Flnf/gZJr/4Gmf/99k\r\n        mv/eZ5z/3V2T/9xTh//eZZb/21WG/91tnP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4OnrCdno7OjC5e3/sOLt/6He7P+K1ur/bb3j/wIW\r\n        m/8AAJj/AACI/3Zkxf+6qur/xrns/8m87f/Ju+z/yLrs/8e46//Ftuv/xLXq/8Kz6v/Bser/wLDq/7+v\r\n        6v+/r+n/v67p/76u6f+8rOn/u6ro/7uq6P+7quj/uqro/7qp6P+5qOf/uKfo/7im6P+5p+j/uajo/7mo\r\n        6P+5p+j/uKfn/7al5/+1o+f/taPo/7Wj5/+0ouf/sqDm/7Cd5f+tmeP/qJTj/6SP4v+hjOH/oYvg/6GL\r\n        4P+hi+D/oYvg/6KM4P+ijOD/oY3g/6GN4P+ijuH/oY7h/6GN4P+gjOD/nIjf/4553f91Xdn/W0TV/0Je\r\n        0v9/y+X/i9bp/5fZ6f+e3ev/o+Ds/6fg7P+z4ev/ruLt/6ri7f+34+z/uuPs/7vk7f/B5ez/xeXs/8fk\r\n        6//K5Ov/zeTr/9Lj6f/V4Of/3MHT/+B6rv/hg7L/4Xqt/+KIs//jirT/436t/+N/rv/jhLD/4n6t/+J/\r\n        rf/hbKH/4Xip/+Fypv/haJ//4XCj/+Fnn//gXZX/4Guf/+Bck//gYJT/3UV5/91hk//cVIX/3F+R/wAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AADg6ewx1unt/8Dk7f+p4Oz/ndzr/4XT6v9UodD/AACX/wAAk/8AAIj/j3nY/7Oi5//Bs+r/xbjr/8W3\r\n        6//Ftuv/xLXr/8O06v/Csur/wLHq/76u6f+9rOn/vKvp/7yr6f+8q+n/u6vo/7qq6P+5qOj/uKfo/7im\r\n        5/+4puf/t6bn/7el5/+2pOf/tqTn/7el5/+4puf/t6bn/7al5/+1o+b/tKHn/7Gf5v+wneb/rprl/6qW\r\n        4/+mkuH/oovh/52F4P+YgN7/lX7d/5Z+3v+Ygd7/mYLe/5qE3/+bhd//nIXf/52G3/+dh9//nojg/56K\r\n        4P+eiuD/n4vf/5+L4P+eit//mITe/4p12/92X9n/VD7S/0Vz0/+Azeb/jNbp/5ba6v+e3+z/pt7r/6zg\r\n        6v+v4ev/rOLs/7Hj7P+44+z/uuTt/7zl7f/E5ez/weTs/8Pl7P/J5Ov/zuTq/9Hj6f/W3+b/3rPM/+F6\r\n        r//hWqP/4Xuv/+KBr//jhrL/44Sx/+OCsP/jf67/43Wo/+Bhlv/heKj/4Xeo/+Fuov/ha6H/4F6X/+Bi\r\n        mP/gcaT/4WGX/948c//eUof/3nCg/95pmv/eMGb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEpLAN3p7GvQ5+3/vuPs/6ff6/+Z2+v/hNLp/zt7\r\n        vP8AAJf/AACP/ycdkf+eiOL/sJ/m/7en5/+7quj/va3p/7+w6f/Asen/v7Dp/72u6f+8rej/u6vo/7mp\r\n        6P+4p+j/uKfo/7mo6P+5qOf/uajn/7mo5/+4p+f/t6Xn/7al5v+2peb/taTm/7Wj5v+1o+b/taPm/7Si\r\n        5v+yoOb/sJ3l/66Z5P+qleP/ppLi/6SP4f+hi+D/nYfe/5mC3v+Wft3/lHvd/5N52/+Tetz/lHzd/5V9\r\n        3f+Vfd3/lX3d/5R93v+Vfd3/ln/d/5iB3v+Zg97/mYTf/5qF3/+aht7/m4bf/5uH3/+bh9//lIDd/4Rw\r\n        2f9rVNP/OibG/1SP0P+H0+f/j9jo/5Xb6v+c3Or/pd7r/6zh6/+o4uz/r+Ls/7Di7P+25O3/t+Xt/77l\r\n        7P/A5ez/vuTt/8fk6//M5Ov/zuTq/9Ph6P/W3eT/3qfG/+Juq//hdq3/4YKx/+KFsv/jfq7/5ISy/+SF\r\n        sf/jZ57/4nKj/+J+rP/geKj/4Han/+Fypv/hcqX/4Xao/99soP/gY5r/30J4/+Bqnf/dW5H/3m6f/940\r\n        Z/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA3Ortpcvn7f+64+z/o97r/5na6v96zef/HUqm/wAAlv8AAI3/STqm/6aS5P+wnuX/sJ7k/7Cd\r\n        5P+yoOX/s6Ll/7Oi5f+zoeb/s6Lm/7Sj5v+0o+b/taPm/7Wj5v+1o+X/taPm/7Wj5/+1pOb/taTl/7Oh\r\n        5f+xnuX/rpvl/6yZ5P+qluP/qZbj/6iU4/+nk+L/ppHh/6KM4f+eh+D/moLf/5iA3v+Xf93/ln3c/5N6\r\n        2/+Qdtz/jnTb/4102/+OdNr/kHba/5B32/+QeNv/kHfb/5B32/+Pdtz/jnbc/4933P+ReNz/knvc/5R9\r\n        3f+Uft3/lH/d/5WA3f+Xgt7/l4Tf/5eF3/+Ugd3/iXXY/3Zi0f9OOcj/Ixy5/2Wv2P+F0+b/ktjo/5Pb\r\n        6v+d3er/oOHs/6bi7f+n4ez/ruLs/7Hj7f+x5O7/vOXt/7/k7P/B5Oz/w+Ts/8nl6//L5ev/0OPp/9Li\r\n        6P/X2uL/3qHD/+B5r//ghrP/4YSy/+N6r//khLD/43ur/+R/rP/jdKX/44Ow/+F/rP/hd6j/4Guh/+Fx\r\n        pf/gcaP/4HKk/+Bqnf/gVYv/4GOZ/95hk//eZJj/3VSG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfy+QDZ6e3Yw+bu/7Hi7f+k3ev/mtrq/3bE\r\n        4/8BHpj/AACR/wAAiv9oVrn/p5Tk/66d5f+uneT/rJnj/6mW4/+mk+H/oo/g/6KO4P+jkOH/pZLh/6eT\r\n        4f+oleL/qJTi/6eS4v+mkeL/ppHi/6aR4v+lj+H/oo3g/6CL3/+dh9//m4Pf/5iB3v+Wf93/lX7d/5N7\r\n        3P+Qd9z/jXPb/4xy2v+Kcdr/inDZ/4tx2P+Lcdj/inDZ/4hv2f+Ib9n/iW/Z/4pw2f+Kcdn/inHa/4px\r\n        2f+Jcdn/iG/Z/4hv2f+Hb9r/iXDa/4px2v+Lc9r/jHTa/4x12v+Nd9v/j3nb/5B73P+Oetz/jHfb/4dz\r\n        2P9/a9X/dmLR/2VRyP86KsH/KD63/3LB4P+G0+b/i9nq/5Xc6v+g3uv/ouHs/6Xh7P+n4ez/quLt/7Dk\r\n        7f+25O3/uuPs/7/k7P/B5Oz/xuXs/8nl6//L5ev/zuTq/9Th6P/X1uD/3pe9/+B5rf/hh7P/43Ks/+SG\r\n        sv/kgK7/5Iax/+SCr//jg7D/4n2r/+J8q//heKj/4Xeo/+Bpnf/gb6L/4W+i/+Bdkv/fY5f/3lmO/91l\r\n        mP/eZ5n/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA4OrtEtbp7vnD5O3/suHr/57c6v+P1+n/bbba/wAAkP8AAJH/AACF/3tpyf+mleP/q5rk/6ya\r\n        4/+oleL/pJHh/6GN4P+eid//m4Xe/5mF3v+ZhN7/mYTd/5mD3P+YgN3/ln3d/5J83f+Qetz/kXnb/5B4\r\n        2v+Qdtr/j3Xb/4502v+Mctr/i3Ha/4tx2v+Kcdn/inDZ/4lv2f+Jbtj/iG3Z/4ht2f+Ibdj/h27Y/4Zt\r\n        2P+FbNf/hGvX/4Rq2P+Eatj/hGrY/4Rr2P+Ea9f/g2vX/4Jq1/+BaNf/gWjX/4Fo1/+Cadj/hGrX/4Rq\r\n        2P+Fa9j/hW3Z/4Rt2f+Ebdj/g23X/39o1/94YtT/cFzR/21b0f9tWc//aVfK/1E/w/8sHrn/OWy9/3zO\r\n        5P+I1ef/j9np/5nc6v+a3uv/n9/r/6Lg7P+l4e3/quPt/7Hj7f+34+z/v+Tr/77k7P++5Oz/xOXs/8rl\r\n        6//I5ev/0ePp/9Ph6P/X097/3oi1/+CCsv/iZ6n/43us/+R3qf/kfaz/44ez/+N+rf/jf6z/44Kv/+Fy\r\n        pP/ieKn/4Xao/+FlnP/gbqL/4GSa/99vov/eZ5n/32yf/9xWjP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKeqrQDe6u1F0+jt/8Hk7P+u4Oz/mtvq/4zW\r\n        6f9eocv/AACI/wAAjP8AAH3/iXbT/6aV4v+pmOL/qJbh/6OR4P+fjOD/nYrf/5uH3v+Yg93/lH/c/5J8\r\n        2/+Qedr/j3jZ/4922f+Mc9r/i3La/4px2v+JcNn/iXDZ/4lw2f+Ib9n/h27Z/4du2P+Gbdj/hm3Y/4Zt\r\n        1/+FbNf/hWvX/4Vq1/+Eadf/g2jX/4Jn1/+BZ9b/gGbW/4Bm1f9/ZdX/fmPW/35j1v9/ZNX/f2XV/35k\r\n        1f98Y9T/e2LU/3ph1P97YdX/fGLV/3xj1f99Y9X/fWTV/31k1f99ZNX/emHU/3Ve0v9xWdH/bVXP/2dQ\r\n        zP9kTc3/Y03N/2NOyv9iT8n/WknG/zwuvf8kGbL/SY7J/3fN5P+J1uf/jNrq/5Tc6v+b3ev/nN/r/57g\r\n        7P+m4ez/quLs/7fi6/+34+z/tuTt/7Xk7v/A5O3/x+Xs/8fl7P/L5Ov/zeTq/9Ph5//aydn/4IKz/+F0\r\n        rf/iea//44Sy/+ODsP/jg7D/436t/+OBr//jgK7/43ao/+J4qf/ib6P/4nSm/+FzpP/hcKP/32me/95z\r\n        pP/eaJv/3VqN/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAANrp7YjQ6O3/vOPs/6be6/+U2uv/g9To/0uOuv8AAID/AACB/w0Hd/+Sftz/pZTi/6aW\r\n        4f+kkuD/nozf/5mG3v+Wgt3/lH/c/5J92/+Qetr/jXfa/4t02v+Kctn/iXDZ/4hv2f+Ib9j/h27Y/4Zs\r\n        2P+Fa9j/hGrY/4Np2P+Cadf/gGjW/4Bn1v9/Ztb/f2XW/35k1f9+ZNX/fmTV/35k1P98Y9X/fGPU/3xi\r\n        0/97YtP/emHT/3le0/93XNT/d13U/3hf0/93XdP/dlzT/3Vb0v90WtH/dFrS/3Ra0v91W9P/dFrS/3JZ\r\n        0v9wV9H/bVTP/2pRzv9mTM7/YkjM/2BGyv9eRMr/XEPJ/1tDyf9aRMj/WkTI/1lFyP9VRcX/RDi9/zEl\r\n        tP8bGqn/V6bQ/33Q5f+F1+n/i9nq/5ba6f+Y3Or/n93q/6Lf6/+i4e3/qeHt/7ni6/+x4+3/uOXt/73l\r\n        7P/E5ev/yOXs/8jk6//P5Or/0OPq/9Xf5f/buM//4Hux/+F9sP/hea3/4oWy/+OFsv/jgq//44Kv/+OE\r\n        sP/kf63/432t/+N1p//idaf/4myi/+Fuof/gaZ7/33Sk/91ilf/fcqH/AAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ejtzsnm7v+z4+3/pN7r/5ba\r\n        6v+A0uf/OXSp/wAAef8AAHj/GRJ7/5eD3/+klOH/o5Pg/5+O3/+Yht3/k4Dc/5B82/+Nd9r/i3TZ/4ly\r\n        2f+IcNj/hm3Y/4Rq1/+CaNf/gmjW/4Jp1f+BZtb/gGbW/39l1v9/Zdb/fmTW/3xj1P97YtT/emDV/3pg\r\n        1f96X9T/eV7T/3he0/94XtP/eF3T/3dc0/92XNL/dlzR/3Zb0f90WtD/c1jQ/3JY0f9yWdL/clnR/3JY\r\n        0P9xV8//h3fT/56U1v94ZM//cVfR/25V0f9pUc//ZEzN/2FHyv9dQ8b/Vz7D/1U7w/9UOsT/VTvF/1Q5\r\n        xv9SOsb/UTrF/1E8w/9TPMX/Uz3E/088v/9GN7r/Ny22/yEaqv8WNKf/Ybfc/3/Q5v+C1ej/jtfp/5ba\r\n        6f+X2+r/oNzq/6He6/+l4Oz/rOHs/7Ti7P+z4+3/tOTt/7/l7P/F5ez/yOTr/83k6v/P4+j/0uLo/9bc\r\n        5P/cscz/4IOz/+Fuq//ifa//43Or/+SDsv/keqr/436t/+SEsf/kfq3/5Hmq/+R5qf/jbqP/43io/+N2\r\n        p//hdKb/322g/950pf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAOHp7BvV6O32x+bt/7Di7f+b3Ov/jtjp/3/P5/8pX5j/AAB3/wAAdP8bEnv/jnnc/56N\r\n        3/+cjd//l4bc/5GA2/+Oetr/iXTZ/4Vw1/+CbdX/gmvV/4Fp1f+AZtX/fmXV/3xh1f97YdT/e2LT/3xg\r\n        0/97YNT/el/U/3hf1P94XtP/d13R/3Zb0v91WtP/dVrT/3Ra0v9zWdH/cljS/3BX0v9wVtL/cFbQ/3BW\r\n        0P9wVc//b1TP/21Tzv9sU83/bFPO/21Vzv9uVc3/bVPN/4R10f/m5en/6+vr/9zb5v9/b83/YEbI/1lA\r\n        x/9UO8X/UDfD/0w1wP9LM77/TTW//042wP9ONsH/TDXA/0s0wP9IMr//SDK//0kzwP9HMsD/RTG8/0Av\r\n        t/85LbP/LSmt/xgZnv8sXaf/a8Ph/3XS6P+F1un/h9jr/5Ha6v+g2+n/n93r/6Pf7P+i4O3/p+Hs/7Di\r\n        7f+w4+3/vuTs/7/k7P/F5ev/yOXr/8zk6v/N4+n/0+Lp/9fX4f/dnsP/34Cx/+JwrP/kUqD/5H+w/+Vs\r\n        p//kdaj/5H+t/+V1qP/laqD/5Xip/+RwpP/kd6j/42Sc/+FroP/hcqT/4G6h/wAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3OnsSdLo7f/F5Oz/ruHs/5/c\r\n        6v+O1+j/d8vk/xlGjP8AAHP/AABv/xgQev96Ztb/jHvZ/5GB2f+Pftr/infa/4Vx2P+CbNb/f2jV/3pi\r\n        1P95YtP/emLT/3pg0/95X9L/eF7S/3Zc0f91XND/dVvQ/3RZ0f90WdH/cljR/3BX0P9xV87/cVbP/3BV\r\n        0P9wVNH/b1TQ/25Uz/9tU8//alHP/2lPzv9qUM3/a1HM/2pRzf9rUcz/aVDL/2hPzP9oUMz/aE/L/2VL\r\n        y/9hRsr/w7/d/+vr7P/r6+v/6urq/9XU4/9XRcD/SDC8/0Qtvf9ELbv/RC25/0QtuP9EK7r/RzC8/0w8\r\n        vf9aWMH/ZmzE/3WAxf+Hms7/iZrO/5+z1/+ku9r/qsDc/67H3/+0zN3/sMrd/7LO3/+32OT/ttro/7Lc\r\n        6f+w3On/qtzq/6jc6v+r3Or/oN7s/5zf7f+o4Oz/quDs/7Hi7P/B4+v/uuTt/8Pl7P/F5ez/xeXs/8fk\r\n        6//O4+n/1OHn/9nN2//elb7/4XKt/+NvrP/lda7/5nSs/+V+rv/lhbH/5Hyr/+V7q//ke6v/43ip/+R4\r\n        qf/keKr/43Wm/+Jxov/hYJT/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADc6OxtzOft/8Lj6/+v4Ov/m93q/4nV5/9zx+L/Aih+/wAAcP8AAGv/EQps/2xX\r\n        z/94ZtT/fGvU/3po1P93ZNP/eGPR/3hh0f94YNL/dl/S/3Rd0f9xWtD/clnQ/3JZ0P9yWdD/cVjP/3BW\r\n        zv9vVc3/bVPO/21Tzv9rUc7/alHO/2xSzP9rUc3/a1DO/2tQzv9pT83/aFDN/2lQzf9oT83/Z07M/2ZN\r\n        y/9mTcn/ZkzJ/2ZMyf9kScn/YkfI/2BHx/9dRMX/Vj3E/19Nxf/l5un/6+vr/+vr6//q6ur/6urq/66t\r\n        0v87ILX/RTW2/1xcvf9+h8f/iJjN/5ir1P+xyOD/utHj/7/Y5v/E3ej/xuDp/8jh6v/I4er/y+Pq/8zj\r\n        6v/M5Ov/yuTr/83k6//M5ev/zuXr/8vk6//O5ev/zOTr/83k6v/P5On/zePp/8ri6f/C4er/uuHr/67f\r\n        6/+y3+v/teHr/7zj7P++4+z/vOPs/8Tk6//E5Oz/xuTr/8vk6v/Q4+n/1N7m/9q70v/firr/4nOv/+Rv\r\n        rf/laqr/5Xet/+Ryp//jirT/5IOw/+R6qv/jean/43eo/+Rjmf/jeKn/43Wm/+JmmP8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjo7Z/I5u7/vuHq/6zf\r\n        6v+b2+n/h9Tn/23D3/8AAGv/AABq/wAAZ/8CAV7/XErE/2tbzv9oV83/ZVPL/2BLy/9gSMv/ZEzK/2dQ\r\n        y/9qUs3/alHN/2dOzf9mTc3/Z07M/2hOzP9oTs3/alDN/2pQzf9oT8z/Zk3M/2VMzP9lS8z/ZUzL/2VM\r\n        zP9lTMz/ZEvK/2JJyf9gSMj/YEfI/19HyP9eRcj/W0LG/1lAxf9WPcT/VDrC/1A3v/9LNL7/STG9/0Yv\r\n        u/9ELLj/kIvH/+vs7P/r6+v/6+vr/+rq6v/q6ur/5OXo/7PF3P+0zuH/wNnm/8fg6f/I4Or/y+Lq/8vj\r\n        6v/M5Or/zOTr/8vl6//M5ev/y+Xr/8zl6//N5uz/zebs/8zm7P/M5u3/zObs/8zm7P/J5u3/yuft/8zn\r\n        7f/N5+z/zubs/87m6//O5ev/0OXq/87l6//Q5er/zuTq/8rj6v/M4+r/zOTq/8Pj7P/B4+v/v+Ps/8Hj\r\n        7P/C5Oz/xOTr/8nk6//R4un/1dfi/9ysy//ggLP/5Eyi/+Vip//la6j/5YGx/+R+rf/kgK7/43+t/+J/\r\n        rf/jean/5Wub/+R6qf/jcaP/43en/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA1ufszsDk7f+64uv/qd7r/5Ha6v9+0+j/ZLzc/wAAZP8AAGf/AABj/wAA\r\n        V/9GNq7/YFHK/1tKyf9aRMb/WEDE/1Q8w/9ROsL/UjrA/1M7wP9VPMH/VjzD/1c9wv9XPsL/Vz/D/1lB\r\n        xP9bQ8X/XUTG/1xDxP9aQsP/WUDE/1c/xP9YPsT/Wj/F/1lBxv9YP8X/Vz/E/1U9xP9SO8L/UDnA/043\r\n        v/9LNL7/RzG8/0Ywuf9DLbb/Pym1/zwmtP85I7P/Oiiy/1BLtP++v9f/6uvs/+vr6//q6+v/6urq/+jp\r\n        6v/m6er/1uXq/8jj7P/J5ez/y+Xs/8rl7P/K5ev/y+Xr/8vm6//N5uz/xubt/8Tm7f/K5uz/yubs/8jm\r\n        7f/F5u3/xubt/8jm7P/C5u3/yObt/8jm7f/F5u3/yubt/8bm7f/A5u3/yebs/8nm7f/F5ez/yuXr/87m\r\n        6//N5ev/z+Xr/8/l6v/Q5Or/z+Tq/8zk6v/F4+v/w+Pr/7/j6//B5Ov/yOPq/9Hk6f/R4ej/2cfY/96e\r\n        w//hfLD/5HGu/+RxrP/kfq//5Xys/+V4qP/jfKv/4oGu/+N9rP/ke6r/5HKl/+V4qf/kbaH/AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADAwMAA7+/vF+vr66TX2985AAAAAAAAAAAAAAAAAAAAAODq7BPU5+3yvuLr/7Dh\r\n        7P+i3ev/jdnq/33R6P9cs9b/AABc/wAAZP8AAF3/AABS/ysgjP9UQ8T/Tz7D/047wv9NOMD/Tja+/0ky\r\n        vf9EL7z/Qi66/0Mtuf9GLrj/Ry+5/0Uuu/9ELbz/RS26/0Ytuv9GLbv/RS26/0Msuf9DLLn/RC25/0Uu\r\n        uf9HLrn/Ri67/0Qsu/9DK7r/QSu5/0Apuf8/Kbn/PSi2/zwmtP87JLX/OSKz/zorsv9KRbT/bXTC/5el\r\n        0P+xxN3/ydzn/9rm6//j6ez/5+rr/+bq6//k6er/4Ojq/9nn6//R5uz/x+bt/8fm7f/K5+3/wObt/8Tm\r\n        7f/E5uz/w+Xt/8nm7P/D5ez/wuXt/8Xl7P/B5e3/wOXt/8Xl7P/A5ez/w+Xt/8Xl7P/E5ez/xuXs/8Hl\r\n        7P/H5ez/w+bt/77l7f/I5ez/x+bt/8bl7P/H5ez/zObs/8jl7P/L5uz/zeXr/87l6v/O5Or/zeTq/8/k\r\n        6v/O5Or/y+Tq/8Dk7P/C5Ov/yuTq/9Di6f/U1uL/3LfR/9+Ouv/igLL/5G+r/+N5rf/keKv/5X6s/+SA\r\n        rv/ifKv/436t/+OArv/jeKj/43yr/+Vypf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu7u6n6urr/9PY\r\n        26wAAAAAAAAAAAAAAAAAAAAA3unsPtPn7f++4en/sN7p/5zb6/+H1+r/eM7m/0+o0f8AAFv/AABg/wAA\r\n        WP8AAE7/Dglf/0Mxtf9GM7r/RDC6/0QvuP9CLbj/QSu5/z8puP89KLb/Pii0/z4ntP87JrX/OiW2/zkj\r\n        tf86I7T/OSOz/zgjs/83IrP/NyKz/zgjs/85I7L/OSSx/zgksf83I7H/NyKw/zcgr/82IK//NCCw/zIe\r\n        r/8zH67/V1e2/3uEw/+Uoc7/ucvf/77U4//M4ur/zeTr/87l7P/O5u3/0Ofu/9Ho7v/U6O3/0+jt/9Pn\r\n        7P/Q6O3/xObu/8Lm7f/D5u3/yebs/8Lm7f++5e7/v+Xt/77l7f+/5ez/x+Xr/8Pk6//C5Oz/wuTs/73k\r\n        7P+95Oz/weXs/73k7P/C5ez/v+Ts/7/k7P/A5Oz/wOTs/8Ll7P/B5e3/u+Xt/8Xl7P/I5ez/yOXs/8Pm\r\n        7f/F5u3/x+bs/8nm7P/I5ez/y+bs/8zm6//L5ev/zeXr/9Dk6v/R5On/z+Tq/8jk6//F5Oz/zOPq/9Lh\r\n        6P/Xz97/3ajK/+GFtf/kbav/5HGs/+R/sP/kiLP/5Iax/+R/rf/jfq3/4n6s/+N8q//jgK3/43Kk/wAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA7+/vLO3t7frq6+v/1trd7srV3Rfa5ekb2eTpIdjk6Bra6Ox+yuXs/7nh\r\n        6/+m3+z/mdrr/33W7P92zuj/TaDO/wAAWv8AAF7/AABU/wAATP8AAET/KxyV/zgmsf84JbL/NyWw/zck\r\n        sP82I7D/NiOw/zYir/81Ia7/NCCt/zQgq/8zIKz/MiCu/zMgrv8yH63/MR6t/zEdrf8xHa3/MR6t/zIe\r\n        rP8xHav/MB2r/zAcrP8uG6z/Lhyo/zguqv9xe73/k6PP/63C2//H2+f/zeLq/87k6//P5ez/zubs/87n\r\n        7f/M5+3/xubt/8nn7v/L5+3/wefu/8Tn7v+/5u//xubu/8Pm7f/G5u3/v+Xt/8Hl7P/A5ez/uuTs/7/k\r\n        7P/F5ez/vuXs/7nl7f/A5Oz/xOTr/8Hk6/+/5Ov/wOTr/8Lk6/+75Oz/vePs/8Hl6/+55Oz/vuTs/8Tl\r\n        7P+95Oz/vOTs/8Hk7P/C5Ov/xuXr/8bl7P/B5e3/xebt/7/l7f/F5u3/xubt/8jl7P/I5uz/yeXs/8nl\r\n        7P/K5ev/y+Xr/87l6//Q5Or/0uTp/9Lj6f/P4+r/0ePo/9Ld5f/Zwtb/3pe+/+Jyr//jfrP/5G+q/+R6\r\n        rf/kfq3/5H2s/+R6qf/jfqz/43Cj/+N8q//kc6T/AAAAAAAAAAAAAAAAAAAAAAAAAADu7u6V7Ozt/+rr\r\n        6//c3+L/ztzi+tDg5/7M3+f+yd7m/Mre5vzG3uf/wN7o/7De6/+c2+v/f9fs/3HO6f9NoM7/AABY/wAA\r\n        W/8AAFH/AABK/wAAQ/8GA1T/JBed/yobpf8rG6f/Kxum/yoapf8qGqX/Khql/ysapf8rGqT/Khqk/yoZ\r\n        pf8qGaf/Khmn/ykZpv8qGaX/Khmk/yoYo/8rGKX/KRWn/yscp/82L6j/YWm1/4ybyP+nudf/vdLh/8vh\r\n        6v/P5Ov/zOXt/8/m7P/O5uz/zeft/83n7f/N5+3/yeft/8Tm7f/F5u3/x+bs/8Tm7f/B5u3/wOXt/8Xm\r\n        7P+95e7/wOXt/77l7f+/5Oz/weTs/7vk7f+65O3/wuTs/77k6//A5Oz/uuTt/7Xk7f/B5Ov/uOPs/7/k\r\n        6/+74+v/weTr/8Lk6//B5Ov/w+Xr/7rl7f+95ez/v+Ts/7nk7P/C5Ov/v+Ts/8Lk6//H5ev/weXs/8Tl\r\n        7P/E5ez/xeXs/8fm7P++5e3/wuXt/8Tl7P/I5ez/yuXs/8fl7P/H5ez/y+Xr/87l6//R5ev/0uXq/9Pj\r\n        6f/U4uj/0uHo/9XX4v/dsc7/4Hey/+J9sf/jfrH/5H2v/+WBsP/lh7L/5IKu/+OGsf/jgKz/5Hen/+Vx\r\n        o/8AAAAAAAAAAAAAAAAAAAAA5OrsLO3t7u3s7e3/6evs/+Pm6f/J1t//v9bh/77Y5P+/2eT/udfk/7fZ\r\n        5v+x2Ob/sdnn/7Da6P+Q2ez/e9Lq/1Cdyv8AAF//AABX/wAAT/8AAEr/AABD/wAAQf8GA1n/GxCU/yAS\r\n        mv8hE5v/IhSZ/yETmv8iFJz/IxSf/yQVoP8kFZ//IxSg/yITof8jE6H/IAyd/yQTnf85OaL/VVuu/3KA\r\n        vf+brtD/qb3X/7zR4f/N4en/z+Tr/8/l7P/O5uz/z+ft/83n7P/J5u3/zebs/8zm7P/L5uz/yebs/8bm\r\n        7P/H5uz/x+Xs/8Hl7f/F5uz/vuXt/8Dl7f+55O3/wuXs/7zl7f+95e3/wuXs/7rj7P/A5Oz/veTs/7vk\r\n        7P+95Ov/uuPr/73j6//A5Ov/vOTs/8Hk6//C5Ov/vOPr/8Lk6/+64+z/v+Pr/8Dk6//B5Ov/vOTs/7Xk\r\n        7f/B5Oz/weTr/8Lk6//B5ez/teTt/8Ll7P/A5ez/v+Xs/8Dl7P/F5ez/xOXs/8Dl7f++5e3/xeXs/77l\r\n        7f/J5ev/xuXr/8fl7P/K5ev/zOXr/8jl7P/O5ev/0eXq/9Xj6f/T4uj/1N3l/9y/1v/dl7//4X6w/+J0\r\n        rP/igrH/5Xau/+WBr//kfqz/5Iax/+R8qv/keqn/5YGu/wAAAAAAAAAAwMjLAOLq7SDi6u3o6uzt/+Pq\r\n        7P/c5+z/1eTr/83g6f/E2eX/vNbj/7XU4/+t0eL/kcnj/2ehzv9Igb7/SHm3/1iax/9gsNb/RYGz/wAA\r\n        aP8AAFn/AABS/wAATf8AAEf/AABC/wAAN/8FAlT/EwqF/xcNjf8YDo7/GQ+Q/xsQkv8cEJL/Gw2V/xgA\r\n        lv8tKJz/YGmt/3+Ovf+arc7/rsTZ/77T4v/I3uj/zOLq/8/l7P/P5ez/z+bs/8/n7f/P5+3/zOft/8bo\r\n        7//N6O7/yOft/8bm7f/H5u3/xubs/8fm7f/C5u3/weXt/77l7f/D5ez/veXt/8Pm7f+95e3/weXs/7zl\r\n        7f+75e3/vOXt/7nk7f/D5Oz/uuTs/8Hk7P+35O3/vuTs/7zk7P/A4+v/uuLr/8Hj6v+/4+v/v+Tr/7fk\r\n        7P+64+z/wOTr/7/k7P++5Oz/wuTr/8Dk7P+45Oz/vuTs/77k7P/A5Oz/vePr/7/k7P/A5Oz/u+Ts/8Pl\r\n        7P+95e3/weXs/8Hl7P/C5ez/weXt/8Tl7P/F5ez/xOXs/8Xl6//E5ez/yOXr/8fl6//F5ez/xOXs/8nm\r\n        7P/O5uz/0eXq/9Pj6f/V4ef/2NLf/92syv/gf7L/4nit/+KJtf/lea3/5n6v/+aDsP/leKn/5IKv/+R9\r\n        q//lga7/AAAAAAAAAAAAAAAA4ertseDq7f/d6u3/2Ojt/9Xn7P/T5uz/0uXr/87j6v/I3uj/xtzm/7vW\r\n        5P+Hp87/SFyt/yU4oP8AAI3/AACC/wAAef8AAG7/AABr/wAAXP8AAFT/AABQ/wAATP8AAEf/AAA+/wAA\r\n        Nf8AAEn/CwZ//yw0jf9XZaP/bnyw/4mZwP+YqMj/tsnb/7/U4f/N4en/zePr/87k6//P5ez/zebt/8/m\r\n        7P/P5+z/zefs/83n7f/K5+3/xefu/8zo7f/I6O7/wufu/8Tn7v/H5+3/w+bt/8bm7f/D5e3/vuXu/73l\r\n        7v/A5u3/vOXt/8Hl7f+95e3/uuTt/77l7P+95Oz/weTr/7/l7P+25e3/t+Tt/7rk7f+85ez/tuTt/7/l\r\n        7P+45Oz/u+Ts/73j7P++4+r/v+Pq/77k6/+25Oz/u+Ts/7rj7P+74+v/u+Ts/7rk7P+45O3/vOTs/77k\r\n        7P/A5Oz/tOTt/8Dk6/+74+z/weTr/7/k6/+95Oz/xOXr/7/l7f+95e3/t+Xt/8Hl7P/D5ez/w+Xs/8Ll\r\n        7P/G5ez/weXs/7/l7P/E5ez/vOXt/8fl7P/G5ez/yuXs/9Dm6//R5uv/0+Xr/9Tj6f/V3+b/273V/9+R\r\n        vP/heK3/4oa0/+VopP/ncaf/53mp/+d5pv/lf6z/5YGt/+R8q/8AAAAAAAAAAOHq7UPf6u793Oru/9np\r\n        7f/W6O3/1ujs/9Xn7P/T5uz/0ubs/9Hk6//P5Ov/zuLq/87h6f/J3uf/wdnl/7bO3v+uxNj/m7HN/5ux\r\n        yP+YrcT/k6a9/5Kmvf+Oo7r/lqq//4qft/+QpLb/nbLD/6nA0f+70+D/wtnl/8nf6P/N4ur/zuTq/9Dl\r\n        6//Q5uz/0Obt/87n7v/O5+3/zuft/87n7f/K5+7/zuft/8vn7f/G5+7/xufu/8fn7v/D5+//wufu/73n\r\n        7//F5+7/xebt/8Ll7P/F5ez/uuXt/77m7f+55e7/u+Xt/7nk7f+95e3/wOXt/7nk7f+95Oz/u+Ts/7bj\r\n        7P/C5Ov/vuTs/7bk7f+z5O3/wOXs/7fk7f+25O3/vOXs/7nk7f+z4+3/veTs/8Dk6/+75Oz/ueTs/77k\r\n        6/+75Oz/vuTs/8Pk6/+55Oz/vuTs/7jk7P+75Oz/vuTs/73k7P+24+3/veTs/7/k6//B5Ov/xeTr/8Xk\r\n        6//B5ez/wOXs/73l7f+/5e3/vOXt/8Hl7P/H5Ov/vuTs/8bl7P/B5ez/xOXs/8bl7P/C5e3/yObs/8Tm\r\n        7f/J5ez/y+bt/8/n7f/T5uz/1eXq/9Tj6P/Z1+L/3aHE/+FrrP/hgrD/5Het/+Z2rf/lgq7/54Ct/+Vy\r\n        o//lgq7/5Xqp/wAAAAAAAAAA3+rttNzq7f/b6u7/2enu/9bp7f/X6O3/1ejt/9Tn7P/T5+z/0ubs/9Hm\r\n        7P/S5uz/0ebs/9Dm7P/O5Ov/zeTr/83k6//N5Oz/zuTr/9Dk6//P5Ov/zuTr/83k6//P5Ov/zuTr/87k\r\n        6//O5ez/z+bs/83m7f/Q5+3/0Oft/8/n7f/Q5+3/zOft/8fn7v/O6O3/zOfu/8vn7v/J5+3/y+fu/8nn\r\n        7v/K5+3/yeft/8jn7f/C5u3/x+ft/7nm7/+95u7/wObu/8Lm7f/D5u3/u+Xt/8Hl7f+65e3/ueXt/7fl\r\n        7f+75e3/uuTt/73l7f+35O3/tOTt/7nk7f+/5ez/wOTr/8Dl7P+25O3/s+Tt/73l7P++5Oz/tuTt/8Dj\r\n        6//B5Ov/tOTt/7nj7P+95Oz/veTr/7Xk7f+34+z/wuTs/73k7f+15O3/vOTs/7zk7P+45Oz/ueTs/8Dk\r\n        6/+64+z/uOPs/8Dk7P++5ez/u+Ts/7/k6/+94+v/weXs/7Tl7v+95e3/wObt/7zm7f/B5u3/wOXs/7rl\r\n        7P/A5Oz/vuXt/7vl7f/C5ez/xeXs/8Lm7f/G5uz/x+ft/8rn7f/O5+3/z+ju/9Po7f/V5uz/1OXp/9jf\r\n        5v/cutL/4Xqz/+F1rf/ih7T/5YKx/+aGsv/ng67/5n6r/+WIsv/lfav/LDAwAODq7Rne6u302+ru/9nq\r\n        7v/W6e7/1+nu/9Xp7f/U6e3/0+nu/9Po7f/S6O3/0ujt/9Lo7f/R5+z/0ufs/9Dn7P/P5+z/z+ft/9Dn\r\n        7f/R5+z/0ebs/8/m7P/P5+z/z+fs/8/n7f/O5+3/z+ft/8/n7f/O5+3/zuju/8zo7v/M6O7/yOfu/83o\r\n        7f/I5+7/w+jv/8vo7v/M5+3/y+ft/8nn7f/F5+7/yeju/8Ln7v/D5+7/yOft/8Hm7f/H5u3/weXu/73l\r\n        7v/C5u3/u+Xt/77l7f+/5ez/veXs/7vl7P+75ez/vOTs/73k7P+55Oz/vOTs/7zk7f+15O3/uOTt/7zl\r\n        7P+75Oz/uuXt/7Lk7f+95O3/uuTt/7Xk7f+24+z/vuTs/7jk7P+75Oz/uOTs/7Xk7f+25O3/s+Tt/7vk\r\n        7P++5Oz/tuXt/7bl7v+45O3/v+Ts/7fk7f+45O3/vuPr/77j6/+65Oz/vuTs/7jl7f+65O3/vuTs/7fk\r\n        7f/C5Oz/uOXt/7zl7f/B5u3/veXu/7fl7v/A5e3/uOTt/73k7P/B5e3/uuXu/8Hm7v/C5u3/webu/8Dm\r\n        7v/K5+7/zOju/8Xn7v/O6O//yefu/9Ln7P/V5+z/1+Lp/97C1//fi7v/4X2v/+KCs//kgLL/5oCu/+eA\r\n        rP/mf6z/5omz/+Zzo/8AAAAA4evuVd3q7v/b6u7/1+ru/9Xp7v/V6e7/0+nu/9Pp7v/T6e7/zunv/9Pp\r\n        7f/S6O3/zOju/8/o7v/O6O7/zujt/9Do7f/O5+3/0Ofs/9Hn7P/P5+z/zufs/9Dn7P/M5+3/zuft/83o\r\n        7v/M6O7/zuju/8ro7v/N6O7/yuju/8vo7v/E6O//xujv/8fo7v/E5+7/yefu/8Pm7v/F5u7/yeft/8Dm\r\n        7v/I6O7/v+fu/8Hm7v/F5uz/vuXt/7vl7f/D5u3/wOXt/7zl7f/A5e3/uOXt/8Dl7f+05O3/uuTt/7nk\r\n        7f++5Oz/u+Ps/73k7P+95Oz/veTs/7jk7f+/5Oz/uuXt/7jk7f+45e7/ueXt/77l7f+45O3/tuTt/7fj\r\n        7P+85Oz/tuTt/7nk7P+44+z/uuTs/7nk7P+55Oz/ueTt/77l7f+05e3/ueXu/7rk7f/B5Oz/v+Xt/7Pj\r\n        7f+94+z/vOTs/7zk7f+55e3/vOXt/7nl7f/A5e3/veXt/8Hl7f+65O3/wubt/8Hm7v/C5u7/ueXu/8Dk\r\n        7f/D5ez/yebs/8Xm7f/B5u7/wufu/8Ln7v++5u7/xufu/8Xn7v/E5+//y+nv/8ro7//P6O7/1Ojt/9Tn\r\n        7P/V5er/2s3d/96ix//jcq7/43yx/+J+sP/khLH/5nyq/+aBrf/mdaX/5nal/wAAAADg6+6n3ert/9nq\r\n        7v/V6u7/1enu/9Pp7v/S6e7/0+nv/9Lp7v/R6e7/0enu/8zo7v/N6e7/zeju/8ro7v/O6O7/zejt/8vo\r\n        7v/O5+3/zufs/83n7f/N5+3/zOft/83o7v/L6O7/zeju/8vo7v/O6O7/xujv/8To7//G6O7/y+ft/8Lm\r\n        7f/H6O7/x+fu/8Tn7v/C5+//wufu/8Tn7v/D5+3/wefu/7jm7/+95u7/xObt/8Lm7f+85e3/vebu/7zl\r\n        7v++5e3/veXt/7Tl7v+45e3/vOTs/7nk7f+75O3/vuTs/7/j6/+94+v/uuTs/7Tk7P+45Oz/u+Pr/77k\r\n        7P+15O3/uOXu/7bl7v+15O3/t+Tt/7Xk7P+34+z/v+Xs/7jk7P+05O3/t+Tt/7vk7P+95Oz/t+Ps/7vk\r\n        7f+55e3/uuXt/7nl7f+05O7/vuXt/8Hl7f+55e3/uOXt/7zk7P+14+3/uuTs/7zl7f+35O3/u+Xt/7vm\r\n        7v/C5u7/ueXt/8nn7f/H5+3/xOfu/8Dn7/+95u7/xefu/8nn7f/K6O7/xuju/8zp7//C5+//xOfu/8nn\r\n        7v/N5+7/v+fu/8ro7//P6e//zejv/9Pp7v/T6O3/1Ofs/9Xj6//b0d//36XI/+N0r//jda7/5Iq2/+SN\r\n        t//mirT/5oix/+WBrf/kibL/4OvtCd/r7ujc6u7/2Oru/9Xq7v/W6e7/0+rv/9Lq7//S6u//0enu/83p\r\n        7v/O6e7/y+ju/87o7v/O6O7/y+ju/8zo7v/L6O7/zOjt/8ro7v/L5+3/yefu/8Tn7v/L6O7/xOfv/8Xo\r\n        7//J6O7/x+jv/8jo7v/J6O7/x+jv/8Pn7v/J5+3/yOft/8bn7f/G5+7/wObu/8Pn7//B5+7/wOfu/8Dm\r\n        7v/B5u3/weXt/7/l7f/A5ez/u+Xt/7nl7v+45e7/vuXt/7vl7f+25e7/s+Xu/7rl7f+85O3/uOTs/8Dl\r\n        7P+24+z/v+Tr/7/k6/+y4+3/uOPs/7jj7P+74+v/t+Ps/7Hk7f+15e3/suTu/7Xj7f+54+z/uePs/7nk\r\n        7P+z5O3/tuTt/7Tk7f+55e3/ueTt/7jk7f+/5Oz/vuXs/7jl7f+05O7/uOXt/7/l7f/A5u7/t+Xt/7fl\r\n        7v+45e3/ueXt/7fk7f/C5Oz/v+bt/7zl7f/C5u7/w+fv/77m7v/I6O//xOjv/8fn7v/H6O//vOfv/8jn\r\n        7v/B5+//v+fv/8Lo7//E6O//vOfv/8jo7//G6O//yujv/8zo7f/M6O7/0unu/9Dq7//R6e//0Oju/9Ho\r\n        7v/W5+z/1uPq/93F2P/fosb/44K0/+Vtrf/ka6v/5Iq1/+aBrv/mdqX/5IKv/+SMtP/h6+4r3uvu/9vq\r\n        7v/Y6u//1+ru/9Lp7//S6u//zerw/9Dp7//O6e7/zeju/83o7v/K6O7/yuju/8no7v/N6O7/y+ju/83o\r\n        7v/G5+7/yeju/8rn7v/L5+3/xOfu/8no7v/G6O7/x+ju/8bo7v/G5+7/xufu/8Po7//F5+7/w+fu/8Hn\r\n        7v/E5u3/xObu/77m7v/F5+7/wObu/8Tn7v/A5u7/wubt/8Lm7f/C5ez/veTs/8Hl7f+65e3/u+bu/73m\r\n        7v/A5u3/veXt/7rl7v+z5e7/v+Xs/7rk7f+05O7/teTt/7bk7f+35Oz/vuTs/7Xj7P+54+v/vOPq/7ri\r\n        6/+44+z/teTt/7Pk7f+25O3/uuPs/7rj6/+54+z/sePt/7Xk7f+55O3/tOTt/7fk7f+65e3/uOXt/7zl\r\n        7f+35e3/tuXt/77m7f+85e3/weXt/7vm7v+z5e7/v+bu/7nl7v/A5u7/wObu/8Lm7v+85u7/xefu/8bn\r\n        7v/C5+//x+nv/8Xo7//C6PD/yOnv/8To8P/J6O//yunv/8bp8P/D6PD/xujw/8vp7//B6O//yOjv/8rp\r\n        8P/N6fD/zOju/87p7v/Q6e7/z+nv/9Pq7//R6e//0uju/9Tn7f/V4Oj/3r3U/96Zwv/lg7T/5YO1/+Ry\r\n        rP/khbP/53ur/+eErv/kga3/5Iqz/9/r7lbd6+7/2uvu/9nq7//W6u//1Orv/9Lq7//L6fD/z+nv/87o\r\n        7v/M6O7/zOjt/8vo7v/G6O//yejv/83n7f/E5+//yuju/8ro7v/K5+3/x+ft/8vn7f/K5+3/w+fu/8jn\r\n        7v/D5+//xufu/8fn7f/C5+7/xOfu/8Pn7v/B5+7/wufu/8Tn7v/D5u3/wObu/8Pn7f/B5u7/vubu/73m\r\n        7f/A5u7/vebu/8Pl7P/E5ez/wOXs/77m7f+35e7/v+bt/7bk7v+85e3/uOXt/7bl7f+55O3/u+Xt/7rl\r\n        7f+25e3/suTt/7Xk7f+y5O3/t+Ps/7rj6/+44+v/u+Pr/7rj7P+05O3/uuTt/7nk7P+44+z/u+Lr/7rj\r\n        6/+54+z/uOTt/7nk7f+/5ez/vuXt/8Hm7f+45e3/v+bt/7/l7f/A5e3/webu/7jl7v++5e3/uObu/7Tl\r\n        7v+/5u7/vubv/7vm7//E5+7/webv/8Ln7//D6O//z+nv/8Lo7//H6fD/yunw/8np8P/K6fD/xunw/73n\r\n        7//E6PD/xOjw/8fp8P/L6vD/x+nx/8Xp8P/N6vD/yenw/8rp7//Q6e//0Oju/9Lo7v/T6e//z+nv/9Do\r\n        7v/R6O7/1OXr/9rX4v/dwNX/34S6/+N5r//le7H/436z/+WPuv/ng7H/5oGs/+WBrf/kjLT/4Ovucdzr\r\n        7//b6u7/2Orv/9Xq7//T6u//0env/8np8P/Q6e//zuju/8vo7v/O6O3/y+ju/8vo7v/H6O//zeju/8Xo\r\n        7//H6O//yuju/8jn7f/G5+3/yuft/8fn7v/G5+7/x+ju/8Tn7//J5+3/xeft/8Ln7v/D5+7/v+fv/8Hn\r\n        7v/G5+7/wObu/8Xm7f+75u7/xObt/8Hm7f++5u7/vebu/7rm7v/B5u3/wObt/7zl7f/D5u3/uuXu/7zm\r\n        7v+55e7/vubu/7nl7f+95e3/u+Tt/7zk7f+x5O7/t+Xu/7bk7f+85Oz/tuTt/7Xk7f+04+z/tuPs/7jj\r\n        7P+35Oz/t+Tt/7Xk7f+z5e3/tOTt/8Hk7P+34+v/vePr/7zk6/+95Oz/uuTt/73l7f++5e3/teXt/7/l\r\n        7f/B5u3/t+Xu/8Lm7f/C5+7/uubv/8Tm7f/B5u7/t+bu/8Pn7/+95u//wOfu/8fo7//L6O7/yejv/8jp\r\n        8P/D6O//z+nv/8fp7//T6/D/yOnv/83p8P/D6PD/zOnv/83q8P/Q6/H/yenw/8np8P/D6fD/zurw/83q\r\n        8P/N6vD/z+nv/8/p7//S6O3/0eju/8/p7//S6e7/0unu/8/o7v/T4ej/283c/9vE1f/ib7L/5G6v/+Rt\r\n        qv/ld6//5YCz/+eCsP/mcaL/5Y62/+WTuf/e6++D3Ovv/9vq7v/Y6u7/1erv/9Tq7//R6u//0unv/9Dp\r\n        7v/M6O//y+ju/8zo7v/N6O3/y+ju/8Xo7//L6O7/xOjv/8jo7//K6O7/x+fu/8Ho7//I5+7/xOfu/8Xo\r\n        7//C6O//xOjv/8Tn7v/I5+3/vefv/8Pn7v/E5+7/webu/7/n7v+/5u7/w+bt/8Dm7f/A5u3/w+bt/7rm\r\n        7v+65u7/vubu/7rm7v+75u7/vubt/73l7f+45e7/v+bt/73m7f++5u3/uOXt/7fl7f+25O3/v+Ts/7fk\r\n        7f+05e7/uuXt/7jk7f+35O3/sOTt/7zl7f+45O3/u+Ts/7Xk7f+35e3/teXu/7nl7f+y5O3/u+Xt/7jk\r\n        7P+/5ev/w+Xs/7Hj7f/C5u7/v+bu/7zm7v+55u7/xebt/8Tn7v+65u//xuju/7vm7v+65u//wefv/8Dn\r\n        7//B6O//zOrw/8To7//Q6u//yejv/8vo7//S6vD/z+rw/8zp8P/Q6u//y+nv/8zq8P/K6vD/0Ovx/8zq\r\n        8P/Q6vD/0Ovx/8np8P/N6vD/zerw/8rp8P/N6/D/x+rx/8jq8f/Q6u//zuju/9Ho7f/P6O//z+ju/8/o\r\n        7v/O6O7/z+bt/9Xc5P/bzNr/3bDO/+Nmsv/kaqn/5W6w/+Z4r//miLT/6Imz/+iKtP/njrf/5oWx/9/r\r\n        7ojb6+//2uru/9jq7v/W6u//0unv/87q8P/Q6e//zunv/87o7v/I6O//yuju/87o7f/I6O7/v+jw/8jp\r\n        7//I6e//yOjv/8ro7v/H6O7/w+fv/8nn7f/G5+7/xOjv/8Lo7//C5+//wejv/8Xn7v/B5+7/xuft/77m\r\n        7v/E5+7/webu/8Tm7f++5e3/vebu/8Xm7f/B5u3/uObu/77m7v+65u7/uubu/7zm7v+65e3/v+Xt/7nk\r\n        7f+15e7/seXu/7Hl7/+z5e7/uOTt/7rk7P+65Oz/teXt/7Xl7f+y5O3/tuTt/7Tk7f+25e3/u+bt/7jk\r\n        7f+35e3/teXu/7Pl7v+55e7/s+Xu/7Xl7v+25e3/t+Xu/7bl7f+95e3/wObt/7/m7v+35u7/uObv/7rm\r\n        7/++5e7/xOfv/8np7/+55u7/zOnv/8Ho8P/B6O//yujv/8rp7//C6PD/vejv/8Ho8P/T6/D/0evw/8jq\r\n        8f/J6fD/xenw/8zp7//R6vD/0urw/8vq8f/J6vH/xunw/8/q8P/J6vH/yOrx/87p8P/P6vD/zOrx/8jq\r\n        8P/N6fD/zenw/8vp7//M5+3/yufu/8zn7v/O5+3/zebs/9Dj6f/R3uf/2drh/9nK2f/gi77/5Fuv/+Vf\r\n        qv/kdK//522p/+h2qv/ohbH/6Iix/+eGsf/ogKz/3uvue9vr7//a6+//2Oru/9Xq7//S6u//z+rv/8/q\r\n        7//Q6e7/z+nu/83o7//K6e//yejv/8fp7//H6fD/x+jv/8jo7//H6O//yeju/8ro7v/I5+7/xefu/8Dn\r\n        7//C5+//xeju/8Hn7v/F5+7/wufv/77n7//C5+7/xOfu/7vm7//E5+7/xuXs/8Hl7f/A5u7/u+bu/7rm\r\n        7v+/5+7/vebu/7zm7v+85e7/vOXt/7Xl7v/C5Oz/v+Ts/7nk7f+05O7/uuXt/7vk7f+25O3/uuTt/7nk\r\n        7P+z5O3/s+Tt/7Pk7v+35O3/tOTt/7bk7f+25e7/seTu/7rl7v+z5e7/tOXu/7fl7v+35e7/seXu/7Xl\r\n        7v+y5O3/veXu/7rl7f/A5+7/v+bu/8Po7/+65u//wOfu/83o7f/G6O//w+jv/8Do7//B5+//x+nw/7/n\r\n        7//K6e//yOjv/8fp8P/J6PD/zenv/8Xp8P/K6vD/yOnw/8Xo8P/P6vD/zurw/8rq8f/H6fD/zOvx/8Xp\r\n        8P/O6vD/y+nw/83p8P/J6fD/zenv/83p8P/M6O//zOjv/8bo8P/B5+//yebt/8vl7f/J5e3/y+Pr/8rf\r\n        6f/N3ub/0tvk/9XT3v/Zz9v/36rN/+Rgrv/kRKv/5UKj/+WCs//mea//53mq/+eOtv/pfan/6H+r/+mA\r\n        rP/d6+5p3Ovv/9rr7//Z6+//1+vv/9Pq7//R6e//z+rv/8zp7//Q6e7/zuju/87p7//L6O//yOnv/8np\r\n        7//N6O7/yuju/8fo7v/E6O7/xOjv/8fn7v/G5+7/wefv/8Pn7//A5+//vOfv/8Pn7//F5+7/wOfu/8bm\r\n        7f+75u7/wOfv/8Hn7//G5uz/w+Xs/8Dm7v+75u7/u+bu/7vm7v+65u7/tubu/7rl7v+75e3/uuXt/7jk\r\n        7f+85e3/vOXt/7jk7f+35O3/ueTt/7rk7P+35O3/tOTt/7Hk7v+55O3/vOTt/7vk7f+65e3/ueTt/7Pk\r\n        7f+y5O7/uOXu/7bl7v+45u//uOXu/7zm7v+25e7/wObu/8Tm7f/C5e3/wObt/7jl7v/E6O7/uubv/8Dn\r\n        7v/F6O//xeju/8fp7/+95u7/seXv/8Po7//C6fD/yOnw/8jp7//M6e//wejw/8rp8P/G6fD/yenw/8bp\r\n        8P/K6vD/zOnv/9Hp8P/H6fD/yurw/9Pq8P/J6fD/zuju/83o7//N6e7/yejv/8zo7//K6O//y+bt/83n\r\n        7f/F5+//xuXt/8fl7f/K5ez/yuPq/83d5v/R1eH/ztjj/9LY4P/Xzdv/2bjS/9+Iwv/kLKb/5C+o/+RL\r\n        rf/lX6z/5HGt/+aCtP/mhLP/54+2/+l9qf/pkLj/6YWv/97r70bc6+//2+vv/9fr8P/V6/D/1evv/9Lq\r\n        7//N6e//zenv/8/p7v/P6O7/yeju/8vp7//K6e//y+nv/8/o7v/L6e7/zeju/8Xo7v/K6O7/yOfu/8bn\r\n        7v/F5+7/xefu/8bn7v+85+//vufv/8bn7v/A5u7/x+ft/7/m7v++5+//wOfu/7/m7f/D5u3/w+bu/8Hm\r\n        7v+35u//u+bu/7zm7v/B5u7/uOXt/7zl7P+35e3/ueXt/7Ll7v+65e3/r+Tt/7Pk7v+15O3/uOTs/7Hj\r\n        7f+85O3/ueXt/7Pk7v+75e3/s+Xu/7jl7v+55e7/teTu/7vl7f+55e7/v+bu/7nm7v+45e7/xefu/7vm\r\n        7v++5u7/uuXu/8jn7v/A5u7/yOju/8bp7//C5+7/z+ju/8Po7//C6O//v+bu/8fn7v/M5+7/y+ju/8Po\r\n        7//D6PD/zenv/8Hn7//C5+7/yejv/8fo7//O6e//yujv/8To8P/I5+//zeft/8To7//E6O//zefu/8fn\r\n        7v/Q5ez/zuft/87n7v/N5+7/xufu/8rl7f/M5Oz/yubt/8fk7P/J4+v/xuLq/8jc6P/J2uT/ztPg/9TI\r\n        2f/Tz9v/1sjW/9yZx//fSqz/4k+w/+Q2of/kMKj/5Ge0/+RwsP/lhbf/5nyz/+iGs//nibH/6Iqz/+iP\r\n        t//pi7P/3+zvHNvr7/7b7PD/1+zx/9fr8P/W6/D/0erv/8/q7//P6e//0Orv/8/p7//N6e//yenv/83p\r\n        7//L6e//zOrw/8np8P/O6e//x+jv/8jo7v/J5+3/xOfu/8fn7v/J5+7/y+bs/8Hn7v/D5+7/w+fv/8Ln\r\n        7//I5+7/wOfu/8Po7v/B5+7/w+bt/77m7v+45u//vebu/7rm7v+95u7/vebu/73l7f/A5e3/vuXt/7rl\r\n        7f+25e7/tuXu/7nk7f+45O3/t+Tt/7fk7f+w5O3/sOPt/7Tk7f+05O3/tOTu/6/k7v++5u7/uOXu/7vm\r\n        7/++5u7/uuXt/73l7f+45e3/uebv/8Ho7v+/5+//xunv/8Po7//E5+7/xuju/8Tn7v/E6O//wufv/8no\r\n        7//S6u//yejv/8Dn7//L6O7/x+fu/8ro7v/D5+7/y+jv/8Dn7v/G5u3/zujt/8nm7f/C5+7/y+fu/8Tm\r\n        7v/I5u3/xebt/73k7f/H5ev/x+Xs/7zl7v/I5e3/xOTs/8bj6//I5Oz/xOXt/8Xk7P/G5Oz/xOPr/8fi\r\n        6//G4er/xuDp/8fa5P/L1eL/zNDd/8/J2f/Wv9T/177R/9Ctzv/daLX/4CWg/+NIpP/jR6r/5kuh/+U4\r\n        ov/lb7X/5GKy/+aKt//nbqz/6H+w/+eIsv/pg67/6HOj/+qPt//d6/AG3ezv4dvs8P/Z7PD/1+vw/9Xr\r\n        8P/T6u//0erv/9Dp7//P6vD/0Orw/9Dq7//L6e//y+nv/8bp7//H6fD/y+rw/8zq8P/H6e//yeju/8zo\r\n        7v/G6O7/xujv/8To7//F5u3/v+fu/8Xn7v+/5+//xefv/8Dn7//M6O7/0Oju/8Tn7f/C5u3/wOfu/7/m\r\n        7v++5u7/vebu/7zm7v+65u7/webu/7/m7f+75e7/v+bu/7bl7v+25e3/tuTt/73k7P+55Oz/tePt/7rk\r\n        7P+64+z/uOTs/7Tj7f+55O3/t+Tu/7zm7v+z5u//u+bu/7vm7//A5+//vObu/73l7f/N6e//wunw/7rn\r\n        7//B5+//x+jv/8no7v/J6O7/z+nv/8vp7//R6u//xejv/8jo7v/C5+//x+fv/8jn7v+65u//xubt/8Tm\r\n        7f/L5u3/wOXt/8bl7f/B5O3/weTs/8Pj6/+94+z/w+Lq/7/h6f+/4Or/vd/p/8Lf6f+84Or/v9/p/8Lg\r\n        6P/B3+n/xd/o/8Lh6v/C4er/xeDp/8Hg6f/C3+j/xdzl/8nV4v/MzNv/0MHX/9S80//SutH/zpXH/9WH\r\n        uf/ecrL/3kil/+E+nv/hJ6D/4leo/+Rbrf/mQKT/5zSl/+Zosv/kcLX/52un/+diqv/mY6T/6JO5/+mC\r\n        rv/qhrD/6omz/wAAAADd7PCo2uzw/9ns8f/X7PD/1evw/9Xr8P/V6+//0+rv/9Lq8P/P6vD/z+rw/9Dq\r\n        7//Q6u//yunv/83p7//S6vD/0Orv/8vp7//H6O//yOnv/8jp7//D6O//xejw/83p7v/A6O//vejv/73o\r\n        8P/F6O//vufv/8Hm7f+65e3/w+bt/8bn7v/H5+7/xebu/8Lm7v/D5+7/t+Xu/73m7v+65u7/uObu/7zm\r\n        7v+95u7/vOXu/73l7f+95Oz/ruPt/7bk7f+z4+3/t+Tt/73k7P+25O3/u+Tt/7fk7v+95u7/u+bu/7bm\r\n        7/+65u//vufu/7vn8P/O6e//yefu/8Hn7/+25u//wujw/8np8P/K6fD/yunv/8vq7//D6e//x+nw/8jo\r\n        7//K6O//x+fv/8Hn7//L5+7/wubt/8fn7v/F5u3/weTt/8Ll7P/A5Oz/vuLr/7ri6//D4On/wN7n/7ve\r\n        6P+73ef/u9zn/7fc5/+32+f/udrl/7Ha5v+32eT/udjj/7rY5P+62eX/vNrl/7zb5P/B2uP/wdTf/8fN\r\n        3P+/0N//z8LX/8nE1//Oqcn/0pfA/9Vxtv/bT6H/33Ws/+J3sv/hQZn/4TGi/+NKp//jXqv/5GOm/+ZS\r\n        rv/nTaf/6DOf/+Zfsf/oW6L/53ax/+d9rf/ojbX/6n+r/+p4pv/rfa3/AAAAANzs717b7PD/2ezx/9fr\r\n        8f/X6/D/z+vx/9Xr8P/U6/D/0uvw/9Dr8P/Q6vD/0Orv/9Dp7//T6u//z+nu/8To7v/H6O//yOjv/8fn\r\n        7//D6e//xunv/8Tp8P/F6fD/xenw/8To7//B6O//x+jv/8Ho7/+35e7/kd/q/4bc6P+v4uv/yebt/8jm\r\n        7f/F5u3/vebu/77n7v+75u7/vuXt/7vl7v+25e7/vObu/7zn7v++5u7/v+bt/8Tm7f+15O3/wOXs/7jl\r\n        7f+95u7/vObu/7fm7v+75u7/ueXu/8Xo7/+65u//uebv/8Hn7v/B5+//wOfv/7zn7//J6e//yOjv/8rp\r\n        7//O6vD/wefw/8vq8P/F6O//v+jv/7/n7//K6O7/x+jv/8/o7v/N6O7/wObu/8Tl7f/J5uz/webt/8Pl\r\n        7P+94uz/teHr/77g6P+74On/td7q/7bd5/+42+b/r9rm/7PY4/+41uH/sdPi/7rP3v+0ytv/ssPY/7S8\r\n        1f+7vtX/uL7V/7i61P+7vdP/usXW/7280f/OocL/zp3D/8yexv/TjMH/0Ya9/9h1rv/bUJn/31id/+NM\r\n        m//hR5f/4V2m/+BVo//iVKH/5Eig/+RPqP/kXav/5kOm/+dcof/naa3/53+u/+d5qf/nirT/54av/+eR\r\n        t//qhK3/6mea/+uTuf9CR0cA2+zxEdzs8Ova7PD/2Ovw/9bs8f/S7PH/0ezx/9Lr8f/T6/D/0+vw/9Lq\r\n        8P/R6vD/0uvw/9br8P+75u3/h97p/63i6//J6e//z+nv/8rp8P/M6vD/xenw/8Lp8f/E6fH/yOrx/8fp\r\n        8P/E6O//v+fv/63j7f9By+D/Ksrf/0XM4P+P3un/uuXt/9Ho7f/H5u3/wOfu/8nn7v/I5+7/w+fu/8Hm\r\n        7v++5+7/vOfv/8Po7//F6O//xefu/7/l7f/F5u3/v+fu/8Dn7v+85u7/wufv/7vn7v+75u//vefv/7rm\r\n        7//J6O//zurv/83q8P/W6+//yOrw/8jp8P/L6e//yenw/8nq8P/L6fD/vejw/8fp7//I5+7/yefu/8ro\r\n        7//G5+7/x+fu/77m7v/G5u3/y+Xr/8Lj6/+34+z/wOHp/7jd6P+83Ob/s93o/7Tc5v+x2eb/s9Lh/7jI\r\n        2v+zxtn/wLjR/8Cnzv+/mcn/zY69/9WTuv/Ng7D/0oey/9eNtv/ShrH/03up/9CBsP/Ph7X/zGqj/8tw\r\n        pv/Obqn/1FGa/9k8jf/dX5f/202S/99poP/jSZX/5SB8/+Q1jf/iPpH/4kOg/+VAmv/oM5L/5mCm/+Vg\r\n        rP/mXqv/51Cl/+ZjrP/mi7T/5YS0/+eLsf/oiLD/6Iy1/+l5pP/ph7H/6oew/wAAAAAAAAAA2+3wh9rs\r\n        8P/Z7PD/1uzx/9bs8f/T7PH/0+vx/9Ps8P/P7PL/0+vw/9Pr8P/U6/H/v+jw/2/c5/8tz+H/hNjl/7rm\r\n        7v/P6/D/zurw/73p8P/G6fH/yOnw/8Tp8P/J6vH/wunw/8zp7//K6e//tuTt/0jL3/8Zv9j/GL3W/ybB\r\n        2P9k1eT/nODr/7nk7f+95u7/w+bu/7rm7//C5+//wObu/73n7//B6O//uubv/7/o7//E6O//xufu/8Pm\r\n        7f+35e7/t+Xu/8jo7v/H6fD/vujw/87q8P/A6O//xefv/87p7//M6/D/wenw/87r8P+96PD/yunw/8rq\r\n        8P/K6vD/xunv/8Xo7//C5/D/zOnv/8bn7v/J5+3/xefu/8Pn7v+85e7/vOXt/8Ll7P+84uv/wODq/7bd\r\n        6P+43Ob/uNrl/7fY4/+20+D/scfc/7utz/+8kcD/yoS2/9OMt//Ve63/3YCv/9x2p//cXpf/3XCi/9t0\r\n        pf/be6r/3ISv/9x0pP/chbH/3Hmo/9xpn//aZZz/2GGW/9NQjf/YM4P/2lCR/9xUj//caqD/3mif/+Nh\r\n        nv/mM4X/5UGR/+Jop//jc6z/5j+Z/+dsov/nXaT/51Cg/+d7q//mX6T/53Op/+WMtP/ljbP/54Ss/+eE\r\n        rv/oha//6X+q/+mIsf/qgq7/AAAAACgqKwDa7fEY2u3x8dns8P/Y7PH/1+3y/9bs8f/V7PH/0ezy/9Ps\r\n        8f/S6/D/1evw/8zq7/+I4Or/ONDh/zLN3/9y1OP/uOXu/8zq8P/N6vD/yOnw/8Xp8P/I6vD/x+rw/8Xp\r\n        8P/G6fD/zenv/8jp8P/J6O7/c9Pj/zLG2/8kwdn/FbbT/y7H2/87zuD/idnm/7nj7P/S5+3/uObv/7zn\r\n        7/+75u//vebu/7bm7/+/6O//vOfv/7rn7//G6O//zejt/8Xm7v/L6O//xufv/8Xp7//B6PD/y+rx/8vq\r\n        8P/T6vD/zunv/8fq8P/A6PD/yurx/7rn7//P6fD/x+rw/8Tp8P/B6O//zunv/8vo7/+95u//yufu/8Xm\r\n        7v+95+//u+Xt/8Hj7P+64+z/uuHr/7rf6f+y3ef/t9rl/7LY5P+1zd7/sbjU/8WWvf/Leqn/2IGw/9hy\r\n        o//ZfKr/23Ok/95kmP/gbKD/4WSc/+Frnv/hZZj/4HOk/958qv/ee6r/332r/995qf/eeqn/3nSl/+B3\r\n        qP/dXpX/2mCX/9dTj//YU4//3W+k/91Tkv/gb6H/41SW/+ZHjP/lUJH/4m6o/+R6qf/mdKf/5nyo/+dy\r\n        p//pYJb/6HKi/+eDrv/nha3/5pC1/+SHrv/lhKz/5oaw/+iLs//og67/6Iuz/+iGsP8AAAAAAAAAAAAA\r\n        AADb7fGN2+3w/9rt8f/W7fL/1e3y/9fs8f/U7fL/0ezy/9Ts8f/W6/H/mOHr/znQ4f8wzN7/Nsrd/2HQ\r\n        4f/I5+7/0+vw/9Dr8f/N6vD/yenv/8fp8P/I6vH/x+nw/8Tp8P/I6fD/yurw/8zp7/+04ev/U8nd/y/G\r\n        2/8mwdj/Ib7W/x691v84yNz/jdfl/8nm7f+55u//wOfv/7nm7v+85u7/tObv/8Dn7/+45u//vufv/7/m\r\n        7//E5u7/yejv/8Xo7//X7PD/wunw/87r8P/L6vH/xOrw/8rp7//T6u//0uvw/8jq8P/J6vH/zenw/9Dq\r\n        8P/B6PD/w+jv/8jo7v/O5+3/x+ju/8Dn7//H5u3/ueTt/77i6/++4ev/uuHr/7vh6v+23uj/sNrl/7rV\r\n        3/+8x9j/v6TI/82Quv/TdKX/2m2e/9xZjf/fdaX/3l+V/957q//ffKv/4nOl/+Nkmf/jYpb/4YKv/+Jr\r\n        n//hdKX/4Hyr/9+Arf/ffav/34iy/96Brv/egq7/32ad/992p//fZ53/21+X/9hIh//cWJT/4DZ//+F1\r\n        pv/jXpn/5VaX/+VVlv/kfK3/6FyP/+Z0ov/kha//5Yav/+d+qf/nfqn/5YWu/+d2ov/mf6r/5YGs/+aI\r\n        r//lgar/53+q/+eGsP/niLH/5421/wAAAAAAAAAAdYCHANzs8BHb7fHl2u3x/9nu8v/X7fL/1+3y/9Lt\r\n        8v/S7fL/1Ozx/9Pr8f913Of/M83f/z7N3/8+xNv/ndzn/8jn7//U6vD/yuvx/9Lr8P/R6e//xujv/8rp\r\n        8P/L6fD/xOnv/8zp7//G6fD/zurw/83o7/+14Or/iNTj/27L3v9kzd7/T8nc/1DH2/9Vzd//tuHr/73m\r\n        7v+/5+//yuju/77l7f+/5+//xOnw/8Po7//G6O//yunw/8/p7//J6O//x+nw/8bp8P/F6PD/vujw/8vq\r\n        8P/F6vD/wujv/9jr7//C6PD/yOrw/8Ho8P/R6vD/y+nv/8fo7//J5+7/yOfu/8fo7v/B5+//veXu/8jk\r\n        6//H4un/x+Hp/8Xh6f+33un/tdjl/7bT3/+6uc//zJq6/9J/rf/YVo7/2mac/911o//ec6L/4Gud/+Ji\r\n        mv/iXJP/4nuq/+F4qP/idab/42Wa/+JvoP/hcKT/4Xmp/+Fuof/geqr/4IWw/+CCr//eeaj/34ax/957\r\n        qf/fe6n/4Huq/+B4qf/gZp3/3GKZ/9tfmP/gWJP/4leO/+JvoP/kc6b/5W+i/+R/rv/oVZH/5Xej/+WD\r\n        rf/kh7D/6HSi/+d6p//mga3/53qm/+d9qf/ngaz/5n6p/+WNtP/mjbP/5oOt/+WIsP/nkrj/AAAAAAAA\r\n        AAAAAAAAAAAAANnt8Vfa7fL/2u7y/9fu8//X7fL/1u3y/9Xt8v/W7fL/x+rw/3Hc6P9Rz+D/eNXj/6Lc\r\n        5/++5Oz/1Orw/9br7//B6fD/y+rw/8zq8P/L6e//xOnw/8rq8P/L6vD/zOrw/8fp8P/O6vD/yuju/9Ho\r\n        7v/J5uz/t+Ps/8Lk6/+44ur/tOHq/5jZ5f+74+v/w+fu/83p7//F5+7/zOjv/8jo7//G6fD/xunw/7zo\r\n        8P/I6vD/zevw/8jp8P/I6fD/v+jv/8To7//L6fD/xejw/8Hn7/+65u//yenv/8bo7//A6O//vefv/87p\r\n        7/+85+//zejv/8/o7v/G5u7/w+bt/7zk7f+84uv/v+Hp/8Dg6f+13un/t9zm/7bV4f+7ttP/vJS//8xo\r\n        nP/YaZz/3V2R/+BWjf/gWo//33Kj/992pv/jb6L/42+i/+Rdkf/jY5r/4mGY/+NnnP/ja5//4n+s/+J0\r\n        pP/ifKv/4nGi/+F3p//hfqz/4H+s/+CCrv/ghrH/4IKv/99/rf/ghbD/4HWm/+F3qP/hbKH/3mmd/91f\r\n        l//hXpX/42GX/+Vwov/lapz/5X6r/+Zyov/mcqD/5Hyn/+WGsP/nfqn/53Cg/+d3pP/na5z/53uo/+Zt\r\n        m//mgq3/5YSu/+aKsP/ngaz/55S5/+eHrv8AAAAAAAAAAAAAAAAAAAAA2/DyAtnt8qvZ7fL/2e3y/9nt\r\n        8v/W7fL/1u3y/9Xt8v/R6/H/oeHq/6/h6v/G5uz/0enu/9fr8P/W6/H/0+vw/87q8P/P6/H/0ezx/9Lr\r\n        8P/K6e//zOrw/8zr8f/K6vH/wujw/8bq8P/O6u//zunv/9Pp7v/Q6vD/1evw/8vq8P/M6fD/1Ovv/83p\r\n        7//O6e//yunv/8vq8P/I6vD/1uzx/8Po8P/B6fD/yurx/8Tp8P+65/D/uufv/9Pq7//F6PD/yunv/8Dm\r\n        7v/J6fD/yerw/8rp8P/J6e//zunv/8vo7//L6e//zenv/8To7//L6O7/x+bu/8fm7f/D5Oz/w+Lq/8Th\r\n        6f+/3+j/wt7m/7TT4v+0vdb/xpS+/9Bqn//XdKX/23Oj/955qP/hZ5r/40uC/+NlmP/iR4L/4nKk/+Rp\r\n        nf/kYZf/5Wia/+Vjmv/lZ5n/5XKi/+Nrnv/jZJv/4n2s/+JonP/hcaT/4oGv/+Nnnf/ic6X/4YOw/+F1\r\n        pf/hgKz/4Xqp/9+Crv/hgK7/4nWm/+Jnn//ibqL/3Web/+E5ef/jaZz/5W2d/+Vvnv/kfKf/52SU/+dr\r\n        nf/mfqr/5Xin/+hQhf/mb6D/5nil/+dfkv/ngqz/52GS/+Z7p//lfqr/5nai/+eCrf/mfaj/54mx/wAA\r\n        AAAAAAAAAAAAAAAAAACAi4QA2ezxGNrt8uTa7vL/2u7y/9ju8v/V7fL/2O7y/9ft8f/P6/H/0+vw/9fs\r\n        8f/X7PH/2Ozx/9bs8f/S7PH/y+rw/9Hr8P/Q7PH/zuvx/87r8f/L6/H/v+rx/8bq8f/M6fD/w+nw/8jp\r\n        8P/L6e//zurv/8/p7//J6e//xunw/8vq8P/Q6/D/wejw/9Hr8f/U7PD/0uzx/8Tp8P/O6/H/zOrx/83r\r\n        8f/F6vH/yerw/8fq8f/T7PH/z+rw/8Tp8P/N6vD/1Ovw/9Ps8P/B6vH/zurx/8Xp8P/M6vD/zunv/8Pp\r\n        8P/N6e//v+fv/8bn7f/J5u3/wuTt/7/j7P/A4er/t9zo/7jU4v+6utP/uZfA/8x6p//Wc6P/21+S/9xp\r\n        m//dapz/3m6i/+B0pP/jXpP/5F6T/+RpnP/kbqH/5EiC/+Rzo//kdKX/5WGV/+RjmP/jeKj/5GCV/+Nr\r\n        nf/ieKj/4lWM/+GBrv/ifaz/5IGt/+Non//kfKv/43mp/+N+rf/jga7/44Wx/+OArP/jeqj/5HWm/+R6\r\n        qv/id6f/32CT/+Nzo//kWZD/5Xim/+R4pP/ldJ//5Xej/+RmmP/lfKf/52GU/+V/rP/mcqH/5naj/+Z9\r\n        qf/lfqr/5n6o/+RrnP/kibH/54mx/+eLs//okbj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/oi9vu\r\n        8v/Z7vL/2e7z/9nt8v/Z7fL/1e7y/9ju8v/U7PL/1Ozy/9Ts8f/T6/D/0u3x/9Pt8v/S6/H/0evw/8rr\r\n        8f/L6/H/zOvx/87r8f/M7PL/0Ovx/9Tr8P/N6/H/zevx/9Hr8P/S6/D/zOnv/8zp8P/H6fD/xOnw/9Ts\r\n        8P/J6vD/zuvx/9Dr8f/S7PH/y+vx/9ru8v/Y7fH/2O3y/9Xt8f/K6vD/y+rw/9Ps8f/U7fL/0+zx/9Hr\r\n        8P/O6/D/zuzx/8Pr8f/P7PH/yurw/8Ln7//G6O//wejw/8ro7//D5u3/veXt/8Dj6//F4+v/wuHp/7fa\r\n        5f+2xtn/xJS7/8ltpP/UWY7/2XKg/9t0pf/eX5T/3mue/957qv/eZ5z/4HWn/+Nrnv/jW5D/42+h/+Rr\r\n        n//lUIf/5GOY/+Rnm//kW5D/5E+H/+N8q//jc6L/4nqp/+J7qf/kaZz/43ys/+N1pv/lYpv/5X6t/+Z+\r\n        rf/lfqz/5Xao/+WDsf/kgrD/5Xip/+WBrv/kear/5Xao/+V7qv/hdqX/41SJ/+Nxn//keqf/436q/+KB\r\n        rf/jeaX/43Si/+VunP/mcKH/5nai/+Vbjv/kgq3/5mqc/+Vtn//kgKv/5HOg/+SErv/ne6j/54aw/+aT\r\n        uP8AAAAAAAAAAAAAAAAAAAAAAAAAAOW9zgbots7Z4N3n/9ru8//Z7vP/1+7z/9vu8v/Y7fL/1+7y/9bu\r\n        8//T7fL/1Ozy/9Ts8f/T7PH/y+zy/9Xt8v/U7fL/0+zy/9bt8f/N6/H/1O3y/8br8f/c7vH/0evx/83r\r\n        8f/P7PL/yOvx/9bs8f/O6e//zenv/8zp8P/S6/D/2O3x/8Pp8f/P6/H/1+3x/9bt8v/Y7fL/1+7y/9Ht\r\n        8v/N6/H/0ezx/9ru8v/X7fH/2O3x/8vs8v/S7fL/2O3x/9nt8v/L6/H/wenx/8vr8P/N6vD/y+nv/8fo\r\n        7//I6O//vuXu/7zk7f/J5Ov/wOHq/8Th6f/A1+L/xa7J/9CFsP/Td6b/2nuo/9tunv/baJv/3Gqc/95o\r\n        mv/fa57/32md/+Fzpf/iap3/5FSM/+VrnP/jYpf/5FeO/+Rllv/kX5X/43em/+R1pP/kd6b/42ic/+Jl\r\n        mf/jdKb/436s/+Vjmf/lbaL/5nKm/+drn//meqz/52ig/+dwpP/od6n/6Ye3/+iHtP/oeqr/6Y25/+eI\r\n        tf/mg7H/53qp/+N5qP/gY5P/4XCf/+GBrP/igaz/4n+r/+N8qf/igKz/43+q/+Ztnf/mZJf/5HGe/+WA\r\n        q//me6n/5YCq/+Vtnv/keKX/5IGr/+dunv/ngaz/5YGt/wAAAAAAAAAAAAAAAAAAAAAAAAAA6LHLQuiv\r\n        yv/nrMn/3+Lq/9vv8//Z7vP/2u7z/9nt8v/Y7fL/1e7z/9fu8//a7fH/2O3x/9jt8f/V7fL/1+3y/9Tt\r\n        8v/a7vP/1uzx/9Xs8v/Y7vL/0ezy/9ju8v/S7PL/2e3x/87s8v/P7PL/zuzx/9Lr8P/Q6/D/1ezx/9nt\r\n        8f/Q6/H/1ezx/9ft8f/O6/H/1O3y/9ft8v/O7PL/1O3y/9jt8v/d7vL/zezy/8zr8f/b7vL/zezy/8Pq\r\n        8f/X7PD/zurx/8Lp8f/L6vH/w+nw/8fp8P/L6e//xefv/77n7v/F5Ov/xuLq/8Pg6v/G3uf/xsHV/8SB\r\n        qv/SVoz/2nup/9t3p//cXJH/3m6f/954p//fga7/4HOk/+Fsnf/jbKD/43ip/+VonP/mW5D/5VeP/+Rh\r\n        lP/kcaP/5Hmp/+Rpm//kcqL/5Gue/+R5qf/kfa3/5XOk/+RXj//ngrH/52yh/+d0p//peKr/6ou3/+qI\r\n        tv/qjbj/65vC/+yYv//rkbr/65e8/+uYvv/roMT/6pG5/+mVvP/ojbf/5n+s/+Bxnv/hc6H/4YGs/+J1\r\n        of/jfar/4num/+J8qv/ifKr/5Wyb/+Z3pP/kc6D/5XOi/+Vyov/leqb/5XSi/+Rsm//je6f/5oCq/+Z9\r\n        qv/mlrv/AAAAAAAAAAAAAAAAAAAAAAAAAADossuf6KrH/+eewf/mpsb/3uTr/9vu8v/a7/P/2u7y/9nu\r\n        8v/a7vL/1u7z/9ru8//Y7fL/2+7y/9nt8f/X7vL/2O7z/9bu8//c7vP/2O7y/9Lt8//Y7vP/2u7z/9Xt\r\n        8//i7/P/3O/z/9Xu8//W7vP/1e7y/9Ds8f/V7PL/0+zx/9bt8v/U7fL/0+zx/93u8v/V7PH/yerx/9zv\r\n        8v/J6/L/1u3y/9fu8v/X7fL/2e7y/9Hs8v/O7PL/0+zy/9Ls8f/Y7fH/0Ovw/9Dq7//L6e//w+jv/87p\r\n        7v/J5+7/w+Xt/8fk7P/E4Or/wMvc/8KuyP/Rf63/2mya/95ejf/dcqT/32qf/+Fzov/gYJj/4GOZ/+Fn\r\n        nv/jb6P/5GKY/+U4eP/lT4r/52SZ/+dSjP/nYZb/5nmp/+VXj//lear/5V6W/+dqnf/ndaX/54Kx/+dy\r\n        pv/ofq3/6G+h/+qMuf/qear/6nut/+yZwP/sibX/65O5/+yavf/slbn/7J2+/+uPr//pjKr/6Zi2/+eU\r\n        sf/leqP/54eu/+mOtf/nh7H/44Cs/99tnP/hf6n/43yp/+OCr//kZ5j/42ma/+Jzov/lb6H/5GmZ/+J5\r\n        pv/ke6f/5XCd/+R5pv/kfaj/43ej/+N4pf/lcKD/5oOs/+WKsv8AAAAAAAAAAAAAAAAAAAAA6LLLC+iu\r\n        yenprMj/6aPF/+ecwP/lo8P/3ePr/9vu8v/Z7vP/2e7y/9fu8//Y7vP/2O7z/9ju8//X7vP/2O/0/9rv\r\n        9P/c7/T/3e/z/93w8//c7/P/2O/z/9ru8//Z7vP/2u/0/93v8//c7/P/1u7z/9zw8//M7PL/4vDz/9ju\r\n        8//c7/P/3vDz/9fu8//b7/P/2e/y/9ju8v/U7fL/2O7y/8vs8v/W7vL/z+3z/9Ht8v/X7vP/1e3y/8br\r\n        8v/T7PH/z+rx/8rq8f/H6fD/xenw/8To7//B6O//xufu/8bl7f+74uz/wd3o/8rC2f/RhrX/1F6R/9tq\r\n        m//ecaD/4X2s/+N0pf/jaJ7/5HWo/+V1p//lUYz/5m2i/+Vrn//nfq3/6E6G/+hsnf/pYpj/6XCj/+hS\r\n        jP/odKb/6IGt/+iFsv/pkLn/6nel/+psnf/qfKn/6nup/+uSt//rhbD/7JG4/+uBqf/rhqv/66C5/+mc\r\n        tf/pr77/6cHM/+jHzv/o0tb/5tTZ/+XV2f/j09j/3snP/9Orvf+/WYr/wzxk/+V4o//khLD/4Haj/+J1\r\n        ov/jbZ3/5Xel/+VjlP/japr/4nOj/+Rtn//kZpf/43up/+R0of/kdaL/5Gmc/+Rwnv/jhK//43Oj/+R9\r\n        qf/lh6//5Y20/wAAAAAAAAAAAAAAAAAAAADpsMtH6q/K/+msyf/pn8H/5p/B/+aSuv/mmbz/3uLr/9vu\r\n        8v/a7vP/2u7y/9vu8v/b7/P/2+/z/9rv8//Y7/P/2O/0/9jv8//c8PT/1+/z/9jv8//T7vP/1+7z/9zv\r\n        9P/c8PT/3e/0/9zw9P/W7/P/2/D0/9vw9P/e8PT/3vD0/9nv8//f8PT/2u/z/9zv9P/W7vP/z+3z/87t\r\n        8//Y7/P/0+7y/9Pu8//J7PL/1+3z/9Tt8v/T7fL/zOzx/9Ts8f/Q6/H/0ezw/8vq8P/J6fD/zuju/8bn\r\n        7v/I5e3/xuXs/8rf6f/Rwtj/3Im3/+GLuP/ib6D/42SX/+R7qf/ka6H/526f/+dXkf/piLT/52+j/+mA\r\n        rf/nbaH/6H6r/+p+q//pa5z/6pe+/+qBrf/rfKn/6maW/+tzn//rdqP/6m6b/+uHrP/qe5//6YGg/+mW\r\n        q//pq7v/6LbE/+jBy//oztX/6Nbb/+ja3f/p3d//6d/h/+rh4//q4uT/6uPk/+rk5P/q5OT/6uPk/+nh\r\n        4v/m29z/3crP/8OCn/+lGUL/22qT/+SKs//hhK7/4lyL/+VtnP/mZpf/5Wmb/+N1o//ieaf/5meY/+Vt\r\n        nf/jeab/5Guc/+RyoP/mfan/5G6d/+OCrf/jdKT/5Xej/+WErv/llbj/AAAAAAAAAAAAAAAAAAAAAOy6\r\n        0ZfrrMn/6qPE/+mgwv/mnMH/55vA/+iSu//mmL7/4Nvl/9vu8v/c7/L/2u7y/9vv8//a7/P/2+/z/93v\r\n        8//d7/P/2O/z/9vv8//U7vT/1+/0/9bu8//Y7/T/2e7z/9bv8//a8PT/2/D0/9Tu8//V7vP/1O70/9vw\r\n        9P/g8PX/2+/z/9zw9P/X7vP/4PD0/9ju8//d8PP/1u7z/9bv9P/W7vP/0O3z/8/t8//T7PH/0+3y/87s\r\n        8f/M6/H/z+rw/87q8P/Q6e//wujv/8fn7v/I5u3/xuXt/8nk7P/K4er/17nU/+B+qf/ljrX/6JK7/+eK\r\n        sv/pirP/54Sv/+l4pP/pcaL/6mKU/+p7pf/qbJ7/64Kr/+lynf/peZ7/6YOh/+mOq//opb7/6KvA/+ev\r\n        v//nt8L/5r/K/+bJ0P/n1Nr/5trf/+fd4f/o3+L/6eHk/+ni5P/p4+T/6uTl/+rk5f/r5eb/6+bm/+vn\r\n        5//s6Oj/7Ojo/+zo6f/s6On/7Ojo/+zo6P/s6Oj/6+bm/+nh4P/h09T/y5m3/6sxYv/hhKr/5Y20/+N/\r\n        q//hbpv/5Wyb/+Vgkv/maZr/42CU/+V2pf/mYJP/5G6d/+R2pf/kc6H/5XOi/+ZjmP/lXpL/5HCg/+R8\r\n        qP/ld6X/5YSs/+aFr/8AAAAAAAAAAAAAAAAAAAAA7a/MzO2ryv/tp8f/66jI/+igxf/nmcD/6pS//+uT\r\n        vv/pmcD/5cfb/93r8P/a7/P/2+/z/93v8//b7/P/2u/0/93v8//d7/P/2+/z/97v8//b7/P/3vD0/9rw\r\n        9P/b8PT/3fD0/9jw9P/c8PX/2/D0/+Lw9P/h8PP/2e/z/9vv9P/c8PT/3/H1/97x9P/j8fT/1+/0/9Lu\r\n        9P/Z7/T/0+7z/9nv8//V7vP/0u7z/9ft8v/S7PH/y+zx/87r8f/R6/D/zenv/8vo7v+/5u7/xOXt/73j\r\n        7P/H5e3/yOHq/9XG2P/ggKb/31SG/95zl//bYIn/1mWI/9Bpif/IXX3/vE5t/7FEZP+pOlb/nzdO/4sp\r\n        P/96Kz3/u5qx/97P0v/j2t7/5t3g/+ff4f/o4eP/6ePk/+nl5v/q5eb/6ubn/+rn6P/r6Oj/6+jo/+vo\r\n        6P/s6en/7Onp/+zp6f/s6er/7Orq/+zq6v/t6ur/7erq/+3r6v/t6+v/7evr/+3r6//t6+r/7erq/+zp\r\n        6f/r5+f/6eHi/+HQ1f/Lm7r/zYWr/+aStP/mi7P/44Ks/+Jtm//kXo//5Wub/+VhlP/kYJL/5lKJ/+Vu\r\n        nv/jcqH/5Gqb/+ZrnP/nbJ3/52OW/+Vwn//lapv/5Xum/+Z1pP/ncqD/54Ss/wAAAAAAAAAAAAAAAAAA\r\n        AADusMqL7q/L/+6tyv/trsz/7K3M/+ykx//tl7//7Z/E/+yZvv/rncP/6KXE/+DZ5P/a7/P/2u/z/9vv\r\n        8//b7/P/2+/z/9zv8//a7/P/2u/z/9/w9P/c8PT/3vH1/97w9P/h8fX/3/H1/+Dx9f/g8fX/5fL1/+Px\r\n        9P/c7/T/4PH0/9nw9f/U7/X/3fH1/9zw9P/Z7/T/1u/0/9vv8//e7/P/2O70/9rv8//P7vP/1e3y/8vr\r\n        8f/P6vD/xunw/8To7//K5+3/xOXs/8Xm7f/I5ez/v+Lr/8Pi6//I4On/qb3H/1FIVP9BKC//NyYr/ykm\r\n        J/8dJiX/HCcm/yAoKP8mKir/Kisr/ywrK/8rKir/Kigo/yYiIv9fU2X/2dLZ/+fj4//p5ub/6+fn/+vo\r\n        6f/r6er/7Orq/+zr6//s6+v/7evr/+3r6//t6+v/7evr/+3r6//t7Oz/7ezs/+3s7P/t7Oz/7ezs/+3s\r\n        7P/t7Oz/7ezs/+3s7P/t7Oz/7ezs/+3r6//t6ur/7Ojp/+vl5v/n3N//3cXP/9anv//mqcT/53+q/+aM\r\n        tf/kgKv/4HOg/+N4pP/lZpX/5Wib/+R+q//mWo3/5Wyd/+Rsnf/lZpj/5lqP/+Zkl//lbJz/5XSj/+ZY\r\n        jv/lcqD/5nqn/+hqmf/ndKH/AAAAAAAAAAAAAAAAIR0eAO6yxgbvscdB77zPnOq+zv/hm7H/4omm/+N8\r\n        oP/kjqn/436g/+KCov/cdJb/0nGT/8KaqP/G3OL/2u7y/9vv8//c7/P/3O/z/93v8//b7/P/3/Dz/9zv\r\n        8//c8PX/3/H0/9/w9P/g8fX/5fL1/9jw9f/e8fX/5vL1/+fy9f/i8vX/3/H1/9/x9f/c8fX/2vH0/9Pu\r\n        9P/Z7vT/3u/z/8/t8//O7vP/0O7z/8ns8v/K7PL/0ezx/8nr8P/O6u//y+bu/83n7f/K5e3/yOTr/8Tj\r\n        7P/B4ev/sNHd/3iPnP8uOUP/LDU8/y81OP8xNTf/MTM0/zI0Nf8yNDX/MjM0/zIzM/8yMjP/MjIz/zEy\r\n        Mv8xMTH/MTAw/ysnJ/+tqbP/6Obn/+vq6v/s6+v/7ezs/+3s7P/t7Oz/7ezs/+3t7f/t7e3/7u3t/+7t\r\n        7f/u7e3/7u3t/+7t7f/u7e3/7u3t/+7t7f/u7e3/7u3t/+7t7f/u7Oz/7ezs/+3s7P/t6+z/7evr/+3p\r\n        6f/s5uf/6eDh/+PS2f/gvND/5KvF/+ibvf/ojrX/5oiy/+SEr//gcKD/5G+d/+ZelP/lapv/42OY/+R2\r\n        pP/kbJ3/5F2S/+N5pv/mbJ3/5VqO/+Nsnf/kcaD/5HCf/+N5pf/lfKf/52qX/+Z/q/8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADz8vFJyMXG/1tbW/9LS0v/Q0RE/z09Pf84OTj/MzU0/zAxMf8tLS7/LCst/y80\r\n        OP+DmqL/xt7k/9ju8v/b7/P/3vD0/93v8//e7/P/3+/0/97w9P/g8fX/3fH1/+Hx9P/c8PT/1u70/9Xv\r\n        9P/X7/T/1+/0/9jv9P/c8PX/3PH1/9fw9P/X7/T/1e7z/9Ds8v/P7PL/0uvx/83s8v/N7PL/y+rw/83p\r\n        8P/G6O//x+fu/9Hn7f/P5u3/zeXs/8jk7P/F4uz/wuHr/63I0f9Za3f/LTg9/zE5Pv80OT3/NDk8/zU5\r\n        O/81ODv/NTg5/zU3OP80Njf/NDY2/zQ1Nf80NDT/NDQ0/zMzM/8yMjL/MjEx/2Fgaf/i4eX/7Ovq/+3s\r\n        7P/t7e3/7u3t/+7u7f/u7u3/7u7t/+7t7f/u7u3/7u7t/+7u7f/u7e7/7u3t/+7t7f/u7e3/7u3t/+7t\r\n        7f/u7e3/7u3t/+7t7P/u7Oz/7evs/+3r6//t6en/7Ofn/+rg4v/m1dr/5sPT/+u50v/qlLj/54+0/+eC\r\n        r//nh7H/5ISu/+Num//kapr/5l+P/+VRh//kcaH/5Gaa/+Zklv/jX5L/5WCR/+Zhlv/lYpT/5HWk/+Ns\r\n        nP/jcaD/42yb/+RyoP/jeKL/5oWt/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPX09V+ioqH/XFxc/1JS\r\n        Uv9LS0v/R0dH/0RERP9CQkL/Pz8//z09Pv88PD3/Ozs9/zg6PP8sQEj/ip6m/9Hk7v/Z7vP/2+/z/93v\r\n        8//e7/T/3/D0/9/w9P/c7/T/3vD0/9vv9P/k8PT/3u/z/93v8//a7/P/2+/0/9vv9P/U7/P/1e7z/83u\r\n        9P/R7PH/0+zx/9Dr8f/Q7fL/0e3y/9Ls8v/U6/D/1erv/9Hn7v/K5+7/z+fs/87l7P/F4uz/yeHr/7/c\r\n        6v+NscL/N0hZ/zE9RP81PEL/OD1A/zg7Pv84Oz3/Nzo8/zc5O/83OTr/Njg4/zY3OP82Nzf/NjY3/zY2\r\n        Nv81NTb/NDQ1/zMzM/8yMjL/Li0s/8PCy//r6+v/7e3t/+7u7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7u7u/+7u7v/u7u7/7u3u/+7t7f/u7e3/7u3t/+7t7f/u7Oz/7uzs/+3r7P/t6uv/7Onp/+zm\r\n        5//q4OL/5tXb/+bD0//rtM3/66XE/+mDrv/ohK//6IOx/+iMtv/kfKj/4WqZ/+Jtnf/kZ5j/5HOk/+R6\r\n        p//mYZT/5z96/+RwoP/lTYL/5Gyf/+Rsnf/jYpf/422d/+Nvn//hdaH/4nel/+F/qP/lcZ7/AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA8fDxdHx8fP9aWlv/UVFR/0xMTP9ISEj/RUVF/0NDQ/9BQUH/Pz9A/z0+\r\n        P/88PTz/Ojs8/zU6Pf8lMDr/mqfE/93m7P/g7PH/3u7z/9zu8//d7/P/3vD0/9/w9P/f8PT/3/D0/9/w\r\n        9P/d7/P/3e/0/9rv9P/b7/T/3e7z/9ru8//T7fL/0uzy/8/s8v/O7PL/0+zx/9Dr8f/P6/H/z+rw/9Hq\r\n        7//V6O7/0uft/8/l7f/R5Ov/0OTs/8ri6//I3en/y9nm/2Fzhv84Q0n/OkJF/zs/Q/87P0L/Oz5A/zs9\r\n        Pv86PD3/Ojs8/zk6O/85OTr/OTk6/zg5Ov84ODn/Nzc3/zY2Nv81NTX/MzQz/zMzM/8yMjL/lZWh/+rp\r\n        6//t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7t7v/u7e7/7u3t/+7t\r\n        7f/u7e3/7uzs/+3s7P/t6+v/7erq/+zo6P/r5OX/6d7h/+fS2v/mwdL/7LPO/+yev//plrn/6I2z/+iT\r\n        uv/piLL/54Gu/+SFr//fcJ7/4XOh/+Rsm//kbZ7/5V+T/+Zek//mVon/42+g/+Nllv/jZ5n/5GGU/+Nm\r\n        mP/ja5v/4W6f/+B4pf/hcqD/4XWh/+R8p/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf3t9/cHBw/1pa\r\n        Wv9SUlL/TU1N/0lJSf9GRkb/RERE/0JCQv9AQUH/Pz8//z0+Pv87PDz/ODs7/y01O/9meJT/2+Hq/+jr\r\n        7//s7/H/6e/y/+Tv8//h7/P/3+/z/9/v8//g7/P/3u/z/9rv9P/b7vT/2u7z/93u8//c7vP/3u/z/9rv\r\n        8//a7vP/0e3z/9Dt8v/T7fH/0e3y/9Hs8v/R6/H/z+ju/9Pl7P/T3uj/z9zp/8/W5P/Q1eP/1NXk/9vb\r\n        5v/r6+7/bHB3/0BGTP8/REb/QENF/z9BQv8+QEH/PkBB/z0+P/88PT3/PDw9/zs8Pf86Ozz/OTo7/zk5\r\n        Of83ODj/NjY2/zU2Nv80NDT/MzMz/zIyMv9qa3j/5+fq/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u\r\n        7v/u7u7/7u7u/+7u7v/u7e3/7u3t/+7t7f/u7e3/7uzt/+3s7P/t6+v/7erq/+zo6f/s5uj/6uHj/+fZ\r\n        3v/qzdr/68HU/+yyzP/tpMT/6o60/+mEr//pm7//6Iiz/+iJs//njLX/5IOu/990ov/gdKL/42aX/+VZ\r\n        kP/mUon/5HSl/+NekP/idKP/4WiZ/+JxoP/iV43/42SX/+FrnP/gb6H/4WeX/99sm//gc5//4YGo/wAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAM7Oznxra2v/WVlZ/1JSUv9NTk7/SkpK/0dHR/9FRUX/Q0ND/0FC\r\n        Qv9AQED/Pj8//zw9Pf85Ozv/NDc5/ztLYP/O2Ob/6ezu/+3w8f/t8PL/7fDy/+3v8v/s7/L/6O/y/+Xv\r\n        8v/k7vL/4u7y/+Dt8v/e7fL/3ezy/9vs8v/Z7PL/1+3y/9Xt8v/V6/H/1Ovx/9Lp7//T5u7/0uPs/9Td\r\n        6f/U1OP/1cXb/9S41f/QstL/16fM/96fx//ft9f/7ufs//Dw8f9zbXT/RklN/0VISf9DRUb/QkNF/0FD\r\n        RP9AQkP/P0BA/z4/P/8+Pz//PT4//zw9Pf86Ozv/Ojo6/zg5Of83Nzf/NTY2/zU1Nf8zMzP/MjIy/zs7\r\n        RP/h4ef/7ezs/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u3t/+7t7f/u7e3/7uzs/+7s\r\n        7P/t7Oz/7err/+zo6f/r5uf/6uLk/+jc4f/m09v/6cfX/+y0zv/rnb//7Iux/+qavf/rnr//6Zq7/+iX\r\n        vP/pl7z/6Yy0/+aGsP/jfKr/33ak/+B6pv/jc6P/5mKU/+ZXjv/kcqD/4meY/+Ftnv/fb57/4HGh/+Ji\r\n        lP/hXpH/4GCU/99gk//iVov/32WX/95wnP/feaP/AAAAAAAAAAAAAAAAAAAAAEY9QADq2+AC1MvOpmtr\r\n        a/9aWlr/U1NT/05OTv9LS0v/SEhI/0ZGRv9ERET/Q0ND/0FBQf8/QED/Pj4+/zs7PP82ODr/KC42/7vE\r\n        1v/q7O7/7/Hy/+7w8v/u8PL/7vDy/+3w8v/t7/L/7e/y/+zu8v/r7vH/6+3x/+ns7//k4Or/4Mjf/+PR\r\n        4f/h2eb/4trm/+PT4v/lxtz/57PT/+Wly//jkMD/4Ia8/9iFuP/dbav/3Vaj/9dNm//XS5j/3WCm/+iw\r\n        0v/x7/D/8PDy/4N7gf9NTVD/SUtM/0hJSv9FRkj/REVH/0NERf9CQ0T/QUJC/0BAQP8/Pz//PT4+/zw8\r\n        PP86Ozv/OTk5/zg4OP82Njb/NTU1/zQ0NP8zMjL/MzEy/9ra4f/t7Oz/7u3t/+7u7f/u7u7/7u7u/+7u\r\n        7v/u7e3/7u3t/+7t7f/u7e3/7uzs/+3s7P/t6+v/7erq/+zp6v/s5+j/6+Tl/+ne4f/n1tz/6MnX/+u/\r\n        0//sq8f/65S5/+yLtP/rjLL/65S6/+uMtf/pi7L/6Yu1/+iGsP/oirP/5Ymz/+R7qf/edKL/4W6c/+J2\r\n        pf/lZ5f/5Uh//+Nxof/hc6D/4WKU/+Bqm//fZ5j/33Gh/99wof/fX5L/3GCT/99aj//dV4//3GOS/99z\r\n        nv8AAAAAAAAAAAAAAAAAAAAAAAAAAOvM3FThx9L+b25u/1tbW/9UVFT/T09P/0xMTP9JSUn/R0dI/0VG\r\n        Rv9ERET/Q0ND/0FCQv9AQUL/PT4+/zg5O/8wMzL/qLHG/+nr7f/v8fH/7/Hy/+/x8v/u8PL/7vDx/+3v\r\n        8f/t7/H/7e7x/+zu8P/s7e//7Ovu/+zp7P/oqcz/5Gep/+d2sv/pgLj/64S7/+pnqv/rV6L/6lWf/+hY\r\n        nv/nN47/5TSH/+Mcc//jDGr/3zKB/9wreP/fIXX/67DN//Hv8P/x8fL/nZaa/1JPUf9MTk//SktM/0pL\r\n        S/9ISUn/RkdH/0VGR/9ERUX/QkJC/0BBQf8/Pz//PT09/zs8PP86Ojr/ODg5/zc3N/81NTX/NDQ0/zMy\r\n        Mv8xMDD/2Nfe/+zs7P/u7e3/7u3t/+7t7f/u7e3/7u3t/+7t7f/u7O3/7ezs/+3r7P/t6+v/7erq/+zo\r\n        6f/r5uj/6uTm/+nf4//n193/6czY/+zD1v/rrcf/6oy0/+uXu//pj7P/65a9/+uMtP/spcX/7Iiy/+ye\r\n        wf/rocP/6Za8/+ePuP/libP/4nWl/99unf/iapr/4nup/+Rtnf/kZ5j/426f/+Jhk//hapv/32qc/95l\r\n        lv/ca53/21+U/9thlv/aV4z/2VSK/9pckP/ZZJP/23Kb/wAAAAAAAAAAAAAAAAAAAADt0NsK7dHe1uOo\r\n        vv92dXX/XV1d/1VVVf9QUFD/TU1N/0pKSv9JSUn/R0dH/0ZGRv9ERUX/Q0RE/0NDQ/9AQUH/Ozs8/zM0\r\n        Nf+dobT/6Ort//Dx8f/w8fL/8PHy/+/x8f/v8PH/7e/w/+3u8P/s7e//7Ozu/+zs7v/s6+3/7Onr/+vk\r\n        5//lhbv/41GZ/+Vjpf/pbKz/7Fqh/+1MoP/sa63/6jiN/+lKmf/mHXf/4yeA/+MSav/kFGz/4Btz/+Ad\r\n        dv/qpcb/8u/w//Lw8f++tbn/WlJW/1NSU/9RUVH/T09P/0xNTv9LS0z/SUlJ/0dHR/9FRUX/Q0ND/0FB\r\n        Qf8+Pj7/PT09/zs7O/85OTn/Nzc3/zY2Nv80NDT/MzIy/zIuL//a2eD/7Ovr/+3s7P/u7ez/7ezs/+3s\r\n        7P/t7Oz/7ezs/+3r6//t6ur/7Ojp/+zn6P/r5eb/6uLk/+je4P/m1dz/6sXW/+mtxf/smLz/7aHA/+yQ\r\n        tf/tqsf/6oux/+ufwv/urcv/7rPO/+6pyP/umb//7Z7B/+qQt//qnL7/55C4/+aJsf/je6j/4HCg/+Nx\r\n        n//kbp//43Sj/+Vil//jX5P/4WaY/99xof/daZr/3GaY/9xQhP/aW5D/2FKK/9hOhv/YVI3/2FGJ/9pZ\r\n        j//db57/AAAAAAAAAAAAAAAAAAAAAO3R3T/svNH/4HSK/4eCgv9gYGD/V1dX/1FRUf9OTk7/TExM/0pK\r\n        Sv9JSUn/SEhI/0hHR/9HR0f/RUZG/0RERf8/P0D/NTU2/5SYrf/p6u3/8PHw//Dw8f/v7/D/7u/w/+7v\r\n        8P/t7u//7e3v/+zs7v/s7O3/7Ovt/+zq7P/s6er/6+fo/+vW4v/jSKX/3jmS/+Zjpv/sV5//7WOl/+5k\r\n        p//pNIX/6l+j/+c/hv/mQ4z/4y57/+IleP/iF3L/4QVm/+eYuv/y7+//8vDw/9zX2f9gVFj/WVdY/1VV\r\n        Vf9UU1T/UlJT/09QUP9MTE3/SkpK/0hISP9FRUb/Q0JD/0BAQf8+Pj7/PDs8/zk5Of84Nzf/NjU2/zQ0\r\n        NP8yMTH/PDQ7/+Lg5f/r6ur/7evr/+3r6//t6+v/7erq/+3q6v/s6en/7Ojo/+vm5//q4+X/6N7i/+jY\r\n        3v/m0tv/57vM/+qpwf/slrn/7HSh/+yDrP/rhKz/7JO3/+uAqv/smLv/656//+2qyP/so8T/7qHC/++Q\r\n        uv/vnML/7JK6/+qYvf/olrz/5Xyo/+J0o//gZpf/5Gua/+Vhk//lapv/42SV/+J5qP/fbJv/3m6f/9xk\r\n        lv/ZXpH/2EiA/9ZUjf/YUoz/2VGM/91cl//eYJr/32Kc/+Fon/8AAAAAAAAAAAAAAAAAAAAA7c3cZ+mc\r\n        vP/XL1j/qJmc/2NjY/9ZWVn/U1NT/1BPUP9NTU3/TEtM/0tKS/9KSkr/SkpK/0pKSv9LS0v/SUlJ/0ND\r\n        Q/83Njf/mJqt/+np7P/t7u//7e7v/+3t7//t7e7/7e3u/+3t7v/t7O3/7Ozt/+zr7P/s6uv/6+jq/+vm\r\n        6f/q5Ob/6eDj/+J6q//ZCWj/4EuV/+txs//wg7z/72Gp/+19t//qa6T/6nWu/+hjn//lVJb/5T+K/+Ih\r\n        dP/aD13/3GST/+3m6f/x7e7/7+zt/4Fxd/9gXF3/YF5f/11cXP9ZWVn/V1ZX/1NSU/9PT0//TExM/0lI\r\n        Sf9GRUX/QkJC/z8/P/89PDz/OTg5/zc2N/80MzT/MzIy/zAuLv9pYnH/5uPl/+vo6P/r6Oj/6+jo/+vn\r\n        6P/r5uf/6uTm/+ni5f/p3+P/59vg/+fS2//ox9b/6rLK/+qux//tosL/7Ymx/+2HsP/thqv/7JC0/+uK\r\n        sP/urMn/7p2//+2XvP/ur8v/7KXF/+6tzP/vncH/8aPE/+6LuP/tlLv/6pe8/+iTuv/lf6v/4nGh/+Jm\r\n        mP/kdKP/42KT/+Run//ieKf/4HOk/95tnf/dYZP/2VyP/9dPiP/YUY3/2leS/91cmP/fYZv/32Cb/+Fm\r\n        n//iYZz/42Ke/wAAAAAAAAAAAAAAAAAAAADt0+Bi6Jm4/9AQQ//AlqL/amho/1xbW/9WVVX/UlFR/09P\r\n        T/9OTU3/TU1N/01NTf9OTk7/UVBR/1FRUf9RUFD/SUhI/zY1NP+gn7H/5+bp/+zr7P/t7O3/7ezt/+zr\r\n        7P/s6+z/7Ovs/+zq6//r6ev/6+fq/+rl6P/p4+b/5+Dj/+Ta3v/i0tz/4KnE/9w8eP/kRof/52Cw/+5X\r\n        qf/wc7f/8JDB//CEuv/vjLv/75jC/+2Svv/pSpT/52ig/9AsY//JG1v/373P/+rh5//s5ur/vbG3/2hg\r\n        Yv9nY2T/ZGJj/2FgYf9eXV3/WFhY/1FPT/9PTk//S0lK/0dFRv8+PDz/NzY2/zQyM/8zMDH/Mi8x/zEu\r\n        L/8xLi7/KSIk/5iNnP/m4eP/6ePk/+ji4//o4eP/6N/i/+fc4P/m1dv/5tDZ/+bAzv/orsL/6qC+/+x6\r\n        n//rfqr/7J7A/+2iwv/sg6r/7Ze5/+yHq//rlrr/7aLB/+yRt//vq8j/7Zm7/+6ryf/tpsb/7arJ//Cr\r\n        yP/viLL/753C/+6awP/rj7j/6Ja7/+SGsP/ha53/4m2d/+J5p//jcJ//5GeY/+Jyo//fc6T/3WiY/9ld\r\n        j//WVoz/2ViS/91alf/fX5n/4GKc/+FhnP/hX5v/4mWf/+NgnP/jZqD/AAAAAAAAAAAAAAAAAAAAAO3P\r\n        3zPqpMH/zBdE/8uEkf9/cXf/YF1e/1hVVv9VUlP/UlBQ/1FOT/9QTk//UE9P/1JQUf9VVFT/WVhZ/1xa\r\n        W/9OS0z/LiUk/66owP/n5ef/6ujp/+vp6v/r6Or/6ujp/+rn6f/q5uj/6eXo/+jj5//n4OT/5dvh/+PU\r\n        3f/iyNf/46/G/+aTs//rc6D/6mWW/+uHrf/phbD/7obC//Cfx//xZLv/8JXF//CMt//xnsP/74W1/+1d\r\n        oP/rga//6pS5/8plg//Fc6X/38XY/+XX3v/h19z/fWhw/2JYXf9iXF//WVRX/05JSv9LRkj/OjM2/z02\r\n        OP83MjT/NjAy/zErLf8vKSv/LSYo/y0lKP8tJCf/Jx8i/yYfIf8mCAf/wq28/+HV2v/j0dn/49HY/+XL\r\n        1//lydT/6LzN/+qvyf/pp8T/6Xyj/+qAqP/rjbT/7X2m/+2CrP/qj7T/7qvI/+yHrf/tl7r/7aLC/+6y\r\n        zP/sj7H/76PD/+2Xuf/upMH/7pm9/++xzf/uoML/76TE/++Xvf/unMD/7ZO7/+yXvP/nkbf/5Hup/+Bu\r\n        nv/jW4z/4nin/+Nbjf/kV4v/4HOk/9xnmf/XU4b/0lCE/9dQiv/cTYr/4FeU/+Bim//hZZ3/40iI/+Nd\r\n        mP/iW5j/4mig/+Foof8AAAAAAAAAAAAAAAAAAAAA7snXBu7I2d3XaYj/tjRL/66Fl/9nUFj/W0tQ/1JG\r\n        Sv9TSUz/SUJE/01GSP9LRkf/RkBB/1dTVP9QTE3/Qjw+/0o+Qf8pDxz/w7bK/+Td4f/n4eP/6OHk/+fg\r\n        4//n3+P/59zh/+bb4f/l2OD/6NHd/+jB1P/nq8L/6p6//+yKsP/sbpz/7Za6/+yKsf/sgqr/7Ji7/+qH\r\n        rv/sjrz/8XvE//GOvv/xqMr/8Z/D//CcwP/wp8f/7Yu7/+2Crf/snsD/6rnR/+Kvyf/Zn8X/2rrQ/9zI\r\n        1P+1nqn/QyYu/0ArMv9HLjf/NSUr/zkoLf82JSv/OCUr/0AnL/9KKTX/QSYw/2g9Tv9yR1f/VDA9/5Bb\r\n        cP9XLDj/US05/4BMZf/Uo7v/37DF/+ewyP/mnbr/54uw/+mau//rkLP/65a7/+ugwf/sp8P/7KDA/+2h\r\n        v//tmLn/7Y2y/+yZu//spsP/7arG/+2YuP/ti7P/7Zm7/++vy//vqsj/7qTE/+60zv/thq//8KjJ//Cv\r\n        y//wscv/76bF/+2fwf/tpMX/65e8/+d/q//ibqD/4GiZ/+Nrnf/jZJf/41+T/+Fjlv/dZpn/2mCV/9RH\r\n        e//TPXT/3VuU/+BalP/gWZT/4V+Z/+Jonv/kTYn/5FiU/+RKif/jWZb/4l+a/wAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA7sLVi+q/0v/Pl6n/xoKi/3BEV/8+Iyv/PSMs/zwpLv8/LjP/Oikt/zgoLP8zJCn/UDtC/z0v\r\n        M/9QND7/cVNg/5Nrgv/Wtc7/4svX/+nL2//lzNj/58rY/+fG1v/qvtX/6rrR/+ugvf/tfqn/7ZK5/+yJ\r\n        rv/thq3/7X6p/+2Aqf/wttH/7Z29/+2Zu//upML/7aXC/+uWuv/yo8r/86DI//Kpy//yqcr/8Z3B//CZ\r\n        v//vm7//7Xio/+ybv//ro8P/7KfH/+quyP/mqsf/353A/9qkv/+/dpX/u2mK/851lP+9c5L/pl15/6tr\r\n        hf/Ie5z/x36c/9R+of/Of6L/1Yqo/9J8oP/TfqD/5Zi6/+KRsv/ic5f/6oqt/+qGrP/qgKj/7qnJ/+yX\r\n        uf/roMH/6qPC/+p7o//qdaD/7KHA/+qIq//tqcb/63eh/+t8o//rnLv/6nmk/+6mxf/so8H/77LM/++r\r\n        yf/vscz/7rLM/++rxv/unL3/77jR//Czzf/wqcj/8aXH//Cvy//uq8f/7qvJ/+2Vuv/qlbr/53yn/+Fo\r\n        nP/hZZf/42eZ/+Raj//ia5//32GU/98+cP/UP2//10uD/91Hgv/fSYj/4FiU/+BgmP/hWJL/4VyX/+JQ\r\n        jv/jXZf/5VqS/+Nemf/jZ5//AAAAAAAAAAAAAAAAAAAAAAAAAADuuc407rTM/um1y//mtMr/4avC/794\r\n        lP/AgZn/yYOh/7Jog//IhqL/oVx4/6ZWb//Vm7X/s11//9abtP/XmrP/5aTB/+q10f/rqMn/77LP/+2a\r\n        uv/vpcf/7pS5/++gxP/wrc3/7oav/+6Msv/vn8D/8KzK//Cmxv/ukbP/75O4/+2Wuf/uqMX/7qnH/+t5\r\n        pP/urcn/7J29//Kvz//zqsz/86rL//Kpy//ylLr/8KXG//CVu//up8n/652//+yoxf/snL7/7Jy//+yb\r\n        wP/pncD/6Ja8/+mVu//nh7H/6VGQ/+l3pf/pg7D/6Y22/+d9qv/pj7j/6F+X/+mLtP/ne6v/6p/D/+mQ\r\n        uP/qga7/7JO8/+p4ov/tjLD/7Zy8/+2VuP/sia7/7p+9/+2qxv/us8z/7Jq6/+uVtf/spMH/7JO0/+6n\r\n        xv/qiq7/7KbF/+62zv/to8L/76HE/+6uyv/vts7/7qTD/++zzP/usMj/76PC//Coxf/uqcb/8LbQ//C2\r\n        zv/wss3/76rI/+6uyv/up8f/7aDB/+qPtv/kb5//4Wye/+Jmlv/kVoz/41qL/+FdkP/eXpL/2leH/9dO\r\n        hv/dT4r/31WO/+BEgf/gTov/4F6W/+BYkv/hYpr/4XSl/+Jdlv/jVJD/42CZ/+Jrov8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAOvK2gHuscvE7rLM/+yzzP/tr8v/7KjG/+2YvP/tmsD/65i+/+uoyP/rnsL/7JC5/+yC\r\n        sP/ri7T/7Jm9/+ycwf/tjLX/76fI/++oyv/wqMv/76DD//CoyP/vnL//8J/A//Ciw//vpsT/74+0//Go\r\n        x//vmLv/75q8/+6RtP/um7z/7Z68/+6qx//wtc//76zJ//Czzv/tmLz/8ajK//Oz0v/zqMr/8qzN//Gs\r\n        y//wrMv/8J/D//Cmyf/vj7r/7ajG/+yiwv/rocL/65rA/+yhw//rlb3/7ZO8/+yTvP/ri7X/7JC5/+x9\r\n        rf/unML/7XWp/+xypP/sgrD/7Yuz/+6myP/uo8b/7Z7D//G20//vn8H/76nI//C00P/sjK//7Ze3/+6Z\r\n        uf/sgaX/64Gn/+2iwv/to8L/6ZCw/+yiwf/tnb7/7Zm7/+yrx//wttD/7aC+/+6qxf/vocH/7rPO//C3\r\n        z//slLb/767J/+6mxf/wtM3/8bPO/+6hwf/wsMz/8LbP//Cyy//uq8f/77rR//Ctyv/tnsH/6Yiy/+Fv\r\n        oP/hbp//4maX/+Nmm//hUof/3luN/9hWh//ZVIv/20+J/95Ri//fVZD/4V+V/+Fil//gX5b/4W6g/99n\r\n        nP/fa57/4GGV/+Fpnf/haqD/42We/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO24zUvvssr97q3I/+6w\r\n        y//vsM3/76zL//Cixv/wpMj/75/F/++jx//ve6//76fK/++nyf/uqMn/76vL//G00//xrs//8rHS//Gp\r\n        y//yr8//8bfW/++Wu//yrcz/8aTF//Cgwv/xm77/8Ju8//Cpxv/vp8b/77HM//CxzP/wu9T/8LLN/++d\r\n        vf/wr8v/8KnH//Clw//xn8X/87bU//Kjx//zpcf/8rDO//Knx//xrs7/8aHG//CXv//un8H/7a3I/+yo\r\n        xv/tn8H/7KLB/+yqx//uq8r/763N/+2lyP/tqMr/7pzD/+6Jtf/vnMH/8Ji+//CszP/uh7L/7oKt//Gx\r\n        0P/yttP/873Y//K81v/xsMz/8LPO/++uyf/uoL7/76jG/+2Xt//tn73/6568/+ysxv/rqMT/767K/++n\r\n        w//ui6//7q/K/++nw//qdJ7/767K/++lxP/vq8f/77XM/+yCrP/vsMr/77vT//C1zv/xtc//8bvT//Cm\r\n        xv/xtM3/8LTO//C60f/xrsr/76XD/+yYu//ld6X/4W2f/+Jdkf/jZZn/4mab/+Bfkv/ZWoz/1ViI/9tP\r\n        h//cU43/3k2H/+FYkv/iaJ7/4nan/+FnnP/gZ53/32Sb/9xjmP/dZpf/32SY/+Nqnv/kX5b/AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA78DiAe62zLnvrsn/77HK/++syP/vtM//8K3N//CXv//wqsv/8KPG//Gj\r\n        yP/xnsT/8abJ//Gwz//xq8z/8rLS//Ox0f/yoMT/87LR//Kdw//yqsv/8a/P//GpyP/whLD/8Y20//CV\r\n        uv/wkbT/8K/L//Crx//wnLz/8afG//GqyP/yudP/8KHA//G+1v/wocH/8Z/A//CXvv/zo8j/86fJ//Ol\r\n        yP/zpcf/8pvA//Kqy//yp8n/8Z7F//Ccwv/urcn/7anG/+6cwP/uoML/7avI/+2qyf/wrMr/8KrK/++w\r\n        zf/vtdD/8LDO//Gtzv/xqcr/8afJ//K31P/yt9X/88Hb//Gqy//zuNP/8qvL//Kzz//wrsr/77fQ/+6u\r\n        yP/xu9T/76rH/+2zzP/tsMv/7K7H/+++1f/tgqX/752//+6lwf/uqcb/8KvG/+6jwP/wu9P/7Yyw//Cl\r\n        wv/vq8f/8LjR//G60v/wvNP/8K3J//G1z//yqcn/8rnS//Gmxv/ysc7/8rvT//CbwP/up8T/6o2y/+Fs\r\n        nf/iYZT/5FiO/+NUi//iY5X/4F2Q/9lhk//cV47/3FmQ/99pnP/hZpj/5GOX/+NNif/ja6H/4mWc/+JZ\r\n        k//hWpL/3muf/9xom//eW47/4FKF/+REgP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHnLYA7rnNJu61\r\n        zPTvssv/76nG//G1z//wuND/8LHM//G61P/xtdH/8rXR//Kuzf/yr9D/8rTR//K31P/yn8X/8qTH//Ku\r\n        zf/xrMz/8rTS//Gtzv/xtNL/8aHE//GGsP/yrcv/8JC2//Gpx//yttH/8bLN//GgwP/xpsX/8abF//Kn\r\n        xv/zss7/8rXQ//LC2f/xlLr/75u9//KYv//zqMr/9KjK//Otzf/yq8v/8qrK//Okx//ynsP/8J7D/+6j\r\n        xP/urcj/7qbG/+6dv//uosP/7arH/+6oxv/vmb3/8bPQ//G40//xvdf/8LLQ//Gz0P/woMH/8bHO//Kx\r\n        0P/xvNb/8bbS//Gnx//xpsf/8afG/+6MsP/wu9P/77HK/+6nwv/tosD/77vT/+640P/vtM3/77rR/+2i\r\n        v//upsT/7rLL/+6vyf/umrr/7Yuw//C1zf/tmbr/8LTN/+2Yu//xuNH/8KzI//G+1P/yudP/8rvS//Gl\r\n        xf/xuNH/8q/M//OoyP/yqsn/8LTO/+2iwf/mfKb/4Wmc/+VhlP/mWpH/5FyP/+JDdf/YRHT/3l6U/+Bc\r\n        lP/hYpb/4G2e/+Nxov/lbKD/5mqd/+ZTjf/lXZT/5Ham/+JlnP/gap7/32+h/95hlP/fOmv/5XGh/wAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7rvPeO+5z//wqMb/8K3K//Gkxf/ws87/8cDX//Gs\r\n        y//ysc3/8qLH//KtzP/yr87/8rTS//Cnx//yq83/8a3N//Gy0f/ysND/8Ju///Gav//xp8j/8Yy1//Kp\r\n        yP/xrMr/75K1//K71f/whq//8rPO//K71P/yss//863M//OLtP/we6n/87jT//O0z//ukLf/8ajJ//Kh\r\n        xP/zq8z/86/O//Ovzv/yqsv/8qzM//KexP/xncP/8aDG//Clxf/ursr/7qfF/+6kxP/up8f/7bDM/++a\r\n        v//wqcn/76XF/++pyP/xutb/8bTR/++cwf/wlr3/8bHO//G10f/xsM3/8a7N//CUuf/ysc3/8KHB//C+\r\n        1f/vsMz/7qjF//C81f/vudH/7qnF/+6xyv/uoLz/8LfQ//Cxy//vt9D/8L3U//Cvyf/vqcb/8LTO/++s\r\n        yP/vtM3/8cHW//K10P/xnsH/8a3M//K60//ypcf/8KvI//HC1//xts7/8rDL//GryP/vssv/65S3/+Rd\r\n        jv/mTof/51GI/+Y/dv/iZpf/22OQ/9dIef/kX5b/5mWZ/+V2o//jb6D/5HCh/+Zuof/nYZb/51SJ/+dz\r\n        pf/ld6f/5GSZ/+JckP/fOnX/32GS/99XiP/kaZv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AADqtM2K7rTM//Cuyv/xqMf/8a3L//Gxzf/wsMz/8qjJ//KpyP/yr8//8qbI//K31P/yttP/8rjV//G0\r\n        0//ytdL/87fV//Klx//yqcz/8Z7D//O20v/yscz/8H6p//Kvzf/yvNb/8qfF//GNtf/yocL/87TQ//Gi\r\n        wf/yttD/86zK//Oxz//0vNb/9LPP/+6Zvv/vkbj/8Ze9//GszP/ynsT/8qvL//K00f/yqcv/8qrL//Gm\r\n        yv/xmMD/8ZnB/++pyP/wp8f/77HM/+6iw//uq8n/7q7L/++ewf/xr83/7qbG//G00f/xuNP/8KfG//G9\r\n        1v/xstD/8KjJ//Ktzv/xpcf/8r/Y//Kxzv/yrcv/8KXC//G50v/vrcf/8LzU/++1zv/uqsX/8MDX/+6g\r\n        vP/xpMT/8KjF//G2z//uqcX/8LbQ//CyzP/xutL/8bTP//G90//uosD/8bjR//K1z//zvtT/867L//Ko\r\n        x//wv9P/8b/V//K50f/yp8j/8KvI/+2oxP/mh67/4mOV/+ZakP/nUIf/5UuB/9xMev/SVX7/4FSF/+l1\r\n        pf/ndaX/43il/+V2o//maZr/5nmo/+hBfv/obJ//5n2r/+V2pv/ldaX/43Oj/+FMf//eXo//3lmL/+Nk\r\n        lv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6cHTBeqxzOTrpcb/8LfP//CzzP/wtM//8arI//Gz\r\n        z//xp8j/8bLO//Gkx//yn8T/86nL//Kjx//yrs7/8qPH//K00v/yp8n/8qLI//COuP/ylbv/87LP//Kn\r\n        x//ypMX/8Ymy//O20v/xmLz/8qXF//Kty//0vtf/8r7W//TG3P/0sc7/9bXS//W81//1vNX/7qTF/+52\r\n        pv/vnMD/76rJ//Cxzv/xrs3/8qjJ//Oqyv/zpMf/8qPI//Gdw//ylsD/8pnC//Cxzf/wrsv/8KbH/++s\r\n        yf/vsc7/7qTF/++kx//vr8z/8LHO//Cqyv/xpsf/8afK//Cyz//xtdL/8rvX/++ox//yu9X/8rnT//Kt\r\n        y//xq8n/8LDK/++1z//wwNb/8LjR//C20P/xvdX/8b/W//Clwf/vscv/8LXO//C60//ytM//8aTE//Gr\r\n        yP/wm7//8LLN//K/1f/xsM3/8rfQ//Osy//zosT/8qrK//HD1v/ysM3/8rTN//K5z//vqMX/6pe4/+Jt\r\n        nf/ibJz/5V+R/+k1cP/jSnz/1Tli/9hUfv/obaD/7H6s/+iKtP/mhq7/54ez/+R3o//lhK7/52CR/+dw\r\n        n//me6j/5m+e/+Z9qf/lgK3/4mSU/9o9bv/fbpj/4VaK/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9Q\r\n        VwDqt84+6qnH/+qjxP/rn8H/8LTN//Gyzf/wttD/8bPO//Kwz//xs8//8bLQ//O21P/yrc3/8rDP//Ky\r\n        0f/yq8z/8rTS//Gawf/yp8n/8Z7D//Opyf/ztdH/8q3L//O41P/zsc//87TR//KtzP/zvtf/8p/B//Ou\r\n        zf/ztM7/9cne//S20v/1yd7/9sHb//a+2P/wo8X/8KfJ/+6ewf/vn8L/8KbH//Chw//xoMP/8qbH//OV\r\n        vf/zlsD/8qDF//Gawv/xmMH/8afK//GvzP/wrMn/763L//G81v/vsc3/76/M//Cvzf/xstL/8LHP//Cp\r\n        yf/xp8f/8rjT//G51P/zwNr/873Y//Kxz//zxNz/88DY//O91v/xq8j/8bvU//G+1f/vscr/8LfQ//Gx\r\n        zP/ytND/8K7I//HB1v/xwtj/8cLY//Kqx//xqcj/8bvT//C3zv/xs87/8a/K//G60v/yudH/8qXG//G0\r\n        zf/xu9H/8rjS//K60//yuM//8LzQ/+2nxP/kd6L/4XCf/+JyoP/nUob/50h+/+Fgjv/YYIr/3kx9/+tc\r\n        k//sdab/6oix/+Zomv/leqf/5IKu/+N5pv/mgaz/5omy/+R6pv/mcJ3/5meX/+RbkP/keaX/3WWR/91o\r\n        kv/gTH//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOquyn3rqcj/66TF/+mRuf/rqcX/8LnQ//Gr\r\n        yf/xtM7/8bDP//Kry//xtdH/8K3N//Gcw//ypsj/8rPR//Krzf/yt9X/8rTS//KjyP/yqcz/8qvK//Kv\r\n        zf/zvdb/86XG//Knxv/yqMn/87rU//CRt//zv9j/87jT//O00P/0x93/9MXc//XI3v/2yd//9sXd//Kt\r\n        zP/yuNT/8KXH//CuzP/vlLn/75u+//CnyP/yqMn/8p3C//GYwP/xn8T/8Z/F//Glyf/ymsH/8qTJ//Gl\r\n        xP/xr8z/8a/M//Gx0P/xutT/8brV//Cxz//xrs7/8bHR//CnyP/xocb/8rDO//S/2v/yttH/87DO//TK\r\n        3//0x93/88Ta//Gsyv/ysc7/8r/W//HA1//xxdr/8bbP//GlwP/vkrj/8LnS//HB1//zt9D/87PN//Gt\r\n        yf/xutL/8rvU//HA1//xxtr/8rrS//Kwzf/xwNX/8cHV//LA1f/zttD/87XO//G0zf/vtMv/6YGn/+Vt\r\n        m//lZZb/5G2b/+dPgv/mXo//4WyZ/9VMdP/iN2v/7GSZ/+18qv/rfqv/6IGq/+aCrf/khrH/5HOh/+Zy\r\n        o//mZpj/5YOt/+R6pv/leqX/5mCR/+Nbi//db5v/3GGQ/+Fjkv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAA7LHMpOutyv/rnsL/6ZC3/+uixP/upMT/8bfP//Gsyv/xuNL/8bfS//Guzf/xutX/8rzW//K3\r\n        0//ys9L/8qjK//Oz0//yttP/87PQ//Kpyf/ystD/88HZ//O+1//yp8f/9MHa//K00f/yttL/877X//Sz\r\n        0P/0qMj/9KfI//S20f/1yN7/9cPa//fP4//3yd//8rnT//Gfw//xo8T/8avL//Gmxv/vss//7pu+//CK\r\n        tP/xiLP/8Z/D//Gcw//yn8T/8aXJ//Klx//znMP/85zC//GpyP/wr8z/8bTQ//Gxzv/yttL/8q3L//Cv\r\n        zv/ys9H/8q3O//K41f/zp8r/87bT//OmyP/0r83/867L//XH3f/0x9z/87rU//Ovy//yqMf/8r/X//O9\r\n        1//yr8z/8KTC//LC2v/wv9b/8cLY//Kuyv/xr8v/8bLO//K50//yxNn/87jR//Oty//zvdX/8rXP//G/\r\n        1P/xu9H/8cPV//HE1v/xv9L/77bN/+qQtP/oc6H/6G+e/+hqmv/oZZj/52WX/+dnmf/gU4T/2laD/+E1\r\n        a//sTYj/7nyr/+x+rP/oirL/5oSu/+aCrv/ng63/52mZ/+d3o//kha//44iw/+N+qf/jQnb/3jlo/9tf\r\n        iv/cZI7/4W6c/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADssMvA7KjH/+uav//og63/54qw/+2b\r\n        v//upsX/8bzT//K50v/xtdD/8azM//G10f/ytdL/8rTR//Orzf/zsM//87LR//O72P/zqcz/85nB//XD\r\n        2//0ttL/9LjT//Oew//ztdL/863N//K61P/yuNP/8qLE//S/2P/zosX/863N//S81v/0sM7/9bzV//XG\r\n        3P/xttD/8bHN//Ggw//xt9L/8KHE//Ckxf/wnb//8rPR//Cix//wocb/8JW9//Gcwv/ypsn/8qPH//Kg\r\n        xf/zlb3/8qHF//Gtyv/wp8j/8KbI//Gy0P/xss//8Za+//K10//yu9X/87HQ//OrzP/zrM3/9LzX//Oq\r\n        yf/znMH/9Mfd//PA1//zyd7/8r/X//K91f/yvtf/8qvJ//Osy//ywdj/88je//LA1//xwtj/8cHW//LB\r\n        1//yt9D/877V//O10P/zjbn/86DE//Oyzv/zvNP/87jQ//LB1v/ywtX/8sDU//G80P/ujrP/63Wl/+t0\r\n        pf/rbJ7/6nSl/+p0pv/rap3/6GSX/+FXhv/dZJH/4TRq/+tGhP/uhbH/7Xyq/+iRtv/mfqr/53Oh/+d6\r\n        p//oeqj/53Ke/+V6pv/ihK3/44Ot/+J+p//ea5T/2WKH/99znf/keKb/AAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAOyxy9HtqMf/7KDD/+d7qP/njrP/64Ww/+2Xvf/unMD/8rbP//K0z//xudP/8rLP//O5\r\n        1f/zt9P/87fU//Smyf/0qcr/867P//Oqzf/0qcr/9KXH//W81v/0p8j/9LTR//O+2P/yncL/86zM//O4\r\n        0//yttL/8r7X//Gryv/yt9P/8rHP//Oz0P/yr83/8rTQ//CdwP/wq8n/8a7M//Czz//xqcn/8bHN//Gk\r\n        xf/yqcr/8arL//Gcwf/vncL/8ZK9//KVvv/ynMT/86XL//Kkx//znML/85fA/++kxf/wocT/8KLE//Gp\r\n        yf/xrMz/8rDO//K41f/xp8r/86jK//Kjx//yu9b/87DP//S81v/1yN7/9cTa//S/2P/0w9r/87/Y//O3\r\n        0v/yvtb/8sDY//LC2f/zvdX/87LP//O+1v/yvNT/87vU//Gty//ywNb/87LP//Oxz//ztND/87zT//K1\r\n        z//zuND/87nP//LF1v/xuc//8I22/+6Otv/shrH/7Hyq/+1wo//uZZn/7WKY/+xJhv/oUon/4E18/91i\r\n        jf/fQHD/6kJ//+5onf/ub6H/6Iy0/+iUuv/ogqv/532q/+d5pf/mi7P/5G2d/+N3o//heqT/3GmU/9hZ\r\n        hP/bcZn/44ew/+Rqnv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7LPM1O2qyP/sk7z/6I63/+aQ\r\n        tv/rpsX/65u//+2cwP/tnb//8bHM//K50v/yutT/87XS//O41P/zsdD/86/R//OozP/ztdL/87jU//Su\r\n        zf/1xdv/9b3X//Sxz//0psj/9LzX//Onyv/0o8b/8p7C//O41P/yt9P/8rfT//K30//zrMz/87PR//Kn\r\n        yv/xss//8KXG//GuzP/xocT/8bXQ//CvzP/xt9L/8rXQ//O30//xr83/8bTR//Cewv/wo8b/8Y24//Gd\r\n        w//xm8L/8p/F//Kcw//zkbz/8pS+//Ctyv/wqMn/8LHO//CvzP/xqcr/8a7N//GrzP/ypsj/8qzM//K4\r\n        0//yrs3/86zM//Snyf/1vNb/9cTa//S61P/0yt//9KrK//O+1//ywtn/88jd//LA1//zwtj/88LZ//PC\r\n        2P/zwtn/87zU//O71P/zss7/8sXZ//Szz//zudH/9LjQ//O+0//yvdL/87HN//Kew//wmL3/74y2/+6D\r\n        sP/uap3/7mie/+5roP/uXJf/7VWR/+pglv/jOmv/1zpi/9grVP/kLWb/7EqJ/+uCrf/ni7L/6IKs/+iB\r\n        rP/pdKL/6W+d/+V2ov/ic57/4nmk/91jkP/bbJn/1Ex1/9lUgf/kd6b/5lWK/wAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAADttM7Q7ajI/+2Vvf/oi7b/5oyz/+eVuv/qocL/7Jq9/+2cwf/ukrv/76HC//K0\r\n        z//yu9T/8rfS//O30//zsM7/87fU//O41f/0stH/9LHO//a71v/1stD/9bjU//Sixv/zttL/87LQ//Oy\r\n        z//zutX/873X//K30//yutX/8qfJ//Opy//zrMz/8qrK//K00f/yrc7/86nL//K41P/xrcz/8bHP//C4\r\n        0v/xoML/8qXF//Kuzf/yxtz/8rzW//Gy0P/xoMP/8rfU//Cawf/wnsT/8azN//Kjyf/ynsX/8qDH//Kq\r\n        yv/xrsv/8avL//Gpyf/wss7/8KvM//Gqyv/xrMv/8anK//Kszf/zrs7/9LDO//Sz0f/1udX/9cTb//W8\r\n        1f/1uNT/88DZ//PF3P/0xdv/9L7X//PC2P/0wNf/873W//PE2v/zvNT/87/X//O40v/zxNn/9LjR//PA\r\n        1f/zvtP/873U//Sqy//0oMT/86HF//Kfwv/wkrr/73Ok/+9zpf/vbKH/72Kb/+9dl//uXZf/7FaR/+U7\r\n        cv/cP2z/1Ddc/90/bP/oRHz/6ZS3/+eDrP/odaL/52yf/+dOg//nX5D/4mmY/+Ftm//fX4//2U+B/9tm\r\n        l//aYY//3lqM/+Rgkv/mXZL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO20zbvuqsj/7p7C/+qM\r\n        t//leaX/4Xij/+eUuP/rkbT/7Yax/+6Otv/tjLP/7Ju//+6lxf/ysMz/87HO//Kxz//yqsz/86zM//Ot\r\n        zf/0qMv/9K7O//Wdxv/1udT/9L7Y//S81f/zwNn/873X//O30v/zvdf/8rvV//O40//ywdn/87fR//O+\r\n        1//0vtf/87/X//Suz//0psr/9LjU//Opy//ytdL/8bnT//Gxzf/ys8//8bfR//PG3P/zxdr/8bzV//K6\r\n        1P/ypsf/8rLP//O51f/xo8f/8aHI//GdxP/yncT/8p/F//Gbwf/xq8r/8bLO//Cyzv/wsM3/8K3M//Gr\r\n        yv/xrcv/8bbS//Kxzv/zqsv/87LQ//Oxzv/1vdb/9cfd//TH3f/0x9z/9cjd//TB2P/0xtv/9MTb//W9\r\n        1//0vNX/88PZ//TD2f/0wNf/9MTZ//TD2P/1wNf/9bPN//Soyf/0qsr/9KjJ//Sdxf/zpcf/85/E//KP\r\n        uv/xgK//8HSm//Bwo//waJ//8FiW/+9Skf/uS4r/6kmF/+I0aP/dVoL/10Rr/+R4oP/mZJL/5maV/+ZI\r\n        fP/kdqT/5HCf/+M1bP/haJn/3mqe/9tWjP/YTIL/21GI/91XiP/kW5L/5VaQ/+dAff8AAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAA7bTNle2kxf/uocT/7J3B/+eArP/ljLX/4n+q/+aGrf/pd6T/7Iuy/+qP\r\n        tP/ogKr/5Ymu/+J7oP/spcP/8rDO//Kvzf/zrc3/863N//Onyv/zq8z/9K7N//S51f/1wtr/9bPR//TE\r\n        2v/zxtz/8sHY//LF2//zwtr/8sXb//TH3P/1v9f/9cPa//W61f/0sdD/9KbJ//Soy//0qsz/9K3O//O8\r\n        1//ztdH/8qrK//CqyP/xrMn/88fd//TG2//zudP/9c3h//PC2P/ztdH/87jT//S81f/zsM3/8qXJ//Gj\r\n        yP/wpMn/8KjL//KZwv/xosf/8rrU//K91f/wt9H/8b3W//G30f/xuNL/8bXR//Oryv/0qsv/87jS//S0\r\n        0P/1wtn/9cLa//XN4P/1zuD/9cbb//TO4P/1yN3/9cTa//XF2v/1wNf/9cXa//XC2P/0vNX/9LvU//Oo\r\n        x//0pMX/867L//Gcvv/ys8//8qXG//Gtyv/xo8T/8Jm9//GKtf/yf63/8Xmo//Fnn//wX5r/8FWU/+9R\r\n        kf/tVJD/6VWL/+Rik//ZWIL/22WO/9k9Z//eV4X/31iK/91EeP/fZ5n/3EV6/9lRhv/WQ3b/0jpp/9dE\r\n        dv/eU4b/4T53/+ZXj//mWZL/5lqO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtuM9l767K/+6n\r\n        xv/toMP/6pK5/+iPuP/jdKL/4nOd/99bi//eWob/4W+Y/+SLsv/jgqz/4X2o/99nlP/pjLT/75y///Gs\r\n        yf/ytdD/867O//Oqy//0rMz/9KzM//Sy0P/1s9D/9rvV//a91//2xdv/9s3f//fJ3v/3zN//98fd//e+\r\n        1//1uNT/9LDP//OtzP/0osf/9KnL//SkyP/0psn/9LHQ//Sy0P/0uNT/8rjT//LH3P/0zeH/87rT//S/\r\n        1//1xNv/9LzW//TJ3v/0yN3/9Mbb//Oxzf/zsc7/86vM//Goy//zuNT/9LDQ//Ohxf/zr83/9crf//S9\r\n        1f/0xdr/88DX//LA1v/yutP/87jS//Syzv/1ttD/9bvU//bH3P/20eH/9tXl//bR4v/11OT/9dXk//TO\r\n        3//1zN7/9cXa//S81f/0ttL/86vK//O60//zutL/8pS7//Omxv/xocH/8LHN/++Zvf/wpMX/8LHN/++n\r\n        xv/uoML/7pu+//KMtf/yd6n/8XGl//Fsov/wXZn/712a/+9Zlf/tW5X/6G6g/+Flkf/bV4T/2kh7/9My\r\n        ZP/XRXv/10h9/9dCe//WQXn/2EuD/9tNhP/ZP3P/4FeN/+NOiP/mWY7/50V+/+Zqnf/laZ3/AAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAO2xyiburcn+7qnI/+6jxf/sncD/7Ju//+d1o//mf6j/5o20/99n\r\n        k//kfaf/5YSt/+eLs//niLH/6Y61/+uLtf/tkLn/73qq//CEsP/xe6n/8pS6//OgxP/zrs3/9LDN//Sr\r\n        y//1rs3/9qrL//asy//0tM//9K3L//Sexf/1lsP/9ZPB//WrzP/zuNP/87TR//Okxv/0qcn/9LDO//Sx\r\n        z//0rMz/87HP//O10f/xsc//76nI//K/1//zw9j/9Mjc//O40f/0utT/9Mjd//TF2//0yN3/9Mfb//XO\r\n        4f/0yt7/9Mbb//S+1f/0u9T/9bfU//S40//1xNr/9LnT//Svzf/0ttH/8pi8//TE2v/yscz/9Mba//XO\r\n        4P/0wtf/9cfb//TK3f/1yt7/9Mjc//TF2f/0xNr/9L/X//TC2v/0wdj/87LO//OvzP/znMD/8pe9//Kk\r\n        xP/ynsL/8aDE//Ckxf/vq8r/8KPF//Gwzf/ym8L/8a7M//Kjxf/xnMH/8Ze9//J6rP/yd6n/8XCk//Fm\r\n        n//waKD/8Gig/+91qf/sY5n/6GGT/+Rck//bOXP/3EaC/9xRi//TKl//0CVV/9c7cf/dWY//30+H/94n\r\n        Yf/mTo3/5zZ0/+dnmf/nXJL/5UuD/+h6pf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA88HSAe+0\r\n        ztPupMX/757C/+6ewv/ulLz/7Yq4/+uJsv/qjbX/6Ymx/+mIsP/pf6n/7Ji9/+yKtf/ui7f/7X6u/++C\r\n        sP/wear/8Ia0//CJuP/zcqn/832y//SEtf/0jLn/9JrE//WUwf/1jrz/9pTC//alyf/0rMv/8qTH//Oe\r\n        xf/1psn/9aHI//WgyP/zr87/86zK//Glx//yqcr/8abH//Gwzf/ylbz/8Z3A/++Yvv/xttH/9MLZ//TG\r\n        2//zw9n/9Mve//TH3P/1zeD/9c3g//XM3v/1yt//9Mve//S+1v/0wdj/9MLZ//XL4P/0wNj/86XG//XJ\r\n        3v/0xdv/9MLZ//S71P/0xdr/9MXb//O+1//zy97/88fc//PF2//0xNv/8p7A//Oty//zwdn/8rHN//O+\r\n        1v/zrsz/9LLQ//OuzP/0w9r/8pzB//Oewf/zrc7/8q7N//Kryf/xn8P/8a3M//Kxz//yqsv/86TI//KZ\r\n        wP/zq8r/86bH//Ouy//zn8P/8n2w//J/rv/ydaf/8W2j//FooP/xc6n/8Im1/+1onf/rZZv/52KY/+M1\r\n        cv/gQ3z/4EmE/946cP/gUIb/4VaO/+A3cv/kTIj/5jd3/+g4ef/oPXz/52md/+d6qP/ndKP/6X2p/wAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7rXNe++uy//wnMD/76TG//Cgxf/wkLv/74q1/+2F\r\n        sf/tp8f/7Iy1/+6WvP/ujLf/7oay/++Otf/umr7/8XGk//CFs//ylr7/8pjB//N+sf/0frP/9H2y//SL\r\n        uv/1jbz/9ZbC//aiyP/3qcv/963O//evzv/2ss748a3K4/Kixv/0qsv/9avM//Sexv/zosX/8rjR//K2\r\n        0f/ys9D/8Z3C//KTvP/zoMT/8rPQ//PA1//0xdr/9MTa//TF2//0z+H/9dDj//TJ3v/0wNf/9czf//XP\r\n        4v/1y9//9cXb//bR4//1xNv/9c/h//XN4P/1xNr/9c3h//XI3P/0vtb/9L/X//XI3v/0rcz/9MDY//TD\r\n        2//ytc//8rPO//S71v/0sM3/87rT//Kvy//yxdr/9MLa//S81v/zosX/87DO//Ggw//yrMz/86zM//Kc\r\n        wf/xqMn/8anI//Gtzf/ypsj/8qPG//Ory//yqMn/87TR//Opyv/0rcz/9KjK//Swzf/yoMP/8oCv//J6\r\n        rP/xd6j/8Xmq//F/rv/umb//63yp/+tkmv/qWJH/6F6V/+Vblf/lUIr/5jdy/+Zkm//ma6L/5VGK/+Zu\r\n        of/nVo3/6F6T/+lyov/nZ5n/6FKJ/+mGrf/pbZz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AADtw9Ua7rPM9fClxf/wocP/8Jm///Cdwv/vk7z/75zA/+6mxv/unsL/75G5/++awP/vlbr/75m9/++S\r\n        uv/xlLv/8Z7D//KqzP/0kLv/9JTC//WDtv/1grb/9ZC///WPvv/2nsX/96TI//eszP/3rc3/967M/vay\r\n        z2vww9UN8bPOfvKuzfP0qcv/9avM//Sfxv/zuNL/877W//O40//yvNX/8rHO//O20f/zwtn/88PZ//S8\r\n        1f/0wtf/9cvf//TD2f/1z+H/9MTa//S30f/1xNv/9cve//XM4P/2z+L/9cXb//XD2f/1xNr/9s7h//XG\r\n        3P/1yd7/87PP//O50//0rsz/9LvV//Okxv/zqcn/87TQ//O50//zutX/87bS//Oewv/ysM3/8bDN//Gu\r\n        zf/xqsn/87HQ//Oawf/yr87/8qPG//Kgxf/ylL3/8abI//Gz0P/xt9P/8bTQ//Gsyv/yss//8rLP//Ou\r\n        zf/zsc7/9KrK//Ozzv/zs8//867N//Oxzv/ylLv/8oiz//KCr//xhLL/8Za9/+yQt//oeqf/6VSL/+pj\r\n        l//naJ3/5Wug/+dXkP/oTIn/5mWZ/+ZWjv/nTYb/6IKw/+dwoP/nXJD/6Gmb/+hsm//peKb/52WV/+mE\r\n        rP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADtvNGT7rbP/++ox//wn8L/8J3B//Gf\r\n        wv/woMT/76DD/++nx//vmr//76LD/++avv/wmsD/8anJ//KLtf/ypMn/9KvO//Wiyf/1jLv/9Yu7//WI\r\n        u//1jL//9pTA//aiyP/3qcv/963N//eszf/3utKe7NnNAAAAAAAAAAAA8b/UG/K20Jjzp8n19KnL//Sj\r\n        yP/zvNT/87vU//O91v/zuNP/87nS//O91f/zvtb/87rU//O50v/0xtr/9dDi//XP4f/0udP/9c/h//XC\r\n        2f/0vtX/9tXl//XK3v/2zuH/9szf//bL3//2zuD/9cre//XI3f/zvdX/9MHZ//O20//zrs3/8qLF//Kj\r\n        xf/ypcf/8qTG//Knx//yo8b/8abH//CUuv/wn8P/8bXT//Gpy//yqMn/8GGZ//GNuf/xoMT/8ZnA//KW\r\n        vv/zpMj/8a7N//Kry//zrs3/9ZnD//SqzP/zs9D/9KbI//Wfx//0q8z/86/M//O30f/0rcz/87DN//On\r\n        x//yjbf/8oy2//KOuP/wlrz/6o+3/+iFr//pcJ//6W6f/+lsnv/ncaP/50eC/+l5qf/neqr/50+F/+hT\r\n        if/pbqD/6WWX/+h+q//odqP/65e8/+qKr//tp8b/65G1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAoIWQAO7E1Rntuc/r76/L/++wzP/woML/8Z/C//Cdwf/xnMH/8KfH//Ccv//ypMb/8KfJ//Gm\r\n        yP/zosf/86DF//Ov0P/0rdD/9bLT//Wky//2j7//9Ym7//aTwf/2msT/96jK//etzf/3rs7/97fRwfe0\r\n        0Ql9aXEAAAAAAAAAAACOe4MAAAAAAPG60iDzss6O86bI8fSqzP/0xNr/9MDX//S91f/zuNH/88bb//PD\r\n        2f/zutP/9MXa//XK3v/1yd3/9cnd//XP4P/1zd//9dLi//XL3f/1z+D/9dDh//XO4f/2z+L/9cLZ//bV\r\n        5f/21eX/9MLY//KwzP/zutX/8Zu///KszP/wiLb/8aLG//Guzf/wiLX/8ZC7//GLuf/xmcH/8rDP//Kf\r\n        wv/yr8//8qTH//GQu//xqsv/8aHH//GfxP/xrcz/8qDE//KuzP/xss//8bTP//Osy//zqsv/86fI//Oq\r\n        yf/zss7/863N//Oty//ztdD/87LO//Owzf/zss//8rLP//Kjw//ylLv/8Za///CNtP/qjLP/6YGt/+p/\r\n        rP/paJv/6VyT/+mGsv/pgK3/6G+i/+hZj//pgq7/53un/+yYvf/qbJr/6X+r/+ykxP/qhK3/7Ja3/+2l\r\n        w//tob//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO++0l/wr8v+77LN//Ct\r\n        yv/xp8n/8K3N//Ggwv/xsM7/86DF//OZwf/yr9D/87DR//Wfxf/0qMr/9a/R//Wx0v/2sNL/9qbN//WV\r\n        wv/2lsP/9pjD//ekyf/3qMv/96vN//exz8z2uNEUrIuVAAAAAAAAAAAAAAAAAAAAAAAAAAAAqpCZAAAA\r\n        AADxuc8b8rDLg/Kwy+3zw9j/9MTZ//TC2P/0xdv/88fb//PD2v/0xNr/9cre//XG2v/1ydz/9tXl//bP\r\n        4P/21+b/9tXl//XM3//2z+L/9tLi//bY5//20+P/9dDi//S51P/zpcj/87PR//KexP/xmcH/8ZrB//Gc\r\n        wv/xoMT/75O6/++ewv/wpMf/75G6/+6av//vfq7/8JK8//CBsv/wiLT/8Z/E//CUvP/wncL/8ajI//Cq\r\n        yf/xn8P/8azK//Gzzv/xudP/8rvU//Kyzf/zvNT/8rHN//O20P/zttD/87HP//Szz//zsc7/9K3N//Wr\r\n        zP/0t9H/9LjQ//OcwP/ymcD/75/B/+yZvf/rirP/6n6r/+mMtf/pfqr/64+4/+pglf/rgq3/6m+f/+uK\r\n        s//pjrb/7Zu+/+tjlP/tn8H/7Ju8/+yMsv/wt9H/75q8//CvzP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAArIiYA7qu3AfG60Y7xt9D/8LnT//Koyv/yrc3/8rDP//Oszf/0msL/9afJ//Wy\r\n        0f/0ttX/9bLS//Wx0v/2u9f/9rPS//a01P/2pMv/9pjE//aex//3osj/96XK//epy//3ttHL9r3VFgAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8bXNHvC1zajyudL988TZ//TG\r\n        2v/0xdn/9MXa//TH2//0yNv/9MXZ//XI3P/20OH/9tbm//bU4//21+b/9tXk//bR4v/21uX/9tPj//bV\r\n        5f/1wdj/9MDZ//KWvf/xnML/8JS9//GPvP/wdKn/8KXI/++Uvf/wqcr/8LTR/++kx//wsM//8LDO//Gm\r\n        x//ym77/8ZzC//Gz0P/wqsr/8KzL//Gxzv/xpMb/8LXQ//G50v/0psn/9K/O//K+1v/zudL/87rT//O2\r\n        0f/yutL/87bQ//Oxzv/zs87/87PP//O40f/0uNL/9LXQ//O00P/0r87/867N//Khxf/wrMr/7aLC/+6X\r\n        u//tnL//65zA/+yZvf/tocT/7G6d/+2Gs//tmr7/7JC3/++nyP/vqcb/7pu8/+2hwf/uq8j/8bHO//Gt\r\n        yP/yt9D/877U/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA88fWA/K6\r\n        0pnzutT/87jU//Sszf/0tNL/9bHR//Wny//1stL/9a/Q//W21f/2u9j/9q/R//a10v/2s9P/9q7Q//am\r\n        y//2nMb/96LK//eky//3qMz997LQnvfJ2g28macAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAABKJjgAAAAAAPC1zzHwt9Cm8bXQ9PG50v/yuNH/9MXa//TI2//0yt7/9Mjb//TG\r\n        2v/1zd//9c/h//bV5P/21OT/9tLi//bX5f/20+P/9s/h//TH3P/zvtf/8rfT//K31P/xqcr/8KnM//Ck\r\n        x//wmsD/76LH/++pyv/vm7//8LTR//Cwzf/wqsn/8K/N//GQuv/xu9T/8a3M//Kryv/yqsr/8rTQ//Og\r\n        xf/zn8X/85zE//OuzP/zs9D/9LfS//Suzv/0ss//87bQ//O00P/zrsz/87nS//O+1f/0vtb/9KbJ//Sh\r\n        x//0rM3/9JzF//OWwP/zpsr/86HF//Gxzf/wttD/7qDB/++qyf/vrMr/7aDC/+2LtP/ue6b/8KXH/++j\r\n        xP/wpcX/8bbR/++LsP/wjbX/8KDC//O/2f/zwtj/873V//S91f/ztM//AAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9crZAvS60370ttH59bLQ//W41P/1stH/9rLS//as\r\n        zP/1qcz/9rTT//a61//2uNX/97TS//e21P/3rc7/96rN//eoy//3qMz/96jM4Pez0FXyw8EBw5yrAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE049AAAA\r\n        AADwuM8a8LnRbfG10MXxttD38rfS//K20v/zsM//9LvU//S/1f/0w9j/9cvd//XL3v/2z+D/9c3f//bU\r\n        5f/1zeD/9MTa//Soy//ystD/8LDO//CmyP/wnML/8ajJ//Cnyv/vqcr/8LbS/++pyv/umb3/8LrU//C1\r\n        z//xrsv/8LLO//Gxzv/xqcj/8bDN//KoyP/xpcf/8pK+//Sfxv/0n8f/9KnL//OlyP/zr83/863N//O3\r\n        0f/zttD/9L/V//TJ3f/1tdL/9cPb//Sszf/0stH/9IK1//OPvf/zibj/8oWz//Kpy//zmsP/863M//HA\r\n        1v/yutT/8bzU/++fwf/vqsn/8K7N//Gxzf/xr83/8rnU//Kxzv/ysc//8aDB//XF3f/0yN3/9Mje//S9\r\n        1f/1y9//9cfc//XH3P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAB6Zm8AAAAAAPS2zz30vdTO9bjT//a10v/2udX/9rDP//a41f/3vtn/97HR//e+2f/3vNf/97nV//e0\r\n        0//3s9L/97HP5ve00Hr2s8wOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZHSwAAAAAAAAAAAPG40B3yutJh8bnRqfG6\r\n        0uXyt9H/87fR//O40v/0t9H/9LjS//S50v/0vtX/9b/X//TA2P/zrM7/85zF//Kgxv/xr83/76XG//Ce\r\n        xP/ylsD/8JG8//CexP/vpsj/8LLP//CnyP/vqMr/8KrK//GdxP/wrMv/8aXH//Gfw//woMT/8JS///OT\r\n        wP/zncT/85nC//Kkx//zqMn/86zL//Ozz//zudP/9MXa//XN4P/0xNv/9c3i//Omyf/0p8r/9LvX//Sx\r\n        0f/0rc3/8p/F//S61v/zoMX/87bT//Ogxv/zrsz/87bR//TG2v/0xNn/9MXa//O/1//0y9//8rPQ//TE\r\n        2//0x93/9Mfc//O/1v/1y+D/9b3X//XF2v/20OL/9c7h//bK3f/1wNb/9tXl/wAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPS90gb1yNtQ9cLYrva/\r\n        1/T2vdb/9sDZ//e61f/3rs//97vW//fC2v/3wNj298Taufa/1mT1wNYPAAAAAFkAIgAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAASDtBAAAAAAAAAAAA8cTXCPHB1ibyvdNd8rrTkPK807/zvNPn8rfR/PO9\r\n        1P/zv9X/9LzV//S91//0w9r/8qXJ//Gyz//wrsv/77HN/++dwP/xqMn/8a/M//Cryf/wq8r/8afI//Cp\r\n        yf/xqMj/8pO+//Ghxv/wnsT/8J3E//Ghxf/yosX/86HG//Okx//0qcr/9bfT//Wy0P/1xNv/9cDZ//XF\r\n        3P/0v9j/87jU//TI3v/0wtv/9L7Y//S81//0psn/9JvE//Sfxf/0uNX/9LbU//SmyP/0wNn/8rnT//PC\r\n        2v/0uNT/9LnU//TD2v/1y93/9Mre//bO4P/1zuH/9tDi//TL3//1y9//9cne//bN4P/1xNv/99fn//bM\r\n        4P/32uj/9s3f//fU5P/32Ob///4AAH/AAAA/////////+P/+AAAeAAAAB/////////D//AAAAAAAAAD/\r\n        ///////g//4AAAAAAAAAP///////wP/+AAAAAAAAAA///////4D//gAAAAAAAAAD//////+A//8AAAAA\r\n        AAAAAP//////AP//AAAAAAAAAAB//////gD//wAAAAAAAAAAH/////wA//+AAAAAAAAAAA/////4AP//\r\n        gAAAAAAAAAAD////8AD//4AAAAAAAAAAAf///+AA//+AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAA\r\n        AAD//4AAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAD//4AAAAAAAAAA\r\n        AAAAAAAA//+AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAA///AAAAA\r\n        AAAAAAAAAAAAAP//wAAAAAAAAAAAAAAAAAD//8AAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAP//\r\n        gAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAA\r\n        AAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAA\r\n        AAAAAAAA//4AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAA//wAAAAA\r\n        AAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAP/8\r\n        AAAAAAAAAAAAAAAAAAD8eAAAAAAAAAAAAAAAAAAA/HgAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAA\r\n        AAD4AAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA\r\n        AAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAA\r\n        AAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAA\r\n        AAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAOAA\r\n        AAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAA\r\n        AAD8AAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAA\r\n        AAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAA\r\n        AAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAPwA\r\n        AAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAA\r\n        AAD4AAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAA\r\n        AAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAA\r\n        AAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAPwA\r\n        AAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA\r\n        AAD/AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAA\r\n        AAAAAAAA/gAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAA/gAAAAAA\r\n        AAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAP4A\r\n        AAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA\r\n        AAD/AAAAAAAAAAAAAAAAAAAA/4AAAAcAAAAAAAAAAAAAAP+AAAAHwAAAAAAAAAAAAAD/wAAAD/AAAAAA\r\n        AAAAAAAA/8AAAB/8AAAAAAAAAAAAAP/gAAA//wAAAAAAAAAAAAD/8AAAf//AAAAAAAAAAAAA//wAAf//\r\n        +AAAAAAAAAAAAP/+AAf///8AAAAAAAAAAAA=\r\n</value>\r\n  </data>\r\n</root>"
  },
  {
    "path": "source-code/source/plugins/Novidia/Novidia.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{47181a1d-c22c-4c9c-b4e0-cb6ce886a1d8}</ProjectGuid>\n    <RootNamespace>Novidia</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\GPUModel;..\\..\\..\\dependencies\\xdelta3;..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\detours\\include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;detours.lib;syelog.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\GPUModel;..\\..\\..\\dependencies\\xdelta3;..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\detours\\include;</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>opengl32.lib;detours.lib;syelog.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\crc\\crc_32.c\" />\n    <ClCompile Include=\"src\\dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\crc\\crc.h\" />\n    <ClInclude Include=\"src\\crc\\sniptype.h\" />\n    <ClInclude Include=\"src\\framework.h\" />\n    <ClInclude Include=\"src\\glStuff.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Novidia/Novidia.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\crc\\crc_32.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\glStuff.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\crc\\sniptype.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\crc\\crc.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Novidia/src/crc/crc.h",
    "content": "/*\n**  CRC.H - header file for SNIPPETS CRC and checksum functions\n*/\n\n#ifndef CRC__H\n#define CRC__H\n\n#include <stdlib.h>           /* For size_t                 */\n#include \"sniptype.h\"         /* For BYTE, WORD, DWORD      */\n\n/*\n**  File: ARCCRC16.C\n*/\n\nvoid init_crc_table(void);\nWORD crc_calc(WORD crc, char *buf, unsigned nbytes);\nvoid do_file(char *fn);\n\n/*\n**  File: CRC-16.C\n*/\n\nWORD crc16(char *data_p, WORD length);\n\n/*\n**  File: CRC-16F.C\n*/\n\nWORD updcrc(WORD icrc, BYTE *icp, size_t icnt);\n\n/*\n**  File: CRC_32.C\n*/\n\n#define UPDC32(octet,crc) (crc_32_tab[((crc)\\\n     ^ ((BYTE)octet)) & 0xff] ^ ((crc) >> 8))\n\nDWORD updateCRC32(unsigned char ch, DWORD crc);\nBoolean_T crc32file(char *name, DWORD *crc, long *charcnt);\nDWORD crc32buf(char *buf, size_t len);\n\n/*\n**  File: CHECKSUM.C\n*/\n\nunsigned checksum(void *buffer, size_t len, unsigned int seed);\n\n/*\n**  File: CHECKEXE.C\n*/\n\nvoid checkexe(char *fname);\n\n\n\n#endif /* CRC__H */"
  },
  {
    "path": "source-code/source/plugins/Novidia/src/crc/crc_32.c",
    "content": "/* Crc - 32 BIT ANSI X3.66 CRC checksum files */\n\n#include <stdio.h>\n#include \"crc.h\"\n\n#ifdef __TURBOC__\n #pragma warn -cln\n#endif\n\n/**********************************************************************\\\n|* Demonstration program to compute the 32-bit CRC used as the frame  *|\n|* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|\n|* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|\n|* protocol).  The 32-bit FCS was added via the Federal Register,     *|\n|* 1 June 1982, p.23798.  I presume but don't know for certain that   *|\n|* this polynomial is or will be included in CCITT V.41, which        *|\n|* defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|\n|* PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|\n|* errors by a factor of 10^-5 over 16-bit FCS.                       *|\n\\**********************************************************************/\n\n/* Need an unsigned type capable of holding 32 bits; */\n\ntypedef DWORD UNS_32_BITS;\n\n/* Copyright (C) 1986 Gary S. Brown.  You may use this program, or\n   code or tables extracted from it, as desired without restriction.*/\n\n/* First, the polynomial itself and its table of feedback terms.  The  */\n/* polynomial is                                                       */\n/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */\n/* Note that we take it \"backwards\" and put the highest-order term in  */\n/* the lowest-order bit.  The X^32 term is \"implied\"; the LSB is the   */\n/* X^31 term, etc.  The X^0 term (usually shown as \"+1\") results in    */\n/* the MSB being 1.                                                    */\n\n/* Note that the usual hardware shift register implementation, which   */\n/* is what we're using (we're merely optimizing it by doing eight-bit  */\n/* chunks at a time) shifts bits into the lowest-order term.  In our   */\n/* implementation, that means shifting towards the right.  Why do we   */\n/* do it this way?  Because the calculated CRC must be transmitted in  */\n/* order from highest-order term to lowest-order term.  UARTs transmit */\n/* characters in order from LSB to MSB.  By storing the CRC this way,  */\n/* we hand it to the UART in the order low-byte to high-byte; the UART */\n/* sends each low-bit to hight-bit; and the result is transmission bit */\n/* by bit from highest- to lowest-order term without requiring any bit */\n/* shuffling on our part.  Reception works similarly.                  */\n\n/* The feedback terms table consists of 256, 32-bit entries.  Notes:   */\n/*                                                                     */\n/*  1. The table can be generated at runtime if desired; code to do so */\n/*     is shown later.  It might not be obvious, but the feedback      */\n/*     terms simply represent the results of eight shift/xor opera-    */\n/*     tions for all combinations of data and CRC register values.     */\n/*                                                                     */\n/*  2. The CRC accumulation logic is the same for all CRC polynomials, */\n/*     be they sixteen or thirty-two bits wide.  You simply choose the */\n/*     appropriate table.  Alternatively, because the table can be     */\n/*     generated at runtime, you can start by generating the table for */\n/*     the polynomial in question and use exactly the same \"updcrc\",   */\n/*     if your application needn't simultaneously handle two CRC       */\n/*     polynomials.  (Note, however, that XMODEM is strange.)          */\n/*                                                                     */\n/*  3. For 16-bit CRCs, the table entries need be only 16 bits wide;   */\n/*     of course, 32-bit entries work OK if the high 16 bits are zero. */\n/*                                                                     */\n/*  4. The values must be right-shifted by eight bits by the \"updcrc\"  */\n/*     logic; the shift must be unsigned (bring in zeroes).  On some   */\n/*     hardware you could probably optimize the shift in assembler by  */\n/*     using byte-swap instructions.                                   */\n\nstatic UNS_32_BITS crc_32_tab[] = { /* CRC polynomial 0xedb88320 */\n0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,\n0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,\n0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\n0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,\n0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,\n0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,\n0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\n0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,\n0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\n0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,\n0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\n0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\n0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,\n0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\n0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\n0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,\n0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,\n0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,\n0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\n0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,\n0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\n0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\n0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,\n0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\n0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,\n0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,\n0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d\n};\n\nDWORD updateCRC32(unsigned char ch, DWORD crc)\n{\n      return UPDC32(ch, crc);\n}\n\nBoolean_T crc32file(char *name, DWORD *crc, long *charcnt)\n{\n      FILE *fin;\n      register DWORD oldcrc32;\n      register int c;\n\n      oldcrc32 = 0xFFFFFFFF; *charcnt = 0;\n#ifdef MSDOS\n      if ((fin=fopen(name, \"rb\"))==NULL)\n#else\n      if ((fopen_s(&fin, name, \"rb\"))!=0) // modded for fopen_s to avoid enabling unsafe fopen\n#endif\n      {\n            perror(name);\n            return Error_;\n      }\n      while ((c=getc(fin))!=EOF)\n      {\n            ++*charcnt;\n            oldcrc32 = UPDC32(c, oldcrc32);\n      }\n\n      if (ferror(fin))\n      {\n            perror(name);\n            *charcnt = -1;\n      }\n      fclose(fin);\n\n      *crc = oldcrc32 = ~oldcrc32;\n\n      return Success_;\n}\n\nDWORD crc32buf(char *buf, size_t len)\n{\n      register DWORD oldcrc32;\n\n      oldcrc32 = 0xFFFFFFFF;\n\n      for ( ; len; --len, ++buf)\n      {\n            oldcrc32 = UPDC32(*buf, oldcrc32);\n      }\n\n      return ~oldcrc32;\n      \n}\n\n#ifdef TEST\n\nmain(int argc, char *argv[])\n{\n      DWORD crc;\n      long charcnt;\n      register errors = 0;\n\n      while(--argc > 0)\n      {\n            errors |= crc32file(*++argv, &crc, &charcnt);\n            printf(\"%08lX %7ld %s\\n\", crc, charcnt, *argv);\n      }\n      return(errors != 0);\n}\n\n#endif /* TEST */"
  },
  {
    "path": "source-code/source/plugins/Novidia/src/crc/sniptype.h",
    "content": "/*\n**  SNIPTYPE.H - Include file for SNIPPETS data types and commonly used macros\n*/\n\n#ifndef SNIPTYPE__H\n#define SNIPTYPE__H\n\n#include <stdlib.h>                             /* For free()           */\n#include <string.h>                             /* For NULL & strlen()  */\n\ntypedef enum {Error_ = -1, Success_, False_ = 0, True_} Boolean_T;\n\n#if defined(__unix__)\n typedef unsigned char  BYTE;\n typedef unsigned long  DWORD;\n typedef unsigned short WORD;\n #if !defined(FAR)\n  #define FAR\n #endif\n #if !defined(NEAR)\n  #define NEAR\n #endif\n #if !defined(HUGE)\n  #define HUGE\n #endif\n #if !defined(PASCAL)\n  #define PASCAL\n #endif\n #if !defined(CDECL)\n  #define CDECL\n #endif\n #if !defined(INTERRUPT)\n  #define INTERRUPT\n #endif\n#elif !defined(WIN32) && !defined(_WIN32) && !defined(__NT__) \\\n      && !defined(_WINDOWS)\n #if !defined(OS2)\n  typedef unsigned char  BYTE;\n  typedef unsigned long  DWORD;\n #endif\n typedef unsigned short WORD;\n#else\n #define WIN32_LEAN_AND_MEAN\n #define NOGDI\n #define NOSERVICE\n #undef INC_OLE1\n #undef INC_OLE2\n #include <windows.h>\n #define HUGE\n#endif\n\ntypedef union {\n      signed char       c;\n      BYTE              b;\n} VAR8_;\n\ntypedef union {\n      VAR8_             v8[2];\n      signed short      s;\n      WORD              w;\n} VAR16_;\n\ntypedef union {\n      VAR16_            v16[2];\n      signed long       l;\n      DWORD             dw;\n      float             f;\n      void              *p;\n} VAR32_;\n\ntypedef union {\n      VAR32_            v32[2];\n      double            d;\n} VAR64_;\n\n#define NUL '\\0'\n#define LAST_CHAR(s) (((char *)s)[strlen(s) - 1])\n#define TOBOOL(x) (!(!(x)))\n#define FREE(p) (free(p),(p)=NULL)\n\n#endif /* SNIPTYPE__H */"
  },
  {
    "path": "source-code/source/plugins/Novidia/src/dllmain.cpp",
    "content": "#include \"framework.h\"\n#include \"glStuff.h\"\n#include <PluginConfigApi.h>\n#include <GPUModel.h>\n\nextern \"C\" {\n// well, only good for 64 bit now, ont that is matters lol\n#define SIZEOF_SIZE_T 8\n#define SIZEOF_UNSIGNED_LONG_LONG 8\n#include <xdelta3.h>\n#include <xdelta3.c>\n#include \"crc/crc.h\"\n}\n\n\n// upload to the SSBO instead after processing\n// two versions because apparently TexSubImage can cause major stuttering\nvoid h_uploadModelTransformBuf_TexImage(DWORD* a1, int a2)\n{\n\tif (a2 > 0x100)\n\t\treturn;\n\n\tuploadModelTransformBuf(a1, a2);\n\t\n\tglActiveTexture(GL_TEXTURE8);\n\tglBindTexture(GL_TEXTURE_1D, buf_tex);\n\t// can't change tex size without making shader sad :(\n\tglTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, 0x3000 / sizeof(float) / 4, 0, tex_upload_format, GL_FLOAT, *(float**)0x1411a3330);\n\tglActiveTexture(GL_TEXTURE0);\n}\nvoid h_uploadModelTransformBuf_TexSubImage(DWORD* a1, int a2)\n{\n\tif (a2 > 0x100)\n\t\treturn;\n\n\tuploadModelTransformBuf(a1, a2);\n\n\tglActiveTexture(GL_TEXTURE8);\n\tglBindTexture(GL_TEXTURE_1D, buf_tex);\n\tglTexSubImage1D(GL_TEXTURE_1D, 0, 0, a2 * 3, tex_upload_format, GL_FLOAT, *(float**)0x1411a3330);\n\tglActiveTexture(GL_TEXTURE0);\n}\n\nvoid h_uploadModelTransformBuf_NoUpload(DWORD* a1, int a2)\n{\n\tglActiveTexture(GL_TEXTURE8);\n\tglBindTexture(GL_TEXTURE_1D, buf_tex);\n\tglActiveTexture(GL_TEXTURE0);\n}\n\n// just a crash fix\nvoid h_glBindBuffer(GLenum target, GLuint buffer)\n{\n\t// if not okay, it's param buffer data\n\tif (!checkBufferTargetOk(target))\n\t{\n\t\treturn;\n\t}\n\n\tglBindBuffer(target, buffer);\n}\n\n// just a crash fix\nvoid h_glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)\n{\n\t// if not okay, it's param buffer data\n\tif (!checkBufferTargetOk(target))\n\t{\n\t\treturn;\n\t}\n\t\n\tglBufferData(target, size, data, usage);\n}\n\nPROC h_wglGetProcAddress(LPCSTR Arg1)\n{\n\tPROC res = wGlGetProcAddress_forhook(Arg1);\n\tif (res == nullptr)\n\t\treturn (PROC)stub;\n\treturn res;\n}\n\n// used as an entry point after GL context is created\nvoid h_glutSetCursor(int cursor)\n{\n\tif (!loadGlAddresses())\n\t{\n\t\tprintf(\"[Novidia] Aborting loading\\n\");\n\t\t//MessageBoxA(NULL, \"!\", NULL, NULL);\n\t}\n\telse\n\t{\n\n\t\tstruct {\n\t\t\tvoid* target;\n\t\t\tvoid* hook;\n\t\t} hookFuncs[] = {\n\t\t\t{&glBindBuffer, h_glBindBuffer},\n\t\t\t{&glBindBufferARB, h_glBindBuffer},\n\t\t\t{&glBufferData, h_glBufferData},\n\t\t\t{&glBufferDataARB, h_glBufferData},\n\t\t\t//{&glDrawElements, h_glDrawElements},\n\t\t\t//{&glDrawRangeElements, h_glDrawRangeElements},\n\t\t};\n\n\t\tfor (auto fn : hookFuncs)\n\t\t{\n\t\t\thookGlFunc((PROC*)fn.target, fn.hook);\n\t\t}\n\n\t\t//glActiveTexture(GL_TEXTURE8);\n\t\tglGenTextures(1, &buf_tex);\n\t\tprintf(\"[Novidia] Buffer texture id: %d\\n\", buf_tex);\n\t\tglBindTexture(GL_TEXTURE_1D, buf_tex);\n\t\tif (enable_chara_skinning && use_TexSubImage)\n\t\t\tglTexStorage1D(GL_TEXTURE_1D, 1, GL_RGBA32F, 0x3000 / sizeof(float) / 4);\n\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\n\t\t// BGRA texture uploads seem to run a little faster\n\t\t// ideally just asking the driver what to use would be fine,\n\t\t// but my driver says GL_RGBA is better (contrary to my testing)\n\t\tif (force_BGRA_upload)\n\t\t{\n\t\t\ttex_upload_format = GL_BGRA;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// ask the driver which image format to use for uploads\n\t\t\tglGetInternalformativ(GL_TEXTURE_1D, GL_RGBA32F, GL_TEXTURE_IMAGE_FORMAT, 1, &tex_upload_format);\n\t\t\tprintf(\"[Novidia] Driver preferred texture upload format: %d\\n\", tex_upload_format);\n\t\t}\n\n\t\tif (tex_upload_format == GL_BGRA)\n\t\t{\n\t\t\tprintf(\"[Novidia] Using BGRA texture uploads\\n\");\n\t\t\t// set swizzling to make shader read as if it's RGBA still\n\t\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_R, GL_BLUE);\n\t\t\tglTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_B, GL_RED);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttex_upload_format = GL_RGBA;\n\t\t\tprintf(\"[Novidia] Using RGBA texture uploads\\n\");\n\t\t}\n\n\t\tif (!enable_chara_skinning)\n\t\t{\n\t\t\tstruct vec4 {\n\t\t\t\tfloat x;\n\t\t\t\tfloat y;\n\t\t\t\tfloat z;\n\t\t\t\tfloat w;\n\t\t\t};\n\n\t\t\tstruct mtx {\n\t\t\t\tvec4 xMul;\n\t\t\t\tvec4 yMul;\n\t\t\t\tvec4 zMul;\n\t\t\t};\n\n\t\t\t/*\n\t\t\tmtx no_anim_mtx = {\n\t\t\t\t{1, 0, 0, 0},\n\t\t\t\t{0, 1, 0, 0},\n\t\t\t\t{0, 0, 1, 0},\n\t\t\t};\n\t\t\t*/\n\n\t\t\tmtx no_anim_mtx = {\n\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t{0, 0, 0, 0},\n\t\t\t\t{0, 0, 0, 0},\n\t\t\t};\n\n\t\t\tfloat uploadBuf[0x3000 / sizeof(float)];\n\n\t\t\tfor (int i = 0; i < sizeof(uploadBuf) / sizeof(float); i += sizeof(no_anim_mtx) / sizeof(float))\n\t\t\t{\n\t\t\t\t// yes, I really could just memset it to all zeros lol\n\t\t\t\tmemcpy(&uploadBuf[i], &no_anim_mtx, sizeof(no_anim_mtx));\n\t\t\t}\n\t\t\t\n\t\t\tglTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, 0x3000 / sizeof(float) / 4, 0, tex_upload_format, GL_FLOAT, uploadBuf);\n\t\t}\n\t}\n\n\tDetourTransactionBegin();\n\tDetourUpdateThread(GetCurrentThread());\n\tprintf(\"[Novidia] Unhooking glutSetCursor\\n\");\n\tDetourDetach(&(PVOID&)glutSetCursor, h_glutSetCursor);\n\tDetourTransactionCommit();\n\n\tglutSetCursor(cursor);\n}\n\nint64_t hookedGetFileSize(MsString* path) {\n\t// store original size for use later or to return in case of error\n\tint64_t ogsize = divaGetFileSize(path);\n\n\tstd::string pathStr = std::string(path->GetCharBuf());\n\tstatic std::string shdfarc = \"shader.farc\";\n\n\n\t// identify whether current file is shader or not\n\tbool fileIsShader = false;\n\tif (pathStr.length() >= shdfarc.length())\n\t{\n\t\tfileIsShader = (0 == pathStr.compare(pathStr.length() - shdfarc.length(), shdfarc.length(), shdfarc));\n\t}\n\n\tif (!fileIsShader)\n\t{\n\t\treturn ogsize;\n\t}\n\n\n\t// reset some stuff when reprocessing shader farc (should never happen)\n\tif (shader_farc_data) {\n\t\tfree(shader_farc_data);\n\t\tshader_farc_data = NULL;\n\t\tshader_farc_data_size = 0;\n\t\tshader_farc_path = \"\";\n\t\tshader_file_handle = NULL;\n\t}\n\n\n\t// local vars declared early to allow use of goto\n\tFILE* ogfile;\n\tvoid* ogdata = NULL;\n\tDWORD crc;\n\twchar_t crcstr[9];\n\tstd::wstring vcd_path;\n\tDWORD dwAttrib;\n\tFILE* vcdfile;\n\tlong vcdsize;\n\tvoid* vcddata = NULL;\n\tvoid* outbuf = NULL;\n\tusize_t outbuf_size;\n\tusize_t outbuf_data_size;\n\tint xd3err;\n\n\n\t// if shader, open it and read data\n\t//if (fopen_s(&ogfile, path->GetCharBuf(), \"rb\") != 0)\n\togfile = divaFsopen(path->GetCharBuf(), \"rb\", _SH_DENYNO);\n\tif (ogfile == nullptr)\n\t{\n\t\tMessageBoxW(NULL, L\"Error opening shader.farc.\", L\"Novidia\", NULL);\n\t\tgoto fail;\n\t}\n\n\togdata = malloc(ogsize);\n\t//if (fread(ogdata, 1, ogsize, ogfile) != ogsize)\n\tif (divaFread(ogdata, 1, ogsize, ogfile) != ogsize)\n\t{\n\t\tMessageBoxW(NULL, L\"Error reading shader.farc.\", L\"Novidia\", NULL);\n\t\tgoto fail;\n\t}\n\n\t//fclose(ogfile);\n\tdivaFclose(ogfile); // need to use diva's fclose if using diva's fsopen and fread\n\n\n\t// crc32 the shader data to find a vcdiff patch file\n\tcrc = crc32buf((char*)ogdata, ogsize);\n\tswprintf_s(crcstr, L\"%08x\", crc);\n\t//MessageBoxW(NULL, crcstr, L\"Novidia\", NULL);\n\n\tvcd_path = DirPath() + L\"\\\\plugins\\\\Novidia Shaders\\\\\" + crcstr + L\".vcdiff\";\n\t\n\tdwAttrib = GetFileAttributesW(vcd_path.c_str());\n\tif (dwAttrib == INVALID_FILE_ATTRIBUTES || (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))\n\t{\n\t\tMessageBoxW(NULL, L\"Unable to find shader vcdiff file.\", L\"Novidia\", NULL);\n\t\tMessageBoxW(NULL, vcd_path.c_str(), L\"Novidia\", NULL);\n\t\tgoto fail;\n\t}\n\n\n\t// try opening and reading said vcdiff patch\n\tif (_wfopen_s(&vcdfile, vcd_path.c_str(), L\"rb\") != 0)\n\t{\n\t\tMessageBoxW(NULL, L\"Error opening shader vcdiff file.\", L\"Novidia\", NULL);\n\t\tMessageBoxW(NULL, vcd_path.c_str(), L\"Novidia\", NULL);\n\t\tgoto fail;\n\t}\n\n\t// get size of the file from having already opened it, skipping whatever the game does\n\tfseek(vcdfile, 0, SEEK_END); // seek to end of file\n\tvcdsize = ftell(vcdfile); // get current file pointer\n\tfseek(vcdfile, 0, SEEK_SET); // seek back to beginning of file\n\n\tvcddata = malloc(vcdsize);\n\tif (fread(vcddata, 1, vcdsize, vcdfile) != vcdsize)\n\t{\n\t\tMessageBoxW(NULL, L\"Error reading shader vcdiff file.\", L\"Novidia\", NULL);\n\t\tMessageBoxW(NULL, vcd_path.c_str(), L\"Novidia\", NULL);\n\t\tgoto fail;\n\t}\n\n\tfclose(vcdfile);\n\n\t\n\t// allocate an output buffer and patch shader into it (needs to be done now to know correct size)\n\toutbuf_size = 64 * 1024 * 1024; // 64M should be enough\n\toutbuf = malloc(outbuf_size);\n\toutbuf_data_size;\n\txd3err = xd3_decode_memory((uint8_t*)vcddata, vcdsize, (uint8_t*)ogdata, ogsize, (uint8_t*)outbuf, &outbuf_data_size, outbuf_size, 0);\n\n\tif (xd3err != 0)\n\t{\n\t\tMessageBoxW(NULL, L\"Error applying shader vcdiff file.\", L\"Novidia\", NULL);\n\t\tMessageBoxA(NULL, xd3_strerror(xd3err), \"Novidia\", NULL);\n\t\tgoto fail;\n\t}\n\n\twprintf(L\"[Novidia] Patched shader.farc using %s.vcdiff\\n\", crcstr);\n\n\t// done successfully! cleanup and save results\n\tfree(ogdata);\n\tfree(vcddata);\n\tshader_farc_data = outbuf;\n\tshader_farc_data_size = outbuf_data_size;\n\tshader_farc_path = pathStr;\n\n\treturn outbuf_data_size;\n\nfail:\n\tif (ogdata) free(ogdata);\n\tif (vcddata) free(vcddata);\n\tif (outbuf) free(outbuf);\n\treturn ogsize;\n}\nFILE* hookedFsopen(const char* path, const char* mode, int shflag)\n{\n\tFILE* res = divaFsopen(path, mode, shflag);\n\n\tif (strcmp(path, shader_farc_path.c_str()) == 0)\n\t{\n\t\tshader_file_handle = res;\n\t}\n\treturn res;\n}\nint64_t hookedFread(void* dst, int64_t size, int64_t count, FILE* file)\n{\n\tif (file != shader_file_handle)\n\t{\n\t\treturn divaFread(dst, size, count, file);\n\t}\n\n\tsize_t size_bytes = size * count;\n\n\tif ((size_bytes > shader_farc_data_size) || !shader_farc_data)\n\t{\n\t\treturn divaFread(dst, size, count, file); // this is an error -- the game wants more data than we have for some reason, or size has a value but not our buffer\n\t}\n\n\tmemcpy(dst, shader_farc_data, size_bytes);\n\n\tshader_file_handle = NULL; // easy way to avoid risk of unexpected reuse\n\n\t// optionally, could free the stored farc data here, but it only uses 64MB so why bother?\n\t/*\n\tfree(shader_farc_data); // no longer need to keep this around so free it and save the RAM\n\tshader_farc_data = NULL; // clear associated data too, because there's no longer a processed shader\n\tshader_farc_data_size = 0;\n\tshader_farc_path = \"\";\n\t*/\n\n\tprintf(\"[Novidia] Shader patch applied\\n\");\n\n\treturn size_bytes;\n}\n\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)\n{\n\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\tloadConfig();\n\n\t\tif (!disable_amd_check)\n\t\t{\n\t\t\tstd::string gpuName = GPUModel::getGpuName();\n\t\t\tif (gpuName != \"AMD\")\n\t\t\t{\n\t\t\t\t// detected Nvidia GPU\n\t\t\t\tprintf(\"[Novidia] Detected Non-AMD GPU! Quitting!\\n\");\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t\tDisableThreadLibraryCalls(hModule);\n\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tprintf(\"[Novidia] Hooking glutSetCursor\\n\");\n\t\tDetourAttach(&(PVOID&)glutSetCursor, h_glutSetCursor);\n\t\tprintf(\"[Novidia] Hooking wglGetProcAddress\\n\");\n\t\tDetourAttach(&(PVOID&)wGlGetProcAddress_forhook, h_wglGetProcAddress);\n\n\t\tprintf(\"[Novidia] Hooking uploadModelTransformBuf\\n\");\n\t\tif (enable_chara_skinning)\n\t\t{\n\t\t\tif (use_TexSubImage)\n\t\t\t\tDetourAttach(&(PVOID&)uploadModelTransformBuf, h_uploadModelTransformBuf_TexSubImage);\n\t\t\telse\n\t\t\t\tDetourAttach(&(PVOID&)uploadModelTransformBuf, h_uploadModelTransformBuf_TexImage);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDetourAttach(&(PVOID&)uploadModelTransformBuf, h_uploadModelTransformBuf_NoUpload);\n\t\t}\n\n\t\tif (enable_shader_deltas)\n\t\t{\n\t\t\tprintf(\"[Novidia] Hooking divaGetFileSize\\n\");\n\t\t\tDetourAttach(&(PVOID&)divaGetFileSize, hookedGetFileSize);\n\t\t\tprintf(\"[Novidia] Hooking divaFsopen\\n\");\n\t\t\tDetourAttach(&(PVOID&)divaFsopen, hookedFsopen);\n\t\t\tprintf(\"[Novidia] Hooking divaFread\\n\");\n\t\t\tDetourAttach(&(PVOID&)divaFread, hookedFread);\n\t\t}\n\n\t\tDetourTransactionCommit();\n\n\t\t/*\n\t\tif (shader_amd_farc)\n\t\t{\n\t\t\tconst char* shaderpath = \"./rom/shader_amd.farc\";\n\t\t\tInjectCode((void*)0x140a41018, std::vector<uint8_t>(shaderpath, shaderpath + strlen(shaderpath)));\n\t\t}\n\t\t*/\n\t}\n\n\treturn TRUE;\n}\n\n\n\nusing namespace PluginConfig;\n\nPluginConfigOption config[] = {\n\t{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"disable_amd_check\", L\"general\", CONFIG_FILE, L\"Disable AMD Check\", L\"On systems with both AMD and Nvidia graphics, the plugin may disable functionality due to detecting a non-AMD GPU.\\nSet this to forcefully enable functionality.\", false, false } },\n\t{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"enable_chara_skinning\", L\"general\", CONFIG_FILE, L\"Enable Chara Skinning\", L\"If you really need to get extra performance, you can disable uploading skinning data. (character models will disappear)\", true, false } },\n\t{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"use_TexSubImage\", L\"general\", CONFIG_FILE, L\"Use glTexSubImage\", L\"glTexSubImage should offer higher performance, but stuttering has been reported when it is used.\\nTry disabling this if you have issues.\", true, false } },\n\t{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"force_BGRA_upload\", L\"general\", CONFIG_FILE, L\"Force BGRA Texture Uploads\", L\"BGRA format uploads seem to run faster (on some hardware), but drivers may suggest RGBA instead.\\nUsing this forces uploads to use the BGRA format.\\n\\nDisabling this may decrease or improve performance.\", true, false } },\n\t{ CONFIG_BOOLEAN, new PluginConfigBooleanData{ L\"shader_delta_patches\", L\"general\", CONFIG_FILE, L\"Apply shader vcdiff patches\", L\"Novidia can automatically apply pre-generated delta patch files to shaders.\\nLeave this enabled for current and future versions of AMDPack.\", true, false } },\n};\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"Novidia\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"Novidia by somewhatlurker\\n\\nPerforms some model skinning transformations in an alternate way to enable functionality on non-Nvidia hardware.\\nAlso fixes crashing on non-Nvidia hardware.\";\n}\n\nextern \"C\" __declspec(dllexport) PluginConfigArray GetPluginOptions(void)\n{\n\treturn PluginConfigArray{ _countof(config), config };\n}"
  },
  {
    "path": "source-code/source/plugins/Novidia/src/framework.h",
    "content": "#pragma once\n\n//#define WIN32_LEAN_AND_MEAN\n//#include <windows.h>\n//#include <psapi.h>\n\n#include <vector>\n\n#include \"glStuff.h\"\n\n// use this as a hook to perform initialisation\nvoid(__cdecl* glutSetCursor)(int cursor) = *(void(__cdecl**)(int))0x140966068;\nvoid(__cdecl* uploadModelTransformBuf)(DWORD* a1, int a2) = (void(__cdecl*)(DWORD * a1, int a2))0x140444fa0;\n\nbool& performTransform = *(bool*)0x14cc57bb0;\n\n// vars that will contain the requiered info about GL buffers to perform the transform\nGLuint buf_tex;\n\n\n// check if a buffer target is okay to allow on non-Nvidia platforms\n// (used to prevent crashes in glBindBuffer and glBufferData)\n// only parameter buffer NV targets cause issues\nbool checkBufferTargetOk(GLenum target)\n{\n\treturn !(target == GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV || target == GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV);\n}\n\n\nint __stdcall stub() { return 1; }\n\nbool disable_amd_check;\nbool enable_chara_skinning;\nbool use_TexSubImage;\nbool force_BGRA_upload;\nGLint tex_upload_format;\n\nstruct MsString {\n\tunion {\n\t\tchar* string_ptr;\n\t\tchar string_buf[16];\n\t};\n\tuint64_t len;\n\tuint64_t bufsize;\n\n\tchar* GetCharBuf()\n\t{\n\t\tif (bufsize > 0xf && string_ptr != nullptr)\n\t\t\treturn string_ptr;\n\t\telse\n\t\t\treturn string_buf;\n\t};\n\n\tvoid SetCharBuf(char* newcontent)\n\t{\n\t\tlen = strlen(newcontent);\n\t\tbufsize = len;\n\t\tif (len > 0xf)\n\t\t{\n\t\t\tstring_ptr = _strdup(newcontent);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstrcpy_s(string_buf, newcontent);\n\t\t}\n\t}\n};\n\nstd::string shader_farc_path = \"\";\nvoid* shader_farc_data = NULL;\nint64_t shader_farc_data_size;\nFILE* shader_file_handle = NULL;\nbool enable_shader_deltas;\n\nint64_t(*divaGetFileSize)(MsString* path) = (int64_t(*)(MsString* path))0x1400abb20;\nFILE* (*divaFsopen)(const char* path, const char* mode, int shflag) = (FILE* (*)(const char* path, const char* mode, int shflag))0x14085a17c;\nint64_t(*divaFread)(void* dst, int64_t size, int64_t count, FILE* file) = (int64_t(*)(void* dst, int64_t size, int64_t count, FILE* file))0x14085a6c4;\nint(*divaFclose)(FILE* file) = (int(*)(FILE* file))0x140846e9c; // not hooked, just so it can be called\n\nstd::wstring ExePath() {\n\tWCHAR buffer[MAX_PATH];\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\treturn std::wstring(buffer);\n}\n\nstd::wstring DirPath() {\n\tstd::wstring exepath = ExePath();\n\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\n\treturn exepath.substr(0, pos);\n}\n\nstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\Novidia.ini\";\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\n\n\nvoid loadConfig()\n{\n\tdisable_amd_check = GetPrivateProfileIntW(L\"general\", L\"disable_amd_check\", 0, CONFIG_FILE) > 0 ? true : false;\n\tenable_chara_skinning = GetPrivateProfileIntW(L\"general\", L\"enable_chara_skinning\", 1, CONFIG_FILE) > 0 ? true : false;\n\tuse_TexSubImage = GetPrivateProfileIntW(L\"general\", L\"use_TexSubImage\", 1, CONFIG_FILE) > 0 ? true : false;\n\tforce_BGRA_upload = GetPrivateProfileIntW(L\"general\", L\"force_BGRA_upload\", 1, CONFIG_FILE) > 0 ? true : false;\n\tenable_shader_deltas = GetPrivateProfileIntW(L\"general\", L\"shader_delta_patches\", 1, CONFIG_FILE) > 0 ? true : false;\n\t\n\tif (GetPrivateProfileIntW(L\"general\", L\"shader_amd_farc\", 0, CONFIG_FILE) > 0)\n\t{\n\t\tMessageBoxA(NULL, \"Attention: Use of shader_amd.farc has been discontinued and will no longer work. MAMD mdata is not required and can be deleted.\\n\\nIf you use modded shaders, amd-tools has been updated so it can generate new patches. Please check the readme for more information.\", \"Novidia\", 0);\n\t\tWritePrivateProfileStringW(L\"general\", L\"shader_amd_farc\", L\"0\", CONFIG_FILE);\n\t}\n}\n\n\nvoid InjectCode(void* address, const std::vector<uint8_t> data)\n{\n\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\tDWORD oldProtect;\n\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\tmemcpy(address, data.data(), byteCount);\n\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n}\n\n//bool hasConflicts()\n//{\n//\tprintf(\"[Novidia] Checking for conflicts...\\n\");\n//\n//\tHMODULE* hModules = new HMODULE[USHRT_MAX];\n//\tHANDLE hProcess;\n//\tDWORD cbNeeded;\n//\n//\thProcess = GetCurrentProcess();\n//\n//\tif (EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {\n//\t\tfor (unsigned long long i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {\n//\t\t\tauto pNameFunc = (LPCWSTR(*)())GetProcAddress(hModules[i], \"GetPluginName\");\n//\t\t\tif (pNameFunc) {\n//\t\t\t\tLPCWSTR name = pNameFunc();\n//\t\t\t\tif (name && lstrcmpW(name, L\"DivaGL\") == 0)\n//\t\t\t\t{\n//\t\t\t\t\t// detected DivaGL\n//\t\t\t\t\tprintf(\"[Novidia] Detected DivaGL! Quitting!\\n\");\n//#ifdef _DEBUG\n//\t\t\t\t\tMessageBoxExW(NULL, L\"Detected DivaGL! Quitting!\\n\", L\"Novidia\", MB_OK, 0);\n//#endif\n//\t\t\t\t\tdelete[] hModules;\n//\t\t\t\t\treturn true;\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\tprintf(\"[Novidia] No conflicts found.\\n\");\n//\tdelete[] hModules;\n//\treturn false;\n//}\n"
  },
  {
    "path": "source-code/source/plugins/Novidia/src/glStuff.h",
    "content": "#pragma once\n\n#include <windows.h>\n#include <iostream>\n#include <detours.h>\n\nHMODULE ogl32 = GetModuleHandle(L\"opengl32.dll\");\n\nPROC(*wGlGetProcAddress_forhook)(LPCSTR) = (PROC(*)(LPCSTR))(GetProcAddress(ogl32, \"wglGetProcAddress\"));\n\n\n// should probably just use GL.h, but I'm avoiding it to let me call hooked stuff as normal\ntypedef uint32_t GLenum, GLuint, GLsizei, GLbitfield;\ntypedef int32_t GLint;\ntypedef uint64_t GLsizeiptr;\ntypedef int64_t GLintptr, GLint64;\ntypedef bool GLboolean;\ntypedef char GLchar;\n\n#define GL_FALSE 0\n#define GL_NO_ERROR 0\n#define GL_TEXTURE_1D 0x0de0\n#define GL_TEXTURE_2D 0x0de1\n#define GL_FLOAT 0x1406\n#define GL_RED 0x1903\n#define GL_GREEN 0x1904\n#define GL_BLUE 0x1905\n#define GL_ALPHA\t 0x1906\n#define GL_RGBA 0x1908\n#define GL_NEAREST 0x2600\n#define GL_TEXTURE_MAG_FILTER 0x2800\n#define GL_TEXTURE_MIN_FILTER 0x2801\n#define GL_TEXTURE_WRAP_S 0x2802\n#define GL_TEXTURE_WRAP_T 0x2803\n#define GL_BGRA 0x80e1\n#define GL_CLAMP_TO_BORDER 0x812d\n#define GL_CLAMP_TO_EDGE 0x812f\n#define GL_TEXTURE_IMAGE_FORMAT 0x828f\n#define GL_TEXTURE0 0x84c0\n#define GL_TEXTURE8 0x84c8\n#define GL_BUFFER_SIZE 0x8764\n#define GL_RGBA32F 0x8814\n#define GL_RGBA16F 0x881a\n#define GL_ARRAY_BUFFER 0x8892\n#define GL_ARRAY_BUFFER_BINDING 0x8894\n#define GL_READ_ONLY 0x88b8\n#define GL_STREAM_DRAW 0x88e0\n#define GL_STREAM_COPY 0x88e2\n#define GL_COMPILE_STATUS 0x8b81\n#define GL_LINK_STATUS 0x8b82\n#define GL_CURRENT_PROGRAM 0x8b8d\n#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8da2\n#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8da4\n#define GL_TEXTURE_SWIZZLE_R 0x8e42\n#define GL_TEXTURE_SWIZZLE_G 0x8e43\n#define GL_TEXTURE_SWIZZLE_B 0x8e44\n#define GL_TEXTURE_SWIZZLE_A 0x8e45\n#define GL_TEXTURE_SWIZZLE_RGBA 0x8e46\n#define GL_SHADER_STORAGE_BUFFER 0x90d2\n#define GL_COMPUTE_SHADER 0x91b9\n#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001\n#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000\n\n\n//void(__cdecl** p_glActiveTexture)(GLenum texture) = (void(__cdecl**)(GLenum texture))0x1411a3db8;\nvoid(__cdecl* glGenTextures)(GLsizei n, GLuint* textures) = *(void(__cdecl**)(GLsizei, GLuint*))0x140965ad8;\nvoid(__cdecl* glBindTexture)(GLenum target, GLuint texture) = *(void(__cdecl**)(GLenum, GLuint))0x140965bf8;\nvoid(__cdecl* glTexParameteri)(GLenum target, GLenum pname, GLint param) = *(void(__cdecl**)(GLenum, GLenum, GLint))0x140965a18;\nvoid(__cdecl* glTexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* data) = *(void(__cdecl**)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*))0x140965b58;\nvoid(__cdecl* glTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) = (void(__cdecl*)(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*))GetProcAddress(ogl32, \"glTexSubImage1D\");\n\n// these are all imported using wglGetProcAddress and can't be initialised until after the OpenGL context is created\nvoid(__cdecl* glActiveTexture)(GLenum texture);\nvoid(__cdecl* glTexStorage1D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);\nvoid(__cdecl* glGetInternalformativ)(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);\nvoid(__cdecl* glBindBuffer)(GLenum target, GLuint buffer);\nvoid(__cdecl* glBindBufferARB)(GLenum target, GLuint buffer);\nvoid(__cdecl* glBufferData)(GLenum target, GLsizeiptr size, const void* data, GLenum usage);\nvoid(__cdecl* glBufferDataARB)(GLenum target, GLsizeiptr size, const void* data, GLenum usage);\n\n// just used for a nicer time getting addresses and hooking\nstruct {\n\tvoid* ptr;\n\tconst char* name;\n\tbool dynamic;\n} glFuncs[] = {\n\t{&glGenTextures, \"glGenTextures\", false},\n\t{&glBindTexture, \"glBindTexture\", false},\n\t{&glTexParameteri, \"glTexParameteri\", false},\n\t{&glTexImage1D, \"glTexImage1D\", false},\n\t{&glTexSubImage1D, \"glTexSubImage1D\", false},\n\t{&glActiveTexture, \"glActiveTexture\", true},\n\t{&glTexStorage1D, \"glTexStorage1D\", true},\n\t{&glGetInternalformativ, \"glGetInternalformativ\", true},\n\t{&glBindBuffer, \"glBindBuffer\", true},\n\t{&glBindBufferARB, \"glBindBufferARB\", true},\n\t{&glBufferData, \"glBufferData\", true},\n\t{&glBufferDataARB, \"glBufferDataARB\", true},\n};\n\nbool loadGlAddresses()\n{\n\tbool ret = true;\n\tfor (auto fn : glFuncs)\n\t{\n\t\tif (fn.dynamic)\n\t\t{\n\t\t\t*(PROC*)(fn.ptr) = wGlGetProcAddress_forhook(fn.name);\n\t\t\tif (*(PROC*)(fn.ptr) == nullptr)\n\t\t\t{\n\t\t\t\tprintf(\"[Novidia] Failed to load address of %s\\n\", fn.name);\n\t\t\t\tret = false;\n\t\t\t\tMessageBoxA(NULL, fn.name, NULL, NULL);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\nconst char* getGlFuncName(void* func)\n{\n\tconst char* name = NULL;\n\tfor (auto fn : glFuncs)\n\t{\n\t\tif (func == *(PROC*)(fn.ptr))\n\t\t\tname = fn.name;\n\t}\n\n\treturn name;\n}\n\nbool hookGlFunc(PROC* target, void* hook)\n{\n\tconst char* name = getGlFuncName(*target);\n\n\tif (name == nullptr)\n\t{\n\t\tprintf(\"[Novidia] Invalid hook target at %p\\n\", *target);\n\t\treturn false;\n\t}\n\n\tDetourTransactionBegin();\n\tDetourUpdateThread(GetCurrentThread());\n\tprintf(\"[Novidia] Hooking %s\\n\", name);\n\tDetourAttach(&(PVOID&)*target, hook);\n\tDetourTransactionCommit();\n\n\treturn true;\n}"
  },
  {
    "path": "source-code/source/plugins/Patches/PatchApplier.h",
    "content": "#pragma once\n\n// PatchApplier provides the stuff for implementing patches for the specific game version\nclass PatchApplier {\npublic:\n\tvirtual void ApplyPatches() {};\n};"
  },
  {
    "path": "source-code/source/plugins/Patches/PatchApplier600.h",
    "content": "#pragma once\n#include <vector>\n#include \"PatchApplier.h\"\n#include \"framework.h\"\n\nclass PatchApplier600 : public PatchApplier {\n\tvirtual void ApplyPatches() {\n\t\tconst struct { void* Address; std::vector<uint8_t> Data; } patches_600[] =\n\t\t{\n\t\t\t// Always return true for the SelCredit enter SelPv check\n\t\t\t{ (void*)0x000000014037A560, { 0xB0, 0x01, 0xC3, 0x90, 0x90, 0x90 } },\n\t\t\t// Just completely ignore all SYSTEM_STARTUP errors\n\t\t\t{ (void*)0x00000001403DC590, { 0xC3 } },\n\t\t\t// Always exit TASK_MODE_APP_ERROR on the first frame\n\t\t\t{ (void*)0x00000001403DE8B7, { 0x90, 0x90 } },\n\t\t\t{ (void*)0x00000001403DE8D3, { 0x89, 0xD1, 0x90 } },\n\t\t\t// Ignore the EngineClear variable to clear the framebuffer at all resolutions\n\t\t\t{ (void*)0x00000001404E7470, { 0x90, 0x90 } },\n\t\t\t{ (void*)0x00000001404E7505, { 0x90, 0x90 } },\n\t\t\t// Write ram files to the current directory instead of Y : / SBZV / ram\n\t\t\t{ (void*)0x0000000140648AE9, { 0xE9, 0xD8, 0x00 } },\n\t\t\t// Change mdata path from \"C:/Mount/Option\" to \"mdata/\"\n\t\t\t{ (void*)0x0000000140A51058, { 0x6D, 0x64, 0x61, 0x74, 0x61, 0x2F, 0x00 } },\n\t\t\t{ (void*)0x0000000140648A8E, { 0x06 } },\n\t\t\t// Skip parts of the network check state\n\t\t\t{ (void*)0x000000014064D391, { 0xE9, 0x22, 0x03, 0x00 } },\n\t\t\t// Set the initial DHCP WAIT timer value to 0\n\t\t\t{ (void*)0x000000014064E0C7, { 0x00, 0x00 } },\n\t\t\t// Ignore SYSTEM_STARTUP Location Server checks\n\t\t\t{ (void*)0x000000014064EE82, { 0x90, 0x90 } },\n\t\t\t// Toon Shader Fix by lybxlpsv\n\t\t\t{ (void*)0x00000001404E813F, { 0x90 } },\n\t\t\t{ (void*)0x00000001404E8140, { 0x90 } },\n\t\t\t// Toon Shader Outline Fix by lybxlpsv\n\t\t\t{ (void*)0x000000014061C6B2, { 0x01 } },\n\t\t\t// Skip unnecessary checks\n\t\t\t{ (void*)0x0000000140207FB0, { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3 } },\n\t\t\t{ (void*)0x000000014064A400, { 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3 } },\n\t\t\t// Disables call to glutFitWindowSizeToDesktop, prevents window automatic resize\n\t\t\t{ (void*)0x000000014018CE06, { 0x90, 0x90, 0x90, 0x90, 0x90 } },\n\t\t\t// Allow modifier mode selection (by Team Shimapan)\n\t\t\t{ (void*)0x00000001405A7C03, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },\n\t\t\t{ (void*)0x00000001405A6B45, { 0x90, 0x90 } },\n\t\t\t// allow modifier modes to work without use_card\n\t\t\t{ (void*)0x00000001405A7B9A,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },\n\t\t\t{ (void*)0x000000014012F2CA,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },\n\t\t\t// enable module selector without use_card\n\t\t\t// { (void*)0x00000001405C513B,{ 0x01 } }, // no\n\t\t\t// Force Hide IDs\n\t\t\t{ (void*)0x000000014096D840, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\n\t\t\t{ (void*)0x000000014096D850, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\n\t\t\t// fix TouchReaction\n\t\t\t\t// get some more space by optimizing this code for size\n\t\t\t\t/*{ (void*)0x000000014067D1F2,{ 0x7E } },                                            // MOVQ  XMM0,qword ptr [0x168 + RSP] (change to MOVQ)\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x7),{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x6C } },              // MOVQ  qword ptr [RSP + 0x6c],XMM0\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0xD),{ 0xC7, 0x44, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00 } },  // MOV  dword ptr [RSP + 0x74],0x0\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x15),{ 0xEB, 0x0E } },                                      // JMP  0x1406a2007 (to rest of function as usual) // unsure\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// add new code\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x17),{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } },                    // MOVQ  XMM0,RDX (load touch pos)\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x1C),{ 0xEB, 0x5D } },                                      // JMP  0x1406a205d // unsure\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x7B),{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } },        // CVTPI2PS  XMM1,qword ptr [0x1409b8b1c] (load 1280x720) // unsuew\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x82),{ 0x0F, 0x12, 0x51, 0x1C } },                          // MOVLPS  XMM2,qword ptr [RCX + 0x1c] (load actual res)\n\t\t\t\t{ (void*)(0x000000014067D1F2 + 0x86),{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } },                    // JMP  0x1406a1f81 // unsure\n\t\t\t\t{ (void*)(0x000000014067D1F2 - 0x61),{ 0x0F, 0x59, 0xC1 } },                                // MULPS  XMM0,XMM1\n\t\t\t\t{ (void*)(0x000000014067D1F2 - 0x61),{ 0x0F, 0x5E, 0xC2 } },                                // DIVPS  XMM0,XMM2\n\t\t\t\t{ (void*)(0x000000014067D1F2 - 0x5B),{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } },              // MOVQ  qword ptr [RSP+0x10],XMM0\n\t\t\t\t{ (void*)(0x000000014067D1F2 - 0x55),{ 0xEB, 0x06 } },                                      // JMP  0x1406a1f95 (back to original function) // unsure\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// jmp to new code\n\t\t\t\t{ (void*)(0x000000014067D1F2 - 0x52),{ 0xEB, 0x67 } },*/                                      // JMP  0x1406a1ff9 // unsure\n\t\t};\n\n\t\tfor (size_t i = 0; i < _countof(patches_600); i++)\n\t\t\tInjectCode(patches_600[i].Address, patches_600[i].Data);\n\n\n\t\t\n\t\t// The old stereo patch...\n\t\t// Use 2 channels instead of 4\n\t\tif (nStereo)\n\t\t{\n\t\t\tInjectCode((void*)0x0000000140A4A588, { 0x02 });\n\t\t\tprintf(\"[Patches] Stereo patch enabled\\n\");\n\t\t}\n\n\t\t// Disable AA\n\t\tif (!nTAA)\n\t\t{\n\t\t\t// set TAA var (shouldn't be needed but whatever)\n\t\t\t//*(byte*)0x00000001411AB67C = 0; // no\n\n\t\t\t// make constructor/init not set TAA\n\t\t\t{DWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x000000014049258D, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x000000014049258D + 0) = 0x90;\n\t\t\t*((byte*)0x000000014049258D + 1) = 0x90;\n\t\t\t*((byte*)0x000000014049258D + 2) = 0x90;\n\t\t\tVirtualProtect((BYTE*)0x000000014049258D, 3, oldProtect, &bck); }\n\n\t\t\t// not sure, but it's somewhere in TaskPvGame init\n\t\t\t// just make it set TAA to 0 instead of 1 to avoid possible issues\n\t\t\t{DWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x00000001400FF48D, 1, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x00000001400FF48D + 0) = 0x00;\n\t\t\tVirtualProtect((BYTE*)0x00000001400FF48D, 1, oldProtect, &bck); }\n\n\t\t\t// prevent re-enabling after taking photos\n\t\t\t{DWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x0000000140476EC8, 1, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x0000000140476EC8 + 0) = 0x00;\n\t\t\tVirtualProtect((BYTE*)0x0000000140476EC8, 1, oldProtect, &bck); }\n\n\t\t\tprintf(\"[Patches] TAA disabled\\n\");\n\t\t}\n\t\tif (!nMLAA)\n\t\t{\n\t\t\t// set MLAA var (shouldn't be needed but whatever)\n\t\t\t//*(byte*)0x00000001411AB680 = 0; // no\n\n\t\t\t// make constructor/init not set MLAA\n\t\t\t{DWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x000000014049258A, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x000000014049258A + 0) = 0x90;\n\t\t\t*((byte*)0x000000014049258A + 1) = 0x90;\n\t\t\t*((byte*)0x000000014049258A + 2) = 0x90;\n\t\t\tVirtualProtect((BYTE*)0x000000014049258A, 3, oldProtect, &bck); }\n\n\t\t\tprintf(\"[Patches] MLAA disabled\\n\");\n\t\t}\n\n\t\t// Replace the hardcoded videos with MP4s, if they exist\n\t\tif (nMP4Movies)\n\t\t{\n\t\t\tpatchMovieExt(\"adv_cfm_cm\", (void*)0x0000000140989ED5);\n\t\t\tpatchMovieExt(\"adv_sega_cm\", (void*)0x0000000140989EF6);\n\t\t\tpatchMovieExt(\"diva_adv02\", (void*)0x00000001409C537D);\n\t\t\tpatchMovieExt(\"diva_adv\", (void*)0x00000001409C53AB);\n\t\t}\n\t\t// Hide \"FREE PLAY\"\n\t\tif (nHideFreeplay)\n\t\t{\n\t\t\tInjectCode((void*)0x0000000140388A5B, { 0x06, 0xB6 });\n\t\t\tprintf(\"[Patches] Hide FREE PLAY/CREDIT(S) enabled\\n\");\n\t\t}\n\t\t// Enable \"FREE PLAY\" mode\n\t\tif (nFreeplay || nHideFreeplay)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001403A1B1A, { 0x75 });\n\t\t\tprintf(\"[Patches] Show FREE PLAY instead of CREDIT(S)\\n\");\n\n\t\t\tif (nPDLoaderText && !nHideFreeplay)\n\t\t\t{\n\t\t\t\tInjectCode((void*)0x00000001409BC188, { 'U', 'N', 'S', 'U', 'P', 'P', 'O', 'R', 'T', 'E', 'D', '\\0' });\n\t\t\t\tprintf(\"[Patches] Show PD Loader text\\n\");\n\t\t\t}\n\t\t}\n\t\t// Use GLUT_CURSOR_RIGHT_ARROW instead of GLUT_CURSOR_NONE\n\t\tif (nCursor)\n\t\t{\n\t\t\t/*InjectCode((void*)0x000000014018B44A, { 0x00 });\n\t\t\tInjectCode((void*)0x00000001402E7FE5, { 0xeb }); // Disable debug cursor // unsure\n\t\t\tprintf(\"[Patches] Cursor enabled\\n\");*/\n\t\t}\n\t\t// Override status icon states to be invalid (hides them)\n\t\tif (nHideStatusIcons || nStatusIcons > 0)\n\t\t{\n\t\t\tstd::vector<uint8_t> cardIcon = { 0xFD, 0x0A };\n\t\t\tstd::vector<uint8_t> networkIcon = { 0x9E, 0x1E };\n\n\t\t\tif (nHideStatusIcons || nStatusIcons == 1 || nStatusIcons >= 5) // 1 or invalid for hidden\n\t\t\t{\n\t\t\t\tcardIcon = { 0xFD, 0x0A };\n\t\t\t\tnetworkIcon = { 0x9E, 0x1E };\n\t\t\t\tprintf(\"[Patches] Status icons hidden\\n\");\n\t\t\t}\n\t\t\telse if (nStatusIcons == 2) // 2 for error icons\n\t\t\t{\n\t\t\t\tcardIcon = { 0xFA, 0x0A };\n\t\t\t\tnetworkIcon = { 0x9F, 0x1E };\n\t\t\t\tprintf(\"[Patches] Status icons set to error state\\n\");\n\t\t\t}\n\t\t\telse if (nStatusIcons == 3) // 3 for OK icons\n\t\t\t{\n\t\t\t\tcardIcon = { 0xFC, 0x0A };\n\t\t\t\tnetworkIcon = { 0xA0, 0x1E };\n\t\t\t\tprintf(\"[Patches] Status icons set to OK state\\n\");\n\t\t\t}\n\t\t\telse if (nStatusIcons == 4) // 4 for partial OK icons\n\t\t\t{\n\t\t\t\tcardIcon = { 0xFB, 0x0A };\n\t\t\t\tnetworkIcon = { 0xA1, 0x1E };\n\t\t\t\tprintf(\"[Patches] Status icons set to partial OK state\\n\");\n\t\t\t}\n\n\t\t\t// card icon\n\t\t\tInjectCode((void*)0x00000001403A0C9E, cardIcon); // error state\n\t\t\tInjectCode((void*)0x00000001403A0CA3, cardIcon); // OK state\n\n\t\t\t// network icon\n\t\t\tInjectCode((void*)0x00000001403A107B, networkIcon); // error state\n\t\t\tInjectCode((void*)0x00000001403A1085, networkIcon); // OK state\n\t\t\tInjectCode((void*)0x00000001403A109B, networkIcon); // partial state\n\n\t\t\tInjectCode((void*)0x00000001403A10D5, { 0x48, 0xE9 }); // never show the error code for partial connection\n\n\t\t\t// I was going to use this with a string, but the assignment wasn't behaving well and making separate prints was easier than figuring it out\n\t\t\t// printf(\"[Patches] Status icons %s\\n\", iconType);\n\t\t}\n\t\t// Removes PV watermark\n\t\tif (nHidePVWatermark)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001409D9798, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });\n\t\t\tprintf(\"[Patches] PV watermark hidden\\n\");\n\t\t}\n\t\t// Disable the PV screen photo UI\n\t\tif (nNoPVUi)\n\t\t{\n\t\t\tInjectCode((void*)0x0000000140476DB1, { 0xEB, 0x6F }); // skip button panel image (JMP\t0x14048FB02) // unsure\n\n\t\t\t// patch minimum PV UI state to 1 instead of 0\n\t\t\t// hook check for lyrics enabled (UI state < 2) to change UI state 0 into 1\n\t\t\t// dump new code in the skipped button panel condition\n\t\t\tInjectCode((void*)0x0000000140476DB3, { 0xC7, 0x83, 0x58, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }); // MOV\tdword ptr [0x158 + RBX],0x1\n\t\t\tInjectCode((void*)0x0000000140476DBD, { 0xC6, 0x80, 0x3A, 0xD1, 0x02, 0x00, 0x01 }); // MOV\tbyte ptr [0x2d13a + RAX],0x1\n\t\t\tInjectCode((void*)0x0000000140476DC4, { 0xE9, 0x8B, 0xFB, 0xFF, 0xFF }); // JMP\t0x14048F634 // unsure\n\n\t\t\tInjectCode((void*)0x000000014047694D, { 0xE9, 0x61, 0x04, 0x00, 0x00 }); // JMP\t0x14048FA93 // unsure\n\n\t\t\tprintf(\"[Patches] PV UI disabled\\n\");\n\t\t}\n\t\t// Don't show volume control\n\t\tif (nHideVolCtrl)\n\t\t{\n\t\t\t// skip SE button\n\t\t\tInjectCode((void*)0x000000014096CD28, { 0xC0, 0xD3 });\n\n\t\t\t// skip volume sliders button\n\t\t\tInjectCode((void*)0x0000000140A4A3D8, { 0xE0, 0x50 });\n\n\t\t\tprintf(\"[Patches] Volume control hidden\\n\");\n\t\t}\n\t\t// Skip loading (and therefore displaying) song lyrics\n\t\tif (nNoLyrics)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001404CE362, { 0x00, 0x00 });\n\t\t\tInjectCode((void*)0x00000001404CE29E, { 0x48, 0xE9 }); // ensure first iteration doesn't run // unsure\n\t\t\tprintf(\"[Patches] Lyrics disabled\\n\");\n\t\t}\n\t\t// Skip loading (and therefore displaying) song movies\n\t\tif (nNoMovies)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001404D1C6B, { 0x48, 0xE9 }); // unsure\n\t\t\tInjectCode((void*)0x00000001404D1B61, { 0x48, 0xE9 }); // unsure\n\t\t\tprintf(\"[Patches] Movies disabled\\n\");\n\t\t}\n\t\t// Disable error banner\n\t\tif (nNoError)\n\t\t{\n\t\t\t// Disable Errors Banner\n\t\t\tInjectCode((void*)0x00000001403A0DCB, { 0x90, 0x90 });\n\t\t\tprintf(\"[Patches] Errors Banner disabled\\n\");\n\t\t}\n\t\t// Disable timer\n\t\tif (nNoTimer)\n\t\t{\n\t\t\t// Freeze mode selection timer\n\t\t\tInjectCode((void*)0x00000001405456DE, { 0x90, 0x90, 0x90 });\n\n\t\t\t// Freeze PV selection timer\n\t\t\tInjectCode((void*)0x000000014059B21F, { 0x90, 0x90, 0x90, 0x90 });\n\t\t}\n\t\t// Disable timer sprite\n\t\tif (nNoTimerSprite)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001409883A8, { 0x00 }); // time_loop\n\t\t\tInjectCode((void*)0x0000000140A01E20, { 0x00 }); // time_in\n\t\t\tInjectCode((void*)0x0000000140A01E28, { 0x00 }); // time_out\n\t\t}\n\t\t// Enhanced Stage Manager\n\t\tif (nEStageManager > 0)\n\t\t{\n\t\t\t// Replace the function that provides the number of stages and compact some of it\n\t\t\tInjectCode((void*)0x0000000140371E50, { 0x48, 0x8B, 0x88, 0x40, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x20, 0x48, 0x8B, 0xD0, 0x48, 0x8B, 0x88, 0x48, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x28, 0x8B, 0x88, 0x50, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x30, 0x8B, 0x88, 0x54, 0x01, 0x00, 0x00, 0x8B, 0x80, 0x58, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x38, 0x8B, 0x82, 0x5C, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x34, 0x89, 0x44, 0x24, 0x3C, 0x48, 0x8B, 0x82, 0x60, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x82, 0x68, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x82, 0x70, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x50, 0x8B, 0x82, 0x78, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x58, 0x84, 0xC0, 0x74, 0x2A, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0xC1, 0xE8, 0x20, 0x85, 0xC0, 0x75, 0x1D, 0xE8, 0xD9, 0xD9, 0xE5, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x13, 0x48, 0x8D, 0x48, 0x10, 0xE8, 0xFB, 0xD3, 0xE5, 0xFF, 0xB9, 0x03, 0x00, 0x00, 0x00, 0x85, 0xC0, 0x0F, 0x45, 0xD9, 0x8B, 0x1D, 0x1B, 0x0C, 0x00, 0x00, 0x83, 0x3D, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x74, 0x06, 0x8B, 0x1D, 0x10, 0x0C, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x60, 0x5B, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }); // unsure\n\n\t\t\t// Jump to another section by addding some code to replace the values (Jump 1)\n\t\t\tInjectCode((void*)(0x0000000140371E50 + 0x104), { 0xE9, 0x87, 0x0B, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }); // unsure\n\n\t\t\t// Jump to another section by addding some code to replace the values (Replace 1/2) while some reserving space for values\n\t\t\tInjectCode((void*)(0x0000000140371E50 + 0xC50), { 0xFF, 0x05, 0x76, 0x00, 0x00, 0x00, 0x8B, 0x0D, 0x70, 0x00, 0x00, 0x00, 0xBA, 0x02, 0x00, 0x00, 0x00, 0x83, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0xFF, 0xC2, 0x39, 0xD1, 0x0F, 0x4D, 0xCA, 0x89, 0x48, 0x08, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xE8, 0x92, 0x98, 0xE0, 0xFF, 0xB0, 0x01, 0x48, 0x83, 0xC4, 0x28, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x44, 0x89, 0x61, 0x08, 0x44, 0x88, 0x61, 0x0C, 0x4C, 0x89, 0x61, 0x10, 0x44, 0x89, 0x25, 0x29, 0x00, 0x00, 0x00, 0xE9, 0x68, 0xF4, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); // unsure\n\n\t\t\t// Use the value from our own address instead of the original one\n\t\t\tInjectCode((void*)0x00000001403DDABF, { 0x48, 0x8D, 0x05, 0x4A, 0x18, 0xDA, 0x00, 0x8B, 0x1D, 0x00, 0x56 }); // unsure\n\n\t\t\t// Jump to another section by addding some code to replace the values (Jump 2)\n\t\t\tInjectCode((void*)(0x00000001403F65AF + 0x89), { 0xE9, 0x03, 0x55, 0xF9, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }); // unsure\n\n\t\t\tDWORD StageCountProtect;\n\t\t\tVirtualProtect((int32_t*)0x140372B10, 0x10, PAGE_EXECUTE_READWRITE, &StageCountProtect); // unsure\n\n\t\t\tint* ESM = (int*)0x0000000140372B10; // unsure\n\n\t\t\tif (nEStageManagerEncore)\n\t\t\t\tESM[1] = nEStageManager;\n\t\t\telse\n\t\t\t\tESM[0] = nEStageManager;\n\n\t\t\tESM[2] = nEStageManagerEncore;\n\n\t\t\tprintf(\"[Patches] Enhanced Stage Manager enabled\\n\");\n\t\t}\n\t\t// OpenGL Patches\n\t\t//if (nOGLPatchA)\n\t\t//{\n\t\t//\t// (call cs:glGetError) -> (xor eax, eax); (nop); (nop); (nop); (nop);\n\t\t//\tInjectCode((void*)0x000000014067842D, { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 });\n\t\t//}\n\t\t//if (nOGLPatchB)\n\t\t//{\n\t\t//\t// (js loc_14069BC32) -> (nop)...\n\t\t//\tInjectCode((void*)0x0000000140676D04, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\n\t\t//}\n\t\t// Unlock PSEUDO modules (which will all default to Miku, unless we also patch them to match the first performer)\n\t\tif (nUnlockPseudo)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001409E71C0, { 0x00 });\n\t\t\tInjectCode((void*)0x00000001409E71D0, { 0x00 });\n\t\t\tInjectCode((void*)0x00000001409E71E0, { 0x00 });\n\t\t\tInjectCode((void*)0x00000001409E71F0, { 0x00 });\n\t\t\tInjectCode((void*)0x00000001409E7200, { 0x00 });\n\t\t}\n\t\t// Enable card button by somewhatlurker (pretty much just eye candy for now)\n\t\tif (nCard)\n\t\t{\n\t\t\tInjectCode((void*)0x00000001405449EB, { 0x90, 0x90 });\n\t\t}\n\t\t// The original slider update needs to run for hardware sliders to work -- only patch it when using emulation\n\t\tif (!nHardwareSlider)\n\t\t{\n\t\t\t// Don't update the touch slider state so we can write our own\n\t\t\tInjectCode((void*)0x00000001405F0C5B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 });\n\t\t}\n\t}\n};"
  },
  {
    "path": "source-code/source/plugins/Patches/PatchApplier710.h",
    "content": "#pragma once\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"PatchApplier.h\"\r\n#include \"framework.h\"\r\n\r\nclass PatchApplier710 : public PatchApplier {\r\n\tvirtual void ApplyPatches() {\r\n\t\tconst struct { void* Address; std::vector<uint8_t> Data; } patches_710[] =\r\n\t\t{\r\n\t\t\t// Just completely ignore all SYSTEM_STARTUP errors\r\n\t\t\t{ (void*)0x00000001403F5080, { 0xC3 } },\r\n\t\t\t// Always exit TASK_MODE_APP_ERROR on the first frame\r\n\t\t\t{ (void*)0x00000001403F73A7, { 0x90, 0x90 } },\r\n\t\t\t{ (void*)0x00000001403F73C3, { 0x89, 0xD1, 0x90 } },\r\n\t\t\t// Ignore the EngineClear variable to clear the framebuffer at all resolutions\r\n\t\t\t{ (void*)0x0000000140501480, { 0x90, 0x90 } },\r\n\t\t\t{ (void*)0x0000000140501515, { 0x90, 0x90 } },\r\n\t\t\t// Write ram files to the current directory instead of Y : / SBZV / ram\r\n\t\t\t{ (void*)0x000000014066CF09, { 0xE9, 0xD8, 0x00 } },\r\n\t\t\t// Change mdata path from \"C:/Mount/Option\" to \"mdata/\"\r\n\t\t\t{ (void*)0x0000000140A8CA18, { 0x6D, 0x64, 0x61, 0x74, 0x61, 0x2F, 0x00 } },\r\n\t\t\t{ (void*)0x000000014066CEAE, { 0x06 } },\r\n\t\t\t// Skip parts of the network check state\r\n\t\t\t{ (void*)0x00000001406717B1, { 0xE9, 0x22, 0x03, 0x00 } },\r\n\t\t\t// Set the initial DHCP WAIT timer value to 0\r\n\t\t\t{ (void*)0x00000001406724E7, { 0x00, 0x00 } },\r\n\t\t\t// Ignore SYSTEM_STARTUP Location Server checks\r\n\t\t\t{ (void*)0x00000001406732A2, { 0x90, 0x90 } },\r\n\t\t\t// Toon Shader Fix by lybxlpsv\r\n\t\t\t{ (void*)0x000000014050214F, { 0x90 } },\r\n\t\t\t{ (void*)0x0000000140502150, { 0x90 } },\r\n\t\t\t// Toon Shader Outline Fix by lybxlpsv\r\n\t\t\t{ (void*)0x0000000140641102, { 0x01 } },\r\n\t\t\t// Skip unnecessary checks\r\n\t\t\t{ (void*)0x0000000140210820, { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3 } },\r\n\t\t\t{ (void*)0x000000014066E820, { 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3 } },\r\n\t\t\t// Disables call to glutFitWindowSizeToDesktop, prevents window automatic resize\r\n\t\t\t{ (void*)0x0000000140194E06, { 0x90, 0x90, 0x90, 0x90, 0x90 } },\r\n\t\t\t// Allow modifier mode selection (by Team Shimapan)\r\n\t\t\t{ (void*)0x00000001405CB1B3, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },\r\n\t\t\t{ (void*)0x00000001405CA0F5, { 0x90, 0x90 } },\r\n\t\t\t// allow modifier modes to work without use_card\r\n\t\t\t{ (void*)0x00000001405CB14A,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },\r\n\t\t\t{ (void*)0x0000000140136CFA,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },\r\n\t\t\t// enable module selector without use_card\r\n\t\t\t{ (void*)0x00000001405C513B,{ 0x01 } },\r\n\t\t\t// fix back button\r\n\t\t\t{ (void*)0x0000000140578FB8, { 0xE9, 0x73, 0xFF, 0xFF, 0xFF } },\r\n\t\t\t// Force Hide IDs\r\n\t\t\t{ (void*)0x00000001409A5918, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\r\n\t\t\t{ (void*)0x00000001409A5928, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\r\n\t\t\t// fix TouchReaction\r\n\t\t\t\t// get some more space by optimizing this code for size\r\n\t\t\t\t{ (void*)0x00000001406A1FE2,{ 0x7E } },                                            // MOVQ  XMM0,qword ptr [0x168 + RSP] (change to MOVQ)\r\n\t\t\t\t{ (void*)0x00000001406A1FE9,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x6C } },              // MOVQ  qword ptr [RSP + 0x6c],XMM0\r\n\t\t\t\t{ (void*)0x00000001406A1FEF,{ 0xC7, 0x44, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00 } },  // MOV  dword ptr [RSP + 0x74],0x0\r\n\t\t\t\t{ (void*)0x00000001406A1FF7,{ 0xEB, 0x0E } },                                      // JMP  0x1406a2007 (to rest of function as usual)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // add new code\r\n\t\t\t\t{ (void*)0x00000001406A1FF9,{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } },                    // MOVQ  XMM0,RDX (load touch pos)\r\n\t\t\t\t{ (void*)0x00000001406A1FFE,{ 0xEB, 0x5D } },                                      // JMP  0x1406a205d\r\n\t\t\t\t{ (void*)0x00000001406A205D,{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } },        // CVTPI2PS  XMM1,qword ptr [0x1409b8b1c] (load 1280x720)\r\n\t\t\t\t{ (void*)0x00000001406A2064,{ 0x0F, 0x12, 0x51, 0x1C } },                          // MOVLPS  XMM2,qword ptr [RCX + 0x1c] (load actual res)\r\n\t\t\t\t{ (void*)0x00000001406A2068,{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } },                    // JMP  0x1406a1f81\r\n\t\t\t\t{ (void*)0x00000001406A1F81,{ 0x0F, 0x59, 0xC1 } },                                // MULPS  XMM0,XMM1\r\n\t\t\t\t{ (void*)0x00000001406A1F84,{ 0x0F, 0x5E, 0xC2 } },                                // DIVPS  XMM0,XMM2\r\n\t\t\t\t{ (void*)0x00000001406A1F87,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } },              // MOVQ  qword ptr [RSP+0x10],XMM0\r\n\t\t\t\t{ (void*)0x00000001406A1F8D,{ 0xEB, 0x06 } },                                      // JMP  0x1406a1f95 (back to original function)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   // jmp to new code\r\n\t\t\t\t{ (void*)0x00000001406A1F90,{ 0xEB, 0x67 } },                                      // JMP  0x1406a1ff9\r\n\t\t};\r\n\r\n\t\tfor (size_t i = 0; i < _countof(patches_710); i++)\r\n\t\t\tInjectCode(patches_710[i].Address, patches_710[i].Data);\r\n\r\n\r\n\r\n\t\t// The old stereo patch...\r\n\t\t// Use 2 channels instead of 4\r\n\t\tif (nStereo)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x0000000140A860C0, { 0x02 });\r\n\t\t\tprintf(\"[Patches] Stereo patch enabled\\n\");\r\n\t\t}\r\n\r\n\t\t// Disable AA\r\n\t\tif (!nTAA)\r\n\t\t{\r\n\t\t\t// set TAA var (shouldn't be needed but whatever)\r\n\t\t\t*(byte*)0x00000001411AB67C = 0;\r\n\r\n\t\t\t// make constructor/init not set TAA\r\n\t\t\t{DWORD oldProtect, bck;\r\n\t\t\tVirtualProtect((BYTE*)0x00000001404AB11D, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t*((byte*)0x00000001404AB11D + 0) = 0x90;\r\n\t\t\t*((byte*)0x00000001404AB11D + 1) = 0x90;\r\n\t\t\t*((byte*)0x00000001404AB11D + 2) = 0x90;\r\n\t\t\tVirtualProtect((BYTE*)0x00000001404AB11D, 3, oldProtect, &bck); }\r\n\r\n\t\t\t// not sure, but it's somewhere in TaskPvGame init\r\n\t\t\t// just make it set TAA to 0 instead of 1 to avoid possible issues\r\n\t\t\t{DWORD oldProtect, bck;\r\n\t\t\tVirtualProtect((BYTE*)0x00000001401063CE, 1, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t*((byte*)0x00000001401063CE + 0) = 0x00;\r\n\t\t\tVirtualProtect((BYTE*)0x00000001401063CE, 1, oldProtect, &bck); }\r\n\r\n\t\t\t// prevent re-enabling after taking photos\r\n\t\t\t{DWORD oldProtect, bck;\r\n\t\t\tVirtualProtect((BYTE*)0x000000014048FBA9, 1, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t*((byte*)0x000000014048FBA9 + 0) = 0x00;\r\n\t\t\tVirtualProtect((BYTE*)0x000000014048FBA9, 1, oldProtect, &bck); }\r\n\r\n\t\t\tprintf(\"[Patches] TAA disabled\\n\");\r\n\t\t}\r\n\t\tif (!nMLAA)\r\n\t\t{\r\n\t\t\t// set MLAA var (shouldn't be needed but whatever)\r\n\t\t\t*(byte*)0x00000001411AB680 = 0;\r\n\r\n\t\t\t// make constructor/init not set MLAA\r\n\t\t\t{DWORD oldProtect, bck;\r\n\t\t\tVirtualProtect((BYTE*)0x00000001404AB11A, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t*((byte*)0x00000001404AB11A + 0) = 0x90;\r\n\t\t\t*((byte*)0x00000001404AB11A + 1) = 0x90;\r\n\t\t\t*((byte*)0x00000001404AB11A + 2) = 0x90;\r\n\t\t\tVirtualProtect((BYTE*)0x00000001404AB11A, 3, oldProtect, &bck); }\r\n\r\n\t\t\tprintf(\"[Patches] MLAA disabled\\n\");\r\n\t\t}\r\n\r\n\t\t// gamma\r\n\t\tif (nGamma != 100 && nGamma != 0)\r\n\t\t{\r\n\t\t\tfloat gamma_float = (float)nGamma / 100.0f;\r\n\t\t\tInjectCode((void*)(0x1404a863b), { *((uint8_t*)(&gamma_float)), *((uint8_t*)(&gamma_float) + 1), *((uint8_t*)(&gamma_float) + 2), *((uint8_t*)(&gamma_float) + 3) });\r\n\r\n\t\t\tprintf(\"[Patches] Gamma: %f\\n\", gamma_float);\r\n\t\t}\r\n\r\n\t\t// Replace the hardcoded videos with MP4s, if they exist\r\n\t\tif (nMP4Movies)\r\n\t\t{\r\n\t\t\tpatchMovieExt(\"adv_cm_01\", (void*)0x00000001409A53CC);\r\n\t\t\tpatchMovieExt(\"adv_cm_02\", (void*)0x00000001409A53E4);\r\n\t\t\tpatchMovieExt(\"adv_cm_03\", (void*)0x00000001409A53FC);\r\n\t\t\tpatchMovieExt(\"adv_cfm_cm\", (void*)0x00000001409C22CD);\r\n\t\t\tpatchMovieExt(\"adv_sega_cm\", (void*)0x00000001409C22EE);\r\n\t\t\tpatchMovieExt(\"diva_adv02\", (void*)0x00000001409FF455);\r\n\t\t\tpatchMovieExt(\"diva_adv\", (void*)0x00000001409FF483);\r\n\t\t}\r\n\t\t// Hide \"FREE PLAY\"\r\n\t\tif (nHideFreeplay)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x00000001403BABEF, { 0x06, 0xB6 });\r\n\t\t\tprintf(\"[Patches] Hide FREE PLAY/CREDIT(S) enabled\\n\");\r\n\t\t}\r\n\t\t// Enable \"FREE PLAY\" mode\r\n\t\tif (nFreeplay || nHideFreeplay)\r\n\t\t{\r\n\t\t\t// Always return true for the SelCredit enter SelPv check\r\n\t\t\tInjectCode((void*)0x0000000140393610, { 0xB0, 0x01, 0xC3, 0x90, 0x90, 0x90 });\r\n\r\n\t\t\tInjectCode((void*)0x00000001403BABEA, { 0x75 });\r\n\t\t\tprintf(\"[Patches] Show FREE PLAY instead of CREDIT(S)\\n\");\r\n\r\n\t\t\tif (nPDLoaderText && !nHideFreeplay)\r\n\t\t\t{\r\n\t\t\t\tInjectCode((void*)0x00000001409F61F0, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72,\r\n\t\t\t\t\t0x20, 't', 'e', 's', 't',\r\n\t\t\t\t\t0x00});\r\n\t\t\t\tprintf(\"[Patches] Show PD Loader text\\n\");\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Use GLUT_CURSOR_RIGHT_ARROW instead of GLUT_CURSOR_NONE\r\n\t\tif (nCursor)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x000000014019341B, { 0x00 });\r\n\t\t\tInjectCode((void*)0x00000001403012b5, { 0xeb }); // Disable debug cursor\r\n\t\t\tprintf(\"[Patches] Cursor enabled\\n\");\r\n\t\t}\r\n\t\t// Override status icon states to be invalid (hides them)\r\n\t\tif (nHideStatusIcons || nStatusIcons > 0)\r\n\t\t{\r\n\t\t\tstd::vector<uint8_t> cardIcon = { 0xFD, 0x0A };\r\n\t\t\tstd::vector<uint8_t> networkIcon = { 0x9E, 0x1E };\r\n\r\n\t\t\tif (nHideStatusIcons || nStatusIcons == 1 || nStatusIcons >= 5) // 1 or invalid for hidden\r\n\t\t\t{\r\n\t\t\t\tcardIcon = { 0xFD, 0x0A };\r\n\t\t\t\tnetworkIcon = { 0x9E, 0x1E };\r\n\t\t\t\tprintf(\"[Patches] Status icons hidden\\n\");\r\n\t\t\t}\r\n\t\t\telse if (nStatusIcons == 2) // 2 for error icons\r\n\t\t\t{\r\n\t\t\t\tcardIcon = { 0xFA, 0x0A };\r\n\t\t\t\tnetworkIcon = { 0x9F, 0x1E };\r\n\t\t\t\tprintf(\"[Patches] Status icons set to error state\\n\");\r\n\t\t\t}\r\n\t\t\telse if (nStatusIcons == 3) // 3 for OK icons\r\n\t\t\t{\r\n\t\t\t\tcardIcon = { 0xFC, 0x0A };\r\n\t\t\t\tnetworkIcon = { 0xA0, 0x1E };\r\n\t\t\t\tprintf(\"[Patches] Status icons set to OK state\\n\");\r\n\t\t\t}\r\n\t\t\telse if (nStatusIcons == 4) // 4 for partial OK icons\r\n\t\t\t{\r\n\t\t\t\tcardIcon = { 0xFB, 0x0A };\r\n\t\t\t\tnetworkIcon = { 0xA1, 0x1E };\r\n\t\t\t\tprintf(\"[Patches] Status icons set to partial OK state\\n\");\r\n\t\t\t}\r\n\r\n\t\t\t// card icon\r\n\t\t\tInjectCode((void*)0x00000001403B9D6E, cardIcon); // error state\r\n\t\t\tInjectCode((void*)0x00000001403B9D73, cardIcon); // OK state\r\n\r\n\t\t\t// network icon\r\n\t\t\tInjectCode((void*)0x00000001403BA14B, networkIcon); // error state\r\n\t\t\tInjectCode((void*)0x00000001403BA155, networkIcon); // OK state\r\n\t\t\tInjectCode((void*)0x00000001403BA16B, networkIcon); // partial state\r\n\r\n\t\t\tInjectCode((void*)0x00000001403BA1A5, { 0x48, 0xE9 }); // never show the error code for partial connection\r\n\r\n\t\t\t// I was going to use this with a string, but the assignment wasn't behaving well and making separate prints was easier than figuring it out\r\n\t\t\t// printf(\"[Patches] Status icons %s\\n\", iconType);\r\n\t\t}\r\n\t\t// Removes PV watermark\r\n\t\tif (nHidePVWatermark)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x0000000140A13A88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });\r\n\t\t\tprintf(\"[Patches] PV watermark hidden\\n\");\r\n\t\t}\r\n\t\t// Disable the PV screen photo UI\r\n\t\tif (nNoPVUi)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x000000014048FA91, { 0xEB, 0x6F }); // skip button panel image (JMP\t0x14048FB02)\r\n\r\n\t\t\t// patch minimum PV UI state to 1 instead of 0\r\n\t\t\t// hook check for lyrics enabled (UI state < 2) to change UI state 0 into 1\r\n\t\t\t// dump new code in the skipped button panel condition\r\n\t\t\tInjectCode((void*)0x000000014048FA93, { 0xC7, 0x83, 0x58, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }); // MOV\tdword ptr [0x158 + RBX],0x1\r\n\t\t\tInjectCode((void*)0x000000014048FA9D, { 0xC6, 0x80, 0x3A, 0xD1, 0x02, 0x00, 0x01 }); // MOV\tbyte ptr [0x2d13a + RAX],0x1\r\n\t\t\tInjectCode((void*)0x000000014048FAA4, { 0xE9, 0x8B, 0xFB, 0xFF, 0xFF }); // JMP\t0x14048F634\r\n\r\n\t\t\tInjectCode((void*)0x000000014048F62D, { 0xE9, 0x61, 0x04, 0x00, 0x00 }); // JMP\t0x14048FA93\r\n\r\n\t\t\tprintf(\"[Patches] PV UI disabled\\n\");\r\n\t\t}\r\n\t\t// Don't show volume control\r\n\t\tif (nHideVolCtrl)\r\n\t\t{\r\n\t\t\t// skip SE button\r\n\t\t\tInjectCode((void*)0x00000001409A4D60, { 0xC0, 0xD3 });\r\n\r\n\t\t\t// skip volume sliders button\r\n\t\t\tInjectCode((void*)0x0000000140A85F10, { 0xE0, 0x50 });\r\n\r\n\t\t\tprintf(\"[Patches] Volume control hidden\\n\");\r\n\t\t}\r\n\t\t// Skip loading (and therefore displaying) song lyrics\r\n\t\tif (nNoLyrics)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x00000001404E7A25, { 0x00, 0x00 });\r\n\t\t\tInjectCode((void*)0x00000001404E7950, { 0x48, 0xE9 }); // ensure first iteration doesn't run\r\n\t\t\tprintf(\"[Patches] Lyrics disabled\\n\");\r\n\t\t}\r\n\t\t// Skip loading (and therefore displaying) song movies\r\n\t\tif (nNoMovies)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x00000001404EB584, { 0x48, 0xE9 });\r\n\t\t\tInjectCode((void*)0x00000001404EB471, { 0x48, 0xE9 });\r\n\t\t\tprintf(\"[Patches] Movies disabled\\n\");\r\n\t\t}\r\n\t\t// Disable error banner\r\n\t\tif (nNoError)\r\n\t\t{\r\n\t\t\t// Disable Errors Banner\r\n\t\t\tInjectCode((void*)0x00000001403B9E9B, { 0x90, 0x90 });\r\n\t\t\tprintf(\"[Patches] Errors Banner disabled\\n\");\r\n\t\t}\r\n\t\t// Disable timer\r\n\t\tif (nNoTimer)\r\n\t\t{\r\n\t\t\t// Freeze mode selection timer\r\n\t\t\tInjectCode((void*)0x0000000140566B9E, { 0x90, 0x90, 0x90 });\r\n\r\n\t\t\t// Freeze PV selection timer\r\n\t\t\tInjectCode((void*)0x00000001405BDFBF, { 0x90, 0x90, 0x90, 0x90 });\r\n\t\t}\r\n\t\t// Disable timer sprite\r\n\t\tif (nNoTimerSprite)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x00000001409C0758, { 0x00 }); // time_loop\r\n\t\t\tInjectCode((void*)0x0000000140A3D3F0, { 0x00 }); // time_in\r\n\t\t\tInjectCode((void*)0x0000000140A3D3F8, { 0x00 }); // time_out\r\n\t\t}\r\n\t\t// Enhanced Stage Manager\r\n\t\tif (nEStageManager > 0)\r\n\t\t{\r\n\t\t\t// Replace the function that provides the number of stages and compact some of it\r\n\t\t\tInjectCode((void*)0x000000014038AEF0, { 0x48, 0x8B, 0x88, 0x40, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x20, 0x48, 0x8B, 0xD0, 0x48, 0x8B, 0x88, 0x48, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x28, 0x8B, 0x88, 0x50, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x30, 0x8B, 0x88, 0x54, 0x01, 0x00, 0x00, 0x8B, 0x80, 0x58, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x38, 0x8B, 0x82, 0x5C, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x34, 0x89, 0x44, 0x24, 0x3C, 0x48, 0x8B, 0x82, 0x60, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x82, 0x68, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x82, 0x70, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x50, 0x8B, 0x82, 0x78, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x58, 0x84, 0xC0, 0x74, 0x2A, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0xC1, 0xE8, 0x20, 0x85, 0xC0, 0x75, 0x1D, 0xE8, 0xD9, 0xD9, 0xE5, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x13, 0x48, 0x8D, 0x48, 0x10, 0xE8, 0xFB, 0xD3, 0xE5, 0xFF, 0xB9, 0x03, 0x00, 0x00, 0x00, 0x85, 0xC0, 0x0F, 0x45, 0xD9, 0x8B, 0x1D, 0x1B, 0x0C, 0x00, 0x00, 0x83, 0x3D, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x74, 0x06, 0x8B, 0x1D, 0x10, 0x0C, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x60, 0x5B, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });\r\n\r\n\t\t\t// Jump to another section by addding some code to replace the values (Jump 1)\r\n\t\t\tInjectCode((void*)0x000000014038AFF4, { 0xE9, 0x87, 0x0B, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });\r\n\r\n\t\t\t// Jump to another section by addding some code to replace the values (Replace 1/2) while some reserving space for values\r\n\t\t\tInjectCode((void*)0x000000014038BB40, { 0xFF, 0x05, 0x76, 0x00, 0x00, 0x00, 0x8B, 0x0D, 0x70, 0x00, 0x00, 0x00, 0xBA, 0x02, 0x00, 0x00, 0x00, 0x83, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0xFF, 0xC2, 0x39, 0xD1, 0x0F, 0x4D, 0xCA, 0x89, 0x48, 0x08, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xE8, 0x92, 0x98, 0xE0, 0xFF, 0xB0, 0x01, 0x48, 0x83, 0xC4, 0x28, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x44, 0x89, 0x61, 0x08, 0x44, 0x88, 0x61, 0x0C, 0x4C, 0x89, 0x61, 0x10, 0x44, 0x89, 0x25, 0x29, 0x00, 0x00, 0x00, 0xE9, 0x68, 0xF4, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });\r\n\r\n\t\t\t// Use the value from our own address instead of the original one\r\n\t\t\tInjectCode((void*)0x00000001403F65AF, { 0x48, 0x8D, 0x05, 0x4A, 0x18, 0xDA, 0x00, 0x8B, 0x1D, 0x00, 0x56 });\r\n\r\n\t\t\t// Jump to another section by addding some code to replace the values (Jump 2)\r\n\t\t\tInjectCode((void*)0x00000001403F6638, { 0xE9, 0x03, 0x55, 0xF9, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });\r\n\r\n\t\t\tDWORD StageCountProtect;\r\n\t\t\tVirtualProtect((int32_t*)0x14038BBB0, 0x10, PAGE_EXECUTE_READWRITE, &StageCountProtect);\r\n\r\n\t\t\tint* ESM = (int*)0x000000014038BBB0;\r\n\r\n\t\t\tif (nEStageManagerEncore)\r\n\t\t\t\tESM[1] = nEStageManager;\r\n\t\t\telse\r\n\t\t\t\tESM[0] = nEStageManager;\r\n\r\n\t\t\tESM[2] = nEStageManagerEncore;\r\n\r\n\t\t\tprintf(\"[Patches] Enhanced Stage Manager enabled\\n\");\r\n\t\t\r\n\t\t}\r\n\t\t//// OpenGL Patches\r\n\t\t//if (nOGLPatchA)\r\n\t\t//{\r\n\t\t//\t// (call cs:glGetError) -> (xor eax, eax); (nop); (nop); (nop); (nop);\r\n\t\t//\tInjectCode((void*)0x000000014069D21D, { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//}\r\n\t\t//if (nOGLPatchB)\r\n\t\t//{\r\n\t\t//\t// (js loc_14069BC32) -> (nop)...\r\n\t\t//\tInjectCode((void*)0x000000014069BAF4, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//}\r\n\t\t// \r\n\t\t// Unlock PSEUDO modules (which will all default to Miku, unless we also patch them to match the first performer)\r\n\t\tif (nUnlockPseudo)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x0000000140A21770, { 0x00 });\r\n\t\t\tInjectCode((void*)0x0000000140A21780, { 0x00 });\r\n\t\t\tInjectCode((void*)0x0000000140A21790, { 0x00 });\r\n\t\t\tInjectCode((void*)0x0000000140A217A0, { 0x00 });\r\n\t\t\tInjectCode((void*)0x0000000140A217B0, { 0x00 });\r\n\t\t}\r\n\t\t// Enable card button by somewhatlurker (pretty much just eye candy for now)\r\n\t\tif (nCard)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x0000000140565E6B, { 0x90, 0x90 });\r\n\t\t}\r\n\t\t// The original slider update needs to run for hardware sliders to work -- only patch it when using emulation\r\n\t\tif (!nHardwareSlider)\r\n\t\t{\r\n\t\t\t// Don't update the touch slider state so we can write our own\r\n\t\t\tInjectCode((void*)0x000000014061579B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 });\r\n\t\t}\r\n\t\t// Quick start\r\n\t\tif (!nUseDivahookBat)\r\n\t\t{\r\n\t\t\tif (nQuickStart == 1) // skip the card/guest screen\r\n\t\t\t{\r\n\t\t\t\tInjectCode((void*)0x0000000140578EA9, { 0xE9, 0x8E, 0x00, 0x00, 0x00 });\r\n\t\t\t}\r\n\t\t\telse if (nQuickStart == 2) // skip everything; normal mode\r\n\t\t\t{\r\n\t\t\t\tInjectCode((void*)0x0000000140578EA9, { 0xE9, 0xF1, 0x00, 0x00, 0x00 });\r\n\t\t\t\tInjectCode((void*)0x0000000140578E9D, { 0xC7, 0x47, 0x68, 0x28, 0x00, 0x00, 0x00 }); // skip back button error\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Disable scrolling sound effect\r\n\t\tif (nNoScrollingSfx)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x00000001405C84B3, { 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t}\r\n\t\tif (nEnablePvCustomization)\r\n\t\t{\r\n\t\t\t// Disable hand scaling\r\n\t\t\tif (nNoHandScaling)\r\n\t\t\t{\r\n\t\t\t\tInjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 });\r\n\t\t\t}\r\n\t\t\t// Default hand size\r\n\t\t\tif (nDefaultHandSize >= 10000 && nDefaultHandSize <= 1000000)\r\n\t\t\t{\r\n\t\t\t\tprintf(\"[Patches] Changing default hand size...\\n\");\r\n\t\t\t\tconst float num = (float)nDefaultHandSize / 10000.0;\r\n\t\t\t\tDWORD oldProtect;\r\n\t\t\t\tfloat* addr1 = (float*)(0x140506B59);\r\n\t\t\t\tfloat* addr2 = (float*)(0x140506B60);\r\n\t\t\t\t/*float* addr3 = (float*)(0x140506B67);\r\n\t\t\t\tfloat* addr4 = (float*)(0x140506B71);*/\r\n\t\t\t\tVirtualProtect(addr1, 4, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\tVirtualProtect(addr2, 4, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t/*VirtualProtect(addr3, 4, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\tVirtualProtect(addr4, 4, PAGE_EXECUTE_READWRITE, &oldProtect);*/\r\n\t\t\t\t*addr1 = *addr2 /*= *addr3 = *addr4*/ = num;\r\n\t\t\t\tVirtualProtect(addr1, 4, oldProtect, nullptr);\r\n\t\t\t\tVirtualProtect(addr2, 4, oldProtect, nullptr);\r\n\t\t\t\t/*VirtualProtect(addr3, 4, oldProtect, nullptr);\r\n\t\t\t\tVirtualProtect(addr4, 4, oldProtect, nullptr);*/\r\n\t\t\t\tprintf(\"[Patches] New default hand size: %f\\n\", num);\r\n\t\t\t}\r\n\t\t\t// Force mouth animations\r\n\t\t\t{\r\n\t\t\t\tif (nForceMouth == 1) // PDA\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\"[Patches] Forcing PDA mouth...\\n\");\r\n\t\t\t\t\tint* mouth_table = (int*)(0x1409A1DC0);\r\n\t\t\t\t\tDWORD oldProtect;\r\n\t\t\t\t\tVirtualProtect(mouth_table, 44, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t\tfor (int i = 0; i < 11; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmouth_table[i]++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tVirtualProtect(mouth_table, 44, oldProtect, nullptr);\r\n\t\t\t\t\tprintf(\"[Patches] PDA mouth forced\\n\");\r\n\t\t\t\t}\r\n\t\t\t\telse if (nForceMouth == 2) // FT\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\"[Patches] Forcing FT mouth...\\n\");\r\n\t\t\t\t\tint* mouth_table_oldid = (int*)(0x1409A1E1C);\r\n\t\t\t\t\tDWORD oldProtect;\r\n\t\t\t\t\tVirtualProtect(mouth_table_oldid, 44, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t\tfor (int i = 0; i < 11; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmouth_table_oldid[i]--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tVirtualProtect(mouth_table_oldid, 44, oldProtect, nullptr);\r\n\t\t\t\t\tprintf(\"[Patches] FT mouth forced\\n\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Force expressions\r\n\t\t\t{\r\n\t\t\t\tif (nForceExpressions == 1) // PDA\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\"[Patches] Forcing PDA expressions...\\n\");\r\n\t\t\t\t\tint* exp_table = (int*)(0x140A21900);\r\n\t\t\t\t\tDWORD oldProtect;\r\n\t\t\t\t\tVirtualProtect(exp_table, 104, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t\tfor (int i = 0; i < 26; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\texp_table[i] += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tVirtualProtect(exp_table, 104, oldProtect, nullptr);\r\n\t\t\t\t\tprintf(\"[Patches] PDA expressions forced\\n\");\r\n\t\t\t\t}\r\n\t\t\t\telse if (nForceExpressions == 2) // FT\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\"[Patches] Forcing FT expressions...\\n\");\r\n\t\t\t\t\tint* exp_table_oldid = (int*)(0x140A219D0);\r\n\t\t\t\t\tDWORD oldProtect;\r\n\t\t\t\t\tVirtualProtect(exp_table_oldid, 104, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t\tfor (int i = 0; i < 26; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\texp_table_oldid[i] -= 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tVirtualProtect(exp_table_oldid, 104, oldProtect, nullptr);\r\n\t\t\t\t\tprintf(\"[Patches] FT expressions forced\\n\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Force look animations\r\n\t\t\t{\r\n\t\t\t\tif (nForceLook == 1) // PDA\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\"[Patches] Forcing PDA look...\\n\");\r\n\t\t\t\t\tint* look_table = (int*)(0x1409A1D70);\r\n\t\t\t\t\tDWORD oldProtect;\r\n\t\t\t\t\tVirtualProtect(look_table, 36, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t\tfor (int i = 0; i < 9; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlook_table[i]++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tVirtualProtect(look_table, 36, oldProtect, nullptr);\r\n\t\t\t\t\tprintf(\"[Patches] PDA look forced\\n\");\r\n\t\t\t\t}\r\n\t\t\t\telse if (nForceLook == 2) // FT\r\n\t\t\t\t{\r\n\t\t\t\t\tprintf(\"[Patches] Forcing FT look...\\n\");\r\n\t\t\t\t\tint* look_table_oldid = (int*)(0x1409A1D9C);\r\n\t\t\t\t\tDWORD oldProtect;\r\n\t\t\t\t\tVirtualProtect(look_table_oldid, 36, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\t\t\t\t\tfor (int i = 0; i < 9; i++)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlook_table_oldid[i]--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tVirtualProtect(look_table_oldid, 36, oldProtect, nullptr);\r\n\t\t\t\t\tprintf(\"[Patches] FT look forced\\n\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Sing missed notes\r\n\t\tif (nSingMissed)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x140109044, { 0xEB });\r\n\t\t\t// Breaks border:\r\n\t\t\t// InjectCode((void*)0x140109096, { 0xEB });\r\n\t\t}\r\n\t\t// NPR1\r\n\t\t{\r\n\t\t\tif (nNpr1 == 1) // force on\r\n\t\t\t{\r\n\t\t\t\tInjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });\r\n\t\t\t\tInjectCode((void*)0x0000000140502FC6, { 0x01, 0x00, 0x00, 0x00, 0xC3 });\r\n\r\n\t\t\t\tprintf(\"[Patches] NPR1 forced\\n\");\r\n\t\t\t}\r\n\t\t\telse if (nNpr1 == 2) // force off\r\n\t\t\t{\r\n\t\t\t\tInjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });\r\n\t\t\t\tInjectCode((void*)0x0000000140502FC6, { 0x00, 0x00, 0x00, 0x00, 0xC3 });\r\n\r\n\t\t\t\tprintf(\"[Patches] NPR1 disabled\\n\");\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Depth of Field\r\n\t\tif (!nDoF)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x00000001409476AB, { 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\r\n\t\t\tInjectCode((void*)0x00000001411AB650, { 0b00000001 });\r\n\t\t}\r\n\t\t// MAG filter\r\n\t\tif (nMAG > 0)\r\n\t\t{\r\n\t\t\t//InjectCode((void*)0x00000001404AB142, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\r\n\t\t\tunsigned char filter;\r\n\t\t\tswitch (nMAG)\r\n\t\t\t{\r\n\t\t\tcase 1: // nearest\r\n\t\t\t\tfilter = 0;\r\n\t\t\t\tInjectCode((void*)0x00000001404ACE56, { 0x90, 0x90 });\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // sharpen\r\n\t\t\t\tfilter = 3; // sharpen(4tap)\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3: // cone\r\n\t\t\t\tfilter = 5; // cone(2tap)\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tfilter = 1;\r\n\t\t\t}\r\n\r\n\t\t\t//InjectCode((void*)0x00000001404A864F, { filter });\r\n\t\t\t//InjectCode((void*)0x00000001411AC518, { filter });\r\n\r\n\t\t\tInjectCode((void*)0x00000001404ACE8E, { 0xB9, filter, 0x00, 0x00 });\r\n\t\t\tInjectCode((void*)0x00000001404ACE93, { 0x90 });\r\n\t\t}\r\n\t\t// Reflections\r\n\t\tif (!nReflections)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x1406477C6, { 0xE9, 0xE9, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90 });\r\n\t\t\tInjectCode((void*)0x1411ADAFC, { 0x00 });\r\n\t\t}\r\n\t\t// Shadows\r\n\t\tif (!nShadows)\r\n\t\t{\r\n\t\t\t//InjectCode((void*)0x140502B44, { 0x90, 0x90, 0x90 });\r\n\t\t\t//InjectCode((void*)0x140502BB2, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t\tInjectCode((void*)0x140502766, { 0x00 });\r\n\t\t\tInjectCode((void*)0x1411AD438, { 0x00 });\r\n\t\t\tInjectCode((void*)0x1411AD320, { 0x00 });\r\n\t\t}\r\n\t\t// Punch-through transparency\r\n\t\tif (!nPunchthrough)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x1411AD43D, { 0x00 });\r\n\t\t}\r\n\t\t// Glare\r\n\t\tif (!nGlare)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x1404B2168, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t}\r\n\t\t// Shader\r\n\t\tif (!nShader)\r\n\t\t{\r\n\t\t\tInjectCode((void*)0x140C9C48E, { 0x00 });\r\n\t\t}\r\n\t\t// 2D\r\n\t\tif (n2D)\r\n\t\t{\r\n\t\t\t//InjectCode((void*)0x140502B44, { 0x90, 0x90, 0x90 });\r\n\t\t\tInjectCode((void*)0x140502BB2, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t\tInjectCode((void*)0x140502A3C, { 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t\t/*InjectCode((void*)0x1411AD320, { 0x00 }); // shadow\r\n\t\t\tInjectCode((void*)0x1411AD323, { 0x00 }); // reflect\r\n\t\t\tInjectCode((void*)0x1411AD321, { 0x00 }); // SS_SSS\r\n\t\t\tInjectCode((void*)0x1411AD325, { 0x00 }); // preprocess\r\n\t\t\tInjectCode((void*)0x1411AD328, { 0x00 }); // 3D*/\r\n\t\t\tInjectCode((void*)0x1411AD32A, { 0x01 }); // post process\r\n\t\t\tInjectCode((void*)0x1411AD32B, { 0x01 }); // sprite\r\n\r\n\t\t\tInjectCode((void*)0x140A07920, { 0x00 }); // ignore objset\r\n\t\t}\r\n\r\n\t\t//// Prevent data deletion\r\n\t\t//if (nNoDelete)\r\n\t\t//{\r\n\t\t//\tInjectCode((void*)(0x1406FEF80 + 0x1DB), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407113F0 + 0x13C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140712270 + 0x6C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140712580 + 0x4C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140712580 + 0x7C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140713470 + 0x104), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407135B0 + 0x102), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407135B0 + 0x135), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407135B0 + 0x232), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140713810 + 0x3E8), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140713D00 + 0x677), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x1D2), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x218), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x22A), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140720910 + 0x25C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140723EE0 + 0xEC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140870DE0 + 0x4), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1406FEF80 + 0x1DB), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407113F0 + 0x13C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140712270 + 0x6E), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140712580 + 0x4C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140712580 + 0x7C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140713470 + 0x104), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407135B0 + 0x102), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407135B0 + 0x135), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407135B0 + 0x232), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140713810 + 0x3E8), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140713D00 + 0x677), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x1D2), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x218), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x22A), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140720910 + 0x25C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140723EE0 + 0xEC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140870DE0 + 0x4), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x14081B6A4), { 0xC3 });\r\n\r\n\t\t//\tInjectCode((void*)(0x1406E1090 + 0x43C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140718250 + 0x176), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140718750 + 0xC9), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407193E0 + 0xFC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1406E1090 + 0x43C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140718250 + 0x176), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x140718750 + 0xC9), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x1407193E0 + 0xFC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\r\n\t\t//\tInjectCode((void*)(0x14081B67A), { 0xC3 });\r\n\t\t//}\r\n\r\n\t\t// patch refract and reflect buffer sizes\r\n\t\tif (nRefractResWidth != 512 || nRefractResHeight != 256)\r\n\t\t{\r\n\t\t\tInjectCode((void*)(0x140a24424), std::vector<uint8_t>((uint8_t*)&nRefractResWidth, (uint8_t*)((int64_t)&nRefractResWidth + 4)));\r\n\t\t\tInjectCode((void*)(0x140a24428), std::vector<uint8_t>((uint8_t*)&nRefractResHeight, (uint8_t*)((int64_t)&nRefractResHeight + 4)));\r\n\r\n\t\t\tprintf(\"[Patches] Refraction resolution patched.\\n\");\r\n\t\t}\r\n\t\tif (nReflectResWidth != 512 || nReflectResHeight != 256)\r\n\t\t{\r\n\t\t\tInjectCode((void*)(0x140a2443c), std::vector<uint8_t>((uint8_t*)&nReflectResWidth, (uint8_t*)((int64_t)&nReflectResWidth + 4)));\r\n\t\t\tInjectCode((void*)(0x140a24440), std::vector<uint8_t>((uint8_t*)&nReflectResHeight, (uint8_t*)((int64_t)&nReflectResHeight + 4)));\r\n\t\t\t// for large reflect resolutions, adjust blur effect amount to not lose the effect\r\n\t\t\t// scaling is based on a 1024 width instead of the original 512px\r\n\t\t\t// because we don't wanna make it too blurry when just being used to smooth jaggies\r\n\t\t\tif (nReflectResWidth >= 2048)\r\n\t\t\t{\r\n\t\t\t\tint blurAmount = nReflectResWidth / 1024;\r\n\r\n\t\t\t\t// multiply blur setting\r\n\t\t\t\t// ECX has blur amount, EDX has blur type\r\n\t\t\t\tInjectCode((void*)(0x140503000), { 0x89, 0x15, 0x3a, 0xa3, 0xca, 0x00 });  // MOV  dword ptr [0x1411ad340], EDX\r\n\t\t\t\tInjectCode((void*)(0x140503006), { 0xb8 });                                // MOV  EAX, blurAmount\r\n\t\t\t\tInjectCode((void*)(0x140503007), std::vector<uint8_t>((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4)));\r\n\t\t\t\tInjectCode((void*)(0x14050300b), { 0xf7, 0xe1 });                          // MUL  (EDX:EAX,)ECX\r\n\t\t\t\tInjectCode((void*)(0x14050300d), { 0xeb, 0x09 });                          // JMP  0x140503018\r\n\t\t\t\tInjectCode((void*)(0x140503018), { 0x89, 0x05, 0x1e, 0xa3, 0xca, 0x00 });  // MOV  dword ptr [0x1411ad33c], EAX\r\n\t\t\t\tInjectCode((void*)(0x14050301e), { 0xc3 });                                // RET\r\n\r\n\t\t\t\t// divide dwgui blur amount getting\r\n\t\t\t\t// RDX gets type, RCX gets amount\r\n\t\t\t\tInjectCode((void*)(0x140502910), { 0x48, 0x85, 0xd2 });                    // TEST  RDX, RDX\r\n\t\t\t\tInjectCode((void*)(0x140502913), { 0x74, 0x08 });                          // JZ  0x14050291d\r\n\t\t\t\tInjectCode((void*)(0x140502915), { 0x8b, 0x05, 0x25, 0xaa, 0xca, 0x00 });  // MOV  EAX, dword ptr [0x1411ad340]\r\n\t\t\t\tInjectCode((void*)(0x14050291b), { 0x89, 0x02 });                          // MOV  dword ptr [RDX], EAX\r\n\r\n\t\t\t\tInjectCode((void*)(0x14050291d), { 0x48, 0x85, 0xc9 });                    // TEST  RCX, RCX\r\n\t\t\t\tInjectCode((void*)(0x140502920), { 0x74, 0x2d });                          // JZ  0x14050294f\r\n\t\t\t\tInjectCode((void*)(0x140502922), { 0x8b, 0x05, 0x14, 0xaa, 0xca, 0x00 });  // MOV  EAX, dword ptr [0x1411ad33c]\r\n\r\n\t\t\t\tInjectCode((void*)(0x140502928), { 0xeb, 0x0d });                          // JMP  0x140502937\r\n\t\t\t\tInjectCode((void*)(0x140502937), { 0x49, 0xc7, 0xc0 });                    // MOV  R8, blurAmount\r\n\t\t\t\tInjectCode((void*)(0x14050293a), std::vector<uint8_t>((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4)));\r\n\t\t\t\tInjectCode((void*)(0x14050293e), { 0xeb, 0x08 });                          // JMP  0x140502948\r\n\t\t\t\tInjectCode((void*)(0x140502948), { 0x31, 0xd2 });                          // XOR  EDX,EDX\r\n\t\t\t\tInjectCode((void*)(0x14050294a), { 0x49, 0xf7, 0xf0 });                    // DIV  (EDX:EAX,)R8\r\n\r\n\t\t\t\tInjectCode((void*)(0x14050294d), { 0x89, 0x01 });                          // MOV  dword ptr [RCX], EAX\r\n\t\t\t\tInjectCode((void*)(0x14050294f), { 0xc3 });                                // RET\r\n\t\t\t}\r\n\r\n\t\t\tprintf(\"[Patches] Reflection resolution patched.\\n\");\r\n\t\t}\r\n\t\tif (nShadowResWidth != 2048 || nShadowResHeight != 2048)\r\n\t\t{\r\n\t\t\tInjectUint((void*)(0x140A81E04), nShadowResHeight);\r\n\t\t\tInjectUint((void*)(0x140A81E08), nShadowResWidth);\r\n\r\n\t\t\tprintf(\"[Patches] Shadow resolution patched.\\n\");\r\n\t\t}\r\n\r\n\t\t// lag compensation\r\n\t\tif (nLagCompensation > 0 && nLagCompensation <= 500)\r\n\t\t{\r\n\t\t\tInjectCode((void*)(0x14011e44e), { 0xf3, 0x0f, 0x10, 0x05, 0x8a, 0xcf, 0x9c, 0x00 });\t// hijack xmm0\r\n\t\t\tInjectCode((void*)(0x14011e46b), { 0xf3, 0x0f, 0x11, 0x44, 0x24, 0x20 });\t// get value from xmm0 instead of xmm1\r\n\t\t\tfloat startPos = (float)nLagCompensation / 1000.0f;\r\n\t\t\tInjectCode((void*)(0x140aeB3e0), { *((uint8_t*)(&startPos)), *((uint8_t*)(&startPos) + 1), *((uint8_t*)(&startPos) + 2), *((uint8_t*)(&startPos) + 3) });\r\n\r\n\t\t\tprintf(\"[Patches] Lag Compensation: %f\\n\", startPos);\r\n\t\t}\r\n\t}\r\n};"
  },
  {
    "path": "source-code/source/plugins/Patches/Patches.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <VCProjectVersion>16.0</VCProjectVersion>\r\n    <ProjectGuid>{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>Patches</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"Shared\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <TargetExt>.dva</TargetExt>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <TargetExt>.dva</TargetExt>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>NDEBUG;PATCHES_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\r\n      <LanguageStandard>stdcpp17</LanguageStandard>\r\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableUAC>false</EnableUAC>\r\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>_DEBUG;PATCHES_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r\n      <LanguageStandard>stdcpp17</LanguageStandard>\r\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableUAC>false</EnableUAC>\r\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"databank.cpp\" />\r\n    <ClCompile Include=\"dllmain.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"databank.h\" />\r\n    <ClInclude Include=\"framework.h\" />\r\n    <ClInclude Include=\"PatchApplier.h\" />\r\n    <ClInclude Include=\"PatchApplier600.h\" />\r\n    <ClInclude Include=\"PatchApplier710.h\" />\r\n    <ClInclude Include=\"storage.h\" />\r\n    <ClInclude Include=\"urlutil.h\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Patches/Patches.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Resource Files\">\r\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"dllmain.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"databank.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"framework.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"PatchApplier.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"PatchApplier600.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"PatchApplier710.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"databank.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"storage.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"urlutil.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Patches/databank.cpp",
    "content": "#include <iostream>\r\n#include <fstream>\r\n#include <sstream>\r\n#include <vector>\r\n\r\n#include \"databank.h\"\r\n#include \"urlutil.h\"\r\n\r\nnamespace Databank\r\n{\r\n    bool PvList::readFromStr(std::string& str)\r\n    {\r\n        std::string decoded = urlDecode(urlDecode(str));\r\n\r\n        std::vector<std::string> tokens;\r\n        std::stringstream ss(decoded);\r\n        std::string token;\r\n        while (std::getline(ss, token, ','))\r\n        {\r\n            if (!token.empty())\r\n            {\r\n                tokens.push_back(token);\r\n            }\r\n        }\r\n\r\n        if (tokens.size() % 7 != 0)\r\n        {\r\n            std::cerr << \"[Patches] Databank error: Token count (\" << tokens.size() << \") is not a multiple of 7.\" << std::endl;\r\n            return false;\r\n        }\r\n\r\n        for (size_t i = 0; i < tokens.size(); i += 7)\r\n        {\r\n            try\r\n            {\r\n                PvEntry entry;\r\n                std::tuple<int, int> id(std::stoi(tokens[i]), std::stoi(tokens[i + 2]));\r\n                entry.unk1 = std::stoi(tokens[i + 1]);\r\n                entry.advStart = tokens[i + 3];\r\n                entry.advEnd = tokens[i + 4];\r\n                entry.start = tokens[i + 5];\r\n                entry.end = tokens[i + 6];\r\n                entries.insert({ id, entry });\r\n            }\r\n            catch (const std::exception& e)\r\n            {\r\n                std::cerr << \"[Patches] Databank parse error: \" << e.what() << std::endl;\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    bool PvList::readFromFile(const std::string& filename)\r\n    {\r\n        try\r\n        {\r\n            std::ifstream file(filename, std::ios::in | std::ios::binary);\r\n            if (!file)\r\n            {\r\n                std::cerr << \"[Patches] Failed to open databank \" + filename << std::endl;\r\n                return false;\r\n            }\r\n\r\n            std::string contents = std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());\r\n\r\n            return readFromStr(contents);\r\n        }\r\n        catch (const std::exception& e)\r\n        {\r\n            std::cerr << \"[Patches] Databank file read error: \" << e.what() << std::endl;\r\n            return false;\r\n        }\r\n    }\r\n\r\n    void PvList::addEntry(int id, int extra, PvEntry& entry)\r\n    {\r\n        entries.insert({ std::tuple<int, int>(id, extra), entry });\r\n    }\r\n\r\n    void PvList::generateMissingEntries()\r\n    {\r\n        PvEntry entry = PvEntry();\r\n\r\n        for (int i = 0; i <= 999; i++)\r\n        {\r\n            entry.advStart = \"2000-01-01\";\r\n            entry.advEnd = \"2029-01-01\";\r\n            entry.start = \"2000-01-01\";\r\n            entry.end = \"2029-01-01\";\r\n\r\n            entries.insert({ std::tuple<int, int>(i, 0), entry });\r\n            entries.insert({ std::tuple<int, int>(i, 1), entry });\r\n        }\r\n    }\r\n\r\n    std::string PvList::finalize()\r\n    {\r\n        std::ostringstream csvStream;\r\n        if (entries.empty())\r\n        {\r\n            return \"%2A%2A%2A\"; // ***\r\n            //checksum = \"5341\";\r\n        }\r\n        else\r\n        {\r\n            bool first = true;\r\n\r\n            for (const auto& entryMap : entries)\r\n            {\r\n                std::ostringstream entryStream;\r\n                if (!first)\r\n                {\r\n                    csvStream << \",\";\r\n                }\r\n                first = false;\r\n                const PvEntry& entry = entryMap.second;\r\n                entryStream << std::get<0>(entryMap.first) << \",\"\r\n                    << entry.unk1 << \",\"\r\n                    << std::get<1>(entryMap.first) << \",\"\r\n                    << entry.advStart << \",\"\r\n                    << entry.advEnd << \",\"\r\n                    << entry.start << \",\"\r\n                    << entry.end;\r\n                csvStream << urlEncode(entryStream.str());\r\n            }\r\n\r\n            return urlEncode(csvStream.str());\r\n            //checksum = std::to_string(crc16_ccitt(finalString));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/Patches/databank.h",
    "content": "#pragma once\r\n#include <map>\r\n\r\n#include \"databank.h\"\r\n\r\nnamespace Databank\r\n{\r\n    struct PvEntry\r\n    {\r\n        int unk1 = 1;\r\n        std::string advStart, advEnd, start, end;\r\n    };\r\n\r\n    class PvList\r\n    {\r\n    protected:\r\n        std::map<std::tuple<int, int>, PvEntry> entries;\r\n\r\n    public:\r\n        bool readFromStr(std::string& str);\r\n        bool readFromFile(const std::string& filename);\r\n        void addEntry(int id, int extra, PvEntry& entry);\r\n        void generateMissingEntries();\r\n        std::string finalize();\r\n    };\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/Patches/dllmain.cpp",
    "content": "#include \"windows.h\"\r\n#include \"vector\"\r\n#include <tchar.h>\r\n#include <GL/freeglut.h>\r\n#include <iostream>\r\n#include <fstream>\r\n#include <filesystem>\r\n#include <sstream>\r\n#include <iomanip>\r\n#include <regex>\r\n#include <detours.h>\r\n\r\n#include \"PluginConfigApi.h\"\r\n#include \"PatchApplier.h\"\r\n#include \"PatchApplier600.h\"\r\n#include \"PatchApplier710.h\"\r\n#include \"framework.h\"\r\n#include \"storage.h\"\r\n#include \"databank.h\"\r\n#pragma comment(lib, \"detours.lib\")\r\n\r\nunsigned short game_version = 710;\r\n\r\nvoid InjectCode(void* address, const std::vector<uint8_t> data);\r\nvoid ApplyPatches();\r\nvoid ApplyCustomPatches(std::wstring CPATCH_FILE_STRING);\r\n\r\nconstexpr uint64_t PVLIST_INIT_ADDRESS = 0x000000014001EC80;\r\nvoid(__fastcall* divaPvListInitializer)(void* pvListContainer) = (void(__fastcall*)(void* pvListContainer))PVLIST_INIT_ADDRESS;\r\nvoid initPvListContainerHook();\r\n\r\nHMODULE *hModulePtr;\r\n\r\nBOOL APIENTRY DllMain(HMODULE hModule,\r\n\tDWORD  ul_reason_for_call,\r\n\tLPVOID lpReserved\r\n)\r\n{\r\n\tswitch (ul_reason_for_call)\r\n\t{\r\n\tcase DLL_PROCESS_ATTACH:\r\n\t\thModulePtr = &hModule;\r\n\t\tif (*(char*)0x140A570F0 == '6') game_version = 600;\r\n\t\tApplyPatches();\r\n\tcase DLL_THREAD_ATTACH:\r\n\tcase DLL_THREAD_DETACH:\r\n\tcase DLL_PROCESS_DETACH:\r\n\t\tbreak;\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nvoid ApplyPatches() {\r\n\tif (game_version == 710)\r\n\t{\r\n\t\tconst char* exe_ver_string = (const char*)0x140A92CB8;\r\n\t\tif (strcmp(exe_ver_string, \"7.10.00\") != 0)\r\n\t\t{\r\n\t\t\tMessageBoxW(nullptr, L\"Game version not 7.10. Please verify your files.\", L\"Patches\", MB_ICONERROR);\r\n\t\t\texit(1);\r\n\t\t}\r\n\t}\r\n\r\n\tstd::string version_string = std::to_string(game_version);\r\n\tversion_string.insert(version_string.begin()+1, '.');\r\n\tstd::cout << \"[Patches] Game version \" + version_string << std::endl;\r\n\r\n\tPatchApplier* pa;\r\n\r\n\tswitch (game_version)\r\n\t{\r\n\tcase 600:\r\n\t\tpa = new PatchApplier600;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tpa = new PatchApplier710;\r\n\t}\r\n\r\n\tpa->ApplyPatches();\r\n\tprintf(\"[Patches] Patches applied\\n\");\r\n\r\n\tif (nCustomPatches)\r\n\t{\r\n\t\tstd::cout << \"[Patches] Reading custom patches...\\n\";\r\n\t\ttry {\r\n\t\t\tfor (std::filesystem::path p : std::filesystem::directory_iterator(\"../patches\"))\r\n\t\t\t{\r\n\t\t\t\tif (std::filesystem::path(p).filename().string()._Starts_with(\"._\")) continue; // exclude macOS metadata\r\n\r\n\t\t\t\tstd::string extension = std::filesystem::path(p).extension().string();\r\n\t\t\t\tif ((extension == \".p\" || extension == \".P\" || extension == \".p2\" || extension == \".P2\") &&\r\n\t\t\t\t\tGetPrivateProfileIntW(L\"plugins\", std::filesystem::path(p).filename().c_str(), TRUE, CONFIG_FILE))\r\n\t\t\t\t{\r\n\t\t\t\t\tstd::cout << \"[Patches] Reading custom patch file: \" << std::filesystem::path(p).filename().string() << std::endl;\r\n\t\t\t\t\tApplyCustomPatches(std::filesystem::path(p).wstring());\r\n\t\t\t\t}\r\n\t\t\t\telse std::cout << \"[Patches] Skipping disabled patch file: \" << std::filesystem::path(p).filename().string() << std::endl;\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (const std::filesystem::filesystem_error &e) {\r\n\t\t\tstd::cout << \"[Patches] File system error \" << e.what() << \" \" << e.path1() << \" \" << e.path2() << \" \" << e.code() << std::endl;\r\n\t\t}\r\n\r\n\t\tstd::cout << \"[Patches] All custom patches applied\\n\";\r\n\t}\r\n\r\n\tif (nAutoDatabank)\r\n\t{\r\n\t\tinitPvListContainerHook();\r\n\t}\r\n}\r\n\r\n\r\n\r\nvoid ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)\r\n{\r\n\tLPCWSTR CPATCH_FILE = CPATCH_FILE_STRING.c_str();\r\n\tstd::ifstream fileStream(CPATCH_FILE_STRING);\r\n\r\n\tif (!fileStream.is_open())\r\n\t\treturn;\r\n\r\n\tstd::string line;\r\n\r\n\t// check for BOM\r\n\tstd::getline(fileStream, line);\r\n\tif (line.size() >= 3 && line.rfind(\"\\xEF\\xBB\\xBF\", 0) == 0)\r\n\t\tfileStream.seekg(3);\r\n\telse\r\n\t\tfileStream.seekg(0);\r\n\r\n\twhile (std::getline(fileStream, line))\r\n\t{\r\n\t\tif (line[0] == '#')\r\n\t\t{\r\n\t\t\tstd::cout << \"[Patches]\" << line.substr(1, line.size()-1) << std::endl;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (line == \"IGNORE\") break;\r\n\t\tif (line.find(':') == std::string::npos || (line[0] == '/' && line[1] == '/')) continue;\r\n\r\n\t\tstd::vector<std::string> commentHSplit = SplitString(line, \"#\");\r\n\t\tstd::vector<std::string> commentDSSplit = SplitString(commentHSplit[0], \"//\");\r\n\t\tstd::vector<std::string> colonSplit = SplitString(commentDSSplit[0], \":\");\r\n\t\tif (colonSplit.size() != 2) continue;\r\n\t\tbool echo = true;\r\n\t\tif (colonSplit[0].at(0) == '@')\r\n\t\t{\r\n\t\t\techo = false;\r\n\t\t\tcolonSplit[0].at(0) = ' ';\r\n\t\t}\r\n\t\tlong long int address;\r\n\t\tstd::istringstream iss(colonSplit[0]);\r\n\t\tiss >> std::setbase(16) >> address;\r\n\t\tif (address == 0) std::cout << \"[Patches] Custom patch address wrong: \" << std::hex << address << std::endl;\r\n\r\n\t\tif (colonSplit[1].at(0) == '!')\r\n\t\t{\r\n\t\t\tif (echo) std::cout << \"[Patches] Patching: \" << std::hex << address << \":!\";\r\n\t\t\tstd::vector<std::string> fullColonSplit = SplitString(line, \":\");\r\n\t\t\tfor (int i = 1; i < fullColonSplit[1].size(); i++)\r\n\t\t\t{\r\n\t\t\t\tunsigned char byte_u = fullColonSplit[1].at(i);\r\n\t\t\t\tif(byte_u=='\\\\' && i<fullColonSplit[1].size())\r\n\t\t\t\t{\r\n\t\t\t\t\tswitch (fullColonSplit[1].at(i + 1))\r\n\t\t\t\t\t{\r\n\t\t\t\t\tcase '0':\r\n\t\t\t\t\t\tbyte_u = '\\0';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'n':\r\n\t\t\t\t\t\tbyte_u = '\\n';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 't':\r\n\t\t\t\t\t\tbyte_u = '\\t';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'r':\r\n\t\t\t\t\t\tbyte_u = '\\r';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'b':\r\n\t\t\t\t\t\tbyte_u = '\\b';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'a':\r\n\t\t\t\t\t\tbyte_u = '\\a';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'f':\r\n\t\t\t\t\t\tbyte_u = '\\f';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'v':\r\n\t\t\t\t\t\tbyte_u = '\\v';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase '\\\\':\r\n\t\t\t\t\t\tbyte_u = '\\\\';\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (echo) std::cout << byte_u;\r\n\t\t\t\tstd::vector<uint8_t> patch = { byte_u };\r\n\t\t\t\tInjectCode((void*)address, patch);\r\n\t\t\t\taddress++;\r\n\t\t\t}\r\n\t\t\tif (echo) std::cout << std::endl;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tstd::vector<std::string> bytes = SplitString(colonSplit[1], \" \");\r\n\t\t\tif (bytes.size() < 1) continue;\r\n\r\n\t\t\tstd::string comment_string = \"\";\r\n\t\t\tint comment_counter = 0;\r\n\t\t\tif (commentHSplit.size() > 1)\r\n\t\t\t{\r\n\t\t\t\tbool ignore = 1;\r\n\t\t\t\tfor (std::string comment : commentHSplit)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (ignore)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tignore = 0;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcomment_string = comment_string + comment;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (echo) std::cout << \"[Patches] Patching: \" << std::hex << address << \":\";\r\n\t\t\tfor (std::string bytestring : bytes)\r\n\t\t\t{\r\n\t\t\t\tint byte;\r\n\t\t\t\tstd::istringstream issb(bytestring);\r\n\t\t\t\tissb >> std::setbase(16) >> byte;\r\n\t\t\t\tunsigned char byte_u = byte;\r\n\t\t\t\tif (echo)\r\n\t\t\t\t{\r\n\t\t\t\t\tstd::cout << std::hex << byte << \" \";\r\n\t\t\t\t\tif (comment_counter < comment_string.length())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstd::cout << \"(\" << comment_string.at(comment_counter) << \") \";\r\n\t\t\t\t\t\tcomment_counter++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tstd::vector<uint8_t> patch = { byte_u };\r\n\t\t\t\tInjectCode((void*)address, patch);\r\n\t\t\t\taddress++;\r\n\t\t\t}\r\n\t\t\tif (echo) std::cout << std::endl;\r\n\t\t\telse if (comment_string.length() > 0)\r\n\t\t\t{\r\n\t\t\t\tstd::cout << \"[Patches]\";\r\n\t\t\t\tif (comment_string.at(0) != ' ') std::cout << ' ';\r\n\t\t\t\tstd::cout << comment_string << std::endl;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfileStream.close();\r\n}\r\n\r\nDatabank::PvList lists[5] = {};\r\nvoid hookedPvListInitializer(void* pvListContainer)\r\n{\r\n\tStorage::FileRecord* records = (Storage::FileRecord*)((uint64_t)pvListContainer + 0xA0);\r\n\r\n\tfor (int i = 0; i <= 4; i++)\r\n\t{\r\n\t\tstd::regex pattern(\"(PvList\" + std::to_string(i) +\"_SBZV_7.10_.*_.*\\\\.dat)\");\r\n\t\ttry\r\n\t\t{\r\n\t\t\tfor (const auto& entry : std::filesystem::directory_iterator(\"ram/databank/\"))\r\n\t\t\t{\r\n\t\t\t\tif (entry.is_regular_file() && std::regex_match(entry.path().filename().string(), pattern))\r\n\t\t\t\t{\r\n\t\t\t\t\tstd::string path = entry.path().string();\r\n\t\t\t\t\tstd::cout << \"[Patches] Reading databank: \" << path << std::endl;\r\n\t\t\t\t\tlists[i].readFromFile(path);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (const std::filesystem::filesystem_error& e)\r\n\t\t{\r\n\t\t\tstd::cerr << \"[Patches] Databank filesystem error: \" << e.what() << std::endl;\r\n\t\t}\r\n\r\n\t\tif (i != 4) lists[i].generateMissingEntries();\r\n\t\tstd::string finalString = lists[i].finalize();\r\n\r\n\t\tStorage::customAddStringContainer(&records[i], finalString.c_str());\r\n\t}\r\n\r\n\t*(uint8_t*)(0x140CDB1D9) = 0x01; // enables databank\r\n}\r\n\r\nvoid initPvListContainerHook()\r\n{\r\n\tif (game_version != 710) return;\r\n\r\n\tDetourTransactionBegin();\r\n\tDetourUpdateThread(GetCurrentThread());\r\n\tDetourAttach(&(PVOID&)divaPvListInitializer, (PVOID)(hookedPvListInitializer));\r\n\tDetourTransactionCommit();\r\n\tstd::cout << \"[Patch] Auto Databank enabled\" << std::endl;\r\n}\r\n\r\n\r\n\r\nusing namespace PluginConfig;\r\n\r\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\r\n{\r\n\treturn L\"Patches\";\r\n}\r\n\r\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\r\n{\r\n\treturn L\"Applies patches/tweaks to the game before it starts.\\nThis plugin is required.\";\r\n}"
  },
  {
    "path": "source-code/source/plugins/Patches/framework.h",
    "content": "#pragma once\r\n#include \"windows.h\"\r\n#include <string>\r\n#include <vector>\r\n\r\ntypedef uint16_t(__fastcall* p_crc16_ccitt)(void* data, int len);\r\np_crc16_ccitt o_crc16_ccitt = (p_crc16_ccitt)0x140011A90;\r\n\r\nuint16_t crc16_ccitt(std::string& str)\r\n{\r\n\treturn o_crc16_ccitt(str.data(), str.size());\r\n}\r\n\r\nstd::string TrimString(const std::string& str, const std::string& whitespace)\r\n{\r\n\tconst size_t strBegin = str.find_first_not_of(whitespace);\r\n\r\n\tif (strBegin == std::string::npos)\r\n\t\treturn \"\";\r\n\r\n\tconst size_t strEnd = str.find_last_not_of(whitespace);\r\n\tconst size_t strRange = strEnd - strBegin + 1;\r\n\r\n\treturn str.substr(strBegin, strRange);\r\n}\r\n\r\nstd::vector<std::string> SplitString(const std::string& str, const std::string& delim)\r\n{\r\n\tstd::vector<std::string> tokens;\r\n\tsize_t prev = 0, pos = 0;\r\n\tdo\r\n\t{\r\n\t\tpos = str.find(delim, prev);\r\n\t\tif (pos == std::string::npos)\r\n\t\t\tpos = str.length();\r\n\r\n\t\tstd::string token = str.substr(prev, pos - prev);\r\n\r\n\t\tif (!token.empty())\r\n\t\t\ttokens.push_back(token);\r\n\r\n\t\tprev = pos + delim.length();\r\n\t} while (pos < str.length() && prev < str.length());\r\n\r\n\treturn tokens;\r\n}\r\n\r\nvoid InjectCode(void* address, const std::vector<uint8_t> data)\r\n{\r\n\tconst size_t byteCount = data.size() * sizeof(uint8_t);\r\n\r\n\tDWORD oldProtect;\r\n\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\tmemcpy(address, data.data(), byteCount);\r\n\tVirtualProtect(address, byteCount, oldProtect, nullptr);\r\n}\r\n\r\nvoid InjectUint(void* address, const uint32_t data)\r\n{\r\n\tDWORD oldProtect;\r\n\tVirtualProtect(address, 4, PAGE_EXECUTE_READWRITE, &oldProtect);\r\n\tmemcpy(address, &data, 4);\r\n\tVirtualProtect(address, 4, oldProtect, nullptr);\r\n}\r\n\r\n// patchMovieExt will modify an extension to mp4 only if the file exists on disk as an mp4\r\nvoid patchMovieExt(std::string moviefile, void* address)\r\n{\r\n\tbool isinmdata = 0;\r\n\ttry {\r\n\t\tfor (std::filesystem::path p : std::filesystem::directory_iterator(\"../mdata\"))\r\n\t\t{\r\n\t\t\tif (std::filesystem::path(p).filename().string().at(0) != 'M' || std::filesystem::path(p).filename().string().length() > 4) continue;\r\n\t\t\tif (std::filesystem::exists(p.string() + \"/rom/movie/\" + moviefile + \".mp4\"))\r\n\t\t\t{\r\n\t\t\t\tisinmdata = 1;\r\n\t\t\t\t//std::cout << \"[Patches] Movie \" << moviefile << \".mp4 found in M\" << ss.str() << std::endl;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tcatch (const std::filesystem::filesystem_error& e) {\r\n\t\tstd::cout << \"[Patches] File system error \" << e.what() << \" \" << e.path1() << \" \" << e.path2() << \" \" << e.code() << std::endl;\r\n\t}\r\n\r\n\tif (isinmdata || std::filesystem::exists(\"../rom/movie/\" + moviefile + \".mp4\"))\r\n\t{\r\n\t\tInjectCode(address, { 0x6D, 0x70, 0x34 });\r\n\t\tstd::cout << \"[Patches] Movie \" << moviefile << \" patched to mp4\\n\";\r\n\t\treturn;\r\n\t}\r\n\t//std::cout << \"[Patches] Movie \" << moviefile << \" NOT patched to mp4\\n\";\r\n\treturn;\r\n}\r\n\r\nconst LPCWSTR CONFIG_FILE = L\".\\\\config.ini\";\r\n\r\nauto nCursor = GetPrivateProfileIntW(L\"patches\", L\"cursor\", TRUE, CONFIG_FILE);\r\nauto nHideFreeplay = GetPrivateProfileIntW(L\"patches\", L\"hide_freeplay\", FALSE, CONFIG_FILE);\r\nauto nFreeplay = GetPrivateProfileIntW(L\"patches\", L\"freeplay\", TRUE, CONFIG_FILE);\r\nauto nPDLoaderText = GetPrivateProfileIntW(L\"patches\", L\"pdloadertext\", TRUE, CONFIG_FILE);\r\nauto nHideStatusIcons = GetPrivateProfileIntW(L\"patches\", L\"hide_status_icons\", FALSE, CONFIG_FILE);\r\nauto nStatusIcons = GetPrivateProfileIntW(L\"patches\", L\"status_icons\", 0, CONFIG_FILE);\r\nauto nHidePVWatermark = GetPrivateProfileIntW(L\"patches\", L\"hide_pv_watermark\", FALSE, CONFIG_FILE);\r\nauto nNoPVUi = GetPrivateProfileIntW(L\"patches\", L\"no_pv_ui\", FALSE, CONFIG_FILE);\r\nauto nHideVolCtrl = GetPrivateProfileIntW(L\"patches\", L\"hide_volume\", FALSE, CONFIG_FILE);\r\nauto nNoLyrics = GetPrivateProfileIntW(L\"patches\", L\"no_lyrics\", FALSE, CONFIG_FILE);\r\nauto nNoMovies = GetPrivateProfileIntW(L\"patches\", L\"no_movies\", FALSE, CONFIG_FILE);\r\nauto nMP4Movies = GetPrivateProfileIntW(L\"patches\", L\"mp4_movies\", FALSE, CONFIG_FILE);\r\nauto nNoError = GetPrivateProfileIntW(L\"patches\", L\"no_error\", FALSE, CONFIG_FILE);\r\nauto nNoTimer = GetPrivateProfileIntW(L\"patches\", L\"no_timer\", TRUE, CONFIG_FILE);\r\nauto nNoTimerSprite = GetPrivateProfileIntW(L\"patches\", L\"no_timer_sprite\", TRUE, CONFIG_FILE);\r\nauto nAutoDatabank = GetPrivateProfileIntW(L\"patches\", L\"auto_databank\", TRUE, CONFIG_FILE);\r\nauto nEStageManager = GetPrivateProfileIntW(L\"patches\", L\"enhanced_stage_manager\", 0, CONFIG_FILE);\r\nauto nEStageManagerEncore = GetPrivateProfileIntW(L\"patches\", L\"enhanced_stage_manager_encore\", TRUE, CONFIG_FILE);\r\nauto nUnlockPseudo = GetPrivateProfileIntW(L\"patches\", L\"unlock_pseudo\", FALSE, CONFIG_FILE);\r\nauto nCard = GetPrivateProfileIntW(L\"patches\", L\"card\", TRUE, CONFIG_FILE);\r\nauto nHardwareSlider = GetPrivateProfileIntW(L\"patches\", L\"hardware_slider\", FALSE, CONFIG_FILE);\r\nauto nTAA = GetPrivateProfileIntW(L\"graphics\", L\"taa\", TRUE, CONFIG_FILE);\r\nauto nMLAA = GetPrivateProfileIntW(L\"graphics\", L\"mlaa\", TRUE, CONFIG_FILE);\r\nauto nDoF = GetPrivateProfileIntW(L\"graphics\", L\"dof\", TRUE, CONFIG_FILE);\r\nauto nMAG = GetPrivateProfileIntW(L\"graphics\", L\"mag\", 0, CONFIG_FILE);\r\nauto nGamma = GetPrivateProfileIntW(L\"graphics\", L\"gamma\", 100, CONFIG_FILE);\r\nauto nStereo = GetPrivateProfileIntW(L\"patches\", L\"stereo\", TRUE, CONFIG_FILE);\r\nauto nCustomPatches = GetPrivateProfileIntW(L\"patches\", L\"custom_patches\", TRUE, CONFIG_FILE);\r\nauto nQuickStart = GetPrivateProfileIntW(L\"patches\", L\"quick_start\", 0, CONFIG_FILE);\r\nauto nNoScrollingSfx = GetPrivateProfileIntW(L\"patches\", L\"no_scrolling_sfx\", FALSE, CONFIG_FILE);\r\nauto nEnablePvCustomization = GetPrivateProfileIntW(L\"patches\", L\"enable_pv_customization\", FALSE, CONFIG_FILE);\r\nauto nNoHandScaling = GetPrivateProfileIntW(L\"patches\", L\"no_hand_scaling\", FALSE, CONFIG_FILE);\r\nauto nDefaultHandSize = GetPrivateProfileIntW(L\"patches\", L\"default_hand_size_uint\", 0, CONFIG_FILE);\r\nauto nSingMissed = GetPrivateProfileIntW(L\"patches\", L\"sing_missed\", FALSE, CONFIG_FILE);\r\nauto nForceMouth = GetPrivateProfileIntW(L\"patches\", L\"force_mouth\", 0, CONFIG_FILE);\r\nauto nForceExpressions = GetPrivateProfileIntW(L\"patches\", L\"force_expressions\", 0, CONFIG_FILE);\r\nauto nForceLook = GetPrivateProfileIntW(L\"patches\", L\"force_look\", 0, CONFIG_FILE);\r\nauto nNpr1 = GetPrivateProfileIntW(L\"graphics\", L\"npr1\", 0, CONFIG_FILE);\r\nauto nReflections = GetPrivateProfileIntW(L\"graphics\", L\"reflections\", TRUE, CONFIG_FILE);\r\nauto nShadows = GetPrivateProfileIntW(L\"graphics\", L\"shadows\", TRUE, CONFIG_FILE);\r\nauto nPunchthrough = GetPrivateProfileIntW(L\"graphics\", L\"punchthrough\", TRUE, CONFIG_FILE);\r\nauto nGlare = GetPrivateProfileIntW(L\"graphics\", L\"glare\", TRUE, CONFIG_FILE);\r\nauto nShader = GetPrivateProfileIntW(L\"graphics\", L\"shader\", TRUE, CONFIG_FILE);\r\nauto n2D = GetPrivateProfileIntW(L\"graphics\", L\"2D\", FALSE, CONFIG_FILE);\r\nauto nReflectResWidth = GetPrivateProfileIntW(L\"graphics\", L\"reflect_res_width\", 512, CONFIG_FILE);\r\nauto nReflectResHeight = GetPrivateProfileIntW(L\"graphics\", L\"reflect_res_height\", 256, CONFIG_FILE);\r\nauto nRefractResWidth = GetPrivateProfileIntW(L\"graphics\", L\"refract_res_width\", 512, CONFIG_FILE);\r\nauto nRefractResHeight = GetPrivateProfileIntW(L\"graphics\", L\"refract_res_height\", 256, CONFIG_FILE);\r\nauto nShadowResWidth = GetPrivateProfileIntW(L\"graphics\", L\"shadow_res_width\", 2048, CONFIG_FILE);\r\nauto nShadowResHeight = GetPrivateProfileIntW(L\"graphics\", L\"shadow_res_height\", 2048, CONFIG_FILE);\r\nauto nLagCompensation = GetPrivateProfileIntW(L\"graphics\", L\"lag_compensation\", 0, CONFIG_FILE);\r\nauto nUseDivahookBat = GetPrivateProfileIntW(L\"launcher\", L\"use_divahook_bat\", FALSE, CONFIG_FILE);"
  },
  {
    "path": "source-code/source/plugins/Patches/storage.h",
    "content": "#pragma once\r\n#include <cstdint>\r\n\r\nnamespace Storage\r\n{\r\n    struct FileRecord\r\n    {\r\n        union\r\n        {\r\n            void* pData;          // used if allocSize is >= 16\r\n            char  inlineData[16]; // used if allocSize is < 16; [8-15] not normally cleared when expanded\r\n        };\r\n        uint64_t dataLength = 0;\r\n        uint64_t allocSize = 15;\r\n    };\r\n\r\n    //void(__fastcall* divaAddStringContainer)(void*, void**) = (void(__fastcall*)(void* container, void** src))0x01400C0A40;\r\n\r\n    void customAddStringContainer(void* container, const char* str)\r\n    {\r\n        uint64_t addr = (uint64_t)container;\r\n\r\n        while (*(uint64_t*)addr != 0)\r\n        {\r\n            addr += sizeof(FileRecord);\r\n        }\r\n\r\n        FileRecord* record = (FileRecord*)addr;\r\n        size_t length = strlen(str) + 1;\r\n\r\n        if (length > 0 && length < 16)\r\n        {\r\n            memcpy_s(record->inlineData, length, str, length);\r\n            record->dataLength = length;\r\n            record->allocSize = 0;\r\n        }\r\n        else if (length >= 16)\r\n        {\r\n            char* alloc = (char*)malloc(length);\r\n            memcpy_s(alloc, length, str, length);\r\n            record->pData = alloc;\r\n            record->dataLength = length;\r\n            record->allocSize = length;\r\n        }\r\n    }\r\n};"
  },
  {
    "path": "source-code/source/plugins/Patches/urlutil.h",
    "content": "#pragma once\r\n#include <string>\r\n#include <sstream>\r\n#include <iomanip>\r\n\r\nstd::string urlDecode(const std::string& encoded)\r\n{\r\n    std::string decoded;\r\n    char ch;\r\n    for (size_t i = 0; i < encoded.length(); i++)\r\n    {\r\n        if (encoded[i] == '%')\r\n        {\r\n            if (i + 2 < encoded.length())\r\n            {\r\n                std::string hex = encoded.substr(i + 1, 2);\r\n                ch = static_cast<char>(std::strtol(hex.c_str(), nullptr, 16));\r\n                decoded.push_back(ch);\r\n                i += 2;\r\n            }\r\n            else\r\n            {\r\n                decoded.push_back('%');\r\n            }\r\n        }\r\n        else if (encoded[i] == '+')\r\n        {\r\n            decoded.push_back(' ');\r\n        }\r\n        else\r\n        {\r\n            decoded.push_back(encoded[i]);\r\n        }\r\n    }\r\n    return decoded;\r\n}\r\n\r\nstd::string urlEncode(const std::string& str)\r\n{\r\n    std::ostringstream escaped;\r\n    escaped.fill('0');\r\n    escaped << std::hex;\r\n\r\n    for (unsigned char c : str)\r\n    {\r\n        if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')\r\n        {\r\n            escaped << c;\r\n        }\r\n        else\r\n        {\r\n            escaped << '%' << std::setw(2) << std::uppercase << static_cast<int>(c);\r\n        }\r\n    }\r\n    return escaped.str();\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/Render/Render.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <ProjectGuid>{89F87459-768F-4638-9267-0F90CD74452D}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Render</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;RENDER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;RENDER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\freeglut\\include;..\\..\\..\\dependencies\\detours\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Render/Render.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/Render/dllmain.cpp",
    "content": "#include \"framework.h\"\n#include <detours.h>\n#pragma comment(lib, \"detours.lib\")\n#include <GL\\freeglut.h>\n#include <GL\\GL.h>\n#include <wingdi.h>\n#include <windows.h>\n#include <timeapi.h>\n#include <iostream>\n#include <thread>\n\n#include <chrono>\n\n#include \"PluginConfigApi.h\"\n\nusing namespace std::chrono;\n\nunsigned short game_version = 710;\n\nvoid exitGameClean(int)\n{\n\tswitch (game_version)\n\t{\n\tcase 600:\n\t\t*(bool*)0x0000000140E8DF20 = true; // 6.00\n\t\tbreak;\n\tdefault:\n\t\t*(bool*)0x0000000140EDA6B0 = true; // 7.10\n\t}\n}\n\nint hookedCreateWindow(const char* title, void(__cdecl* exit_function)(int))\n{\n\tSetProcessDPIAware();\n\n\t// trick Optimus into switching to the NVIDIA GPU\n\tif (cuInit != NULL) cuInit(0);\n\t\n\tif (nDisplay == 2) // fullscreen\n\t{\n\t\tchar GameModeString[24];\n\t\tsprintf_s(GameModeString, sizeof(GameModeString), \"%dx%d:%d@%d\", nWidth, nHeight, nBitDepth, nRefreshRate);\n\t\tglutGameModeString(GameModeString);\n\t\t\n\t\tif (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) {\n\t\t\tprintf(\"[Render Manager] Game mode (exclusive fullscreen) enabled.\\n\");\n\t\t\tprintf(GameModeString);\n\t\t\tprintf(\"\\n\");\n\t\t\tglutEnterGameMode();\n\t\t}\n\t\telse {\n\t\t\tprintf(\"[Render Manager] Requested display mode not supported. Using non-exclusive fullscreen instead.\\n\");\n\t\t\tprintf(GameModeString);\n\t\t\tprintf(\"\\n\");\n\t\t\tswitch (game_version)\n\t\t\t{\n\t\t\tcase 600:\n\t\t\t\t*fullScreenFlag_600 = 1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t*fullScreenFlag_710 = 1;\n\t\t\t}\n\t\t\t__glutCreateWindowWithExit(title, exitGameClean);\n\t\t}\n\t}\n\telse // windowed or borderless\n\t{\n\t\tswitch (game_version)\n\t\t{\n\t\tcase 600:\n\t\t\t*fullScreenFlag_600 = 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t*fullScreenFlag_710 = 0;\n\t\t}\n\n\t\tRECT xy;\n\t\tSystemParametersInfo(SPI_GETWORKAREA, 0, &xy, 0);\n\t\tint screenWidth = xy.right - xy.left;\n\t\tint screenHeight = xy.bottom - xy.top;\n\t\tif (nWidth > screenWidth)\n\t\t{\n\t\t\tscreenWidth = GetSystemMetrics(SM_CXSCREEN);\n\t\t\txy.left = 0;\n\t\t}\n\n\t\tif (nHeight > screenHeight)\n\t\t{\n\t\t\tscreenHeight = GetSystemMetrics(SM_CYSCREEN);\n\t\t\txy.top = 0;\n\t\t}\n\t\tint wndX = xy.left + (screenWidth - nWidth) / 2;\n\t\tint wndY = xy.top + (screenHeight - nHeight) / 2;\n\n\t\tglutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);\n\n\t\tglutInitWindowSize(nWidth, nHeight);\n\t\tglutInitWindowPosition(wndX, wndY);\n\t\t__glutCreateWindowWithExit(title, exitGameClean);\n\n\t\tif (nDisplay == 1 || nDisplay == 3) // borderless mode\n\t\t{\n\t\t\t// support borderless mode even with original copy of glut\n\t\t\tHDC hDev = wglGetCurrentDC(); // get handle to current opengl device context\n\t\t\tHWND hWnd = WindowFromDC(hDev); // convert it to a window handle\n\n\t\t\tLONG_PTR wndStyle = WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;  // set no border (visible to ensure something is shown immediately)\n\n\t\t\tif (nDisplay == 1)\n\t\t\t{\n\t\t\t\twndStyle |= WS_POPUP;\n\t\t\t\tprintf(\"[Render Manager] Popup enabled.\\n\");\n\t\t\t}\n\n\t\t\tSetWindowLongPtr(hWnd, GWL_STYLE, wndStyle);\n\t\t\tSetWindowPos(hWnd, HWND_TOP, wndX, wndY, nWidth, nHeight, SWP_FRAMECHANGED); // adjust position to apply new style\n\n\t\t\tprintf(\"[Render Manager] Borderless mode.\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprintf(\"[Render Manager] Windowed mode.\\n\");\n\t\t}\n\t}\n\n\treturn true;\n}\n\n__int64 hookedParseParameters(int a1, __int64* a2)\n{\n\t// Force -wqhd if Custom Internal Resolution is enabled\n\tif (nIntRes)\n\t\tswitch (game_version)\n\t\t{\n\t\tcase 600:\n\t\t\t*resolutionType_600 = 15;\n\t\t\tbreak;\n\t\t//default:\n\t\t//\t*resolutionType_710 = 15;\n\t\t}\n\t// Return to the original function\n\tswitch (game_version)\n\t{\n\tcase 600:\n\t\treturn divaParseParameters_600(a1, a2);\n\t\tbreak;\n\t//default:\n\t//\treturn divaParseParameters_710(a1, a2);\n\t}\n}\n\ntime_point<high_resolution_clock> sleepUntil = high_resolution_clock::now();\ntime_point<high_resolution_clock> nextUpdate = high_resolution_clock::now();\nnanoseconds expectedFrameDuration;\nnanoseconds sleepWindow(2500000);\n\n__int64 __fastcall limiterFuncNormal(__int64 a1)\n{\n\tauto timeNow = high_resolution_clock::now();\n\n\tif (timeNow < nextUpdate)\n\t\treturn 0;\n\n\ttimeNow = high_resolution_clock::now();\n\n\t// increment nextUpdate by fixed interval to unsure timing accuracy between frames\n\t// (ignore time spent outside the update)\n\tnextUpdate += expectedFrameDuration;\n\n\t// if dropping frames, run as fast as possible\n\t// and also change nextUpdate's timing to match current time\n\t// (so frame n+2 will be at least 1/nFpsLimit seconds from frame n+1)\n\tif (nextUpdate < timeNow)\n\t\tnextUpdate = timeNow;\n\n\tswitch (game_version)\n\t{\n\tcase 600:\n\t\treturn divaEngineUpdate_600(a1);\n\tdefault:\n\t\treturn divaEngineUpdate_710(a1);\n\t}\n}\n\n__int64 __fastcall limiterFuncLight(__int64 a1)\n{\n\tauto timeNow = high_resolution_clock::now();\n\n\t// sleep until the approximate correct time to save CPU usage,\n\t// then change to instantly returning when timing is more critical\n\tif (timeNow < sleepUntil)\n\t{\n\t\tstd::this_thread::sleep_until(sleepUntil);\n\n\t\tif (nVerboseLimiter)\n\t\t{\n\t\t\ttimeNow = high_resolution_clock::now();\n\t\t\tnanoseconds timeDifference = (timeNow - sleepUntil);\n\t\t\tif (timeDifference > sleepWindow) // no need for abs because it doesn't matter if this is early\n\t\t\t{\n\t\t\t\tprintf(\"FPS LIMITER SLEEP TIME OUTSIDE ALLOWED WINDOW\\n\");\n\t\t\t\tprintf(\" Target sleep until time: %lld, Actual time: %lld\\n\", sleepUntil.time_since_epoch().count(), timeNow.time_since_epoch().count());\n\t\t\t\tprintf(\" (Difference: %lld, Window: %lld)\\n\", timeDifference.count(), sleepWindow.count());\n\t\t\t}\n\t\t}\n\t}\n\n\tif (timeNow < nextUpdate)\n\t\treturn 0;\n\n\ttimeNow = high_resolution_clock::now();\n\n\t// increment nextUpdate by fixed interval to unsure timing accuracy between frames\n\t// (ignore time spent outside the update)\n\tnextUpdate += expectedFrameDuration;\n\n\t// if dropping frames, run as fast as possible\n\t// and also change nextUpdate's timing to match current time\n\t// (so frame n+2 will be at least 1/nFpsLimit seconds from frame n+1)\n\tif (nextUpdate < timeNow)\n\t\tnextUpdate = timeNow;\n\n\tsleepUntil = nextUpdate - sleepWindow;\n\n\tswitch (game_version)\n\t{\n\tcase 600:\n\t\treturn divaEngineUpdate_600(a1);\n\tdefault:\n\t\treturn divaEngineUpdate_710(a1);\n\t}\n}\n\n#define WRITE_MEMORY_INT(address, data) \\\n{ \\\nDWORD oldProtect, bck; \\\nVirtualProtect((BYTE*)(address), 4, PAGE_EXECUTE_READWRITE, &oldProtect); \\\n*((int*)(address)) = (data); \\\nVirtualProtect((BYTE*)(address), 4, oldProtect, &bck); \\\n}\n\nvoid __fastcall hookedInitRender(int ssaa, int hd_res, int ss_alpha_mask, __int8 npr) {\n\tif (nIntRes)\n\t{\n\t\tconst __int64 widthAddress = 0x0000000140EDA8B0 + 0x0C;\n\t\tconst __int64 heightAddress = 0x0000000140EDA8B0 + 0x10;\n\t\tconst __int64 intWidthAddress = 0x0000000140EDA8D8 + 0x0C;\n\t\tconst __int64 intHeightAddress = 0x0000000140EDA8D8 + 0x10;\n\n\t\tint originalWidth = *(int*)widthAddress;\n\t\tint originalHeight = *(int*)heightAddress;\n\t\tint originalIntWidth = *(int*)intWidthAddress;\n\t\tint originalIntHeight = *(int*)intHeightAddress;\n\t\tWRITE_MEMORY_INT(widthAddress, nIntResWidth);\n\t\tWRITE_MEMORY_INT(heightAddress, nIntResHeight);\n\t\tWRITE_MEMORY_INT(intWidthAddress, nIntResWidth);\n\t\tWRITE_MEMORY_INT(intHeightAddress, nIntResHeight);\n\t\tdivaInitRender_710(ssaa, hd_res, ss_alpha_mask, npr);\n\t\tWRITE_MEMORY_INT(widthAddress, originalWidth);\n\t\tWRITE_MEMORY_INT(heightAddress, originalHeight);\n\t\tWRITE_MEMORY_INT(intWidthAddress, originalIntWidth);\n\t\tWRITE_MEMORY_INT(intHeightAddress, originalIntHeight);\n\t}\n\telse\n\t\tdivaInitRender_710(ssaa, hd_res, ss_alpha_mask, npr);\n}\n\n__int64 __fastcall hookedEngineUpdate(__int64 a1)\n{\n\tif (nFpsLimit < 1)\n\t\tswitch (game_version)\n\t\t{\n\t\tcase 600:\n\t\t\treturn divaEngineUpdate_600(a1);\n\t\tdefault:\n\t\t\treturn divaEngineUpdate_710(a1);\n\t\t}\n\telse if (nUseLightLimiter)\n\t\treturn limiterFuncLight(a1);\n\telse\n\t\treturn limiterFuncNormal(a1);\n}\n\nextern \"C\" __declspec(dllexport) int getFramerateLimit(void)\n{\n\treturn nFpsLimit;\n}\n\nextern \"C\" __declspec(dllexport) void setFramerateLimit(int framerate)\n{\n\tnFpsLimit = framerate;\n\tif (nFpsLimit < 1)\n\t\texpectedFrameDuration = nanoseconds(0);\n\telse\n\t\texpectedFrameDuration = nanoseconds(1000000000 / nFpsLimit);\n\treturn;\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule,\n\tDWORD  ul_reason_for_call,\n\tLPVOID lpReserved\n)\n{\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\tif (*(char*)0x140A570F0 == '6') game_version = 600;\n\n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tswitch (game_version)\n\t\t{\n\t\tcase 600:\n\t\t\tDetourAttach(&(PVOID&)divaCreateWindow_600, hookedCreateWindow);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDetourAttach(&(PVOID&)divaCreateWindow_710, hookedCreateWindow);\n\t\t}\n\t\tDetourTransactionCommit();\n\n\t\tswitch (game_version)\n\t\t{\n\t\tcase 600:\n\t\t\tDetourTransactionBegin();\n\t\t\tDetourUpdateThread(GetCurrentThread());\n\t\t\tDetourAttach(&(PVOID&)divaParseParameters_600, hookedParseParameters);\n\t\t\tDetourTransactionCommit();\n\t\t\tbreak;\n\t\t//default:\n\t\t//\tDetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters);\n\t\t}\n\n\n\t\t// set sleep time resolution to 2ms or device minimum (whichever's lower)\n\t\tTIMECAPS tc;\n\n\t\tif (timeGetDevCaps(&tc, sizeof(TIMECAPS)) == MMSYSERR_NOERROR)\n\t\t{\n\t\t\tUINT wTimerRes = min(max(tc.wPeriodMin, 2), tc.wPeriodMax);\n\t\t\ttimeBeginPeriod(wTimerRes);\n\t\t}\n\n\t\tsetFramerateLimit(nFpsLimit);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tswitch (game_version)\n\t\t{\n\t\tcase 600:\n\t\t\tDetourAttach(&(PVOID&)divaEngineUpdate_600, hookedEngineUpdate);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDetourAttach(&(PVOID&)divaEngineUpdate_710, hookedEngineUpdate);\n\t\t}\n\t\tDetourTransactionCommit();\n\n\t\t// if window is set to screen res, process that now so it can be used for auto internal res\n\t\tif (nWidth == -1 || nHeight == -1)\n\t\t{\n\t\t\tnWidth = GetSystemMetrics(SM_CXSCREEN);\n\t\t\tnHeight = GetSystemMetrics(SM_CYSCREEN);\n\t\t}\n\n\t\tif (nIntRes)\n\t\t{\n\t\t\t// if -1 use window resolution\n\t\t\tif (nIntResWidth == -1 || nIntResHeight == -1)\n\t\t\t{\n\t\t\t\tnIntResWidth = nWidth;\n\t\t\t\tnIntResHeight = nHeight;\n\t\t\t}\n\n\t\t\tprintf(\"[Render] Custom internal resolution enabled\\n\");\n\t\t\tprintf(\"[Render] X: %d Y: %d\\n\", nIntResWidth, nIntResHeight);\n\t\t\tswitch (game_version)\n\t\t\t{\n\t\t\tcase 600:\n\t\t\t\tWRITE_MEMORY_INT(0x0000000140980954, nIntResWidth);\n\t\t\t\tWRITE_MEMORY_INT(0x0000000140980958, nIntResWidth);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDetourTransactionBegin();\n\t\t\t\tDetourUpdateThread(GetCurrentThread());\n\t\t\t\tDetourAttach(&(PVOID&)divaInitRender_710, hookedInitRender);\n\t\t\t\tDetourTransactionCommit();\n\t\t\t}\n\t\t}\n\t}\n\treturn TRUE;\n}\n\n\nusing namespace PluginConfig;\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"Render\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"Applies window mode/size and FPS limiting.\";\n}\n"
  },
  {
    "path": "source-code/source/plugins/Render/framework.h",
    "content": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n#include <string>\n\nstatic int(__cdecl* divaCreateWindow_710)(const char* title, void(__cdecl* exitfunc)(int)) = (int(__cdecl*)(const char* title, void(__cdecl * exitfunc)(int)))0x140194D00;\nvoid(__fastcall* divaInitRender_710)(int ssaa, int hd_res, int ss_alpha_mask, __int8 npr) = (void(__fastcall *)(int ssaa, int hd_res, int ss_alpha_mask, __int8 npr))0x0000000140502A10;\n//__int64 (__fastcall* divaParseParameters_710)(int a1, __int64* a2) = (__int64(__fastcall*)(int a1, __int64* a2))0x140193630;\n__int64(__fastcall* divaEngineUpdate_710)(__int64 a1) = (__int64(__fastcall*)(__int64 a1))0x140194CD0;\n\nuint8_t* fullScreenFlag_710 = (uint8_t*)0x140EDA5D1;\n//DWORD* resolutionType_710 = (DWORD*)0x140EDA5D4;\n\n\nstatic int(__cdecl* divaCreateWindow_600)(const char* title, void(__cdecl* exitfunc)(int)) = (int(__cdecl*)(const char* title, void(__cdecl * exitfunc)(int)))0x14018CD00;\n__int64(__fastcall* divaParseParameters_600)(int a1, __int64* a2) = (__int64(__fastcall*)(int a1, __int64* a2))0x14018B660;\n__int64(__fastcall* divaEngineUpdate_600)(__int64 a1) = (__int64(__fastcall*)(__int64 a1))0x14018CCD0;\n\nuint8_t* fullScreenFlag_600 = (uint8_t*)0x140E8DE41;\nDWORD* resolutionType_600 = (DWORD*)0x140E8DE44;\n\nusing namespace std;\n\nwstring DirPath() {\n\tWCHAR buffer[MAX_PATH];\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\twstring::size_type pos = wstring(buffer).find_last_of(L\"\\\\/\");\n\treturn wstring(buffer).substr(0, pos);\n}\n\nwstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\config.ini\";\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\n\nint nDisplay = GetPrivateProfileIntW(L\"resolution\", L\"display\", 0, CONFIG_FILE);\nint nWidth = GetPrivateProfileIntW(L\"resolution\", L\"width\", 1280, CONFIG_FILE);\nint nHeight = GetPrivateProfileIntW(L\"resolution\", L\"height\", 720, CONFIG_FILE);\n\nint nIntRes = GetPrivateProfileIntW(L\"resolution\", L\"r.enable\", FALSE, CONFIG_FILE);\nint nIntResWidth = GetPrivateProfileIntW(L\"resolution\", L\"r.width\", 1280, CONFIG_FILE);\nint nIntResHeight = GetPrivateProfileIntW(L\"resolution\", L\"r.height\", 720, CONFIG_FILE);\n\nint nBitDepth = GetPrivateProfileIntW(L\"resolution\", L\"bitdepth\", 32, CONFIG_FILE);\nint nRefreshRate = GetPrivateProfileIntW(L\"resolution\", L\"refreshrate\", 60, CONFIG_FILE);\n\nint nFpsLimit = GetPrivateProfileIntW(L\"graphics\", L\"fps.limit\", 60, CONFIG_FILE);\nint nUseLightLimiter = GetPrivateProfileIntW(L\"graphics\", L\"fps.limit.lightmode\", TRUE, CONFIG_FILE);\nint nVerboseLimiter = GetPrivateProfileIntW(L\"graphics\", L\"fps.limit.verbose\", FALSE, CONFIG_FILE);\n\n// used to trick Optimus into switching to the NVIDIA GPU\nHMODULE nvcudaModule = LoadLibraryW(L\"nvcuda.dll\");\n// cuInit actually returns a CUresult, but we don't really care about it\nvoid(WINAPI * cuInit)(unsigned int flags) = (void(WINAPI*)(unsigned int flags))GetProcAddress(nvcudaModule, \"cuInit\");\n"
  },
  {
    "path": "source-code/source/plugins/ShaderPatch/ShaderPatch.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{C07E495E-A16F-48FA-80E4-0296B5234F0B}</ProjectGuid>\n    <RootNamespace>ShaderPatch</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <TargetExt>.dva</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\GPUModel;..\\..\\..\\dependencies\\detours\\include;..\\..\\..\\dependencies\\PluginConfigApi</AdditionalIncludeDirectories>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\GPUModel;..\\..\\..\\dependencies\\detours\\include;..\\..\\..\\dependencies\\PluginConfigApi</AdditionalIncludeDirectories>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib</AdditionalLibraryDirectories>\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\dllmain.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\framework.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/ShaderPatch/ShaderPatch.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "source-code/source/plugins/ShaderPatch/src/dllmain.cpp",
    "content": "#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n#include <windows.h>\n\n#include \"framework.h\"\n#include \"PluginConfigApi.h\"\n#include \"GPUModel.h\"\n#include \"detours.h\"\n#pragma comment(lib, \"detours.lib\")\n\n#include <vector>\n#include <regex>\n\nvoid InjectCode(void* address, const std::vector<uint8_t> data)\n{\n\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\tDWORD oldProtect;\n\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\tmemcpy(address, data.data(), byteCount);\n\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n}\n\nvoid NopBytes(void* address, unsigned int num)\n{\n\tstd::vector<uint8_t> newbytes = {};\n\n\tfor (unsigned int i = 0; i < num; ++i) newbytes.push_back(0x90);\n\n\tInjectCode(address, newbytes);\n}\n\n\n\n\n\nvoid LoadData()\n{\n\tstd::ifstream fileStream(DATA_FILE_STRING);\n\n\tif (!fileStream.is_open())\n\t\treturn;\n\n\tstd::string line;\n\tstd::string section = \"patches\";\n\tstd::string lastComment;\n\tbool isInComment = false;\n\n\t// check for BOM\n\tstd::getline(fileStream, line);\n\tif (line.size() >= 3 && line.rfind(\"\\xEF\\xBB\\xBF\", 0) == 0)\n\t\tfileStream.seekg(3);\n\telse\n\t\tfileStream.seekg(0);\n\n\twhile (std::getline(fileStream, line))\n\t{\n\t\t// detect comments first to make comment exit logic easier\n\t\tint commentStartPos;\n\t\tif ((commentStartPos = 1, line.size() >= 1 && line[0] == '#') || (commentStartPos = 2, line.size() >= 2 && line.rfind(\"//\", 0) == 0))\n\t\t{\n\t\t\tline.erase(0, commentStartPos);\n\t\t\tline = TrimString(line, \" \\t\");\n\t\t\tif (isInComment)\n\t\t\t{\n\t\t\t\tlastComment += \"\\n\" + line;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlastComment = line;\n\t\t\t\tisInComment = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tisInComment = false;\n\n\t\tif (line.size() <= 0) // skip empty lines\n\t\t{\n\t\t\tlastComment = \"\"; // consume the last comment\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line[0] == '[') // section name\n\t\t{\n\t\t\tsize_t endIdx = line.find(']');\n\t\t\tsection = line.substr(1, endIdx - 1);\n\t\t\tstd::transform(section.begin(), section.end(), section.begin(), ::tolower);\n\t\t\tlastComment = \"\"; // consume the last comment\n\t\t\tcontinue;\n\t\t}\n\n\t\tstd::vector<std::string> equalSplit = SplitString(line, \"=\");\n\t\tif (equalSplit.size() < 2)\n\t\t{\n\t\t\tlastComment = \"\"; // consume the last comment\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (section == \"patches\")\n\t\t{\n\t\t\tShaderPatchInfo patch = ShaderPatchInfo();\n\n\t\t\tpatch.fileRegex = equalSplit[0];\n\n\t\t\tstd::vector<std::string> rules = SplitString(equalSplit[1], \"||\");\n\t\t\tif (rules.size() < 1) continue; // probably will never trigger but whatever\n\n\t\t\tfor (std::string &rule : rules)\n\t\t\t{\n\t\t\t\tif (rule.size() >= 5 && rule.rfind(\"arch:\", 0) == 0)\n\t\t\t\t{\n\t\t\t\t\trule.erase(0, 5);\n\t\t\t\t\tpatch.archs = SplitString(rule, \",\");\n\t\t\t\t}\n\t\t\t\telse if (rule.size() >= 4 && rule.rfind(\"cfg:\", 0) == 0)\n\t\t\t\t{\n\t\t\t\t\trule.erase(0, 4);\n\t\t\t\t\t// force cfg key to lower because ini shouldn't be case sensitive\n\t\t\t\t\tstd::transform(rule.begin(), rule.end(), rule.begin(), ::tolower);\n\t\t\t\t\tpatch.cfg = rule;\n\t\t\t\t}\n\t\t\t\telse if (rule.size() >= 5 && rule.rfind(\"from:\", 0) == 0)\n\t\t\t\t{\n\t\t\t\t\trule.erase(0, 5);\n\t\t\t\t\tpatch.dataRegex = rule;\n\t\t\t\t}\n\t\t\t\telse if (rule.size() >= 3 && rule.rfind(\"to:\", 0) == 0)\n\t\t\t\t{\n\t\t\t\t\trule.erase(0, 3);\n\t\t\t\t\trule = StringReplace(rule, \"\\\\n\", \"\\n\");\n\t\t\t\t\tpatch.dataReplace = rule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlastComment = \"\"; // consume the last comment\n\n\t\t\tpatchesVec.push_back(patch);\n\t\t}\n\t\telse if (section == \"config\")\n\t\t{\n\t\t\t// force cfg key to lower because ini shouldn't be case sensitive\n\t\t\tstd::transform(equalSplit[0].begin(), equalSplit[0].end(), equalSplit[0].begin(), ::tolower);\n\t\t\tequalSplit[0] = TrimString(equalSplit[0], \" \\t\");\n\t\t\tequalSplit[1] = TrimString(equalSplit[1], \" \\t\");\n\n\t\t\tdataCfgMap[equalSplit[0]] = strpair(equalSplit[1], lastComment);\n\t\t\tlastComment = \"\"; // consume the last comment\n\t\t}\n\t}\n\n\tfileStream.close();\n}\n\n// always call this after LoadData\nvoid LoadUserCfg()\n{\n\t// copy default config into userconfig to avoid having to read from multiple maps while patching\n\tfor (std::map<std::string, strpair>::iterator iter = dataCfgMap.begin(); iter != dataCfgMap.end(); ++iter)\n\t{\n\t\tuserCfgMap[iter->first] = iter->second.first;\n\t}\n\n\tstd::ifstream fileStream(CONFIG_FILE_STRING);\n\n\tif (!fileStream.is_open())\n\t\treturn;\n\n\tstd::string line;\n\tstd::string section = \"config\";\n\n\t// check for BOM\n\tstd::getline(fileStream, line);\n\tif (line.size() >= 3 && line.rfind(\"\\xEF\\xBB\\xBF\", 0) == 0)\n\t\tfileStream.seekg(3);\n\telse\n\t\tfileStream.seekg(0);\n\n\twhile (std::getline(fileStream, line))\n\t{\n\t\tif (line.size() <= 0) // skip empty lines\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// skip comments\n\t\tif ((line.size() >= 1 && line[0] == '#') || (line.size() >= 2 && line.rfind(\"//\", 0) == 0))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line[0] == '[') // section name\n\t\t{\n\t\t\tsize_t endIdx = line.find(']');\n\t\t\tsection = line.substr(1, endIdx - 1);\n\t\t\tstd::transform(section.begin(), section.end(), section.begin(), ::tolower);\n\t\t\tcontinue;\n\t\t}\n\n\t\tstd::vector<std::string> equalSplit = SplitString(line, \"=\");\n\t\tif (equalSplit.size() < 2)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (section == \"config\")\n\t\t{\n\t\t\t// force cfg key to lower because ini shouldn't be case sensitive\n\t\t\tstd::transform(equalSplit[0].begin(), equalSplit[0].end(), equalSplit[0].begin(), ::tolower);\n\t\t\tequalSplit[0] = TrimString(equalSplit[0], \" \\t\");\n\t\t\tequalSplit[1] = TrimString(equalSplit[1], \" \\t\");\n\n\t\t\tuserCfgMap[equalSplit[0]] = equalSplit[1];\n\t\t}\n\t}\n\n\tfileStream.close();\n}\n\n\nvoid hookedLoadFromFarcThunk(FArchivedFile** ppFile)\n{\n\tloadFromFarcThunk(ppFile);\n\n\tif (ppFile == nullptr || *ppFile == nullptr)\n\t\treturn;\n\n\tFArchivedFile &file = **ppFile;\n\n\tif (file.notLoadedFlag != 0)\n\t\treturn;\n\n\tstd::string modifiedStr = \"\";\n\n\tfor (ShaderPatchInfo &patch : patchesVec)\n\t{\n\t\tbool archMatches = false;\n\t\tif (patch.archs.size() > 0)\n\t\t{\n\t\t\tfor (std::string &arch : patch.archs)\n\t\t\t{\n\t\t\t\tif (gpuName.size() >= arch.size() && gpuName.rfind(arch, 0) == 0)\n\t\t\t\t{\n\t\t\t\t\tarchMatches = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tarchMatches = true;\n\t\t}\n\n\t\tbool cfgMatches = false;\n\t\tif (patch.cfg.length() == 0 || // patch has no config setting\n\t\t\t(userCfgMap.find(patch.cfg) != userCfgMap.end() && userCfgMap[patch.cfg] != \"0\")) // patch has a toggle and is not set to 0\n\t\t{\n\t\t\tcfgMatches = true;\n\t\t}\n\n\t\tif (archMatches && cfgMatches && std::regex_match(file.fileName.GetCharBuf(), patch.fileRegex))\n\t\t{\n\t\t\tif (modifiedStr.length() == 0)\n\t\t\t\tmodifiedStr = std::string(file.data, file.dataSize);\n\n\t\t\tmodifiedStr = std::regex_replace(modifiedStr, patch.dataRegex, patch.dataReplace);\n\t\t\tmodifiedStr = StringReplace(modifiedStr, \"<fname>\", file.fileName.GetCharBuf());\n\n\t\t\tif (patch.cfg.length() > 0) // patch has a config setting\n\t\t\t{\n\t\t\t\tint valNum = 0;\n\t\t\t\tstd::string valKey;\n\t\t\t\twhile (valNum++, valKey = patch.cfg + \"_val\" + std::to_string(valNum),\n\t\t\t\t\tuserCfgMap.find(valKey) != userCfgMap.end()) // loop until there's no more config values set\n\t\t\t\t{\n\t\t\t\t\tmodifiedStr = StringReplace(modifiedStr, \"<val\" + std::to_string(valNum) + \">\", userCfgMap[valKey]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (modifiedStr.length() > 0)\n\t{\n\t\t//free(file.data);\n\t\tfile.data = _strdup(modifiedStr.c_str());\n\t\tfile.dataSize = modifiedStr.size();\n\t\tprintf(\"[ShaderPatch] Patched %s\\n\", file.fileName.GetCharBuf());\n\t}\n}\n\n\nBOOL APIENTRY DllMain(HMODULE hModule,\n\tDWORD  ul_reason_for_call,\n\tLPVOID lpReserved\n)\n{\n\tif (ul_reason_for_call == DLL_PROCESS_ATTACH)\n\t{\n\t\t// install a thunk to hook\n\t\tInjectCode((void*)0x1405e5991, { 0x48, 0x83, 0xec, 0x28 });       // SUB  RSP, 0x28\n\t\tInjectCode((void*)0x1405e5995, { 0xe8, 0x56, 0xe8, 0xb9, 0xff }); // CALL  0x1401841f0\n\t\tInjectCode((void*)0x1405e599a, { 0x48, 0x83, 0xc4, 0x28 });       // ADD  RSP, 0x28\n\t\tInjectCode((void*)0x1405e599e, { 0xc3 });                         // RET\n\t\tInjectCode((void*)0x1405e534a, { 0xe8, 0x42, 0x06, 0x00, 0x00 }); // CALL  0x1405e5991\n\n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)loadFromFarcThunk, (PVOID)hookedLoadFromFarcThunk);\n\t\tDetourTransactionCommit();\n\n\t\tgpuName = GPUModel::getGpuName();\n\t\tprintf(\"[ShaderPatch] Detected GPU: %s\\n\", gpuName.c_str());\n\t\t//Sleep(2000);\n\n\t\tLoadData();\n\t\tLoadUserCfg();\n\t}\n\treturn TRUE;\n}\n\n\nusing namespace PluginConfig;\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"ShaderPatch\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"Automatically patches shaders\";\n}\n\nstd::vector<PluginConfigOption> configVec;\nextern \"C\" __declspec(dllexport) PluginConfigArray GetPluginOptions(void)\n{\n\tLoadData();\n\tLoadUserCfg();\n\n\tfor (std::map<std::string, strpair>::iterator iter = dataCfgMap.begin(); iter != dataCfgMap.end(); ++iter)\n\t{\n\t\tstd::string k = iter->first;\n\t\tstd::string v = iter->second.first;\n\t\tstd::string c = iter->second.second;\n\n\n\n\t\tif (k.size() < 6 || k.substr(k.size() - 5, 4) != \"_val\")\n\t\t{\n\t\t\tWCHAR utf16key[128];\n\t\t\tWCHAR utf16val[128];\n\t\t\tWCHAR utf16comment[512];\n\n\t\t\t// count values to approximate the group size\n\t\t\tint valNum = 0;\n\t\t\tint valCount = 0;\n\t\t\tstd::string valKey;\n\t\t\twhile (valNum++, valKey = k + \"_val\" + std::to_string(valNum),\n\t\t\t\tdataCfgMap.find(valKey) != dataCfgMap.end()) // loop until there's no more config values set\n\t\t\t{\n\t\t\t\tvalCount++;\n\t\t\t}\n\n\n\t\t\tMultiByteToWideChar(CP_UTF8, 0, k.c_str(), -1, utf16key, 128);\n\t\t\tMultiByteToWideChar(CP_UTF8, 0, c.c_str(), -1, utf16comment, 512);\n\t\t\tLPCWSTR ttDup = _wcsdup(utf16comment);\n\n\t\t\tconfigVec.push_back({ CONFIG_GROUP_START, new PluginConfigGroupData{ _wcsdup(utf16key), 45 + valCount * 25 } });\n\t\t\tconfigVec.push_back({ CONFIG_BOOLEAN, new PluginConfigBooleanData{ _wcsdup(utf16key), L\"config\", CONFIG_FILE, L\"Enable\", ttDup, v == \"0\" ? false : true, false } }); // could use userCfgMap here, but launcher handles that anyway\n\n\n\t\t\tvalNum = 0;\n\t\t\twhile (valNum++, valKey = k + \"_val\" + std::to_string(valNum),\n\t\t\t\tdataCfgMap.find(valKey) != dataCfgMap.end()) // loop until there's no more config values set\n\t\t\t{\n\t\t\t\tMultiByteToWideChar(CP_UTF8, 0, valKey.c_str(), -1, utf16key, 128);\n\t\t\t\tMultiByteToWideChar(CP_UTF8, 0, dataCfgMap[valKey].first.c_str(), -1, utf16val, 128); // could use userCfgMap here, but launcher handles that anyway\n\n\t\t\t\tstd::wstring name;\n\t\t\t\tif (dataCfgMap[valKey].second.size() > 0)\n\t\t\t\t{\n\t\t\t\t\tMultiByteToWideChar(CP_UTF8, 0, dataCfgMap[valKey].second.c_str(), -1, utf16comment, 512);\n\t\t\t\t\tname = utf16comment;\n\t\t\t\t\tname += L\":\";\n;\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tname = std::wstring(L\"Value \") + std::to_wstring(valNum) + L\":\";\n\t\t\t\t}\n\t\t\t\tconfigVec.push_back({ CONFIG_STRING, new PluginConfigStringData{ _wcsdup(utf16key), L\"config\", CONFIG_FILE, _wcsdup(name.c_str()), ttDup, _wcsdup(utf16val), false } });\n\t\t\t}\n\n\n\t\t\tconfigVec.push_back({ CONFIG_GROUP_END, NULL });\n\t\t\tconfigVec.push_back({ CONFIG_SPACER, new PluginConfigSpacerData{ 10 } });\n\t\t}\n\t}\n\n\treturn PluginConfigArray{ (int)configVec.size(), &configVec[0] };\n}"
  },
  {
    "path": "source-code/source/plugins/ShaderPatch/src/framework.h",
    "content": "#pragma once\n//#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n//#include <windows.h>\n//#include <psapi.h>\n#include <string>\n#include <vector>\n#include <map>\n#include <regex>\n#include <stdint.h>\n#include <fstream>\n\n\nstruct ShaderPatchInfo {\n\tstd::regex fileRegex;\n\tstd::regex dataRegex;\n\tstd::string dataReplace;\n\tstd::vector<std::string> archs;\n\tstd::string cfg;\n};\n\nstd::vector<ShaderPatchInfo> patchesVec;\n\ntypedef std::pair<std::string, std::string> strpair;\nstd::map<std::string, strpair> dataCfgMap; // default config file entries\nstd::map<std::string, std::string> userCfgMap; // user config file entries\n\n#pragma pack(push, 1)\nstruct MsString {\n\tunion {\n\t\tchar* string_ptr;\n\t\tchar string_buf[16];\n\t};\n\tuint64_t unk;\n\tuint64_t size;\n\n\tchar* GetCharBuf()\n\t{\n\t\tif (size > 0xf && string_ptr != nullptr)\n\t\t\treturn string_ptr;\n\t\telse\n\t\t\treturn string_buf;\n\t};\n};\n\nstruct FArchivedFile {\n\tuint8_t padding00[0x10];\n\tuint8_t notLoadedFlag;\n\tuint8_t padding11[0x07];\n\tMsString farcPath;\n\tMsString fileName;\n\tuint8_t padding58[0x38];\n\tuint64_t dataSize;\n\tchar* data;\n};\n#pragma pack(pop)\n\nvoid (__stdcall* loadFromFarcThunk)(FArchivedFile** file) = (void(__stdcall*)(FArchivedFile** file))0x1405e5991;\n\nstd::string gpuName;\n\nstd::vector<std::string> SplitString(const std::string& str, const std::string& delim)\n{\n\tstd::vector<std::string> tokens;\n\tsize_t prev = 0, pos = 0;\n\tdo\n\t{\n\t\tpos = str.find(delim, prev);\n\t\tif (pos == std::string::npos)\n\t\t\tpos = str.length();\n\n\t\tstd::string token = str.substr(prev, pos - prev);\n\n\t\tif (!token.empty())\n\t\t\ttokens.push_back(token);\n\n\t\tprev = pos + delim.length();\n\t} while (pos < str.length() && prev < str.length());\n\n\treturn tokens;\n}\n\nstd::string TrimString(const std::string& str, const std::string& whitespace)\n{\n\tconst size_t strBegin = str.find_first_not_of(whitespace);\n\n\tif (strBegin == std::string::npos)\n\t\treturn \"\";\n\n\tconst size_t strEnd = str.find_last_not_of(whitespace);\n\tconst size_t strRange = strEnd - strBegin + 1;\n\n\treturn str.substr(strBegin, strRange);\n}\n\nstd::string StringReplace(const std::string& str, const std::string& srch, const std::string& repl)\n{\n\tsize_t pos = 0;\n\tstd::string outstr = str;\n\n\twhile (true)\n\t{\n\t\tpos = outstr.find(srch, pos);\n\t\tif (pos == std::string::npos)\n\t\t\tbreak;\n\n\t\toutstr.replace(pos, srch.length(), repl);\n\t}\n\n\treturn outstr;\n}\n\n\nstd::wstring ExePath() {\n\tWCHAR buffer[MAX_PATH];\n\tGetModuleFileNameW(NULL, buffer, MAX_PATH);\n\treturn std::wstring(buffer);\n}\n\nstd::wstring DirPath() {\n\tstd::wstring exepath = ExePath();\n\tstd::wstring::size_type pos = exepath.find_last_of(L\"\\\\/\");\n\treturn exepath.substr(0, pos);\n}\n\nstd::wstring DATA_FILE_STRING = DirPath() + L\"\\\\plugins\\\\ShaderPatch.ini\";\nLPCWSTR DATA_FILE = DATA_FILE_STRING.c_str();\n\nstd::wstring CONFIG_FILE_STRING = DirPath() + L\"\\\\plugins\\\\ShaderPatchConfig.ini\";\nLPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();\n\n//bool hasConflicts()\n//{\n//\tprintf(\"[ShaderPatch] Checking for conflicts...\\n\");\n//\n//\tHMODULE* hModules = new HMODULE[USHRT_MAX];\n//\tHANDLE hProcess;\n//\tDWORD cbNeeded;\n//\n//\thProcess = GetCurrentProcess();\n//\n//\tif (EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {\n//\t\tfor (unsigned long long i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {\n//\t\t\tauto pNameFunc = (LPCWSTR(*)())GetProcAddress(hModules[i], \"GetPluginName\");\n//\t\t\tif (pNameFunc) {\n//\t\t\t\tLPCWSTR name = pNameFunc();\n//\t\t\t\tif (name && lstrcmpW(name, L\"DivaGL\") == 0)\n//\t\t\t\t{\n//\t\t\t\t\t// detected DivaGL\n//\t\t\t\t\tprintf(\"[ShaderPatch] Detected DivaGL! Quitting!\\n\");\n//#ifdef _DEBUG\n//\t\t\t\t\tMessageBoxExW(NULL, L\"Detected DivaGL! Quitting!\\n\", L\"ShaderPatch\", MB_OK, 0);\n//#endif\n//\t\t\t\t\tdelete[] hModules;\n//\t\t\t\t\treturn true;\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n//\t}\n//\n//\tprintf(\"[ShaderPatch] No conflicts found.\\n\");\n//\tdelete[] hModules;\n//\treturn false;\n//}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/CameraController.cpp",
    "content": "#include \"CameraController.h\"\n#include <algorithm>\n#include \"Input/InputState.h\"\n#include \"ComponentsManager.h\"\n#include \"../framework.h\"\n#include \"../Input/Mouse/Mouse.h\"\n#include \"../Input/Keyboard/Keyboard.h\"\n#include \"../Input/Bindings/KeyboardBinding.h\"\n\n#define  GLUT_CURSOR_RIGHT_ARROW\t0x0000\n#define  GLUT_CURSOR_NONE\t\t\t0x0065\n\nusing namespace TLAC::Input;\nusing namespace TLAC::Utilities;\n\nnamespace TLAC::Components\n{\n\tCameraController::CameraController()\n\t{\n\t}\n\n\tCameraController::~CameraController()\n\t{\n\t\tdelete ToggleBinding;\n\n\t\tdelete ForwardBinding;\n\t\tdelete BackwardBinding;\n\t\tdelete LeftBinding;\n\t\tdelete RightBinding;\n\n\t\tdelete UpBinding;\n\t\tdelete DownBinding;\n\t\tdelete ClockwiseBinding;\n\t\tdelete CounterClockwiseBinding;\n\t\tdelete ZoomInBinding;\n\t\tdelete ZoomOutBinding;\n\n\t\tdelete FastBinding;\n\t\tdelete SlowBinding;\n\t}\n\n\tconst char* CameraController::GetDisplayName()\n\t{\n\t\treturn \"camera_controller\";\n\t}\n\n\tvoid CameraController::Initialize(ComponentsManager* manager)\n\t{\n\t\tcomponentsManager = manager;\n\n\t\tprintf(\"[TLAC] CameraController::Initialize(): Initialized\\n\");\n\n\t\tfor (int i = 0; i < sizeof(cameraSetterAddresses) / sizeof(void*); i++)\n\t\t{\n\t\t\tDWORD oldProtect;\n\t\t\tVirtualProtect((void*)cameraSetterAddresses[i], sizeof(uint8_t), PAGE_EXECUTE_READWRITE, &oldProtect);\n\n\t\t\toriginalSetterBytes[i] = *(uint8_t*)cameraSetterAddresses[i];\n\t\t}\n\n\t\tToggleBinding = new Binding();\n\t\tToggleBinding->AddBinding(new KeyboardBinding(VK_F3, true));\n\n\t\tForwardBinding = new Binding();\n\t\tForwardBinding->AddBinding(new KeyboardBinding('W', true));\n\t\tBackwardBinding = new Binding();\n\t\tBackwardBinding->AddBinding(new KeyboardBinding('S', true));\n\t\tLeftBinding = new Binding();\n\t\tLeftBinding->AddBinding(new KeyboardBinding('A', true));\n\t\tRightBinding = new Binding();\n\t\tRightBinding->AddBinding(new KeyboardBinding('D', true));\n\n\t\tUpBinding = new Binding();\n\t\tUpBinding->AddBinding(new KeyboardBinding(VK_SPACE, true));\n\t\tDownBinding = new Binding();\n\t\tDownBinding->AddBinding(new KeyboardBinding(VK_CONTROL, true));\n\n\t\tClockwiseBinding = new Binding();\n\t\tClockwiseBinding->AddBinding(new KeyboardBinding('E', true));\n\t\tCounterClockwiseBinding = new Binding();\n\t\tCounterClockwiseBinding->AddBinding(new KeyboardBinding('Q', true));\n\n\t\tZoomInBinding = new Binding();\n\t\tZoomInBinding->AddBinding(new KeyboardBinding('R', true));\n\t\tZoomOutBinding = new Binding();\n\t\tZoomOutBinding->AddBinding(new KeyboardBinding('F', true));\n\n\t\tFastBinding = new Binding();\n\t\tFastBinding->AddBinding(new KeyboardBinding(VK_SHIFT, true));\n\t\tSlowBinding = new Binding();\n\t\tSlowBinding->AddBinding(new KeyboardBinding(VK_MENU, true));\n\n\t\tcamera = (Camera*)CAMERA_ADDRESS;\n\t}\n\n\tvoid CameraController::Update()\n\t{\n\t\treturn;\n\t}\n\n\tvoid CameraController::UpdateInput()\n\t{\n\t\tif (ToggleBinding->AnyTapped())\n\t\t{\n\t\t\tSetControls(!GetIsEnabled());\n\t\t\treturn;\n\t\t}\n\n\t\tif (!GetIsEnabled())\n\t\t\treturn;\n\n\t\tauto keyboard = Keyboard::GetInstance();\n\t\tauto mouse = Mouse::GetInstance();\n\n\t\tbool forward = ForwardBinding->AnyDown();\n\t\tbool backward = BackwardBinding->AnyDown();\n\t\tbool left = LeftBinding->AnyDown();\n\t\tbool right = RightBinding->AnyDown();\n\n\t\tbool up = UpBinding->AnyDown();\n\t\tbool down = DownBinding->AnyDown();\n\n\t\tbool fast = FastBinding->AnyDown();\n\t\tbool slow = SlowBinding->AnyDown();\n\n\t\tbool clockwise = ClockwiseBinding->AnyDown();\n\t\tbool counterclockwise = CounterClockwiseBinding->AnyDown();\n\n\t\tbool zoomin = ZoomInBinding->AnyDown();\n\t\tbool zoomout = ZoomOutBinding->AnyDown();\n\n\t\tfloat speed = GetElapsedTime() * (fast ? fastSpeed : slow ? slowSpeed : normalSpeed);\n\n\t\tif (forward ^ backward)\n\t\t\tcamera->Position += PointFromAngle(verticalRotation + (forward ? +0.0f : -180.0f), speed);\n\n\t\tif (left ^ right)\n\t\t\tcamera->Position += PointFromAngle(verticalRotation + (right ? +90.0f : -90.0f), speed);\n\n\t\tif (up ^ down)\n\t\t\tcamera->Position.Y += speed * (up ? +0.25f : -0.25f);\n\n\t\tif (clockwise ^ counterclockwise)\n\t\t\tcamera->Rotation += speed * (clockwise ? -1.0f : +1.0f);\n\n\t\tif (zoomin ^ zoomout)\n\t\t{\n\t\t\tcamera->HorizontalFov += speed * (zoomin ? -1.0f : +1.0f);\n\t\t\tcamera->HorizontalFov = std::clamp(camera->HorizontalFov, +1.0f, +170.0f);\n\t\t}\n\n\t\tif (mouse->HasMoved())\n\t\t{\n\t\t\tSetMouseWindowCenter();\n\n\t\t\tauto delta = mouse->GetDeltaPosition();\n\n\t\t\tverticalRotation += delta.x * sensitivity;\n\t\t\thorizontalRotation -= delta.y * (sensitivity / 5.0f);\n\n\t\t\thorizontalRotation = std::clamp(horizontalRotation, -75.0f, +75.0f);\n\t\t}\n\n\t\t((InputState*)*(uint64_t*)INPUT_STATE_PTR_ADDRESS)->HideCursor();\n\n\t\tVec2 focus = PointFromAngle(verticalRotation, 1.0f);\n\t\tcamera->Focus.X = camera->Position.X + focus.X;\n\t\tcamera->Focus.Z = camera->Position.Z + focus.Y;\n\n\t\tcamera->Focus.Y = camera->Position.Y + PointFromAngle(horizontalRotation, 5.0f).X;\n\t}\n\n\tvoid CameraController::SetControls(bool value)\n\t{\n\t\tif (GetIsEnabled() == value)\n\t\t\treturn;\n\n\t\tSetIsEnabled(value);\n\t\tcomponentsManager->SetUpdateGameInput(!value);\n\n\t\tprintf(\"[TLAC] CameraController::SetControls(): enabled = %s\\n\", GetIsEnabled() ? \"true\" : \"false\");\n\n\t\ttypedef void __stdcall _glutSetCursor(int);\n\t\tauto glutSetCursor = (_glutSetCursor*)GLUT_SET_CURSOR_ADDRESS;\n\n\t\t// hide cursor\n\t\tglutSetCursor(value ? GLUT_CURSOR_NONE : GLUT_CURSOR_RIGHT_ARROW);\n\n\t\tif (value)\n\t\t{\n\t\t\t// disable camera setters\n\t\t\tfor (int i = 0; i < sizeof(cameraSetterAddresses) / sizeof(void*); i++)\n\t\t\t\t*(uint8_t*)cameraSetterAddresses[i] = RET_OPCODE;\n\n\t\t\t// set initial camera angle\n\t\t\tVec2 camXz = Vec2(camera->Position.X, camera->Position.Z);\n\t\t\tVec2 focusXz = Vec2(camera->Focus.X, camera->Focus.Z);\n\t\t\tverticalRotation = AngleFromPoints(camXz, focusXz);\n\n\t\t\thorizontalRotation = 0;\n\t\t\tcamera->Rotation = defaultRotation;\n\t\t\tcamera->HorizontalFov = defaultFov;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// restore camera setters\n\t\t\tfor (int i = 0; i < sizeof(cameraSetterAddresses) / sizeof(void*); i++)\n\t\t\t\t*(uint8_t*)cameraSetterAddresses[i] = originalSetterBytes[i];\n\t\t}\n\t}\n\n\tvoid CameraController::SetMouseWindowCenter()\n\t{\n\t\tRECT windowRect = framework::GetWindowBounds();\n\n\t\tint centerX = windowRect.left + (windowRect.right - windowRect.left) / 2;\n\t\tint centerY = windowRect.top + (windowRect.bottom - windowRect.top) / 2;\n\n\t\tMouse::GetInstance()->SetPosition(centerX, centerY);\n\t}\n\n\tbool CameraController::GetIsEnabled()\n\t{\n\t\treturn isEnabled;\n\t}\n\n\tvoid CameraController::SetIsEnabled(bool value)\n\t{\n\t\tisEnabled = value;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/CameraController.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"../Constants.h\"\n#include \"../Input/Bindings/Binding.h\"\n#include \"../Utilities/Math.h\"\n\nnamespace TLAC::Components\n{\n\tstruct Camera\n\t{\n\t\tUtilities::Vec3 Position;\n\t\tUtilities::Vec3 Focus;\n\t\tfloat Rotation;\n\t\tfloat HorizontalFov;\n\t\tfloat VerticalFov;\n\t};\n\n\tclass CameraController : public EmulatorComponent\n\t{\n\tpublic:\n\t\tInput::Binding* ToggleBinding;\n\n\t\tInput::Binding* ForwardBinding;\n\t\tInput::Binding* BackwardBinding;\n\t\tInput::Binding* LeftBinding;\n\t\tInput::Binding* RightBinding;\n\n\t\tInput::Binding* UpBinding;\n\t\tInput::Binding* DownBinding;\n\t\tInput::Binding* FastBinding;\n\t\tInput::Binding* SlowBinding;\n\n\t\tInput::Binding* ClockwiseBinding;\n\t\tInput::Binding* CounterClockwiseBinding;\n\n\t\tInput::Binding* ZoomInBinding;\n\t\tInput::Binding* ZoomOutBinding;\n\n\t\tCameraController();\n\t\t~CameraController();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\t\tvoid SetControls(bool value);\n\n\t\tbool GetIsEnabled();\n\n\tprivate:\n\t\tconst float fastSpeed = 0.1f;\n\t\tconst float slowSpeed = 0.0005f;\n\t\tconst float normalSpeed = 0.005f;\n\n\t\tconst float defaultRotation = 0.0f;\n\t\tconst float defaultFov = 70.0f;\n\t\tconst float sensitivity = 0.25f;\n\n\t\tComponentsManager* componentsManager;\n\t\tfloat verticalRotation;\n\t\tfloat horizontalRotation;\n\n\t\tbool isEnabled;\n\t\tCamera* camera;\n\n\t\tuint8_t originalSetterBytes[4];\n\t\tvoid* cameraSetterAddresses[4] =\n\t\t{\n\t\t\t(void*)CAMERA_POS_SETTER_ADDRESS,\n\t\t\t(void*)CAMERA_INTR_SETTER_ADDRESS,\n\t\t\t(void*)CAMERA_ROT_SETTER_ADDRESS,\n\t\t\t(void*)CAMERA_PERS_SETTER_ADDRESS,\n\t\t};\n\n\t\tvoid SetMouseWindowCenter();\n\t\tvoid SetIsEnabled(bool value);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/ComponentsManager.cpp",
    "content": "#include \"ComponentsManager.h\"\n#include \"../FileSystem/ConfigFile.h\"\n#include \"../framework.h\"\n#include \"Input/InputEmulator.h\"\n#include \"Input/TouchSliderEmulator.h\"\n#include \"Input/TouchPanelEmulator.h\"\n#include \"PlayerDataManager.h\"\n#include \"FrameRateManager.h\"\n#include \"FastLoader.h\"\n#include \"CameraController.h\"\n#include \"DebugComponent.h\"\n#include \"ScaleComponent.h\"\n#include \"ScoreSaver.h\"\n#include \"Pause.h\"\n#include \"GameTargets/TargetInspector.h\"\n\nusing ConfigFile = TLAC::FileSystem::ConfigFile;\n\nnamespace TLAC::Components\n{\n\ttypedef void EngineUpdateInput(void*);\n\n\tComponentsManager::ComponentsManager()\n\t{\n\t}\n\n\tComponentsManager::~ComponentsManager()\n\t{\n\t}\n\n\tvoid ComponentsManager::ParseAddComponents()\n\t{\n\t\tEmulatorComponent* allComponents[]\n\t\t{\n\t\t\tnew TargetInspector(),\n\t\t\tnew InputEmulator(),\n\t\t\tnew TouchSliderEmulator(),\n\t\t\tnew TouchPanelEmulator(),\n\t\t\tnew Pause(), // ensure pause is always immediately after input emulators so it can swallow inputs\n\t\t\tnew PlayerDataManager(),\n\t\t\tnew FrameRateManager(),\n\t\t\tnew FastLoader(),\n\t\t\tnew ScaleComponent(),\n\t\t\tnew ScoreSaver(),\n\t\t\tnew CameraController(),\n\t\t\tnew DebugComponent(),\n\t\t};\n\n\t\tConfigFile componentsConfig(framework::GetModuleDirectory(), COMPONENTS_CONFIG_FILE_NAME);\n\t\tbool success = componentsConfig.OpenRead();\n\n\t\tif (!success)\n\t\t{\n\t\t\tprintf(\"ComponentsManager::ParseAddComponents(): Unable to parse %s\\n\", COMPONENTS_CONFIG_FILE_NAME.c_str());\n\t\t\treturn;\n\t\t}\n\n\t\tsize_t componentCount = sizeof(allComponents) / sizeof(EmulatorComponent*);\n\t\tcomponents.reserve(componentCount);\n\n\t\tstd::string trueString = \"true\", falseString = \"false\";\n\n\t\tfor (int i = 0; i < componentCount; i++)\n\t\t{\n\t\t\tstd::string* value;\n\n\t\t\tauto name = allComponents[i]->GetDisplayName();\n\t\t\t//printf(\"ComponentsManager::ParseAddComponents(): searching name: %s\\n\", name);\n\n\t\t\tif (componentsConfig.TryGetValue(name, &value))\n\t\t\t{\n\t\t\t\t//printf(\"ComponentsManager::ParseAddComponents(): %s found\\n\", name);\n\n\t\t\t\tif (*value == trueString)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"ComponentsManager::ParseAddComponents(): enabling %s...\\n\", name);\n\t\t\t\t\tcomponents.push_back(allComponents[i]);\n\t\t\t\t}\n\t\t\t\telse if (*value == falseString)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"ComponentsManager::ParseAddComponents(): disabling %s...\\n\", name);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//printf(\"ComponentsManager::ParseAddComponents(): invalid value %s for component %s\\n\", value, name);\n\t\t\t\t}\n\n\t\t\t\tdelete value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//printf(\"ParseAddComponents(): component %s not found\\n\", name);\n\t\t\t\tdelete allComponents[i];\n\t\t\t}\n\t\t}\n\t}\n\n\n\tvoid ComponentsManager::Initialize()\n\t{\n\t\tdwGuiDisplay = (DwGuiDisplay*) * (uint64_t*)DW_GUI_DISPLAY_INSTANCE_PTR_ADDRESS;\n\n\t\tParseAddComponents();\n\t\tupdateStopwatch.Start();\n\n\t\tfor (auto& component : components)\n\t\t\tcomponent->Initialize(this);\n\t}\n\n\tvoid ComponentsManager::Update()\n\t{\n\t\telpasedTime = updateStopwatch.Restart();\n\n\t\tfor (auto& component : components)\n\t\t{\n\t\t\tcomponent->SetElapsedTime(elpasedTime);\n\t\t\tcomponent->Update();\n\t\t}\n\t}\n\n\tvoid ComponentsManager::UpdateInput()\n\t{\n\t\tif (!GetIsInputEmulatorUsed())\n\t\t{\n\t\t\tuint64_t* inputStatePtr = (uint64_t*)INPUT_STATE_PTR_ADDRESS;\n\n\t\t\t// poll input using the original PollInput function we overwrote with the update hook instead\n\t\t\tif (inputStatePtr != nullptr)\n\t\t\t\t((EngineUpdateInput*)ENGINE_UPDATE_INPUT_ADDRESS)((void*)* inputStatePtr);\n\t\t}\n\n\t\tfor (auto& component : components)\n\t\t\tcomponent->UpdateInput();\n\t}\n\n\tvoid ComponentsManager::UpdatePostInput()\n\t{\n\t\tfor (auto& component : components)\n\t\t{\n\t\t\tcomponent->UpdatePostInput();\n\t\t}\n\t}\n\n\tvoid ComponentsManager::UpdateDraw2D()\n\t{\n\t\tfor (auto& component : components)\n\t\t{\n\t\t\tcomponent->UpdateDraw2D();\n\t\t}\n\t}\n\n\tvoid ComponentsManager::OnFocusGain()\n\t{\n\t\tfor (auto& component : components)\n\t\t\tcomponent->OnFocusGain();\n\t}\n\n\tvoid ComponentsManager::OnFocusLost()\n\t{\n\t\tfor (auto& component : components)\n\t\t\tcomponent->OnFocusLost();\n\t}\n\n\tvoid ComponentsManager::Dispose()\n\t{\n\t\tfor (auto& component : components)\n\t\t\tdelete component;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/ComponentsManager.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"../Utilities/Stopwatch.h\"\n#include <vector>\n#include <string>\n\nnamespace TLAC::Components\n{\n\tconst std::string COMPONENTS_CONFIG_FILE_NAME = \"components.ini\";\n\n\t// Incomplete type\n\tstruct DwGuiDisplay\n\t{\n\t\tvoid* vftable;\n\t\tvoid* active;\n\t\tvoid* cap;\n\t\tvoid* on;\n\t\tvoid* move;\n\t\tvoid* widget;\n\t};\n\n\tclass ComponentsManager\n\t{\n\tpublic:\n\t\tComponentsManager();\n\t\t~ComponentsManager();\n\t\tvoid Initialize();\n\t\tvoid Update();\n\t\tvoid UpdateInput();\n\t\tvoid UpdatePostInput();\n\t\tvoid UpdateDraw2D();\n\t\tvoid OnFocusGain();\n\t\tvoid OnFocusLost();\n\t\tvoid Dispose();\n\n\t\tinline bool GetIsInputEmulatorUsed() { return isInputEmulatorUsed; };\n\t\tinline void SetIsInputEmulatorUsed(bool value) { isInputEmulatorUsed = value; };\n\n\t\tinline bool GetUpdateGameInput() { return updateGameInput; };\n\t\tinline void SetUpdateGameInput(bool value) { updateGameInput = value; }\n\n\t\tinline bool IsDwGuiActive() { return dwGuiDisplay->active != nullptr; };\n\t\tinline bool IsDwGuiHovered() { return dwGuiDisplay->on != nullptr; };\n\n\tprivate:\n\t\tDwGuiDisplay* dwGuiDisplay;\n\n\t\tbool isInputEmulatorUsed = false;\n\t\tbool updateGameInput = true;\n\n\t\tfloat elpasedTime;\n\t\tUtilities::Stopwatch updateStopwatch;\n\t\tstd::vector<EmulatorComponent*> components;\n\n\t\tvoid ParseAddComponents();\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/CustomPlayerData.h",
    "content": "#pragma once\n#include <string>\n#include <vector>\n\nnamespace TLAC::Components\n{\n\tstruct CustomPlayerData\n\t{\n\t\tstd::string *PlayerName;\n\t\tstd::string* LevelName;\n\t\tint VocaloidPoints;\n\t\tint LevelNum;\n\t\tint LevelPlateId;\n\t\tint LevelPlateEffect;\n\t\tint SkinEquip;\n\t\tint BtnSeEquip;\n\t\tint SlideSeEquip;\n\t\tint ChainslideSeEquip;\n\t\tint SlidertouchSeEquip;\n\t\tint ModuleEquip0;\n\t\tint ModuleEquip1;\n\t\tint ModuleEquip2;\n\t\tint ModuleEquip3;\n\t\tint ModuleEquip4;\n\t\tint ModuleEquip5;\n\t\tint ModuleEquipCmn0;\n\t\tint ModuleEquipCmn1;\n\t\tint ModuleEquipCmn2;\n\t\tint ModuleEquipCmn3;\n\t\tint ModuleEquipCmn4;\n\t\tint ModuleEquipCmn5;\n\t\tint ActionVol;\n\t\tint ActionSlideVol;\n\t\tint UsePVEquip;\n\t\tint UsePVSFXEquip;\n\t\tint UsePVSkinEquip;\n\t\tbool ShowGreatClearBorder;\n\t\tbool ShowExcellentClearBorder;\n\t\tbool ShowRivalClearBorder;\n\t\tbool UseCard;\n\t\tbool GameModifierOptions;\n\t\tbool ActionSE;\n\t\tstd::vector<int> Mylist[3];\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/DebugComponent.cpp",
    "content": "#include \"DebugComponent.h\"\n#include \"../Constants.h\"\n\nnamespace TLAC::Components\n{\n\tconst char* GameStateNames[] =\n\t{\n\t\t\"STARTUP\",\n\t\t\"ADVERTISE\",\n\t\t\"GAME\",\n\t\t\"DATA_TEST\",\n\t\t\"TEST_MODE\",\n\t\t\"APP_ERROR\",\n\t\t\"MAX\",\n\t};\n\n\tconst char* SubGameStateNames[] =\n\t{\n\t\t\"DATA_INITIALIZE\",\n\t\t\"SYSTEM_STARTUP\",\n\t\t\"SYSTEM_STARTUP_ERROR\",\n\t\t\"WARNING\",\n\t\t\"LOGO\",\n\t\t\"RATING\",\n\t\t\"DEMO\",\n\t\t\"TITLE\",\n\t\t\"RANKING\",\n\t\t\"SCORE_RANKING\",\n\t\t\"CM\",\n\t\t\"PHOTO_MODE_DEMO\",\n\t\t\"SELECTOR\",\n\t\t\"GAME_MAIN\",\n\t\t\"GAME_SEL\",\n\t\t\"STAGE_RESULT\",\n\t\t\"SCREEN_SHOT_SEL\",\n\t\t\"SCREEN_SHOT_RESULT\",\n\t\t\"GAME_OVER\",\n\t\t\"DATA_TEST_MAIN\",\n\t\t\"DATA_TEST_MISC\",\n\t\t\"DATA_TEST_OBJ\",\n\t\t\"DATA_TEST_STG\",\n\t\t\"DATA_TEST_MOT\",\n\t\t\"DATA_TEST_COLLISION\",\n\t\t\"DATA_TEST_SPR\",\n\t\t\"DATA_TEST_AET\",\n\t\t\"DATA_TEST_AUTH_3D\",\n\t\t\"DATA_TEST_CHR\",\n\t\t\"DATA_TEST_ITEM\",\n\t\t\"DATA_TEST_PERF\",\n\t\t\"DATA_TEST_PVSCRIPT\",\n\t\t\"DATA_TEST_PRINT\",\n\t\t\"DATA_TEST_CARD\",\n\t\t\"DATA_TEST_OPD\",\n\t\t\"DATA_TEST_SLIDER\",\n\t\t\"DATA_TEST_GLITTER\",\n\t\t\"DATA_TEST_GRAPHICS\",\n\t\t\"DATA_TEST_COLLECTION_CARD\",\n\t\t\"TEST_MODE_MAIN\",\n\t\t\"APP_ERROR\",\n\t\t\"MAX\",\n\t};\n\n\tconst char* DataTestNames[] =\n\t{\n\t\t\"MAIN TEST\",\n\t\t\"MISC TEST\",\n\t\t\"OBJECT TEST\",\n\t\t\"STAGE TEST\",\n\t\t\"MOTION TEST\",\n\t\t\"COLLISION TEST\",\n\t\t\"SPRITE TEST\",\n\t\t\"2DAUTH TEST\",\n\t\t\"3DAUTH TEST\",\n\t\t\"CHARA TEST\",\n\t\t\"ITEM TEST\",\n\t\t\"PERFORMANCE TEST\",\n\t\t\"PVSCRIPT TEST\",\n\t\t\"PRINT TEST\",\n\t\t\"CARD TEST\",\n\t\t\"OPD TEST\",\n\t\t\"SLIDER TEST\",\n\t\t\"GLITTER TEST\",\n\t\t\"GRAPHICS TEST\",\n\t\t\"COLLECTION CARD TEST\",\n\t};\n\n\ttypedef void ChangeGameState(GameState);\n\tChangeGameState* changeGameState = (ChangeGameState*)CHANGE_MODE_ADDRESS;\n\n\ttypedef void ChangeSubState(GameState, SubGameState);\n\tChangeSubState* changeSubState = (ChangeSubState*)CHANGE_SUB_MODE_ADDRESS;\n\n\tDebugComponent::DebugComponent()\n\t{\n\t}\n\n\tDebugComponent::~DebugComponent()\n\t{\n\t}\n\n\tconst char* DebugComponent::GetDisplayName()\n\t{\n\t\treturn \"debug_component\";\n\t}\n\n\tvoid DebugComponent::Initialize(ComponentsManager*)\n\t{\n\t\tprintf(\"[TLAC] DebugComponent::Initialize(): Initialized\\n\");\n\n\t\tInjectPatches();\n\n\t\tHWND consoleHandle = GetConsoleWindow();\n\t\tShowWindow(consoleHandle, SW_SHOW);\n\n\t\t// In case the FrameRateManager isn't enabled\n\t\tDWORD oldProtect;\n\t\tVirtualProtect((void*)AET_FRAME_DURATION_ADDRESS, sizeof(float), PAGE_EXECUTE_READWRITE, &oldProtect);\n\t}\n\n\tvoid DebugComponent::Update()\n\t{\n\t\tif (dataTestMain)\n\t\t{\n\t\t\tInput::Keyboard::GetInstance()->PollInput();\n\t\t\tUpdateDataTestMain();\n\t\t}\n\t}\n\n\tvoid DebugComponent::UpdateInput()\n\t{\n\t\tauto keyboard = Input::Keyboard::GetInstance();\n\n\t\t// fast forward menus\n\t\tif (keyboard->IsDown(VK_SHIFT))\n\t\t{\n\t\t\tfloat* frameDuration = (float*)AET_FRAME_DURATION_ADDRESS;\n\n\t\t\tif (keyboard->IsDown(VK_TAB))\n\t\t\t\t*frameDuration = 1.0f / (GetGameFrameRate() / aetSpeedUpFactor);\n\t\t\telse if (keyboard->IsReleased(VK_TAB))\n\t\t\t\t*frameDuration = 1.0f / 60.0f;\n\t\t}\n\n\t\tfor (size_t i = 0; i < _countof(gameStateKeyMappings); i++)\n\t\t{\n\t\t\tif (keyboard->IsTapped(gameStateKeyMappings[i].KeyCode))\n\t\t\t\tInternalChangeGameState(gameStateKeyMappings[i].State);\n\t\t}\n\t}\n\n\tvoid DebugComponent::InjectPatches()\n\t{\n\t\tconst struct { void* Address; std::initializer_list<uint8_t> Data; } patches[] =\n\t\t{\n\t\t\t// Prevent the DATA_TEST game state from exiting on the first frame\n\t\t\t{ (void*)0x0000000140284B01, { 0x00 } },\n\t\t\t// Enable dw_gui sprite draw calls\n\t\t\t{ (void*)0x0000000140192601, { 0x00 } },\n\t\t\t// Update the dw_gui display\n\t\t\t{ (void*)0x0000000140302600, { 0xB0, 0x01 } },\n\t\t\t// Draw the dw_gui display\n\t\t\t{ (void*)0x0000000140302610, { 0xB0, 0x01 } },\n\t\t\t// Enable the dw_gui widgets\n\t\t\t{ (void*)0x0000000140192D00, { 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3 } },\n\t\t};\n\n\t\tfor (size_t i = 0; i < _countof(patches); i++)\n\t\t\tInjectCode(patches[i].Address, patches[i].Data);\n\t}\n\n\tvoid DebugComponent::SetConsoleForeground()\n\t{\n\t\tHWND consoleHandle = GetConsoleWindow();\n\t\tShowWindow(consoleHandle, SW_SHOW);\n\t\t\n\t\tif (consoleHandle == NULL)\n\t\t\treturn;\n\n\t\tWINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) };\n\t\tGetWindowPlacement(consoleHandle, &place);\n\n\t\tswitch (place.showCmd)\n\t\t{\n\t\tcase SW_SHOWMAXIMIZED:\n\t\t\tShowWindow(consoleHandle, SW_SHOWMAXIMIZED);\n\t\t\tbreak;\n\t\tcase SW_SHOWMINIMIZED:\n\t\t\tShowWindow(consoleHandle, SW_RESTORE);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tShowWindow(consoleHandle, SW_NORMAL);\n\t\t\tbreak;\n\t\t}\n\n\t\tSetWindowPos(0, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);\n\t\tSetForegroundWindow(consoleHandle);\n\t}\n\n\tvoid DebugComponent::PrintDataTestMain()\n\t{\n\t\tsystem(\"cls\");\n\t\tprintf(\" DATA TEST MAIN:\\n\\n\");\n\n\t\tfor (int i = SUB_DATA_TEST_MISC; i <= SUB_DATA_TEST_COLLECTION_CARD; i++)\n\t\t\tprintf(\"%s  %s\\n\", i == selectionIndex ? \"->\" : \"  \", DataTestNames[i - SUB_DATA_TEST_MAIN]);\n\n\t\tprintf(\"\\n\");\n\t\tSetConsoleForeground();\n\t}\n\n\tvoid DebugComponent::InternalChangeGameState(GameState state)\n\t{\n\t\tchangeGameState(state);\n\t\tprintDataTestMain = dataTestMain = (state == GS_DATA_TEST);\n\t}\n\n\tvoid DebugComponent::UpdateDataTestMain()\n\t{\n\t\tauto keyboard = Input::Keyboard::GetInstance();\n\n\t\tif (keyboard->IsIntervalTapped(VK_UP))\n\t\t{\n\t\t\tselectionIndex--;\n\t\t\tprintDataTestMain = true;\n\t\t}\n\n\t\tif (keyboard->IsIntervalTapped(VK_DOWN))\n\t\t{\n\t\t\tselectionIndex++;\n\t\t\tprintDataTestMain = true;\n\t\t}\n\n\t\tif (selectionIndex > SUB_DATA_TEST_COLLECTION_CARD)\n\t\t\tselectionIndex = SUB_DATA_TEST_MISC;\n\n\t\tif (selectionIndex < SUB_DATA_TEST_MISC)\n\t\t\tselectionIndex = SUB_DATA_TEST_COLLECTION_CARD;\n\n\t\tif (keyboard->IsTapped(VK_RETURN))\n\t\t{\n\t\t\tdataTestMain = false;\n\n\t\t\tprintf(\"[%s] -> [%s]\\n\", SubGameStateNames[SUB_DATA_TEST_MAIN], SubGameStateNames[selectionIndex]);\n\t\t\tchangeSubState(GS_DATA_TEST, (SubGameState)selectionIndex);\n\t\t}\n\n\t\tif (printDataTestMain)\n\t\t{\n\t\t\tPrintDataTestMain();\n\t\t\tprintDataTestMain = false;\n\t\t}\n\t}\n\n\tvoid DebugComponent::InjectCode(void* address, const std::initializer_list<uint8_t> &data)\n\t{\n\t\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\t\tDWORD oldProtect;\n\t\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\n\t\tmemcpy(address, data.begin(), byteCount);\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/DebugComponent.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"GameState.h\"\n#include \"../Input/Keyboard/Keyboard.h\"\n\nnamespace TLAC::Components\n{\n\tclass DebugComponent : public EmulatorComponent\n\t{\n\tpublic:\n\t\tDebugComponent();\n\t\t~DebugComponent();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\tprivate:\n\t\tconst float aetSpeedUpFactor = 4.0f;\n\t\t\n\t\tbool dataTestMain = false;\n\t\tbool printDataTestMain = false;\n\t\tint selectionIndex = SUB_DATA_TEST_MISC;\n\n\t\tconst struct { BYTE KeyCode; GameState State; } gameStateKeyMappings[5] =\n\t\t{\n\t\t\t{ VK_F4, GS_ADVERTISE },\n\t\t\t{ VK_F5, GS_GAME },\n\t\t\t{ VK_F6, GS_DATA_TEST },\n\t\t\t{ VK_F7, GS_TEST_MODE },\n\t\t\t{ VK_F8, GS_APP_ERROR },\n\t\t};\n\n\t\tvoid InjectPatches();\n\t\tvoid SetConsoleForeground();\n\t\tvoid PrintDataTestMain();\n\t\tvoid InternalChangeGameState(GameState state);\n\t\tvoid UpdateDataTestMain();\n\t\tvoid InjectCode(void* address, const std::initializer_list<uint8_t> &data);\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/EmulatorComponent.cpp",
    "content": "#include \"EmulatorComponent.h\"\n#include \"../Constants.h\"\n\nnamespace TLAC::Components\n{\n\tEmulatorComponent::EmulatorComponent()\n\t{\n\t}\n\n\tEmulatorComponent::~EmulatorComponent()\n\t{\n\t}\n\n\tvoid EmulatorComponent::SetElapsedTime(float value)\n\t{\n\t\telapsedTime = value;\n\t}\n\n\tfloat EmulatorComponent::GetElapsedTime()\n\t{\n\t\treturn elapsedTime == 0.0f ? (1000.0f / 60.0f) : elapsedTime;\n\t}\n\n\tfloat EmulatorComponent::GetFrameRate()\n\t{\n\t\treturn 1000.0f / GetElapsedTime();\n\t}\n\n\tfloat EmulatorComponent::GetGameFrameRate()\n\t{\n\t\treturn *(float*)FRAME_RATE_ADDRESS;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/EmulatorComponent.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tclass ComponentsManager;\n\n\tclass EmulatorComponent\n\t{\n\tpublic:\n\t\tEmulatorComponent();\n\t\t~EmulatorComponent();\n\n\t\tvirtual const char* GetDisplayName() = 0;\n\t\t\n\t\tvirtual void Initialize(ComponentsManager*) = 0;\n\t\tvirtual void Update() = 0;\n\n\t\tvirtual void UpdateInput() {};\n\t\tvirtual void UpdatePostInput() {};\n\t\tvirtual void UpdateDraw2D() {};\n\t\tvirtual void OnFocusGain() {};\n\t\tvirtual void OnFocusLost() {};\n\t\t\n\t\tvoid SetElapsedTime(float value);\n\t\tfloat GetElapsedTime();\n\t\tfloat GetFrameRate();\n\t\tfloat GetGameFrameRate();\n\n\tprivate:\n\t\tfloat elapsedTime;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/FastLoader.cpp",
    "content": "#include \"FastLoader.h\"\n#include \"../FileSystem/ConfigFile.h\"\n#include \"../Constants.h\"\n#include <stdio.h>\n#include \"../framework.h\"\n\nnamespace TLAC::Components\n{\n\tFastLoader::FastLoader()\n\t{\n\t}\n\n\tFastLoader::~FastLoader()\n\t{\n\t}\n\n\tconst char* FastLoader::GetDisplayName()\n\t{\n\t\treturn \"fast_loader\";\n\t}\n\n\tvoid FastLoader::Initialize(ComponentsManager*)\n\t{\n\t\tTLAC::FileSystem::ConfigFile componentsConfig(TLAC::framework::GetModuleDirectory(), COMPONENTS_CONFIG_FILE_NAME);\n\t\tbool success = componentsConfig.OpenRead();\n\t\tif (success)\n\t\t{\n\t\t\tint speed = componentsConfig.GetIntegerValue(\"fast_loader_speed\");\n\t\t\tif (speed >= 2 && speed <= 1024) updatesPerFrame = speed;\n\t\t}\n\t\tprintf(\"[Fast Loader] Speed: %d\\n\", updatesPerFrame);\n\t}\n\n\tvoid FastLoader::Update()\n\t{\n\t\tif (dataInitialized)\n\t\t\treturn;\n\n\t\tpreviousGameState = currentGameState;\n\t\tcurrentGameState = *(GameState*)CURRENT_GAME_STATE_ADDRESS;\n\n\t\tif (currentGameState == GS_STARTUP)\n\t\t{\n\t\t\ttypedef void UpdateTask();\n\t\t\tUpdateTask* updateTask = (UpdateTask*)UPDATE_TASKS_ADDRESS;\n\n\t\t\t// speed up TaskSystemStartup\n\t\t\tfor (int i = 0; i < updatesPerFrame; i++)\n\t\t\t\tupdateTask();\n\n\t\t\tconstexpr int DATA_INITIALIZED = 3;\n\n\t\t\t// skip TaskDataInit\n\t\t\t*(int*)(DATA_INIT_STATE_ADDRESS) = DATA_INITIALIZED;\n\n\t\t\t// skip TaskWarning\n\t\t\t*(int*)(SYSTEM_WARNING_ELAPSED_ADDRESS) = 3939;\n\t\t}\n\t\telse if (previousGameState == GS_STARTUP)\n\t\t{\n\t\t\tdataInitialized = true;\n\t\t\tprintf(\"[TLAC] FastLoader::Update(): Data Initialized\\n\");\n\t\t}\n\t}\n\n\tvoid FastLoader::UpdateInput()\n\t{\n\t\treturn;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/FastLoader.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"GameState.h\"\n#include <string>\n\nnamespace TLAC::Components\n{\n\tclass FastLoader : public EmulatorComponent\n\t{\n\tpublic:\n\t\tFastLoader();\n\t\t~FastLoader();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\tprivate:\n\t\tconst std::string COMPONENTS_CONFIG_FILE_NAME = \"components.ini\";\n\t\tint updatesPerFrame = 39;\n\t\t\n\t\tGameState currentGameState;\n\t\tGameState previousGameState;\n\t\tbool dataInitialized = false;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/FrameRateManager.cpp",
    "content": "﻿#include \"FrameRateManager.h\"\n#include \"../Constants.h\"\n#include \"GameState.h\"\n#include <stdio.h>\n#include <windows.h>\n#include \"../framework.h\"\n#include <vector>\n#include \"detours.h\"\n\nnamespace TLAC::Components\n{\n\tFrameRateManager::FrameRateManager()\n\t{\n\t\tstd::string utf8path = TLAC::framework::GetModuleDirectory() + \"/config.ini\";\n\t\tWCHAR utf16buf[256];\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, utf16buf, 256);\n\n\t\tfloat nMotionRate = GetPrivateProfileIntW(L\"graphics\", L\"frm.motion.rate\", 300, utf16buf);\n\t\tmotionSpeedMultiplier = nMotionRate / 60.0f;\n\t}\n\n\tFrameRateManager::~FrameRateManager()\n\t{\n\t}\n\n\tconst char* FrameRateManager::GetDisplayName()\n\t{\n\t\treturn \"frame_rate_manager\";\n\t}\n\n\n\tfloat FrameRateManager::fspeed_error = 0; // compensation value for use in this frame\n\tfloat FrameRateManager::fspeed_error_next = 0; // save a compensation value to be used in the next frame\n\n\tfloat FrameRateManager::fspeedhook_lastresult = 0; // used by the ageage hair patch to be lazy and avoid setting up for a proper call\n\n\tfloat(*divaGetFrameSpeed)() = (float(*)())0x140192D50;\n\n\t// a version of the original function that tries to round the output to more closely match chara motion timings\n\tfloat hookedGetFrameSpeed()\n\t{\n\t\tfloat frameSpeed = divaGetFrameSpeed();\n\n\t\t// below is somewhat based (in concept) on 140194ad0 (motion quantisation thingy func)\n\n\t\t// add the error compensation from last frame\n\t\tframeSpeed += FrameRateManager::fspeed_error;\n\n\t\t// separate whole and fractional parts of speed\n\t\t// float speed_rounded = floorf(frameSpeed);\n\t\t// float speed_remainder = frameSpeed - speed_rounded;\n\t\tfloat speed_rounded;\n\t\tfloat speed_remainder = modff(frameSpeed, &speed_rounded);\n\n\t\t// save the remainder as error compensation for next frame\n\t\t// use == 0 to detect new frame and vars must be written\n\t\tif (FrameRateManager::fspeed_error_next == 0)\n\t\t{\n\t\t\tFrameRateManager::fspeed_error_next = speed_remainder;\n\t\t\tFrameRateManager::fspeedhook_lastresult = speed_rounded;\n\t\t}\n\n\t\treturn speed_rounded;\n\t}\n\n\tvoid FrameRateManager::Initialize(ComponentsManager*)\n\t{\n\t\tpvFrameRate = (float*)PV_FRAME_RATE_ADDRESS;\n\t\tframeSpeed = (float*)FRAME_SPEED_ADDRESS;\n\t\taetFrameDuration = (float*)AET_FRAME_DURATION_ADDRESS;\n\n\t\t// The default is expected to be 1.0 / 60.0\n\t\tdefaultAetFrameDuration = *aetFrameDuration;\n\n\t\t// This const variable is stored inside a data segment so we don't want to throw any access violations\n\t\tDWORD oldProtect;\n\t\tVirtualProtect((void*)AET_FRAME_DURATION_ADDRESS, sizeof(float), PAGE_EXECUTE_READWRITE, &oldProtect);\n\n\n\t\t// fix auto speed for high fps\n\t\tInjectCode((void*)0x140192d7b, { 0x90, 0x90, 0x90 });\n\n\t\t// fix frame speed slider initial value (should ignore effect of auto speed)\n\t\tInjectCode((void*)0x140338f2f, { 0xf3, 0x0f, 0x10, 0x0d, 0x61, 0x18, 0xba, 0x00 }); // MOVSS XMM1, dword ptr [0x140eda798] (raw framespeed)\n\t\tInjectCode((void*)0x140338f37, { 0x48, 0x8b, 0x8f, 0x80, 0x01, 0x00, 0x00 });       // MOV RCX, qword ptr [0x180 + RDI]\n\n\t\tInjectCode((void*)0x140338ebe, { 0xf3, 0x0f, 0x10, 0x0d, 0xd2, 0x18, 0xba, 0x00 }); // MOVSS XMM1, dword ptr [0x140eda798] (raw framespeed)\n\t\tInjectCode((void*)0x140338ec6, { 0x48, 0x8b, 0x05, 0xfb, 0xb1, 0xe5, 0x00 });       // MOV RAX, qword ptr [0x1411940c8]\n\t\tInjectCode((void*)0x140338ecd, { 0x48, 0x8b, 0x88, 0x80, 0x01, 0x00, 0x00 });       // MOV RCX, qword ptr [0x180 + RAX]\n\n\n\t\t// fix AETs\n\t\tInjectCode((void*)0x140170394, { 0xF3, 0x0F, 0x5E, 0x05, 0x34, 0xA3, 0xD6, 0x00 }); // DIVSS XMM0, dword ptr [0x140eda6d0] (framerate)\n\n\t\t// fix edit PV AETs (thanks lyb)\n\t\tInjectCode((void*)0x140192d30, { 0xF3, 0x0F, 0x10, 0x05, 0x5C, 0x02, 0x00, 0x00 }); // MOVSS XMM0, dword ptr [0x140192f94]\n\n\t\t// fix ageage hair effect\n\t\tInjectCode((void*)0x14054352f, {                                  // MOV R9, &fspeedhook_lastresult\n\t\t\t0x49,\n\t\t\t0xB9,\n\t\t\t(uint8_t)((uint64_t)&fspeedhook_lastresult & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 8) & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 16) & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 24) & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 32) & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 40) & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 48) & 0xFF),\n\t\t\t(uint8_t)(((uint64_t)&fspeedhook_lastresult >> 56) & 0xFF),\n\t\t});\n\t\tInjectCode((void*)0x140543539, { 0xF3, 0x41, 0x0F, 0x59, 0x19 }); // MULSS XMM3, dword ptr [R9]\n\t\tInjectCode((void*)0x14054353e, { 0xEB, 0xB0 });                   // JMP 0x1405434f0\n\n\t\t// fix wind effect\n\t\tInjectCode((void*)0x14053ca71, { 0xEB, 0x3F });                                     // JMP 0x14053cab2\n\t\tInjectCode((void*)0x14053cab2, { 0xF3, 0x0F, 0x10, 0x05, 0xFA, 0x53, 0x46, 0x00 }); // MOVSS XMM0, dword ptr [0x1409a1eb4] (60.0f)\n\t\tInjectCode((void*)0x14053caba, { 0xE9, 0x42, 0xFE, 0xFF, 0xFF });                   // JMP 0x14053c901\n\t\tInjectCode((void*)0x14053c901, { 0xF3, 0x0F, 0x5E, 0x05, 0xC7, 0xDD, 0x99, 0x00 }); // DIVSS XMM0, dword ptr [0x140eda6d0] (framerate)\n\t\tInjectCode((void*)0x14053c909, { 0xE9, 0x68, 0x01, 0x00, 0x00 });                   // JMP 0x14053ca76\n\n\n\t\t// replace divaGetFrameSpeed with a version that rounds the output to fix issues\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaGetFrameSpeed, hookedGetFrameSpeed);\n\t\tDetourTransactionCommit();\n\t}\n\n\tvoid FrameRateManager::Update()\n\t{\n\t\t// *aetFrameDuration = 1.0f / GetGameFrameRate();\n\n\t\tif (*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME)\n\t\t{\n\t\t\t*pvFrameRate = 60.0f * motionSpeedMultiplier;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*pvFrameRate = 60.0f;\n\t\t}\n\n\t\tif (*(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN || *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_DEMO)\n\t\t{\n\t\t\t// enable dynamic framerate\n\t\t\t*(bool*)USE_AUTO_FRAMESPEED_ADDRESS = true;\n\n\t\t\t// target framerate\n\t\t\t*(float*)AUTO_FRAMESPEED_TARGET_FRAMERATE_ADDRESS = *pvFrameRate;\n\n\t\t\t// trying to fix meltdown's water\n\t\t\t//if ((uint64_t*)0x1411943f8 != nullptr)\n\t\t\t\t//*(float*)(*(uint64_t*)0x1411943f8 + 0x1c) = (60.0f / GetGameFrameRate()) / 15.0f;\n\t\t\t\t//*(float*)(*(uint64_t*)0x1411943f8 + 0x10) = *(float*)(*(uint64_t*)0x1411943f8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// enable dynamic framerate\n\t\t\t*(bool*)USE_AUTO_FRAMESPEED_ADDRESS = true;\n\n\t\t\t// target framerate\n\t\t\t*(float*)AUTO_FRAMESPEED_TARGET_FRAMERATE_ADDRESS = 60.0f;\n\t\t}\n\t}\n\n\tvoid FrameRateManager::UpdateDraw2D()\n\t{\n\t\t// cycle the framespeed timing error once per frame\n\t\tfspeed_error = fspeed_error_next;\n\t\tfspeed_error_next = 0;\n\t}\n\n\tvoid FrameRateManager::InjectCode(void* address, const std::vector<uint8_t> data)\n\t{\n\t\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\t\tDWORD oldProtect;\n\t\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\tmemcpy(address, data.data(), byteCount);\n\t\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/FrameRateManager.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include <vector>\n\nnamespace TLAC::Components\n{\n\tclass FrameRateManager : public EmulatorComponent\n\t{\n\tpublic:\n\t\tFrameRateManager();\n\t\t~FrameRateManager();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateDraw2D() override;\n\n\t\tstatic float fspeed_error; // compensation value for use in this frame\n\t\tstatic float fspeed_error_next; // save a compensation value to be used in the next frame\n\n\t\tstatic float fspeedhook_lastresult; // used by the ageage hair patch to be lazy and avoid setting up for a proper call\n\n\tprivate:\n\t\tfloat *pvFrameRate;\n\t\tfloat *frameSpeed;\n\t\tfloat *aetFrameDuration;\n\t\tfloat defaultAetFrameDuration;\n\t\tfloat motionSpeedMultiplier = 5.0;\n\t\tvoid InjectCode(void* address, const std::vector<uint8_t> data);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameState.h",
    "content": "#pragma once\n#include <stdint.h>\n\nnamespace TLAC::Components\n{\n\tenum GameState : uint32_t\n\t{\n\t\tGS_STARTUP,\n\t\tGS_ADVERTISE,\n\t\tGS_GAME,\n\t\tGS_DATA_TEST,\n\t\tGS_TEST_MODE,\n\t\tGS_APP_ERROR,\n\t\tGS_MAX,\n\t};\n\n\tenum SubGameState : uint32_t\n\t{\n\t\tSUB_DATA_INITIALIZE,\n\t\tSUB_SYSTEM_STARTUP,\n\t\tSUB_SYSTEM_STARTUP_ERROR,\n\t\tSUB_WARNING,\n\t\tSUB_LOGO,\n\t\tSUB_RATING,\n\t\tSUB_DEMO,\n\t\tSUB_TITLE,\n\t\tSUB_RANKING,\n\t\tSUB_SCORE_RANKING,\n\t\tSUB_CM,\n\t\tSUB_PHOTO_MODE_DEMO,\n\t\tSUB_SELECTOR,\n\t\tSUB_GAME_MAIN,\n\t\tSUB_GAME_SEL,\n\t\tSUB_STAGE_RESULT,\n\t\tSUB_SCREEN_SHOT_SEL,\n\t\tSUB_SCREEN_SHOT_RESULT,\n\t\tSUB_GAME_OVER,\n\t\tSUB_DATA_TEST_MAIN,\n\t\tSUB_DATA_TEST_MISC,\n\t\tSUB_DATA_TEST_OBJ,\n\t\tSUB_DATA_TEST_STG,\n\t\tSUB_DATA_TEST_MOT,\n\t\tSUB_DATA_TEST_COLLISION,\n\t\tSUB_DATA_TEST_SPR,\n\t\tSUB_DATA_TEST_AET,\n\t\tSUB_DATA_TEST_AUTH_3D,\n\t\tSUB_DATA_TEST_CHR,\n\t\tSUB_DATA_TEST_ITEM,\n\t\tSUB_DATA_TEST_PERF,\n\t\tSUB_DATA_TEST_PVSCRIPT,\n\t\tSUB_DATA_TEST_PRINT,\n\t\tSUB_DATA_TEST_CARD,\n\t\tSUB_DATA_TEST_OPD,\n\t\tSUB_DATA_TEST_SLIDER,\n\t\tSUB_DATA_TEST_GLITTER,\n\t\tSUB_DATA_TEST_GRAPHICS,\n\t\tSUB_DATA_TEST_COLLECTION_CARD,\n\t\tSUB_TEST_MODE_MAIN,\n\t\tSUB_APP_ERROR,\n\t\tSUB_MAX,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameTargets/HoldState.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tenum HoldState\n\t{\n\t\tHOLD_NONE,\n\t\tHOLD_SANKAKU = 64,\n\t\tHOLD_MARU = 128,\n\t\tHOLD_BATSU = 256,\n\t\tHOLD_SHIKAKU = 512,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameTargets/TargetHitStates.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tenum TargetHitStates : int32_t\n\t{\n\t\tCOOL,\n\t\tFINE,\n\t\tSAFE,\n\t\tSAD,\n\t\tCOOL_WRONG, // unsure\n\t\tFINE_WRONG, // unsure\n\t\tSAFE_WRONG, // unsure\n\t\tSAD_WRONG, // unsure\n\t\tWORST,\n\t\tNONE = 21,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameTargets/TargetInspector.cpp",
    "content": "#include \"TargetInspector.h\"\n\nnamespace TLAC::Components\n{\n\tbool TargetInspector::repressTbl[maxTargetSlots];\n\tbool TargetInspector::ShouldVibrate;\n\n\tTargetInspector::TargetInspector()\n\t{\n\t}\n\n\tTargetInspector::~TargetInspector()\n\t{\n\t}\n\n\tvoid TargetInspector::Initialize(ComponentsManager*)\n\t{\n\t\ttgtStates = (TargetState*)TGT_STATES_BASE_ADDRESS;\n\t}\n\n\tvoid TargetInspector::Update()\n\t{\n\t\tUpdateRepressTbl();\n\t\tUpdateShouldVibrate();\n\t}\n\n\tconst char* TargetInspector::GetDisplayName()\n\t{\n\t\treturn \"target_inspector\";\n\t}\n\n\tvoid TargetInspector::UpdateRepressTbl()\n\t{\n\t\tfor (int i = 0; i < maxTargetSlots; ++i)\n\t\t{\n\t\t\trepressTbl[i] = IsWithinRange(tgtStates[i].tgtRemainingTime)\n\t\t\t\t&& HasNotBeenHit(tgtStates[i].tgtHitState)\n\t\t\t\t&& !IsSlide(tgtStates[i].tgtType);\n\t\t}\n\t}\n\n\tvoid TargetInspector::UpdateShouldVibrate()\n\t{\n\t\tfor (int i = 0; i < maxTargetSlots; ++i)\n\t\t{\n\t\t\tif (IsWithinRange(tgtStates[i].tgtRemainingTime)\n\t\t\t\t&& (tgtStates[i].tgtType == SLIDE_LONG_L || tgtStates[i].tgtType == SLIDE_LONG_R)\n\t\t\t\t&& tgtStates[i].tgtHitState == NONE)\n\t\t\t\t{\n\t\t\t\t\t//printf(\"%d\\n\", tgtStates[i].tgtHitState);\n\t\t\t\t\tShouldVibrate = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t}\n\t\tShouldVibrate = false;\n\t}\n\n\tbool TargetInspector::IsWithinRange(float time)\n\t{\n\t\treturn time < timingThreshold && time > -timingThreshold && time != 0;\n\t}\n\n\tbool TargetInspector::HasNotBeenHit(int hitState)\n\t{\n\t\treturn hitState == NONE;\n\t}\n\n\tbool TargetInspector::IsSlide(int type)\n\t{\n\t\treturn (type >= SLIDE_L && type <= SLIDE_LONG_R) || type >= SLIDE_L_CH;\n\t}\n\n\tbool TargetInspector::IsAnyRepress()\n\t{\n\t\tfor (int i = 0; i < maxTargetSlots; ++i)\n\t\t{\n\t\t\tif (repressTbl[i])\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameTargets/TargetInspector.h",
    "content": "#pragma once\n#include \"../EmulatorComponent.h\"\n#include \"../Input/InputEmulator.h\"\n#include \"../../Constants.h\"\n#include \"TargetHitStates.h\"\n#include \"TargetState.h\"\n\nnamespace TLAC::Components\n{\n\tconst int maxTargetSlots = 64;\n\n\tclass TargetInspector : public EmulatorComponent\n\t{\n\tpublic:\n\t\tTargetInspector();\n\t\t~TargetInspector();\n\n\t\tstatic bool repressTbl[maxTargetSlots];\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tstatic bool IsAnyRepress();\n\n\t\tstatic bool ShouldVibrate;\n\n\tprivate:\n\t\t//const uint64_t offset = 0x4A8;\n\t\tconst float timingThreshold = 0.13f; // PS4 estimate\n\n\t\tTargetState* tgtStates;\n\n\t\tbool IsSlide(int);\n\t\tbool IsWithinRange(float);\n\t\tbool HasNotBeenHit(int);\n\t\tvoid UpdateRepressTbl();\n\t\tvoid UpdateShouldVibrate();\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameTargets/TargetState.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tstruct TargetState\n\t{\n\t\t// seems to be some kind of linked list..\n\t\t// not sure if these are for all active targets or just used in some functions\n\t\tTargetState* prev;\n\t\tTargetState* next;\n\t\tbyte padding10[0x4];\n\t\tTargetTypes tgtType;\n\t\tfloat tgtRemainingTime;\n\t\tbyte padding1C[0x434];\n\t\tbyte ToBeRemoved; // FromList\n\t\tbyte padding451[0xB];\n\t\tTargetHitStates tgtHitState;\n\t\tbyte padding460[0x48];\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/GameTargets/TargetTypes.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tenum TargetTypes : int32_t\n\t{\n\t\tSANKAKU,\n\t\tMARU,\n\t\tBATSU,\n\t\tSHIKAKU,\n\t\tSANKAKU_H,\n\t\tMARU_H,\n\t\tBATSU_H,\n\t\tSHIKAKU_H,\n\t\tSLIDE_L = 12,\n\t\tSLIDE_R,\n\t\tSLIDE_LONG_L = 15,\n\t\tSLIDE_LONG_R,\n\t\tSANKAKU_CH = 18,\n\t\tMARU_CH,\n\t\tBATSU_CH,\n\t\tSHIKAKU_CH,\n\t\tSLIDE_L_CH = 23,\n\t\tSLIDE_R_CH,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/InputBufferType.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tenum InputBufferType\n\t{\n\t\tInputBufferType_Tapped,\n\t\tInputBufferType_Released,\n\t\tInputBufferType_Down,\n\t\tInputBufferType_DoubleTapped,\n\t\tInputBufferType_IntervalTapped,\n\t\tInputBufferType_Max,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/InputEmulator.cpp",
    "content": "#include <iostream>\n#include \"windows.h\"\n#include \"InputEmulator.h\"\n#include \"../ComponentsManager.h\"\n#include \"../../Constants.h\"\n#include \"../../framework.h\"\n#include \"../../Input/Bindings/KeyboardBinding.h\"\n#include \"../../Input/Bindings/XinputBinding.h\"\n#include \"../../Input/Bindings/MouseBinding.h\"\n#include \"../../Input/Bindings/Ds4Binding.h\"\n#include \"../../Input/Bindings/DVLBinding.h\"\n#include \"../../Input/KeyConfig/Config.h\"\n#include \"../../Utilities/Operations.h\"\n#include \"../../Utilities/EnumBitwiseOperations.h\"\n#include \"../../FileSystem/ConfigFile.h\"\n#include \"../GameState.h\"\n#include \"../Pause.h\"\n#include \"../../Utils.h\"\n\nconst std::string KEY_CONFIG_FILE_NAME = \"keyconfig.ini\";\n\nusing namespace TLAC::Input;\nusing namespace TLAC::Input::KeyConfig;\nusing namespace TLAC::Utilities;\n\nnamespace TLAC::Components\n{\n\n\tInputEmulator::InputEmulator()\n\t{\n\n\t}\n\n\tInputEmulator::~InputEmulator()\n\t{\n\t\tdelete TestBinding;\n\t\tdelete ServiceBinding;\n\n\t\tdelete StartBinding;\n\t\tdelete SankakuBinding;\n\t\tdelete ShikakuBinding;\n\t\tdelete BatsuBinding;\n\t\tdelete MaruBinding;\n\n\t\tdelete LeftBinding;\n\t\tdelete RightBinding;\n\n\t\tdelete MenuLBinding;\n\t\tdelete MenuRBinding;\n\t\tdelete MenuCircleBinding;\n\t}\n\n\tconst char* InputEmulator::GetDisplayName()\n\t{\n\t\treturn \"input_emulator\";\n\t}\n\n\tvoid InputEmulator::Initialize(ComponentsManager* manager)\n\t{\n\t\tcomponentsManager = manager;\n\t\tcomponentsManager->SetIsInputEmulatorUsed(true);\n\n\t\tinputState = GetInputStatePtr((void*)INPUT_STATE_PTR_ADDRESS);\n\t\tinputState->HideCursor();\n\n\t\tTestBinding = new Binding();\n\t\tServiceBinding = new Binding();\n\t\tSw1Binding = new Binding();\n\t\tSw2Binding = new Binding();\n\t\tStartBinding = new Binding();\n\n\t\tSankakuBinding = new Binding();\n\t\tShikakuBinding = new Binding();\n\t\tBatsuBinding = new Binding();\n\t\tMaruBinding = new Binding();\n\n\t\tLeftBinding = new Binding();\n\t\tRightBinding = new Binding();\n\n\t\tMenuLBinding = new Binding();\n\t\tMenuRBinding = new Binding();\n\n\t\tMenuCircleBinding = new Binding();\n\n\t\tCoinBinding = new Binding();\n\t\tToonBinding = new Binding();\n\t\tWireframeBinding = new Binding();\n\n\t\tFileSystem::ConfigFile configFile(framework::GetModuleDirectory(), KEY_CONFIG_FILE_NAME);\n\t\tconfigFile.OpenRead();\n\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_TEST\", *TestBinding, { \"F1\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_SERVICE\", *ServiceBinding, { \"F2\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_SW1\", *Sw1Binding, { \"F11\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_SW2\", *Sw2Binding, { \"F12\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_START\", *StartBinding, { \"Enter\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_TRIANGLE\", *SankakuBinding, { \"W\", \"I\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_SQUARE\", *ShikakuBinding, { \"A\", \"J\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_CROSS\", *BatsuBinding, { \"S\", \"K\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_CIRCLE\", *MaruBinding, { \"D\", \"L\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_LEFT\", *LeftBinding, { \"Q\", \"U\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"JVS_RIGHT\", *RightBinding, { \"E\", \"O\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"MENU_L\", *MenuLBinding, { \"Left\", \"Up\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"MENU_R\", *MenuRBinding, { \"Down\", \"Right\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"MENU_CIRCLE\", *MenuCircleBinding, { \"D\", \"L\", \"Spacebar\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"TOON\", *ToonBinding, { \"F9\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"COIN\", *CoinBinding, { \"F10\" });\n\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"WIREFRAME\", *WireframeBinding, { \"Backspace\" });\n\n\t\tmouseScrollPvSelection = configFile.GetBooleanValue(\"mouse_scroll_pv_selection\");\n\n\t\tTestBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_L3));\n\t\tServiceBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_L2));\n\t\tCoinBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_L1));\n\t\tStartBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_FN));\n\t\tSankakuBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_TRIANGLE));\n\t\tShikakuBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_SQUARE));\n\t\tBatsuBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_CROSS));\n\t\tMaruBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_CIRCLE));\n\t}\n\n\tvoid InputEmulator::Update()\n\t{\n\t\treturn;\n\t}\n\n\tvoid InputEmulator::OnFocusLost()\n\t{\n\t\t// to prevent buttons from being \"stuck\"\n\t\tinputState->ClearState();\n\t\tinputState->HideCursor();\n\t}\n\n\tvoid InputEmulator::UpdateInput()\n\t{\n\t\tif (!componentsManager->GetUpdateGameInput())\n\t\t\treturn;\n\n\t\tif (!componentsManager->IsDwGuiActive())\n\t\t{\n\t\t\tUpdateJvsInput();\n\n\t\t\tif (mouseScrollPvSelection && !componentsManager->IsDwGuiHovered())\n\t\t\t\tUpdateMousePvScroll();\n\t\t}\n\n\t\tUpdateDwGuiInput();\n\t}\n\n\tvoid InputEmulator::UpdateJvsInput()\n\t{\n\t\tauto tappedFunc = [](void* binding) { return ((Binding*)binding)->AnyTapped(); };\n\t\tauto releasedFunc = [](void* binding) { return ((Binding*)binding)->AnyReleased(); };\n\t\tauto downFunc = [](void* binding) { return ((Binding*)binding)->AnyDown(); };\n\n\t\tlastDownState = inputState->Down.Buttons;\n\n\t\tinputState->Tapped.Buttons = GetJvsButtonsState(tappedFunc);\n\t\tinputState->Released.Buttons = GetJvsButtonsState(releasedFunc);\n\t\tinputState->Down.Buttons = GetJvsButtonsState(downFunc);\n\t\tinputState->DoubleTapped.Buttons = GetJvsButtonsState(tappedFunc);\n\t\tinputState->IntervalTapped.Buttons = GetJvsButtonsState(tappedFunc);\n\n\t\t// if not interacting with L and R, use values from the slider instead\n\t\tif ( ( (inputState->Tapped.Buttons | inputState->Released.Buttons | inputState->Down.Buttons)\n\t\t\t & (JVS_L | JVS_R) ) == 0)\n\t\t{\n\t\t\tUpdateSliderLR();\n\t\t}\n\n\t\tSetMetaButtons();\n\n\t\tUpdateHoldState();\n\t\theldButtons = GetButtonFromHold();\n\n\t\tif ((lastDownState &= inputState->Tapped.Buttons) != 0)\n\t\t{\n\t\t\tinputState->Down.Buttons ^= inputState->Tapped.Buttons;\n\t\t\tif (IsHold() && !TargetInspector::IsAnyRepress())\n\t\t\t\tinputState->Down.Buttons |= heldButtons;\n\t\t}\n\n\t\t// repress held down buttons to not block input\n\t\t//inputState->Down.Buttons ^= inputState->Tapped.Buttons;\n\n\t\tif (CoinBinding->AnyTapped())\n\t\t\taddCoin();\n\n\t\tif (ToonBinding->AnyTapped())\n\t\t\ttoggleNpr1();\n\n\t\tif (WireframeBinding->AnyTapped())\n\t\t\ttoggleWireframe();\n\t}\n\n\tHoldState InputEmulator::GetHoldState()\n\t{\n\t\treturn (HoldState) * ((int*)HOLD_STATE_ADDRESS);\n\t}\n\n\tint InputEmulator::GetMaxHoldState()\n\t{\n\t\treturn *(int*)MAX_HOLD_STATE_ADDRESS;\n\t}\n\n\tbool InputEmulator::IsHold()\n\t{\n\t\treturn ((holdState != HOLD_NONE) && (GetMaxHoldState() != 1));\n\t}\n\n\tvoid InputEmulator::UpdateHoldState()\n\t{\n\t\tholdState = GetHoldState();\n\n\t\tfor (int i = 0; i < 4; ++i)\n\t\t{\n\t\t\tint holdId = 1 << (i + 6);\n\n\t\t\tif ((holdId & holdState) != 0)\n\t\t\t\tholdTbl[i] = 1;\n\t\t\telse\n\t\t\t\tholdTbl[i] = 0;\n\t\t}\n\t}\n\n\tvoid InputEmulator::UpdateDwGuiInput()\n\t{\n\t\tauto keyboard = Keyboard::GetInstance();\n\t\tauto mouse = Mouse::GetInstance();\n\n\t\tauto pos = mouse->GetRelativePosition();\n\t\tinputState->MouseX = (int)pos.x;\n\t\tinputState->MouseY = (int)pos.y;\n\n\t\tauto deltaPos = mouse->GetDeltaPosition();\n\t\tinputState->MouseDeltaX = (int)deltaPos.x;\n\t\tinputState->MouseDeltaY = (int)deltaPos.y;\n\n\t\tinputState->Key = GetKeyState();\n\n\t\tfor (int i = 0; i < sizeof(keyBits) / sizeof(KeyBit); i++)\n\t\t\tUpdateInputBit(keyBits[i].Bit, keyBits[i].KeyCode);\n\n\t\tfor (int i = InputBufferType_Tapped; i < InputBufferType_Max; i++)\n\t\t{\n\t\t\tinputState->SetBit(scrollUpBit, mouse->GetIsScrolledUp(), (InputBufferType)i);\n\t\t\tinputState->SetBit(scrollDownBit, mouse->GetIsScrolledDown(), (InputBufferType)i);\n\t\t}\n\t}\n\n\tvoid InputEmulator::UpdateMousePvScroll()\n\t{\n\t\t// I originally wanted to use a MouseBinding set to JVS_LEFT / JVS_RIGHT\n\t\t// but that ended up being too slow because a PV slot can only be scrolled to once the scroll animation has finished playing\n\t\tint* slotsToScroll = (int*)PV_SEL_SLOTS_TO_SCROLL;\n\t\tint* modulesToScroll = (int*)MODULE_SEL_SLOTS_TO_SCROLL;\n\n\t\tauto mouse = Mouse::GetInstance();\n\t\tif (mouse->GetIsScrolledUp())\n\t\t{\n\t\t\tif (*(int*)PV_SEL_SLOTS_CONST < 26) *slotsToScroll -= 1;\n\t\t\tif (*(int*)MODULE_IS_RECOMMENDED == 0) *modulesToScroll -= 1;\n\t\t}\n\t\tif (mouse->GetIsScrolledDown())\n\t\t{\n\t\t\tif (*(int*)PV_SEL_SLOTS_CONST < 26) *slotsToScroll += 1;\n\t\t\tif (*(int*)MODULE_IS_RECOMMENDED == 0) *modulesToScroll += 1;\n\t\t}\n\t}\n\n\tInputState* InputEmulator::GetInputStatePtr(void* address)\n\t{\n\t\treturn (InputState*)(*(uint64_t*)address);\n\t}\n\n\tJvsButtons InputEmulator::GetJvsButtonsState(bool(*buttonTestFunc)(void*))\n\t{\n\t\tJvsButtons buttons = JVS_NONE;\n\n\t\tif ((Pause::pause || !(*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN)) &&\n\t\t\tbuttonTestFunc(MenuLBinding))\n\t\t{\n\t\t\tbuttons |= JVS_L;\n\t\t\treturn buttons;\n\t\t}\n\t\tif ((Pause::pause || !(*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN)) &&\n\t\t\tbuttonTestFunc(MenuRBinding))\n\t\t{\n\t\t\tbuttons |= JVS_R;\n\t\t\treturn buttons;\n\t\t}\n\t\tif ((Pause::pause || !(*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN)) &&\n\t\t\tbuttonTestFunc(MenuCircleBinding))\n\t\t{\n\t\t\tbuttons |= JVS_CIRCLE;\n\t\t\treturn buttons;\n\t\t}\n\n\t\tif (buttonTestFunc(TestBinding))\n\t\t\tbuttons |= JVS_TEST;\n\t\tif (buttonTestFunc(ServiceBinding))\n\t\t\tbuttons |= JVS_SERVICE;\n\t\tif (buttonTestFunc(Sw1Binding))\n\t\t\tbuttons |= JVS_SW1;\n\t\tif (buttonTestFunc(Sw2Binding))\n\t\t\tbuttons |= JVS_SW2;\n\n\t\tif (buttonTestFunc(StartBinding))\n\t\t\tbuttons |= JVS_START;\n\n\t\tif (buttonTestFunc(SankakuBinding))\n\t\t\tbuttons |= JVS_TRIANGLE;\n\t\tif (buttonTestFunc(ShikakuBinding))\n\t\t\tbuttons |= JVS_SQUARE;\n\t\tif (buttonTestFunc(BatsuBinding))\n\t\t\tbuttons |= JVS_CROSS;\n\t\tif (buttonTestFunc(MaruBinding))\n\t\t\tbuttons |= JVS_CIRCLE;\n\n\t\tif (buttonTestFunc(LeftBinding))\n\t\t\tbuttons |= JVS_L;\n\t\tif (buttonTestFunc(RightBinding))\n\t\t\tbuttons |= JVS_R;\n\n\t\treturn buttons;\n\t}\n\n\tJvsButtons InputEmulator::GetButtonFromHold()\n\t{\n\t\tJvsButtons buttons = JVS_NONE;\n\n\t\tif (holdTbl[0])\n\t\t\tbuttons |= JVS_TRIANGLE;\n\t\tif (holdTbl[1])\n\t\t\tbuttons |= JVS_CIRCLE;\n\t\tif (holdTbl[2])\n\t\t\tbuttons |= JVS_CROSS;\n\t\tif (holdTbl[3])\n\t\t\tbuttons |= JVS_SQUARE;\n\n\t\treturn buttons;\n\t}\n\n\tchar InputEmulator::GetKeyState()\n\t{\n\t\tauto keyboard = Keyboard::GetInstance();\n\n\t\tbool upper = keyboard->IsDown(VK_SHIFT);\n\t\tconstexpr char caseDifference = 'A' - 'a';\n\n\t\tchar inputKey = 0x00;\n\n\t\tfor (char key = '0'; key < 'Z'; key++)\n\t\t{\n\t\t\tif (keyboard->IsIntervalTapped(key))\n\t\t\t\tinputKey = (upper || key < 'A') ? key : (key - caseDifference);\n\t\t}\n\n\t\tif (keyboard->IsIntervalTapped(VK_BACK))\n\t\t\tinputKey = 0x08;\n\n\t\tif (keyboard->IsIntervalTapped(VK_TAB))\n\t\t\tinputKey = 0x09;\n\n\t\tif (keyboard->IsIntervalTapped(VK_SPACE))\n\t\t\tinputKey = 0x20;\n\n\t\tif (keyboard->IsDoubleTapped(VK_ESCAPE))\n\t\t\t*(bool*)SHOULD_EXIT_BOOL_ADDRESS = true;\n\n\t\treturn inputKey;\n\t}\n\n\tvoid InputEmulator::UpdateInputBit(uint32_t bit, uint8_t keycode)\n\t{\n\t\tauto keyboard = Keyboard::GetInstance();\n\n\t\tinputState->SetBit(bit, keyboard->IsTapped(keycode), InputBufferType_Tapped);\n\t\tinputState->SetBit(bit, keyboard->IsReleased(keycode), InputBufferType_Released);\n\t\tinputState->SetBit(bit, keyboard->IsDown(keycode), InputBufferType_Down);\n\t\tinputState->SetBit(bit, keyboard->IsDoubleTapped(keycode), InputBufferType_DoubleTapped);\n\t\tinputState->SetBit(bit, keyboard->IsIntervalTapped(keycode), InputBufferType_IntervalTapped);\n\n\t}\n\n\ttypedef uint8_t getSliderSensorFunc(void*, int);\n\tvoid InputEmulator::UpdateSliderLR()\n\t{\n\t\tgetSliderSensorFunc* getSliderSensorTapped = (getSliderSensorFunc*)GET_SLIDER_TAPPED_ADDRESS;\n\t\tgetSliderSensorFunc* getSliderSensorReleased = (getSliderSensorFunc*)GET_SLIDER_RELEASED_ADDRESS;\n\t\tgetSliderSensorFunc* getSliderSensorDown = (getSliderSensorFunc*)GET_SLIDER_DOWN_ADDRESS;\n\n\t\tif (getSliderSensorTapped((void*)SLIDER_CTRL_TASK_ADDRESS, 36))\n\t\t\tinputState->Tapped.Buttons |= JVS_L;\n\t\telse\n\t\t\tinputState->Tapped.Buttons &= ~JVS_L;\n\n\t\tif (getSliderSensorReleased((void*)SLIDER_CTRL_TASK_ADDRESS, 36))\n\t\t\tinputState->Released.Buttons |= JVS_L;\n\t\telse\n\t\t\tinputState->Released.Buttons &= ~JVS_L;\n\t\t\n\t\tif (getSliderSensorDown((void*)SLIDER_CTRL_TASK_ADDRESS, 36))\n\t\t\tinputState->Down.Buttons |= JVS_L;\n\t\telse\n\t\t\tinputState->Down.Buttons &= ~JVS_L;\n\n\n\t\tif (getSliderSensorTapped((void*)SLIDER_CTRL_TASK_ADDRESS, 37))\n\t\t\tinputState->Tapped.Buttons |= JVS_R;\n\t\telse\n\t\t\tinputState->Tapped.Buttons &= ~JVS_R;\n\n\t\tif (getSliderSensorReleased((void*)SLIDER_CTRL_TASK_ADDRESS, 37))\n\t\t\tinputState->Released.Buttons |= JVS_R;\n\t\telse\n\t\t\tinputState->Released.Buttons &= ~JVS_R;\n\n\t\tif (getSliderSensorDown((void*)SLIDER_CTRL_TASK_ADDRESS, 37))\n\t\t\tinputState->Down.Buttons |= JVS_R;\n\t\telse\n\t\t\tinputState->Down.Buttons &= ~JVS_R;\n\t}\n\n\tvoid InputEmulator::SetMetaButtons()\n\t{\n\t\t// bit 0x6e is used to skip a bunch of screens\n\t\tif ((inputState->Down.Buttons & (JVS_L | JVS_R)) == 0) // ask sega, okay? idk why this is needed\n\t\t{\n\t\t\tif ((inputState->Tapped.Buttons & (JVS_START | JVS_TRIANGLE | JVS_SQUARE | JVS_CROSS | JVS_CIRCLE)) != 0)\n\t\t\t\tinputState->SetBit(0x6e, true, InputBufferType_Tapped);\n\t\t\telse\n\t\t\t\tinputState->SetBit(0x6e, false, InputBufferType_Tapped);\n\n\t\t\tif ((inputState->Down.Buttons & (JVS_START | JVS_TRIANGLE | JVS_SQUARE | JVS_CROSS | JVS_CIRCLE)) != 0)\n\t\t\t\tinputState->SetBit(0x6e, true, InputBufferType_Down);\n\t\t\telse\n\t\t\t\tinputState->SetBit(0x6e, false, InputBufferType_Down);\n\n\t\t\tif ((inputState->Released.Buttons & (JVS_START | JVS_TRIANGLE | JVS_SQUARE | JVS_CROSS | JVS_CIRCLE)) != 0)\n\t\t\t\tinputState->SetBit(0x6e, true, InputBufferType_Released);\n\t\t\telse\n\t\t\t\tinputState->SetBit(0x6e, false, InputBufferType_Released);\n\t\t}\n\t}\n\n\tvoid InputEmulator::addCoin()\n\t{\n\t\tprintf(\"[TLAC] Adding coin\\n\");\n\t\tunsigned char* credits = (unsigned char*)0x14CD93788;\n\t\tif (*credits < 9)\n\t\t{\n\t\t\t*(unsigned char*)0x14CD93A9C = 1;\n\t\t\t(*credits)++;\n\t\t\t(*(unsigned char*)0x14CD93A98)++;\n\t\t\tif ((*(unsigned char*)0x14CD93A98) == 0) (*(unsigned char*)0x14CD93A98)++;\n\t\t}\n\t}\n\n\tvoid InputEmulator::toggleNpr1()\n\t{\n\t\tswitch(*(byte*)0x0000000140502FC6)\n\t\t{\n\t\tcase 0xC3: // default -> force on\n\t\t\tInjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });\n\t\t\tInjectCode((void*)0x0000000140502FC6, { 0x01, 0x00, 0x00, 0x00, 0xC3 });\n\t\t\t*(byte*)0x00000001411AD638 = 1;\n\n\t\t\tprintf(\"[TLAC] NPR1 forced\\n\");\n\t\t\tbreak;\n\t\tcase 0x01: // default -> force off\n\t\t\tInjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });\n\t\t\tInjectCode((void*)0x0000000140502FC6, { 0x00, 0x00, 0x00, 0x00, 0xC3 });\n\t\t\t*(byte*)0x00000001411AD638 = 0;\n\n\t\t\tprintf(\"[TLAC] NPR1 disabled\\n\");\n\t\t\tbreak;\n\t\tdefault: // force off -> default\n\t\t\tInjectCode((void*)0x0000000140502FC0, { 0x89, 0x0D, 0x72 });\n\t\t\tInjectCode((void*)0x0000000140502FC6, { 0xC3, 0xCC, 0xCC, 0xCC, 0xCC });\n\n\t\t\tprintf(\"[TLAC] NPR1 restored\\n\");\n\t\t}\n\t}\n\n\tvoid InputEmulator::toggleWireframe()\n\t{\n\t\tstatic bool wireframeEnabled = false;\n\n\t\tif (!wireframeEnabled)\n\t\t{\n\t\t\t// inject samyuu's wireframe code\n\t\t\tInjectCode((void*)0x00000000140500BE6, { 0xBA, 0x01, 0x1B, 0x00, 0x00,\t// mov edx,00001B01\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0xB9, 0x08, 0x04, 0x00, 0x00,\t// mov ecx,00000408\n\t\t\t\t\t\t\t\t\t\t\t\t\t 0xE8, 0xE1, 0x5A, 0x3B, 0x00,\t// call 1408B66D6\n\t\t\t0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\n\n\t\t\twireframeEnabled = true;\n\t\t\tprintf(\"[TLAC] Wireframe enabled\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tInjectCode((void*)0x00000000140500BE6, { 0xB9, 0x1C, 0x00, 0x00, 0x00, 0xE8, 0x30, 0x7C, 0xF3, 0xFF, 0xB9, 0x1B, 0x00, 0x00, 0x00, 0x8B, 0xD8, 0xE8, 0x24, 0x7C, 0xF3, 0xFF, 0xB9, 0x1A, 0x00, 0x00, 0x00 });\n\n\t\t\twireframeEnabled = false;\n\t\t\tprintf(\"[TLAC] Wireframe disabled\\n\");\n\t\t}\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/InputEmulator.h",
    "content": "#pragma once\n#include <functional>\n#include <Windows.h>\n#include \"InputState.h\"\n#include \"../EmulatorComponent.h\"\n#include \"../../Input/Bindings/Binding.h\"\n#include \"../GameTargets/TargetTypes.h\"\n#include \"../GameTargets/TargetHitStates.h\"\n#include \"../GameTargets/HoldState.h\"\n#include \"../GameTargets/TargetInspector.h\"\n\nnamespace TLAC::Components\n{\n\tstruct KeyBit\n\t{\n\t\tuint32_t Bit;\n\t\tuint8_t KeyCode;\n\t};\n\n\tclass InputEmulator : public EmulatorComponent\n\t{\n\tpublic:\n\t\tInput::Binding* TestBinding;\n\t\tInput::Binding* ServiceBinding;\n\t\tInput::Binding* Sw1Binding;\n\t\tInput::Binding* Sw2Binding;\n\n\t\tInput::Binding* StartBinding;\n\t\tInput::Binding* SankakuBinding;\n\t\tInput::Binding* ShikakuBinding;\n\t\tInput::Binding* BatsuBinding;\n\t\tInput::Binding* MaruBinding;\n\n\t\tInput::Binding* LeftBinding;\n\t\tInput::Binding* RightBinding;\n\n\t\tInput::Binding* MenuLBinding;\n\t\tInput::Binding* MenuRBinding;\n\t\tInput::Binding* MenuCircleBinding;\n\n\t\tInput::Binding* CoinBinding;\n\t\tInput::Binding* ToonBinding;\n\t\tInput::Binding* WireframeBinding;\n\n\t\tInputEmulator();\n\t\t~InputEmulator();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\t\tvirtual void OnFocusLost() override;\n\n\tprivate:\n\t\tComponentsManager* componentsManager;\n\n\t\tbool mouseScrollPvSelection = false;\n\t\tconst uint32_t scrollUpBit = 99;\n\t\tconst uint32_t scrollDownBit = 100;\n\n\t\tKeyBit keyBits[20] =\n\t\t{\n\t\t\t{ 5, VK_LEFT },\n\t\t\t{ 6, VK_RIGHT },\n\n\t\t\t{ 29, VK_SPACE },\n\t\t\t{ 39, 'A' },\n\t\t\t{ 43, 'E' },\n\t\t\t{ 42, 'D' },\n\t\t\t{ 55, 'Q' },\n\t\t\t{ 57, 'S' }, // unsure\n\t\t\t{ 61, 'W' },\n\t\t\t{ 63, 'Y' },\n\t\t\t{ 84, 'L' }, // unsure\n\n\t\t\t{ 80, VK_RETURN },\n\t\t\t{ 81, VK_SHIFT },\n\t\t\t{ 82, VK_CONTROL },\n\t\t\t{ 83, VK_MENU },\n\n\t\t\t{ 91, VK_UP },\n\t\t\t{ 93, VK_DOWN },\n\n\t\t\t{ 96, MK_LBUTTON },\n\t\t\t{ 97, VK_MBUTTON },\n\t\t\t{ 98, MK_RBUTTON },\n\t\t};\n\n\t\tInputState* inputState;\n\t\tJvsButtons lastDownState;\n\t\tJvsButtons heldButtons;\n\t\t\n\t\tint holdTbl[4];\n\t\tHoldState holdState;\n\n\t\tvoid UpdateJvsInput();\n\t\tvoid UpdateDwGuiInput();\n\t\tvoid UpdateMousePvScroll();\n\t\tvoid UpdateHoldState();\n\t\tInputState* GetInputStatePtr(void* address);\n\t\tJvsButtons GetJvsButtonsState(bool(*buttonTestFunc)(void*));\n\t\tJvsButtons GetButtonFromHold();\n\t\tchar GetKeyState();\n\t\tHoldState GetHoldState();\n\t\tint GetMaxHoldState();\n\t\tbool IsHold();\n\n\t\tvoid UpdateInputBit(uint32_t bit, uint8_t keycode);\n\t\tvoid UpdateSliderLR();\n\t\tvoid SetMetaButtons();\n\n\t\tvoid addCoin();\n\t\tvoid toggleNpr1();\n\t\tvoid toggleWireframe();\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/InputState.cpp",
    "content": "#include \"InputState.h\"\n#include <windows.h>\n#include <stdio.h>\n\nnamespace TLAC::Components\n{\n\tvoid InputState::ClearState()\n\t{\n\t\tmemset(this, 0, sizeof(InputState));\n\t}\n\n\tvoid InputState::HideCursor()\n\t{\n\t\tMouseX = INT32_MIN;\n\t\tMouseY = INT32_MIN;\n\t\tMouseDeltaX = 0;\n\t\tMouseDeltaY = 0;\n\t}\n\n\tvoid InputState::SetBit(uint32_t bit, bool value, InputBufferType inputType)\n\t{\n\t\tuint8_t* data = GetInputBuffer(inputType);\n\t\t\n\t\tif (data == nullptr || bit < 0 || bit >= MAX_BUTTON_BIT)\n\t\t\treturn;\n\n\t\tint byteIndex = (bit / 8);\n\t\tint bitIndex = (bit % 8);\n\n\t\tBYTE mask = (1 << bitIndex);\n\n\t\tdata[byteIndex] = value ? (data[byteIndex] | mask) : (data[byteIndex] & ~mask);\n\t}\n\n\tuint8_t* InputState::GetInputBuffer(InputBufferType inputType)\n\t{\n\t\tswitch (inputType)\n\t\t{\n\t\tcase InputBufferType_Tapped: \n\t\t\treturn (uint8_t*)&Tapped;\n\n\t\tcase InputBufferType_Released:\n\t\t\treturn (uint8_t*)&Released;\n\n\t\tcase InputBufferType_Down: \n\t\t\treturn (uint8_t*)&Down;\n\n\t\tcase InputBufferType_DoubleTapped: \n\t\t\treturn (uint8_t*)&DoubleTapped;\n\n\t\tcase InputBufferType_IntervalTapped:\n\t\t\treturn (uint8_t*)&IntervalTapped;\n\n\t\tdefault:\n\t\t\treturn nullptr;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/InputState.h",
    "content": "#pragma once\n#include \"JvsButtons.h\"\n#include \"InputBufferType.h\"\n\nnamespace TLAC::Components\n{\n\tconst int MAX_BUTTON_BIT = 0x6F;\n\n\t// The button state is larger than the size of a register\n\t// but only the first 32 bits are used during normal gameplay\n\t// so this will provide the convenience of still being able to access them through a bit field\n\tunion ButtonState\n\t{\n\t\tJvsButtons Buttons;\n\t\tuint32_t State[4];\n\t};\n\n\t// total sizeof() == 0x20E0\n\tstruct InputState\n\t{\n\t\tButtonState Tapped;\n\t\tButtonState Released;\n\n\t\tButtonState Down;\n\t\tuint32_t Padding_20[4];\n\n\t\tButtonState DoubleTapped;\n\t\tuint32_t Padding_30[4];\n\n\t\tButtonState IntervalTapped;\n\t\tuint32_t Padding_38[12];\n\n\t\tint32_t MouseX;\n\t\tint32_t MouseY;\n\t\tint32_t MouseDeltaX;\n\t\tint32_t MouseDeltaY;\n\n\t\tuint32_t Padding_AC[8];\n\t\tuint8_t Padding_D0[3];\n\t\tchar Key;\n\n\t\tvoid ClearState();\n\t\tvoid HideCursor();\n\t\tvoid SetBit(uint32_t bit, bool value, InputBufferType inputType);\n\t\tuint8_t* GetInputBuffer(InputBufferType inputType);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/JvsButtons.h",
    "content": "#pragma once\n#include <stdint.h>\n\nnamespace TLAC::Components\n{\n\tenum JvsButtons : uint32_t\n\t{\n\t\tJVS_NONE\t\t= 0 << 0x00, // 0x0\n\n\t\tJVS_TEST\t\t= 1 << 0x00, // 0x1\n\t\tJVS_SERVICE\t\t= 1 << 0x01, // 0x2\n\n\t\tJVS_START\t\t= 1 << 0x02, // 0x4\n\t\tJVS_TRIANGLE\t= 1 << 0x07, // 0x80\n\t\tJVS_SQUARE\t\t= 1 << 0x08, // 0x100\n\t\tJVS_CROSS\t\t= 1 << 0x09, // 0x200\n\t\tJVS_CIRCLE\t\t= 1 << 0x0A, // 0x400\n\t\tJVS_L\t\t\t= 1 << 0x0B, // 0x800\n\t\tJVS_R\t\t\t= 1 << 0x0C, // 0x1000\n\n\t\tJVS_SW1\t\t\t= 1 << 0x12, // 0x40000\n\t\tJVS_SW2\t\t\t= 1 << 0x13, // 0x80000\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchPanelEmulator.cpp",
    "content": "#include \"TouchPanelEmulator.h\"\n#include <iostream>\n#include <tchar.h>\n#include <tpcshrd.h>\n#include \"../ComponentsManager.h\"\n#include \"../../Constants.h\"\n#include \"../../framework.h\"\n#include \"../../Input/Mouse/Mouse.h\"\n#include \"../../Input/Keyboard/Keyboard.h\"\n\nusing namespace TLAC::Input;\n\nnamespace TLAC::Components\n{\n\tTouchPanelEmulator::TouchPanelEmulator()\n\t{\n\t}\n\n\tTouchPanelEmulator::~TouchPanelEmulator()\n\t{\n\t}\n\n\tconst char* TouchPanelEmulator::GetDisplayName()\n\t{\n\t\treturn \"touch_panel_emulator\";\n\t}\n\n\tvoid TouchPanelEmulator::Initialize(ComponentsManager* manager)\n\t{\n\t\tcomponentsManager = manager;\n\t\tstate = GetTouchStatePtr((void*)TASK_TOUCH_ADDRESS);\n\t\t// Make touches on actual touchscreens more responsive\n\t\tconst DWORD_PTR dwHwndTabletProperty =\n\t\t\tTABLET_DISABLE_PRESSANDHOLD | // disables press and hold (right-click) gesture\n\t\t\tTABLET_DISABLE_PENTAPFEEDBACK | // disables UI feedback on pen up (waves)\n\t\t\tTABLET_DISABLE_PENBARRELFEEDBACK | // disables UI feedback on pen button down (circle)\n\t\t\tTABLET_DISABLE_FLICKS; // disables pen flicks (back, forward, drag down, drag up)\n\t\tSetProp(TLAC::framework::DivaWindowHandle, MICROSOFT_TABLETPENSERVICE_PROPERTY, reinterpret_cast<HANDLE>(dwHwndTabletProperty));\n\t}\n\n\tvoid TouchPanelEmulator::Update()\n\t{\n\t\tstate->ConnectionState = 1;\n\t}\n\n\tvoid TouchPanelEmulator::UpdateInput()\n\t{\n\t\tif (!componentsManager->GetUpdateGameInput() || componentsManager->IsDwGuiActive() || componentsManager->IsDwGuiHovered())\n\t\t\treturn;\n\n\t\t// TODO: rescale TouchReaction aet position\n\t\tauto keyboard = Keyboard::GetInstance();\n\t\tauto pos = Mouse::GetInstance()->GetRelativePosition();\n\n\t\tstate->XPosition = (float)pos.x;\n\t\tstate->YPosition = (float)pos.y;\n\n\t\tbool down = keyboard->IsDown(VK_LBUTTON);\n\t\tbool released = keyboard->IsReleased(VK_LBUTTON);\n\n\t\tstate->ContactType = (down ? 0x2 : released ? 0x1 : 0x0);\n\t\tstate->Pressure = (float)(state->ContactType != 0);\n\t}\n\n\tTouchPanelState* TouchPanelEmulator::GetTouchStatePtr(void *address)\n\t{\n\t\treturn (TouchPanelState*)address;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchPanelEmulator.h",
    "content": "#pragma once\n#include \"../EmulatorComponent.h\"\n#include \"TouchPanelState.h\"\n\nnamespace TLAC::Components\n{\n\tclass TouchPanelEmulator : public EmulatorComponent\n\t{\n\tpublic:\n\t\tTouchPanelEmulator();\n\t\t~TouchPanelEmulator();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\tprivate:\n\t\tComponentsManager* componentsManager;\n\n\t\tTouchPanelState* state;\n\t\tTouchPanelState* GetTouchStatePtr(void *address);\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchPanelState.h",
    "content": "#pragma once\n\nnamespace TLAC::Components\n{\n\tstruct TouchPanelState\n\t{\n\t\tint Padding00[0x1E];\n\t\tint ConnectionState;\n\t\tint Padding01[0x06];\n\t\tfloat XPosition;\n\t\tfloat YPosition;\n\t\tfloat Pressure;\n\t\tint ContactType;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchSliderEmulator.cpp",
    "content": "#include \"TouchSliderEmulator.h\"\n#include \"../ComponentsManager.h\"\n#include \"../../Constants.h\"\n#include \"../../framework.h\"\n#include \"../../Input/Mouse/Mouse.h\"\n#include \"../../Input/Keyboard/Keyboard.h\"\n#include \"../../Input/Bindings/KeyboardBinding.h\"\n#include \"../../Input/KeyConfig/Config.h\"\n#include \"../../Input/DirectInput/Ds4/DualShock4.h\"\n#include \"../../Input/Divaller/Divaller.h\"\n#include \"../../FileSystem/ConfigFile.h\"\n#include \"../../Utilities/Math.h\"\n#include <algorithm>\n#include <stdio.h>\n#include \"../GameState.h\"\n\nusing namespace TLAC::Input;\nusing namespace TLAC::Input::KeyConfig;\nusing namespace TLAC::Utilities;\n\nnamespace TLAC::Components\n{\n\tconst std::string KEY_CONFIG_FILE_NAME = \"keyconfig.ini\";\n\n\tTouchSliderEmulator* TouchSliderEmulator::LatestInstance;\n\n\tTouchSliderEmulator::TouchSliderEmulator()\n\t{\n\t\tLatestInstance = this;\n\t}\n\n\tTouchSliderEmulator::~TouchSliderEmulator()\n\t{\n\t\tdelete LeftSideSlideLeft;\n\t\tdelete LeftSideSlideRight;\n\n\t\tdelete RightSideSlideLeft;\n\t\tdelete RightSideSlideRight;\n\t}\n\n\tconst char* TouchSliderEmulator::GetDisplayName()\n\t{\n\t\treturn \"touch_slider_emulator\";\n\t}\n\n\tvoid TouchSliderEmulator::Initialize(ComponentsManager* manager)\n\t{\n\t\tcomponentsManager = manager;\n\t\tsliderState = (TouchSliderState*)SLIDER_CTRL_TASK_ADDRESS;\n\n\t\ttouchSliderEmulatorIsEnabled = true;\n\n\t\tLeftSideSlideLeft = new Binding();\n\t\tLeftSideSlideRight = new Binding();\n\n\t\tRightSideSlideLeft = new Binding();\n\t\tRightSideSlideRight = new Binding();\n\n\t\tFileSystem::ConfigFile configFile(framework::GetModuleDirectory(), KEY_CONFIG_FILE_NAME);\n\t\tconfigFile.OpenRead();\n\n\t\tusePs4OfficialSlider = configFile.GetBooleanValue(\"ps4_official_slider\");\n\t\tenableInMenus = configFile.GetBooleanValue(\"slider_in_menus\");\n\n\t\tif (usePs4OfficialSlider)\n\t\t{\n\t\t\tDualShock4* ds4 = DualShock4::GetInstance();\n\t\t\tif (ds4 == nullptr)\n\t\t\t\tDualShock4::rawMode = true; // set raw mode for future instances if no current instance\n\t\t\telse\n\t\t\t\tds4->SetRawMode(true); // if is a current instance, set raw mode on it (also sets for future instances)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDualShock4* ds4 = DualShock4::GetInstance();\n\t\t\tif (ds4 == nullptr)\n\t\t\t\tDualShock4::rawMode = false; // set raw mode for future instances if no current instance\n\t\t\telse\n\t\t\t\tds4->SetRawMode(false); // if is a current instance, set raw mode on it (also sets for future instances)\n\n\t\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"LEFT_SIDE_SLIDE_LEFT\", *LeftSideSlideLeft, { \"Q\" });\n\t\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"LEFT_SIDE_SLIDE_RIGHT\", *LeftSideSlideRight, { \"E\" });\n\n\t\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"RIGHT_SIDE_SLIDE_LEFT\", *RightSideSlideLeft, { \"U\" });\n\t\t\tConfig::BindConfigKeys(configFile.ConfigMap, \"RIGHT_SIDE_SLIDE_RIGHT\", *RightSideSlideRight, { \"O\" });\n\n\t\t\tfloat touchSliderEmulationSpeed = configFile.GetFloatValue(\"touch_slider_emulation_speed\");\n\n\t\t\tif (touchSliderEmulationSpeed != 0.0f)\n\t\t\t\tsliderSpeed = touchSliderEmulationSpeed;\n\t\t}\n\t}\n\n\tvoid TouchSliderEmulator::Update()\n\t{\n\t\tsliderState->State = SLIDER_OK;\n\t}\n\n\tvoid TouchSliderEmulator::UpdateInput()\n\t{\n\t\tif (!componentsManager->GetUpdateGameInput() || componentsManager->IsDwGuiActive() || (!enableInMenus && !(*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN)))\n\t\t\treturn;\n\n\t\tif (Input::Divaller::GetInstance() != nullptr)\n\t\t{\n\t\t\tApplyBitfieldState(Input::Divaller::GetInstance()->GetSlider());\n\t\t}\n\t\telse if (usePs4OfficialSlider)\n\t\t{\n\t\t\tDualShock4* ds4 = DualShock4::GetInstance();\n\t\t\tif (ds4 == nullptr)\n\t\t\t\treturn;\n\n\t\t\tJoystick ls = ds4->GetLeftStick();\n\t\t\tJoystick rs = ds4->GetRightStick();\n\n\t\t\tuint32_t state = 0;\n\n\t\t\t// DualShock4 normalises sticks to floats -- this undoes that\n\t\t\t//printf(\"left stick: %9.6f, %9.6f, \", ls.XAxis, ls.YAxis);\n\t\t\tstate |= (uint8_t)((ls.XAxis + 1.0 + 0.001) * 127.5) ^ 0b10000000; // 0.001 to prevent rounding errors\n\t\t\t//printf(\"%d, \", (int)(state ^ 0b10000000));\n\t\t\tstate |= ((uint8_t)((ls.YAxis + 1.0 + 0.001) * 127.5) ^ 0b10000000) << 8;\n\t\t\t//printf(\"%d\\n\", (int)((state >> 8) ^ 0b10000000));\n\t\t\tstate |= ((uint8_t)((rs.XAxis + 1.0 + 0.001) * 127.5) ^ 0b10000000) << 16;\n\t\t\tstate |= ((uint8_t)((rs.YAxis + 1.0 + 0.001) * 127.5) ^ 0b10000000) << 24;\n\n\t\t\tApplyBitfieldState(state);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsliderIncrement = GetElapsedTime() / sliderSpeed;\n\n\t\t\tconstexpr float sensorStep = (1.0f / SLIDER_SENSORS);\n\n\t\t\tEmulateSliderInput(LeftSideSlideLeft, LeftSideSlideRight, ContactPoints[0], 0.0f, 0.5f);\n\t\t\tEmulateSliderInput(RightSideSlideLeft, RightSideSlideRight, ContactPoints[1], 0.5f + sensorStep, 1.0f + sensorStep);\n\n\t\t\tsliderState->ResetSensors(TouchSliderState::SENSOR_SET_MODE_SECTIONS);\n\n\t\t\tfor (int i = 0; i < CONTACT_POINTS; i++)\n\t\t\t\tApplyContactPoint(ContactPoints[i], i);\n\t\t}\n\t}\n\n\tvoid TouchSliderEmulator::OnFocusLost()\n\t{\n\t\tif (usePs4OfficialSlider || Input::Divaller::GetInstance() != nullptr)\n\t\t\tsliderState->ResetSensors(TouchSliderState::SENSOR_SET_MODE_RAW);\n\t\telse\n\t\t\tsliderState->ResetSensors(TouchSliderState::SENSOR_SET_MODE_SECTIONS);\n\t}\n\n\t// EmulateSliderInput and ApplyContactPoint are used for analog stick/button slider emulation\n\tvoid TouchSliderEmulator::EmulateSliderInput(Binding *leftBinding, Binding *rightBinding, ContactPoint &contactPoint, float start, float end)\n\t{\n\t\tbool leftDown = leftBinding->AnyDown();\n\t\tbool rightDown = rightBinding->AnyDown();\n\n\t\tif (leftDown)\n\t\t\tcontactPoint.Position -= sliderIncrement;\n\t\telse if (rightDown)\n\t\t\tcontactPoint.Position += sliderIncrement;\n\n\t\tif (contactPoint.Position < start)\n\t\t\tcontactPoint.Position = end;\n\n\t\tif (contactPoint.Position > end)\n\t\t\tcontactPoint.Position = start;\n\n\t\tbool leftTapped = leftBinding->AnyTapped();\n\t\tbool rightTapped = rightBinding->AnyTapped();\n\n\t\tif (leftTapped || rightTapped)\n\t\t\tcontactPoint.Position = (start + end) / 2.0f;\n\n\t\tcontactPoint.InContact = leftDown || rightDown;\n\t}\n\n\tvoid TouchSliderEmulator::ApplyContactPoint(ContactPoint& contactPoint, int section)\n\t{\n\t\tsliderState->SectionTouched[section] = contactPoint.InContact;\n\n\t\tint pressure = contactPoint.InContact ? FULL_PRESSURE : NO_PRESSURE;\n\t\tfloat position = std::clamp(contactPoint.Position, 0.0f, 1.0f);\n\n\t\tif (contactPoint.InContact)\n\t\t{\n\t\t\tint sensor = (int)(position * (SLIDER_SENSORS - 1));\n\n\t\t\tsliderState->SetSensor(sensor, pressure, TouchSliderState::SENSOR_SET_MODE_SECTIONS);\n\t\t}\n\n\t\tconstexpr float startRange = -1.0f;\n\t\tconstexpr float endRange = +1.0f;\n\n\t\tsliderState->SectionPositions[section] = contactPoint.InContact ? (ConvertRange(0.0f, 1.0f, startRange, endRange, position)) : 0.0f;\n\t}\n\n\t// ApplyBitfieldState is used for setting raw slider data\n\tvoid TouchSliderEmulator::ApplyBitfieldState(uint32_t state)\n\t{\n\t\tfor (int i = 0; i < 32; i++)\n\t\t{\n\t\t\tif (state & (1 << (31 - i)))\n\t\t\t\tsliderState->SetSensor(i, FULL_PRESSURE, TouchSliderState::SENSOR_SET_MODE_RAW);\n\t\t\telse\n\t\t\t\tsliderState->SetSensor(i, NO_PRESSURE, TouchSliderState::SENSOR_SET_MODE_RAW);\n\t\t}\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchSliderEmulator.h",
    "content": "#pragma once\n#include \"../EmulatorComponent.h\"\n#include \"TouchSliderState.h\"\n#include \"../../Input/Bindings/Binding.h\"\n\nnamespace TLAC::Components\n{\n\tconstexpr int SLIDER_INPUTS = 4;\n\tconstexpr int CONTACT_POINTS = 2;\n\n\tstruct ContactPoint\n\t{\n\t\tfloat Position;\n\t\tbool InContact;\n\t};\n\n\tclass TouchSliderEmulator : public EmulatorComponent\n\t{\n\tpublic:\n\t\tstatic TouchSliderEmulator* LatestInstance;\n\n\t\tInput::Binding* LeftSideSlideLeft;\n\t\tInput::Binding* LeftSideSlideRight;\n\n\t\tInput::Binding* RightSideSlideLeft;\n\t\tInput::Binding* RightSideSlideRight;\n\n\t\tbool usePs4OfficialSlider;\n\n\t\tbool enableInMenus;\n\n\t\tTouchSliderEmulator();\n\t\t~TouchSliderEmulator();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\t\tvirtual void OnFocusLost() override;\n\n\t\tbool isSliderTouched()\n\t\t{\n\t\t\tfor (int i = 0; i < 32; i++)\n\t\t\t\tif (sliderState->SensorTouched[i].IsTouched) return true;\n\n\t\t\treturn false;\n\t\t}\n\n\tprivate:\n\t\tComponentsManager* componentsManager;\n\t\tfloat sliderSpeed = 750.0f;\n\t\tfloat sliderIncrement;\n\n\t\tTouchSliderState *sliderState;\n\t\tContactPoint ContactPoints[CONTACT_POINTS];\n\n\t\tvoid EmulateSliderInput(Input::Binding *leftBinding, Input::Binding *rightBinding, ContactPoint &contactPoint, float start, float end);\n\t\tvoid ApplyContactPoint(ContactPoint &contactPoint, int section);\n\t\tvoid ApplyBitfieldState(uint32_t state);\n\t};\n\n\tinline bool touchSliderEmulatorIsEnabled = false;\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchSliderState.cpp",
    "content": "#include \"TouchSliderState.h\"\n\nnamespace TLAC::Components\n{\n\tvoid TouchSliderState::SetSensor(int index, int value, SliderSensorSetMode mode)\n\t{\n\t\tif (index < 0 || index >= SLIDER_SENSORS)\n\t\t\treturn;\n\n\t\tif (mode == SENSOR_SET_MODE_RAW)\n\t\t{\n\t\t\tif (SerialState == nullptr)\n\t\t\t\treturn;\n\n\t\t\tuint32_t* ph = SerialState->sliderSerialResponse.sensors[index].pressureHistory;\n\t\t\tph[3] = ph[2];\n\t\t\tph[2] = ph[1];\n\t\t\tph[1] = ph[0];\n\t\t\tph[0] = value;\n\n\t\t\tSerialState->sliderSerialResponse.scanMode = 1;\n\t\t\tSerialState->sliderSerialResponse.scanCount = 1;\n\t\t\tSerialState->sliderResponseCnt = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSensorPressureLevels[index] = value;\n\t\t\tSensorTouched[index].IsTouched = value > 0;\n\t\t}\n\t}\n\n\tvoid TouchSliderState::ResetSensors(SliderSensorSetMode mode)\n\t{\n\t\tfor (int i = 0; i < SLIDER_SENSORS; i++)\n\t\t\tSetSensor(i, NO_PRESSURE, mode);\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Input/TouchSliderState.h",
    "content": "#pragma once\n#include <stdint.h>\n\n#define SLIDER_OK 3\n#define SLIDER_SECTIONS 4\n#define SLIDER_SENSORS 32\n\n#define NO_PRESSURE 0\n#define FULL_PRESSURE 180\n\n\nnamespace TLAC::Components\n{\n\tstruct TouchSliderSerialState\n\t{\n\t\tuint8_t padding[0x1960];\n\n\t\tint sliderResponseCnt;\n\t\tstruct\n\t\t{\n\t\t\tint scanMode;\n\t\t\tint scanCount;\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tuint32_t pressureHistory[4]; // first: current, second: last sample, ...\n\t\t\t} sensors[SLIDER_SENSORS];\n\t\t} sliderSerialResponse;\n\n\t\tstruct\n\t\t{\n\t\t\tint scanMode;\n\t\t\tint scanCount;\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tuint32_t pressureHistory[4]; // first: current, second: last sample, ...\n\t\t\t} sensors[SLIDER_SENSORS];\n\t\t} sliderSerialResponseCopy; // the other one is copied here by the game, feel free to ignore it\n\t};\n\n\tstruct TouchSliderState\n\t{\n\t\tuint8_t Padding0000[104];\n\n\t\tTouchSliderSerialState* SerialState;\n\n\t\tint32_t State;\n\n\t\tuint8_t Padding0074[20 + 12];\n\n\t\tint32_t SensorPressureLevels[SLIDER_SENSORS];\n\n\t\tuint8_t Padding0108[52 - 12];\n\n\t\tfloat SectionPositions[SLIDER_SECTIONS];\n\t\tint SectionConnections[SLIDER_SECTIONS];\n\t\tuint8_t Padding015C[4];\n\t\tbool SectionTouched[SLIDER_SECTIONS];\n\n\t\tuint8_t Padding013C[3128 - 52 - 40];\n\n\t\tstruct\n\t\t{\n\t\t\tuint8_t Padding00[2];\n\t\t\tbool IsTouched;\n\t\t\tuint8_t Padding[45];\n\t\t} SensorTouched[SLIDER_SENSORS];\n\n\n\t\t// two different places to be set depending on operation mode now\n\t\t// stick/button based emulation directly controls sections and raw slider emulation controls fake serial inputs\n\t\tenum SliderSensorSetMode\n\t\t{\n\t\t\tSENSOR_SET_MODE_SECTIONS,\n\t\t\tSENSOR_SET_MODE_RAW\n\t\t};\n\n\t\tvoid SetSensor(int index, int value, SliderSensorSetMode mode);\n\t\tvoid ResetSensors(SliderSensorSetMode mode);\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Pause.cpp",
    "content": "﻿#include \"Pause.h\"\n#include \"../Constants.h\"\n#include \"GameState.h\"\n#include \"ComponentsManager.h\"\n#include \"../Utilities/Drawing.h\"\n#include \"GL/glut.h\"\n#include \"detours.h\"\n#include <windows.h>\n#include <vector>\n#include <chrono>\n#include \"../FileSystem/ConfigFile.h\"\n#include \"../framework.h\"\n\nnamespace TLAC::Components\n{\n\tusing TLAC::Utilities::Drawing;\n\tbool Pause::pause = false;\n\tbool Pause::isPaused = false;\n\tbool Pause::giveUp = false;\n\tbool Pause::autoPause = false;\n\tbool Pause::ignoreAutoPause = false;\n\tbool Pause::autoReplay = false;\n\tbool Pause::showUI = true;\n\tint Pause::selResultAet1 = 0;\n\tint Pause::selResultAet2 = 0;\n\tint Pause::selResultAet3 = 0;\n\tint Pause::selResultAet4 = 0;\n\tint Pause::triangleAet = 0;\n\tint Pause::squareAet = 0;\n\tint Pause::crossAet = 0;\n\tint Pause::circleAet = 0;\n\tint Pause::curMenuPos = 0;\n\tstd::vector<std::pair<Pause::menusets, int>> Pause::menuHistory;\n\tPause::menusets Pause::curMenuSet = MENUSET_MAIN;\n\tstd::chrono::time_point<std::chrono::high_resolution_clock> Pause::menuItemMoveTime;\n\tstd::vector<uint8_t> Pause::origAetMovOp;\n\tfloat_t Pause::origDeltaFrameHistory = 0.0f;\n\tint32_t Pause::origDeltaFrameHistoryInt = 0;\n\tuint8_t* Pause::aetMovPatchAddress = (uint8_t*)0x1401703b3;\n\tstd::vector<uint8_t> Pause::origFramespeedOp;\n\tuint8_t* Pause::framespeedPatchAddress = (uint8_t*)0x140192D50;\n\tfloat_t* Pause::deltaFrameHistoryAddress = (float_t*)0x140EDA6C0;\n\tint32_t* Pause::deltaFrameHistoryIntAddress = (int32_t*)0x140EDA6C4;\n\tstd::vector<uint8_t> Pause::origAgeageHairOp;\n\tuint8_t* Pause::ageageHairPatchAddress = (uint8_t*)0x14054352c;\n\tstd::vector<bool> Pause::streamPlayStates;\n\tbool(*divaGiveUpFunc)(void*) = (bool(*)(void* cls))GIVEUP_FUNC_ADDRESS;\n\tvoid(*divaPVEndFunc)(uint64_t, char, char) = (void(*)(uint64_t, char, char))0x140108260;\n\tchar(*divaScriptCommandFunc)(uint64_t, uint64_t, uint64_t, void*, void*, char, char) = (char(*)(uint64_t, uint64_t, uint64_t, void*, void*, char, char))0x14011CBA0;\n\tPlayerData* Pause::playerData;\n\tInputState* Pause::inputState;\n\tTouchSliderState* Pause::sliderState;\n\tTouchPanelState* Pause::panelState;\n\tComponentsManager* Pause::componentsManager;\n\tJvsButtons Pause::filteredButtons;\n\tint Pause::lastTouchType = 0;\n\tstd::vector<Pause::menuSet> Pause::menu = {\n\t\t{\n\t\t\t\"PAUSED\",\n\t\t\t{\n\t\t\t\t{ \"RESUME\", unpause, false },\n\t\t\t\t{ \"RESTART\", restart, false },\n\t\t\t\t{ \"SE VOLUME\", sevolorpvmenu, false },\n\t\t\t\t{ \"GIVE UP\", giveup, false },\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"SE VOLUME\",\n\t\t\t{\n\t\t\t\t{ \"+\", sevolplus, true },\n\t\t\t\t{ \"XX\", menuback, false },\n\t\t\t\t{ \"-\", sevolminus, true },\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"PV OPTIONS\",\n\t\t\t{\n\t\t\t\t{ \"XX\", pvloop, false },\n\t\t\t\t{ \"XX\", pvignoreautopause, false },\n\t\t\t}\n\t\t},\n\t};\n\n\tPause::Pause()\n\t{\n\t}\n\n\tPause::~Pause()\n\t{\n\t}\n\n\tconst char* Pause::GetDisplayName()\n\t{\n\t\treturn \"pause\";\n\t}\n\n\tvoid Pause::saveOldPatchOps()\n\t{\n\t\torigAetMovOp.resize(8);\n\t\tmemcpy(origAetMovOp.data(), aetMovPatchAddress, 8);\n\n\t\torigFramespeedOp.resize(4);\n\t\tmemcpy(origFramespeedOp.data(), framespeedPatchAddress, 4);\n\n\t\torigAgeageHairOp.resize(3);\n\t\tmemcpy(origAgeageHairOp.data(), ageageHairPatchAddress, 3);\n\t}\n\n\tvoid Pause::Initialize(ComponentsManager* manager)\n\t{\n\t\tinputState = (InputState*)(*(uint64_t*)INPUT_STATE_PTR_ADDRESS);\n\t\tplayerData = (PlayerData*)PLAYER_DATA_ADDRESS;\n\t\tsliderState = (TouchSliderState*)SLIDER_CTRL_TASK_ADDRESS;\n\t\tpanelState = (TouchPanelState*)TASK_TOUCH_ADDRESS;\n\t\tcomponentsManager = manager;\n\n\t\tTLAC::FileSystem::ConfigFile config(TLAC::framework::GetModuleDirectory(), \"keyconfig.ini\");\n\t\tconfig.OpenRead();\n\t\tautoPause = config.GetBooleanValue(\"autopause\");\n\n\t\tsaveOldPatchOps();\n\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaGiveUpFunc, hookedGiveUpFunc);\n\t\tDetourTransactionCommit();\n\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaPVEndFunc, hookedDivaPVEndFunc);\n\t\tDetourTransactionCommit();\n\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaScriptCommandFunc, hookedScriptCommandFunc);\n\t\tDetourTransactionCommit();\n\t}\n\n\tvoid Pause::Update()\n\t{\n\n\t}\n\n\t// put these here because my local VS was being a bitch and compiling the place that uses them wrong when they were inline\n\t// updating VS would probably fix it, but this was quicker\n\t// -somewhatlurker\n\tint* resWidth = (int*)RESOLUTION_WIDTH_ADDRESS;\n\tint* resHeight = (int*)RESOLUTION_HEIGHT_ADDRESS;\n\n\tvoid Pause::UpdatePostInput()\n\t{\n\t\tif (pause)\n\t\t{\n\t\t\t// enter pause mode on state transition\n\t\t\tif (!isPaused)\n\t\t\t{\n\t\t\t\t((void(*)())DSC_PAUSE_FUNC_ADDRESS)();\n\n\t\t\t\tsaveOldPatchOps();\n\t\t\t\tInjectCode(aetMovPatchAddress, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });\n\t\t\t\tInjectCode(framespeedPatchAddress, { 0x0f, 0x57, 0xc0, 0xc3 }); // XORPS XMM0,XMM0; RET\n\t\t\t\tInjectCode(ageageHairPatchAddress, { 0x0f, 0x57, 0xdb }); // XORPS XMM3,XMM3\n\n\t\t\t\torigDeltaFrameHistory = *deltaFrameHistoryAddress;\n\t\t\t\torigDeltaFrameHistoryInt = *deltaFrameHistoryIntAddress;\n\n\t\t\t\t*deltaFrameHistoryAddress = 0.0f;\n\t\t\t\t*deltaFrameHistoryIntAddress = 0;\n\n\t\t\t\tuint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70);\n\t\t\t\tuint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18);\n\t\t\t\tint nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20);\n\t\t\t\tfor (int i = 0; i < nAudioStreams; i++)\n\t\t\t\t{\n\t\t\t\t\tuint32_t* playstate = (uint32_t*)(audioStreamsAddress + i * 0x50 + 0x18);\n\t\t\t\t\tif (i < streamPlayStates.size())\n\t\t\t\t\t\tstreamPlayStates[i] = *playstate;\n\t\t\t\t\telse\n\t\t\t\t\t\tstreamPlayStates.push_back(*playstate);\n\n\t\t\t\t\t*playstate = 0;\n\t\t\t\t}\n\n\t\t\t\t// block all buttons from being passed to game\n\t\t\t\tfilteredButtons = allButtons;\n\n\t\t\t\tsetMenuPos(MENUSET_MAIN, 0);\n\t\t\t\tmenuHistory.resize(0);\n\t\t\t\tshowUI = true;\n\t\t\t\tisPaused = true;\n\t\t\t}\n\n\t\t\t// always exit pause if key is tapped or no longer in game somehow\n\t\t\tif (isPauseKeyTapped() || !isInGame())\n\t\t\t{\n\t\t\t\tpause = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// note: use exact button comparisons instead of only single bits to avoid macros\n\t\t\t\tif (inputState->Tapped.Buttons == JVS_SQUARE)\n\t\t\t\t{\n\t\t\t\t\tshowUI = !showUI;\n\t\t\t\t\tif (showUI)\n\t\t\t\t\t{\n\t\t\t\t\t\tmenuItemMoveTime = std::chrono::high_resolution_clock::now(); // restart animations\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// clear these from the screen too\n\t\t\t\t\t\t/*\n\t\t\t\t\t\tDrawing::destroyAetLayer(selResultAet1);\n\t\t\t\t\t\tDrawing::destroyAetLayer(selResultAet2);\n\t\t\t\t\t\tDrawing::destroyAetLayer(selResultAet3);\n\t\t\t\t\t\tDrawing::destroyAetLayer(selResultAet4);\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tDrawing::destroyAetLayer(triangleAet);\n\t\t\t\t\t\tDrawing::destroyAetLayer(squareAet);\n\t\t\t\t\t\tDrawing::destroyAetLayer(crossAet);\n\t\t\t\t\t\tDrawing::destroyAetLayer(circleAet);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* for testing `-ss` stuff\n\t\t\t\tif (inputState->Tapped.Buttons == JVS_TRIANGLE)\n\t\t\t\t{\n\t\t\t\t\tvoid** ScreenShotImplAddr = (void**)0x1412016d0;\n\t\t\t\t\tDrawing::MsString path; // just a small struct from TLAC::Utilities::Drawing::MsString\n\t\t\t\t\tpath.SetCharBuf(\"blahblahblah\");\n\n\t\t\t\t\t((void(*)(void* impl, Drawing::MsString* path, int width, int height))0x140557210)(*ScreenShotImplAddr, &path, 1280, 720);\n\t\t\t\t}\n\t\t\t\t*/\n\n\t\t\t\t// only process menu events when UI is visible\n\t\t\t\tif (showUI)\n\t\t\t\t{\n\t\t\t\t\tif (inputState->Tapped.Buttons == JVS_L)\n\t\t\t\t\t\tsetMenuPos(curMenuSet, curMenuPos - 1);\n\n\t\t\t\t\tif (inputState->Tapped.Buttons == JVS_R)\n\t\t\t\t\t\tsetMenuPos(curMenuSet, curMenuPos + 1);\n\n\t\t\t\t\tif (inputState->Tapped.Buttons == JVS_CROSS)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (curMenuSet == MENUSET_MAIN)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpause = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmenuback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (inputState->Tapped.Buttons == JVS_CIRCLE)\n\t\t\t\t\t\tmenu[curMenuSet].items[curMenuPos].callback();\n\n\t\t\t\t\tif (!componentsManager->IsDwGuiActive()) // not sure if this check is necessary, but it doesn't hurt\n\t\t\t\t\t{\n\t\t\t\t\t\tif (panelState->ContactType == 2 && lastTouchType != 2) // down and was not down before\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor (int i = 0; i < menu[curMenuSet].items.size(); i++)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDrawing::Point itemCoords = getMenuItemCoords(curMenuSet, i);\n\n\t\t\t\t\t\t\t\tDrawing::Point touchCoords = { panelState->XPosition, panelState->YPosition };\n\t\t\t\t\t\t\t\ttouchCoords.x *= 1280.0f / *resWidth; // convert to 720p coords\n\t\t\t\t\t\t\t\ttouchCoords.y *= 720.0f / *resHeight;\n\n\t\t\t\t\t\t\t\tif (touchCoords.x >= itemCoords.x - menuItemWidth / 2 &&\n\t\t\t\t\t\t\t\t\ttouchCoords.x <= itemCoords.x + menuItemWidth / 2 &&\n\t\t\t\t\t\t\t\t\ttouchCoords.y >= itemCoords.y - menuItemHeight / 2 &&\n\t\t\t\t\t\t\t\t\ttouchCoords.y <= itemCoords.y + menuItemHeight / 2)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsetMenuPos(curMenuSet, i);\n\t\t\t\t\t\t\t\t\tmenu[curMenuSet].items[i].callback();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (curMenuSet)\n\t\t\t\t\t{\n\t\t\t\t\tcase MENUSET_SEVOL:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst char volformat[] = \"%d\";\n\t\t\t\t\t\tsize_t size = snprintf(nullptr, 0, volformat, playerData->act_vol) + 1;\n\t\t\t\t\t\tchar* buf = new char[size];\n\t\t\t\t\t\tsnprintf(buf, size, volformat, playerData->act_vol);\n\t\t\t\t\t\tmenu[MENUSET_SEVOL].items[1].name = buf;\n\t\t\t\t\t\tdelete[] buf;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MENUSET_PV:\n\t\t\t\t\t{\n\t\t\t\t\t\tchar* buf1 = new char[11];\n\t\t\t\t\t\tsnprintf(buf1, 11, \"PV LOOP: %s\", autoReplay ? \"Y\" : \"N\");\n\t\t\t\t\t\tmenu[MENUSET_PV].items[0].name = buf1;\n\t\t\t\t\t\tdelete[] buf1;\n\n\t\t\t\t\t\tchar* buf2 = new char[12];\n\t\t\t\t\t\tsnprintf(buf2, 12, \"NO PAUSE: %s\", ignoreAutoPause ? \"Y\" : \"N\");\n\t\t\t\t\t\tmenu[MENUSET_PV].items[1].name = buf2;\n\t\t\t\t\t\tdelete[] buf2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MENUSET_MAIN:\n\t\t\t\t\t{\n\t\t\t\t\t\tmenu[MENUSET_MAIN].items[2].name = isInPV()\n\t\t\t\t\t\t\t? menu[MENUSET_PV].name\n\t\t\t\t\t\t\t: menu[MENUSET_SEVOL].name;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// no slider while paused\n\t\t\t// this is simpler than buttons because slider doesn't trigger on press, it triggers on movement\n\t\t\t// (therefore per-button blocking isn't needed)\n\t\t\t// SENSOR_SET_MODE_SECTIONS matches old behaviour\n\t\t\tsliderState->ResetSensors(TouchSliderState::SENSOR_SET_MODE_SECTIONS);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// exit pause mode on state transition\n\t\t\tif (isPaused)\n\t\t\t{\n\t\t\t\t((void(*)())DSC_UNPAUSE_FUNC_ADDRESS)();\n\n\t\t\t\tInjectCode(aetMovPatchAddress, origAetMovOp);\n\t\t\t\tInjectCode(framespeedPatchAddress, origFramespeedOp);\n\t\t\t\tInjectCode(ageageHairPatchAddress, origAgeageHairOp);\n\n\t\t\t\t*deltaFrameHistoryAddress = origDeltaFrameHistory;\n\t\t\t\t*deltaFrameHistoryIntAddress = origDeltaFrameHistoryInt;\n\n\t\t\t\tuint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70);\n\t\t\t\tuint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18);\n\t\t\t\tint nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20);\n\t\t\t\tfor (int i = 0; i < nAudioStreams; i++)\n\t\t\t\t{\n\t\t\t\t\tuint32_t* playstate = (uint32_t*)(audioStreamsAddress + i * 0x50 + 0x18);\n\t\t\t\t\tif (i < streamPlayStates.size())\n\t\t\t\t\t\t*playstate = streamPlayStates[i];\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\tDrawing::destroyAetLayer(selResultAet1);\n\t\t\t\tDrawing::destroyAetLayer(selResultAet2);\n\t\t\t\tDrawing::destroyAetLayer(selResultAet3);\n\t\t\t\tDrawing::destroyAetLayer(selResultAet4);\n\t\t\t\t*/\n\t\t\t\tDrawing::destroyAetLayer(triangleAet);\n\t\t\t\tDrawing::destroyAetLayer(squareAet);\n\t\t\t\tDrawing::destroyAetLayer(crossAet);\n\t\t\t\tDrawing::destroyAetLayer(circleAet);\n\n\t\t\t\tisPaused = false;\n\t\t\t}\n\n\t\t\t// buttons that have been tapped no longer need to be filtered (doing this with down broke retriggering)\n\t\t\tfilteredButtons = (JvsButtons)(filteredButtons & ~inputState->Tapped.Buttons);\n\n\t\t\t// only enter pause if in game\n\t\t\tif (isInGame())\n\t\t\t{\n\t\t\t\tif (isPauseKeyTapped())\n\t\t\t\t{\n\t\t\t\t\tpause = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// ensure giveUp isn't retained after already quitting\n\t\t\t\tgiveUp = false;\n\t\t\t}\n\t\t}\n\n\t\t// swallow filtered button inputs\n\t\tinputState->Tapped.Buttons = (JvsButtons)(inputState->Tapped.Buttons & ~filteredButtons);\n\t\tinputState->DoubleTapped.Buttons = (JvsButtons)(inputState->DoubleTapped.Buttons & ~filteredButtons);\n\t\tinputState->Down.Buttons = (JvsButtons)(inputState->Down.Buttons & ~filteredButtons);\n\t\tinputState->Released.Buttons = (JvsButtons)(inputState->Released.Buttons & ~filteredButtons);\n\t\tinputState->IntervalTapped.Buttons = (JvsButtons)(inputState->IntervalTapped.Buttons & ~filteredButtons);\n\n\t\tlastTouchType = panelState->ContactType;\n\n\t\t// ensure the PV-only temporary values aren't retained\n\t\tif ((autoReplay || ignoreAutoPause) && *(uint8_t*)PV_LOADING_STATE_ADDRESS < 8)\n\t\t{\n\t\t\tignoreAutoPause = false;\n\t\t\tautoReplay = false;\n\t\t}\n\t}\n\n\t// returns the midpoint of a menu button\n\tDrawing::Point Pause::getMenuItemCoords(menusets set, int pos)\n\t{\n\t\tconst float slant = 35.0f / 199.0f;\n\n\t\tint menuOriginY = menuY - (menuItemTotalHeight * menu[set].items.size() - menuItemPadding) / 2 + menuItemHeight / 2;\n\t\tif (set != MENUSET_MAIN)\n\t\t{\n\t\t\tmenuOriginY += menuItemTotalHeight * 1.2 / 2;\n\t\t}\n\t\tint menuOriginX = menuX + (menuY - menuOriginY) * slant;\n\n\t\tDrawing::Point out;\n\t\tout.x = menuOriginX - (menuItemTotalHeight * pos * slant);\n\t\tout.y = menuOriginY + menuItemTotalHeight * pos;\n\n\t\treturn out;\n\t}\n\n\tvoid Pause::UpdateDraw2D()\n\t{\n\t\tif (isPaused && showUI)\n\t\t{\n\t\t\t// setup draw objects\n\t\t\tDrawing::FontInfo fontInfo(0x11);\n\t\t\tDrawing::DrawParams dtParams(&fontInfo);\n\t\t\tdtParams.layer = bgLayer;\n\t\t\tDrawing::Point aetScale = { 0.65, 0.65 };\n\t\t\tDrawing::Point aetLoc = { (1280 - aetScale.x * 1280) / 2, (720 - aetScale.y * 720) / 2 };\n\n\t\t\t// get aspect ratio\n\t\t\tfloat aspect = *(float*)UI_ASPECT_RATIO;\n\n\n\t\t\t// bg rect\n\t\t\tfloat bgWidth = aspect * 720 + 2; // add a couple of pixels to protect against rounding errors\n\t\t\tfloat bgLeft = -(bgWidth - 1280) / 2; // 0,0 is in the corner of a 720p view.. half of the extra over 1280 wide is the horizontal offset to centre the bg\n\t\t\tDrawing::RectangleBounds rect;\n\t\t\trect = { bgLeft, 0, bgWidth, 720 };\n\t\t\tdtParams.colour = 0xc0000000;\n\t\t\tdtParams.fillColour = dtParams.colour;\n\t\t\tDrawing::fillRectangle(&dtParams, rect);\n\n\n\t\t\t// pause icon\n\t\t\t/*\n\t\t\tconst int pauseWidth = 80;\n\t\t\tconst int pauseHeight = 110;\n\t\t\tconst int pauseGap = 20;\n\t\t\tconst int pausePosX = 32;\n\t\t\tconst int pausePosY = 32;\n\t\t\tconst int pausePartWidth = (pauseWidth - pauseGap) / 2;\n\n\t\t\tconst int pauseX1 = pausePosX;\n\t\t\tconst int pauseX2 = pausePosX + pausePartWidth + pauseGap;\n\t\t\tconst int pauseY1 = pausePosY;\n\n\t\t\tdtParams.colour = 0x80ffffff;\n\t\t\tdtParams.fillColour = 0x80ffffff;\n\t\t\trect = { pauseX1, pauseY1, pausePartWidth, pauseHeight };\n\t\t\tDrawing::fillRectangle(&dtParams, &rect);\n\t\t\trect = { pauseX2, pauseY1, pausePartWidth, pauseHeight };\n\t\t\tDrawing::fillRectangle(&dtParams, &rect);\n\t\t\t*/\n\n\n\t\t\tdtParams.layer = contentLayer;\n\n\t\t\t// bg box\n\t\t\t/*\n\t\t\tstatic int selResultFile = 0;\n\t\t\tif (selResultFile == 0)\n\t\t\t{\n\t\t\t\t//keyWinFile = Drawing::findAetFileId(\"AET_KEY_WIN_MAIN\");\n\t\t\t\tselResultFile = Drawing::findAetFileId(\"AET_SEL_RESULT_MAIN\");\n\t\t\t\t//printf(\"keyWinFile: %d\\n\", keyWinFile);\n\t\t\t}\n\n\t\t\tDrawing::destroyAetLayer(selResultAet1);\n\t\t\tDrawing::destroyAetLayer(selResultAet2);\n\t\t\tDrawing::destroyAetLayer(selResultAet3);\n\t\t\tDrawing::destroyAetLayer(selResultAet4);\n\t\t\tif (selResultFile != -1)\n\t\t\t{\n\t\t\t\t//keyWinAet = Drawing::createAetLayer(keyWinFile, dtParams.layer, CREATEAET_20000, \"win_in\", aetLoc, 0, nullptr, nullptr, 3.7, 3.7, aetScale, 0);\n\t\t\t\taetScale = { 0.47f, 0.47f };\n\t\t\t\taetLoc = { (1280 - aetScale.x * 1280) / 2, (720 - aetScale.y * 720) / 2 + 72 * aetScale.y };\n\t\t\t\tfloat animPos = 7.2;\n\t\t\t\tselResultAet1 = Drawing::createAetLayer(selResultFile, dtParams.layer, CREATEAET_20000, \"window_in\", aetLoc, 0, nullptr, nullptr, animPos, animPos, aetScale, 0);\n\t\t\t\tselResultAet2 = Drawing::createAetLayer(selResultFile, dtParams.layer, CREATEAET_20000, \"window_in\", aetLoc, 0, nullptr, nullptr, animPos, animPos, aetScale, 0);\n\t\t\t\tselResultAet3 = Drawing::createAetLayer(selResultFile, dtParams.layer, CREATEAET_20000, \"window_in\", aetLoc, 0, nullptr, nullptr, animPos, animPos, aetScale, 0);\n\t\t\t\tselResultAet4 = Drawing::createAetLayer(selResultFile, dtParams.layer, CREATEAET_20000, \"window_in\", aetLoc, 0, nullptr, nullptr, animPos, animPos, aetScale, 0);\n\t\t\t}\n\t\t\t*/\n\t\t\t\n\t\t\tdtParams.colour = 0xffffff00;\n\t\t\tDrawing::drawPolyline(&dtParams, {\n\t\t\t\t{ 537, 255 },\n\t\t\t\t{ 794, 255 },\n\t\t\t\t{ 759, 454 },\n\t\t\t\t{ 744, 466 },\n\t\t\t\t{ 487, 466 },\n\t\t\t\t{ 522, 267 },\n\t\t\t\t{ 537, 255 },\n\t\t\t});\n\t\t\tDrawing::drawPolyline(&dtParams, {\n\t\t\t\t{ 537 - .7f, 255 - 2 },\n\t\t\t\t{ 794 + 2.38f, 255 - 2 },\n\t\t\t\t{ 759 + 2.1f, 454 + 1.15f },\n\t\t\t\t{ 744 + .7f, 466 + 2 },\n\t\t\t\t{ 487 - 2.38f, 466 + 2 },\n\t\t\t\t{ 522 - 2.1f, 267 - 1.15f },\n\t\t\t\t{ 537 - .7f, 255 - 2 },\n\t\t\t});\n\t\t\tDrawing::drawPolyline(&dtParams, {\n\t\t\t\t{ 548, 258 },\n\t\t\t\t{ 768, 258 },\n\t\t\t\t{ 774, 265 },\n\t\t\t\t{ 770, 286 },\n\t\t\t\t{ 764, 286 },\n\t\t\t\t{ 737, 435 },\n\t\t\t\t{ 743, 435 },\n\t\t\t\t{ 739, 456 },\n\t\t\t\t{ 733, 463 },\n\t\t\t\t{ 513, 463 },\n\t\t\t\t{ 507, 456 },\n\t\t\t\t{ 511, 435 },\n\t\t\t\t{ 517, 435 },\n\t\t\t\t{ 544, 286 },\n\t\t\t\t{ 538, 286 },\n\t\t\t\t{ 542, 265 },\n\t\t\t\t{ 548, 258 },\n\t\t\t});\n\n\n\t\t\tDrawing::Point menuCoords = getMenuItemCoords(curMenuSet, curMenuPos);\n\t\t\t// selection cursor\n\t\t\tconst float selectBoxWidth = menuItemWidth;\n\t\t\tconst float selectBoxHeight = menuItemHeight;\n\t\t\tconst float selectBoxThickness = 2;\n\n\t\t\tfloat selectBoxX = menuCoords.x - selectBoxWidth / 2;\n\t\t\tfloat selectBoxY = menuCoords.y - menuItemHeight / 2;\n\n\t\t\tdtParams.colour = 0xc0ffff00;\n\t\t\tdtParams.fillColour = 0xc0ffff00;\n\t\t\t//rect = { selectBoxX, selectBoxY, selectBoxWidth, selectBoxHeight };\n\t\t\t//Drawing::drawRectangle(&dtParams, rect, selectBoxThickness);\n\n\t\t\tconst float slant = 35.0f / 199.0f;\n\t\t\tDrawing::drawPolyline(&dtParams, {\n\t\t\t\t{ selectBoxX + (selectBoxHeight - 8) * slant + 8 * 15 / 12, selectBoxY },\n\t\t\t\t{ selectBoxX + selectBoxWidth, selectBoxY },\n\t\t\t\t{ selectBoxX + selectBoxWidth - (selectBoxHeight - 8) * slant, selectBoxY + selectBoxHeight - 8 },\n\t\t\t\t{ selectBoxX + selectBoxWidth - (selectBoxHeight - 8) * slant - 8 * 15 / 12, selectBoxY + selectBoxHeight },\n\t\t\t\t{ selectBoxX, selectBoxY + selectBoxHeight },\n\t\t\t\t{ selectBoxX + (selectBoxHeight - 8) * slant, selectBoxY + 8 },\n\t\t\t\t{ selectBoxX + (selectBoxHeight - 8) * slant + 8 * 15 / 12, selectBoxY },\n\t\t\t});\n\t\t\tDrawing::drawPolyline(&dtParams, {\n\t\t\t\t{ selectBoxX + (selectBoxHeight - 8) * slant + 8 * 15 / 12 - .7f, selectBoxY - 2 },\n\t\t\t\t{ selectBoxX + selectBoxWidth + 2.38f, selectBoxY - 2 },\n\t\t\t\t{ selectBoxX + selectBoxWidth - (selectBoxHeight - 8) * slant + 2.1f, selectBoxY + selectBoxHeight - 8 + 1.15f },\n\t\t\t\t{ selectBoxX + selectBoxWidth - (selectBoxHeight - 8) * slant - 8 * 15 / 12 + .7f, selectBoxY + selectBoxHeight + 2 },\n\t\t\t\t{ selectBoxX - 2.38f, selectBoxY + selectBoxHeight + 2 },\n\t\t\t\t{ selectBoxX + (selectBoxHeight - 8) * slant - 2.1f, selectBoxY + 8 - 1.15f },\n\t\t\t\t{ selectBoxX + (selectBoxHeight - 8) * slant + 8 * 15 / 12 - .7f, selectBoxY - 2 },\n\t\t\t});\n\n\n\t\t\t// menu\n\t\t\tfontInfo.setSize(menuTextSize, menuTextSize);\n\n\t\t\tif (curMenuSet != MENUSET_MAIN)\n\t\t\t{\n\t\t\t\tdtParams.textCurrentLoc = { menuX + 90 * slant, menuY - 90 };\n\t\t\t\tdtParams.lineOriginLoc.y = dtParams.textCurrentLoc.y;\n\t\t\t\tdtParams.colour = 0xffffffff;\n\t\t\t\tDrawing::drawText(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ALIGN_CENTRE | Drawing::DRAWTEXT_STROKE), menu[curMenuSet].name);\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i < menu[curMenuSet].items.size(); i++)\n\t\t\t{\n\t\t\t\tmenuCoords = getMenuItemCoords(curMenuSet, i);\n\t\t\t\tdtParams.textCurrentLoc = { menuCoords.x, menuCoords.y - menuTextSize / 2 };\n\t\t\t\tdtParams.lineOriginLoc = dtParams.textCurrentLoc;\n\t\t\t\tif (i == curMenuPos)\n\t\t\t\t{\n\t\t\t\t\tuint8_t alpha = (cosf(getMenuAnimPos() * 6.283185f) * 0.15 + 0.85) * 255;\n\t\t\t\t\tdtParams.colour = 0x00ffff00 | (alpha << 24);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tdtParams.colour = 0xffffffff;\n\t\t\t\t}\n\n\t\t\t\tDrawing::drawText(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ALIGN_CENTRE), menu[curMenuSet].items[i].name);\n\t\t\t}\n\t\t\t\t\t\t\n\n\t\t\t// key legend\n\t\t\tDrawing::destroyAetLayer(triangleAet);\n\t\t\tDrawing::destroyAetLayer(squareAet);\n\t\t\tDrawing::destroyAetLayer(crossAet);\n\t\t\tDrawing::destroyAetLayer(circleAet);\n\n\t\t\tfloat textLeft;\n\t\t\tif (aspect > 16.0f / 9.0f)\n\t\t\t\ttextLeft = 32;\n\t\t\telse\n\t\t\t\ttextLeft = (1280 - bgWidth) / 2 + 32; // 0,0 is in the corner of a 720p view.. half of the difference to 1280 wide is the horizontal offset to the window corner\n\n\t\t\tfontInfo.setSize(18, 18);\n\t\t\tdtParams.textCurrentLoc = { textLeft, 720 - 40 };\n\t\t\tdtParams.lineOriginLoc = dtParams.textCurrentLoc;\n\t\t\tconst float spriteSize = 18;\n\t\t\tconst float halfSpriteSize = spriteSize / 2;\n\t\t\taetLoc = { 0, dtParams.textCurrentLoc.y + halfSpriteSize }; // the aets are centered on their location, so fudge this a little\n\t\t\taetScale = { spriteSize / 64, spriteSize / 64 }; // just approximated\n\n\t\t\tdtParams.colour = 0xffffffff;\n\t\t\tDrawing::drawTextW(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ENABLE_XADVANCE), L\"↑↓/ＬＲ:Move　\");\n\t\t\t\n\t\t\taetLoc.x = dtParams.textCurrentLoc.x + halfSpriteSize;\n\t\t\tsquareAet = Drawing::createAetLayer(3, dtParams.layer, Drawing::CREATEAET_20000, \"button_shikaku\", aetLoc, 0, nullptr, nullptr, 0, 0, aetScale, nullptr);\n\t\t\tdtParams.textCurrentLoc.x += spriteSize;\n\t\t\tDrawing::drawTextW(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ENABLE_XADVANCE), L\":Hide Menu　\");\n\n\t\t\taetLoc.x = dtParams.textCurrentLoc.x + halfSpriteSize;\n\t\t\tcrossAet = Drawing::createAetLayer(3, dtParams.layer, Drawing::CREATEAET_20000, \"button_batsu\", aetLoc, 0, nullptr, nullptr, 0, 0, aetScale, nullptr);\n\t\t\tdtParams.textCurrentLoc.x += spriteSize;\n\t\t\tif (menuHistory.size() == 0)\n\t\t\t\tDrawing::drawTextW(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ENABLE_XADVANCE), L\":Close　\");\n\t\t\telse\n\t\t\t\tDrawing::drawTextW(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ENABLE_XADVANCE), L\":Back　\");\n\t\t\t\n\t\t\taetLoc.x = dtParams.textCurrentLoc.x + halfSpriteSize;\n\t\t\tcircleAet = Drawing::createAetLayer(3, dtParams.layer, Drawing::CREATEAET_20000, \"button_maru\", aetLoc, 0, nullptr, nullptr, 0, 0, aetScale, nullptr);\n\t\t\tdtParams.textCurrentLoc.x += spriteSize;\n\t\t\tDrawing::drawTextW(&dtParams, (Drawing::drawTextFlags)(Drawing::DRAWTEXT_ENABLE_XADVANCE), L\":Select\");\n\t\t}\n\t}\n\n\tvoid Pause::OnFocusLost()\n\t{\n\t\tif (autoPause && isInGame() && !ignoreAutoPause)\n\t\t\tpause = true;\n\t}\n\n\tbool Pause::isPauseKeyTapped()\n\t{\n\t\treturn inputState->Tapped.Buttons & JVS_START;\n\t}\n\n\tbool Pause::isInGame()\n\t{\n\t\treturn *(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN && *(uint8_t*)PV_STATE_ADDRESS == 1;\n\t}\n\n\tbool Pause::hookedGiveUpFunc(void* cls)\n\t{\n\t\tif (giveUp || divaGiveUpFunc(cls))\n\t\t{\n\t\t\tgiveUp = false;\n\t\t\tpause = false;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tvoid Pause::hookedDivaPVEndFunc(uint64_t p1, char p2, char p3)\n\t{\n\t\tif (autoReplay && isInPV())\n\t\t{\n\t\t\tprintf(\"[TLAC] END triggered, restarting the PV\\n\");\n\n\t\t\trestart();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdivaPVEndFunc(p1, p2, p3);\n\t\t}\n\t}\n\n\tchar Pause::hookedScriptCommandFunc(uint64_t p1, uint64_t p2, uint64_t p3, void* p4, void* p5, char p6, char p7)\n\t{\n\t\tif (autoReplay)\n\t\t{\n\t\t\tint position = *(int*)(p1 + 180012);\n\t\t\tint cmd = *(int*)(p1 + 4 * position + 12);\n\n\t\t\t// printf(\"ARG: %lld, %lld, %lld, %p, %p, %d, %d - POS: %d, CMD: %d\\n\", p1, p2, p3, p4, p5, p6, p7, position, cmd);\n\n\t\t\tif (cmd == 83)\n\t\t\t{\n\t\t\t\tprintf(\"[TLAC] END_FADEOUT triggered but ignored\\n\");\n\n\t\t\t\t// fix stucking at restart and the PV Script Command Error\n\t\t\t\t*(int*)(p1 + 180012) = position + 3;\n\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn divaScriptCommandFunc(p1, p2, p3, p4, p5, p6, p7);\n\t}\n\n\tvoid Pause::setSEVolume(int amount)\n\t{\n\t\tplayerData->act_vol += amount;\n\t\tif (playerData->act_vol < 0) playerData->act_vol = 0;\n\t\tif (playerData->act_vol > 100) playerData->act_vol = 100;\n\t\tplayerData->act_slide_vol = playerData->act_vol;\n\t}\n\n\tvoid Pause::setMenuPos(menusets set, int pos, bool updateHistory)\n\t{\n\t\tmenusets newMenuSet;\n\n\t\tif (set >= 0 && set < menu.size())\n\t\t\tnewMenuSet = set;\n\t\telse\n\t\t\tnewMenuSet = MENUSET_MAIN;\n\n\t\tif (updateHistory && newMenuSet != curMenuSet)\n\t\t\tmenuHistory.push_back(std::pair<menusets, int>(curMenuSet, curMenuPos));\n\n\t\tcurMenuSet = newMenuSet;\n\n\t\tif (pos < 0)\n\t\t\tpos = menu[curMenuSet].items.size() - 1;\n\t\telse if (pos >= menu[curMenuSet].items.size())\n\t\t\tpos = 0;\n\n\t\tcurMenuPos = pos;\n\n\t\tmenuItemMoveTime = std::chrono::high_resolution_clock::now(); // restart animations\n\t}\n\n\tfloat Pause::getMenuAnimPos()\n\t{\n\t\tconst int duration = 1500000000; // 1.5s\n\t\treturn (float)((std::chrono::high_resolution_clock::now() - menuItemMoveTime) % std::chrono::nanoseconds(duration)).count() / (float)duration;\n\t}\n\n\tvoid Pause::InjectCode(void* address, const std::vector<uint8_t> data)\n\t{\n\t\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\t\tDWORD oldProtect;\n\t\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\tmemcpy(address, data.data(), byteCount);\n\t\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/Pause.h",
    "content": "#pragma once\n#include \"../Constants.h\"\n#include \"EmulatorComponent.h\"\n#include \"PlayerData.h\"\n#include \"GameState.h\"\n#include \"../Utilities/Drawing.h\"\n#include \"Input/InputState.h\"\n#include \"Input/TouchSliderState.h\"\n#include \"Input/TouchPanelState.h\"\n#include <string>\n#include <vector>\n#include <chrono>\n\nnamespace TLAC::Components\n{\n\tclass Pause : public EmulatorComponent\n\t{\n\tpublic:\n\t\tPause();\n\t\t~Pause();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdatePostInput() override;\n\t\tvirtual void UpdateDraw2D() override;\n\t\tvirtual void OnFocusLost() override;\n\n\t\tstatic bool pause; // set pause to change pause state\n\t\tstatic bool giveUp; // set give up to end current song\n\n\t\tstatic bool autoPause; // pause when window loses focus\n\t\tstatic bool ignoreAutoPause; // ignore pause on PV\n\t\tstatic bool autoReplay; // loop PV\n\tprivate:\n\t\t// this is a mess of static so that menuItems can work\n\t\tstatic bool isPauseKeyTapped();\n\t\tstatic bool isInGame();\n\t\tstatic std::vector<bool> streamPlayStates;\n\t\tstatic void InjectCode(void* address, const std::vector<uint8_t> data);\n\n\t\tstatic bool isPaused; // tracks internal state\n\n\t\tstatic void saveOldPatchOps();\n\n\t\tstatic std::vector<uint8_t> origAetMovOp;\n\t\tstatic uint8_t* aetMovPatchAddress;\n\n\t\tstatic std::vector<uint8_t> origFramespeedOp;\n\t\tstatic uint8_t* framespeedPatchAddress;\n\t\tstatic float_t origDeltaFrameHistory;\n\t\tstatic int32_t origDeltaFrameHistoryInt;\n\t\tstatic float_t* deltaFrameHistoryAddress;\n\t\tstatic int32_t* deltaFrameHistoryIntAddress;\n\n\t\tstatic std::vector<uint8_t> origAgeageHairOp;\n\t\tstatic uint8_t* ageageHairPatchAddress;\n\n\t\tstatic bool hookedGiveUpFunc(void* cls);\n\t\tstatic void hookedDivaPVEndFunc(uint64_t, char, char);\n\t\tstatic char hookedScriptCommandFunc(uint64_t, uint64_t, uint64_t, void*, void*, char, char);\n\n\t\tstatic void setSEVolume(int amount);\n\n\t\tstatic PlayerData* playerData;\n\t\tstatic InputState* inputState;\n\t\tstatic TouchSliderState* sliderState;\n\t\tstatic TouchPanelState* panelState;\n\t\tstatic ComponentsManager* componentsManager;\n\n\t\tstatic const JvsButtons allButtons = (JvsButtons)(JVS_START | JVS_TRIANGLE | JVS_SQUARE | JVS_CROSS | JVS_CIRCLE | JVS_L | JVS_R); // deliberately only has control panel buttons\n\t\tstatic JvsButtons filteredButtons;\n\t\tstatic int lastTouchType;\n\n\t\tstatic const int menuX = 640;\n\t\tstatic const int menuY = 360;\n\t\tstatic const int menuItemWidth = 180;\n\t\tstatic const int menuItemHeight = 36;\n\t\tstatic const int menuItemPadding = 12;\n\t\tstatic const int menuItemTotalHeight = menuItemHeight + menuItemPadding;\n\t\tstatic const int menuTextSize = 24;\n\n\t\tstatic const uint32_t bgLayer = 0x18;\n\t\tstatic const uint32_t contentLayer = 0x19; // same as startup screen\n\n\t\tstatic bool showUI;\n\n\t\tstatic int selResultAet1;\n\t\tstatic int selResultAet2;\n\t\tstatic int selResultAet3;\n\t\tstatic int selResultAet4;\n\t\tstatic int triangleAet;\n\t\tstatic int squareAet;\n\t\tstatic int crossAet;\n\t\tstatic int circleAet;\n\n\t\tenum menusets\n\t\t{\n\t\t\tMENUSET_MAIN = 0,\n\t\t\tMENUSET_SEVOL = 1,\n\t\t\tMENUSET_PV = 2,\n\t\t};\n\n\t\tstruct menuItem\n\t\t{\n\t\t\tstd::string name;\n\t\t\tvoid(*callback)();\n\t\t\tbool keyRepeat; // unimplemented\n\n\t\t\tmenuItem(std::string _name, void(*_callback)(), bool _keyRepeat)\n\t\t\t{\n\t\t\t\tname = _name;\n\t\t\t\tcallback = _callback;\n\t\t\t\tkeyRepeat = _keyRepeat;\n\t\t\t}\n\t\t};\n\n\t\tstruct menuSet\n\t\t{\n\t\t\tstd::string name;\n\t\t\tstd::vector<menuItem> items;\n\t\t};\n\n\t\tstatic int curMenuPos;\n\t\tstatic std::vector<std::pair<menusets, int>> menuHistory; // used for implementing back button in menus\n\t\tstatic menusets curMenuSet;\n\n\t\tstatic std::chrono::time_point<std::chrono::high_resolution_clock> menuItemMoveTime; // used for animation\n\n\t\t// static void mainmenu() { setMenuPos(MENUSET_MAIN, 0); menuHistory.resize(0); };\n\t\tstatic void menuback()\n\t\t{\n\t\t\tif (menuHistory.size() == 0)\n\t\t\t{\n\t\t\t\t// mainmenu();\n\t\t\t\tunpause();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstd::pair<menusets, int> menuPos = menuHistory.back();\n\t\t\t\tmenuHistory.pop_back();\n\n\t\t\t\tsetMenuPos(menuPos.first, menuPos.second, false);\n\t\t\t}\n\t\t}\n\t\tstatic void unpause() { pause = false; };\n\t\tstatic void restart()\n\t\t{\n\t\t\t// fix the percent calculation if restarted while in the challenge time\n\t\t\tbool isInChallengeTime = *(bool*)(0x140C94438 + 38);\n\n\t\t\tif (isInChallengeTime) {\n\t\t\t\tuint64_t baseA1 = 0x140cdd8d0;\n\t\t\t\tvoid(*doResetChallenge)(uint64_t, uint64_t, uint64_t) = (void(*)(uint64_t, uint64_t, uint64_t))0x14011B010;\n\t\t\t\tdoResetChallenge(baseA1 + 180088, baseA1 + 180088, 0);\n\n\t\t\t\t// it is used in 14011BEA0 after the challenge time starts or ends\n\t\t\t\t// and looks like required to do the reset process properly\n\t\t\t\t*(bool*)(baseA1 + 180181) = 1;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t140d0b510+2 = 0, 140d0b510+14 = 8 for restart\n\n\t\t\talso 140cdd8d0+8 (something less than 0x1a but idk what) -- controls a switch statement in FUN_1400fddc0\n\n\t\t\t0x18: PV seems good, audio good, chart and score broken? -- timing resets, notes don't\n\t\t\t0x14: PVs a little bugged (not major), chart and scoring fine, life still doesn't reset\n\t\t\t0x10: life resets now, but old graphics don't clear\n\n\t\t\t0x15: same as 0x14\n\t\t\t0x16: doesn't actually reset????\n\t\t\t0x17: crash\n\t\t\t0x12: like 0x10 but life isn't cleared\n\n\t\t\tcase 0x11 seems to clear life\n\t\t\tcase 0x15 seems to clear score (maybe note data)\n\t\t\tcase 0x18 seems to fix timing\n\n\t\t\tpatch 0x15 at 1401038cd (was 0x12), 0x18 at 140103b94 (was 0x16)\n\t\t\tthen call with 0x11\n\t\t\thopefully it'll work\n\n\t\t\tpercentage doesn't fully reset by the looks of it????\n\t\t\trip\n\t\t\t(actually was hold and slide scores -- fixed by manually clearing them now)\n\t\t\t*/\n\n\t\t\t// inject flow overrides to switch cases in FUN_1400fddc0\n\t\t\tInjectCode((void*)0x1401038cd, { 0x15 }); InjectCode((void*)0x140103b94, { 0x18 });\n\n\t\t\tbool hasTaskMovie[2] = { false, false };\n\t\t\tbool waitTaskMovie = false;\n\t\t\tsize_t(*taskMovieGet)(int32_t) = (size_t(*)(int32_t))0x14041ED30;\n\t\t\t// reset movie position\n\t\t\tfor (int i = 0; i < 2; i++) {\n\t\t\t\tsize_t taskMovie = taskMovieGet(i);\n\t\t\t\tif (taskMovie) {\n\t\t\t\t\tsize_t taskMoviePlayer = *(size_t*)(taskMovie + 0xB8);\n\t\t\t\t\tif (taskMoviePlayer) {\n\t\t\t\t\t\tsize_t iPlayer = *(size_t*)(taskMoviePlayer + 0x10);\n\t\t\t\t\t\tif (iPlayer) {\n\t\t\t\t\t\t\tsize_t iPlayerVtable = *(size_t*)(iPlayer + 0x00);\n\t\t\t\t\t\t\tint(*iPlayer__SetCurrentPosition)(size_t, double) = (int(*)(size_t, double)) * (size_t*)(iPlayerVtable + 0x60);\n\t\t\t\t\t\t\tiPlayer__SetCurrentPosition(iPlayer, 0.0);\n\n\t\t\t\t\t\t\t*(bool*)(taskMovie + 0xD1) = true;\n\t\t\t\t\t\t\thasTaskMovie[i] = true;\n\t\t\t\t\t\t\twaitTaskMovie = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// set parameters\n\t\t\t*(uint8_t*)PV_STATE_ADDRESS = 0; *(uint8_t*)PV_LOADING_STATE_ADDRESS = 8; *(int*)PV_INNER_LOADING_STATE_ADDRESS = 0x11;\n\n\t\t\tvoid(*doLoading)(uint64_t) = (void(*)(uint64_t))0x1400fddc0;\n\n\t\t\t// do loading until definitely done\n\t\t\twhile (*(int*)PV_INNER_LOADING_STATE_ADDRESS < 0x18)\n\t\t\t{\n\t\t\t\tdoLoading(0x140cdd8d0);\n\t\t\t}\n\n\t\t\t// wait till movie resets\n\t\t\tbool(*taskMovieCheckDisp)(size_t) = (bool(*)(size_t))0x14041F0E0;\n\t\t\twhile (waitTaskMovie) {\n\t\t\t\twaitTaskMovie = false;\n\n\t\t\t\tfor (int i = 0; i < 2; i++) {\n\t\t\t\t\tif (!hasTaskMovie[i])\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tsize_t taskMovie = taskMovieGet(i);\n\t\t\t\t\tif (taskMovie && !taskMovieCheckDisp(taskMovie))\n\t\t\t\t\t\twaitTaskMovie = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// for some reason the above doesn't reset all scoring stuff\n\t\t\t*(int*)0x140D0A9BC = 0; // total holds\n\t\t\t*(int*)0x140D0A9B8 = 0; // hold + multi\n\t\t\t*(int*)0x140D0A9C0 = 0; // slide\n\t\t\t*(uint8_t*)0x140D0A50C = 0; // not clear flag\n\n\t\t\t// only reset chance time while in normal mode\n\t\t\tif (!isInPV(false))\n\t\t\t{\n\t\t\t\t*(char*)0x140D0AA0F = 0; // chance time\n\t\t\t}\n\n\t\t\t// reset give up/end flags\n\t\t\t// because the code above doesn't reset them\n\t\t\t// and causing you to complete with MISSxTAKE \n\t\t\t// if you restarted after give up triggered\n\t\t\t*(char*)0x140D0AA09 = 0;\n\t\t\t*(char*)0x140D0AA0E = 0;\n\t\t\t*(char*)0x140D0AA20 = 0;\n\t\t\t*(char*)0x140D0AA35 = 0;\n\n\t\t\t// revert patches and unpause\n\t\t\tInjectCode((void*)0x1401038cd, { 0x12 }); InjectCode((void*)0x140103b94, { 0x16 });\n\t\t\tunpause();\n\t\t}\n\n\t\tstatic void giveup()\n\t\t{\n\t\t\tignoreAutoPause = false;\n\t\t\tautoReplay = false;\n\t\t\tgiveUp = true;\n\t\t};\n\n\t\tstatic void sevolorpvmenu()\n\t\t{\n\t\t\tsetMenuPos(isInPV() ? MENUSET_PV : MENUSET_SEVOL, 1);\n\t\t};\n\n\t\tstatic void pvloop() { autoReplay = !autoReplay; }\n\t\tstatic void pvignoreautopause() { ignoreAutoPause = !ignoreAutoPause; }\n\t\tstatic void sevolplus() { setSEVolume(10); };\n\t\tstatic void sevolminus() { setSEVolume(-10); };\n\n\t\tstatic bool isInPV(bool checkIsInGame = true)\n\t\t{\n\t\t\tif (checkIsInGame && !isInGame())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn *(char*)0x140C94438 == 2;\n\t\t}\n\n\t\t// contents are in Pause.cpp because they can't be inline here for a static (const) array/vec\n\t\tstatic std::vector<menuSet> menu;\n\n\t\tstatic void setMenuPos(menusets set, int pos, bool updateHistory = true);\n\n\t\tstatic float getMenuAnimPos();\n\n\t\tstatic TLAC::Utilities::Drawing::Point getMenuItemCoords(menusets set, int pos);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/PlayerData.h",
    "content": "#pragma once\n#include <stdint.h>\n\nstruct PlayerData\n{\n\tint8_t use_card;\n\tint8_t freeplay;\n\tint8_t field_2;\n\tint8_t field_3;\n\tint32_t card_type;\n\tint32_t field_8;\n\tint32_t field_C;\n\tint32_t field_10;\n\tint32_t field_14;\n\tint32_t field_18;\n\tint32_t field_1C;\n\tint32_t field_20;\n\tint32_t field_24;\n\tint32_t field_28;\n\tint32_t field_2C;\n\tint32_t field_30;\n\tint32_t field_34;\n\tint32_t field_38;\n\tint32_t field_3C;\n\tint32_t field_40;\n\tint32_t field_44;\n\tint32_t field_48;\n\tint32_t field_4C;\n\tint32_t field_50;\n\tint32_t field_54;\n\tint32_t field_58;\n\tint32_t field_5C;\n\tint32_t field_60;\n\tint32_t field_64;\n\tint32_t field_68;\n\tint32_t field_6C;\n\tint32_t field_70;\n\tint32_t field_74;\n\tint32_t field_78;\n\tint32_t field_7C;\n\tint32_t field_80;\n\tint32_t field_84;\n\tint32_t field_88;\n\tint32_t field_8C;\n\tint32_t field_90;\n\tint32_t field_94;\n\tint32_t field_98;\n\tint32_t field_9C;\n\tint32_t field_A0;\n\tint32_t field_A4;\n\tint32_t field_A8;\n\tint32_t field_AC;\n\tint32_t field_B0;\n\tint32_t field_B4;\n\tint32_t field_B8;\n\tint32_t field_BC;\n\tint32_t field_C0;\n\tint32_t field_C4;\n\tint32_t field_C8;\n\tint32_t field_CC;\n\tint32_t play_data_id;\n\tint32_t accept_index;\n\tint32_t start_index;\n\tint32_t field_DC;\n\tchar* player_name;\n\tint32_t field_E8;\n\tint32_t field_EC;\n\tint32_t field_F0;\n\tint32_t field_F4;\n\tint32_t field_F8;\n\tint32_t field_FC;\n\tchar* level_name;\n\tint32_t field_108;\n\tint32_t field_10C;\n\tint32_t field_110;\n\tint32_t field_114;\n\tint32_t field_118;\n\tint32_t field_11C;\n\tint32_t level;\n\tint32_t level_plate_id;\n\tint32_t level_plate_effect;\n\tint32_t vocaloid_point;\n\tint32_t hp_vol;\n\tint32_t act_toggle;\n\tint32_t act_vol;\n\tint32_t act_slide_vol;\n\tint32_t field_140;\n\tint32_t field_144;\n\tint32_t field_148;\n\tint32_t field_14C;\n\tint32_t field_150;\n\tint32_t field_154;\n\tint32_t field_158;\n\tint32_t field_15C;\n\tint32_t field_160;\n\tint32_t field_164;\n\tint32_t field_168;\n\tint32_t field_16C;\n\tint32_t field_170; //170\n\tint32_t field_174;\n\tint32_t field_178;\n\tint32_t field_17C;\n\tint32_t field_180;\n\tint32_t field_184; //184\n\tint32_t field_188;\n\tint32_t field_18C;\n\tint32_t field_190;\n\tint32_t field_194;\n\tint32_t field_198; //198\n\tint32_t field_19C;\n\tint32_t field_1A0;\n\tint32_t field_1A4;\n\tint32_t field_1A8;\n\tint32_t field_1AC; //1AC\n\tint32_t field_1B0;\n\tint32_t field_1B4;\n\tint32_t field_1B8;\n\tint32_t field_1BC;\n\tint32_t module_equip0; //1C0\n\tint32_t module_equip1; //1C4\n\tint32_t module_equip2; //1C8\n\tint32_t module_equip3; //1CC\n\tint32_t module_equip4; //1D0\n\tint32_t module_equip5; //1D4\n\tint32_t module_equip_cmn0; //1D8\n\tint32_t module_equip_cmn1;//1DC\n\tint32_t module_equip_cmn2;//1E0\n\tint32_t module_equip_cmn3;//1E4\n\tint32_t module_equip_cmn4;//1E8\n\tint32_t module_equip_cmn5;//1EC\n\tint32_t field_1F0;//1F0\n\tint32_t field_1F4;\n\tint32_t field_1F8;\n\tint32_t field_1FC;\n\tint32_t field_200;\n\tint32_t field_204;\n\tint32_t field_208;\n\tint32_t field_20C;\n\tint32_t field_210;\n\tint32_t field_214;\n\tint32_t field_218;\n\tint32_t field_21C;\n\tint32_t field_220;\n\tint32_t field_224;\n\tint32_t field_228;\n\tint32_t field_22C;\n\tint32_t field_230;\n\tint32_t field_234;\n\tint32_t field_238;\n\tint32_t field_23C;\n\tint32_t module_hist; //240\n\tint32_t field_244;\n\tint32_t field_248;\n\tint32_t field_24C;\n\tint32_t field_250;\n\tint32_t field_254;\n\tint32_t field_258;\n\tint32_t field_25C;\n\tint32_t field_260;\n\tint32_t field_264;\n\tint32_t field_268;\n\tint32_t field_26C;\n\tint32_t field_270;\n\tint32_t field_274;\n\tint32_t field_278;\n\tint32_t field_27C;\n\tint32_t field_280;\n\tint32_t field_284;\n\tint32_t field_288;\n\tint32_t field_28C;\n\tint32_t field_290;\n\tint32_t field_294;\n\tint32_t field_298;\n\tint32_t field_29C;\n\tint32_t field_2A0;\n\tint32_t field_2A4;\n\tint32_t field_2A8;\n\tint32_t field_2AC;\n\tint8_t use_pv_module_equip;\n\tint8_t ch_pv_module_equip;\n\tint8_t field_2B2;\n\tint8_t field_2B3;\n\tint32_t module_filter_kind;\n\tint32_t field_2B8;\n\tint32_t field_2BC;\n\tint32_t field_2C0;\n\tint32_t field_2C4;\n\tint32_t field_2C8;\n\tint32_t field_2CC;\n\tint32_t field_2D0;\n\tint32_t field_2D4;\n\tint32_t field_2D8;\n\tint32_t field_2DC;\n\tint32_t field_2E0;\n\tint32_t field_2E4;\n\tint32_t field_2E8;\n\tint32_t field_2EC;\n\tint32_t field_2F0;\n\tint32_t field_2F4;\n\tint32_t field_2F8;\n\tint32_t field_2FC;\n\tint32_t field_300;\n\tint32_t field_304;\n\tint32_t field_308;\n\tint32_t field_30C;\n\tint32_t field_310;\n\tint32_t field_314;\n\tint32_t field_318;\n\tint32_t field_31C;\n\tint32_t field_320;\n\tint32_t field_324;\n\tint32_t field_328;\n\tint32_t field_32C;\n\tint32_t field_330;\n\tint32_t field_334;\n\tint32_t field_338;\n\tint32_t field_33C;\n\tint32_t field_340;\n\tint32_t field_344;\n\tint32_t field_348;\n\tint32_t field_34C;\n\tint32_t field_350;\n\tint32_t field_354;\n\tint32_t field_358;\n\tint32_t field_35C;\n\tint32_t field_360;\n\tint32_t field_364;\n\tint32_t field_368;\n\tint32_t field_36C;\n\tint32_t field_370;\n\tint32_t field_374;\n\tint32_t field_378;\n\tint32_t field_37C;\n\tint32_t field_380;\n\tint32_t field_384;\n\tint32_t field_388;\n\tint32_t field_38C;\n\tint32_t field_390;\n\tint32_t field_394;\n\tint32_t field_398;\n\tint32_t field_39C;\n\tint32_t field_3A0;\n\tint32_t field_3A4;\n\tint32_t field_3A8;\n\tint32_t field_3AC;\n\tint32_t field_3B0;\n\tint32_t field_3B4;\n\tint32_t field_3B8;\n\tint32_t field_3BC;\n\tint32_t field_3C0;\n\tint32_t field_3C4;\n\tint32_t field_3C8;\n\tint32_t field_3CC;\n\tint32_t field_3D0;\n\tint32_t field_3D4;\n\tint32_t field_3D8;\n\tint32_t field_3DC;\n\tint32_t field_3E0;\n\tint32_t field_3E4;\n\tint32_t field_3E8;\n\tint32_t field_3EC;\n\tint32_t field_3F0;\n\tint32_t field_3F4;\n\tint32_t field_3F8;\n\tint32_t field_3FC;\n\tint32_t field_400;\n\tint32_t field_404;\n\tint32_t field_408;\n\tint32_t field_40C;\n\tint32_t field_410;\n\tint32_t field_414;\n\tint32_t field_418;\n\tint32_t field_41C;\n\tint32_t field_420;\n\tint32_t field_424;\n\tint32_t field_428;\n\tint32_t field_42C;\n\tint32_t field_430;\n\tint32_t field_434;\n\tint32_t field_438;\n\tint32_t field_43C;\n\tint32_t field_440;\n\tint32_t field_444;\n\tint32_t field_448;\n\tint32_t field_44C;\n\tint32_t field_450;\n\tint32_t field_454;\n\tint32_t field_458;\n\tint32_t field_45C;\n\tint32_t field_460;\n\tint32_t field_464;\n\tint32_t field_468;\n\tint32_t field_46C;\n\tint32_t field_470;\n\tint32_t field_474;\n\tint32_t field_478;\n\tint32_t field_47C;\n\tint32_t field_480;\n\tint32_t field_484;\n\tint32_t field_488;\n\tint32_t field_48C;\n\tint32_t field_490;\n\tint32_t field_494;\n\tint32_t field_498;\n\tint32_t field_49C;\n\tint32_t field_4A0;\n\tint32_t field_4A4;\n\tint32_t field_4A8;\n\tint32_t field_4AC;\n\tint32_t field_4B0;\n\tint32_t field_4B4;\n\tint32_t field_4B8;\n\tint32_t field_4BC;\n\tint32_t field_4C0;\n\tint32_t field_4C4;\n\tint32_t field_4C8;\n\tint32_t field_4CC;\n\tint32_t field_4D0;\n\tint32_t field_4D4;\n\tint32_t field_4D8;\n\tint32_t field_4DC;\n\tint32_t field_4E0;\n\tint32_t field_4E4;\n\tint32_t field_4E8;\n\tint32_t field_4EC;\n\tint32_t field_4F0;\n\tint32_t field_4F4;\n\tint32_t field_4F8;\n\tint32_t field_4FC;\n\tint32_t field_500;\n\tint32_t field_504;\n\tint32_t field_508;\n\tint32_t field_50C;\n\tint32_t field_510;\n\tint32_t field_514;\n\tint32_t field_518;\n\tint32_t field_51C;\n\tint32_t field_520;\n\tint32_t field_524;\n\tint32_t field_528;\n\tint32_t field_52C;\n\tint32_t field_530;\n\tint32_t field_534;\n\tint32_t field_538;\n\tint32_t field_53C;\n\tint32_t field_540;\n\tint32_t field_544;\n\tint32_t skin_equip;\n\tint32_t skin_equip_cmn;\n\tint32_t use_pv_skin_equip;\n\tint32_t btn_se_equip;\n\tint32_t btn_se_equip_cmn;\n\tint32_t use_pv_btn_se_equip;\n\tint32_t slide_se_equip;\n\tint32_t slide_se_equip_cmn;\n\tint32_t use_pv_slide_se_equip;\n\tint32_t chainslide_se_equip;\n\tint32_t chainslide_se_equip_cmn;\n\tint32_t use_pv_chainslide_se_equip;\n\tint32_t slidertouch_se_equip;\n\tint32_t slidertouch_se_equip_cmn;\n\tint32_t use_pv_slidertouch_se_equip;\n\tint32_t field_584;\n\tint* mylistA_begin;\n\tint* mylistA_end;\n\tint32_t field_598;\n\tint32_t field_59C;\n\tint* mylistB_begin;\n\tint* mylistB_end;\n\tint32_t field_5B0;\n\tint32_t field_5B4;\n\tint* mylistC_begin;\n\tint* mylistC_end;\n\tint32_t field_5C8;\n\tint32_t field_5CC;\n\tint32_t field_5D0;\n\tint32_t field_5D4;\n\tint32_t field_5D8;\n\tint32_t field_5DC;\n\tint32_t field_5E0;\n\tint32_t field_5E4;\n\tint32_t field_5E8;\n\tint32_t field_5EC;\n\tint32_t field_5F0;\n\tint32_t field_5F4;\n\tint32_t field_5F8;\n\tint32_t field_5FC;\n\tint32_t field_600;\n\tint32_t field_604;\n\tint32_t field_608;\n\tint32_t field_60C;\n\tint32_t field_610;\n\tint32_t field_614;\n\tint32_t field_618;\n\tint32_t field_61C;\n\tint32_t field_620;\n\tint32_t field_624;\n\tint32_t field_628;\n\tint32_t field_62C;\n\tint32_t field_630;\n\tint32_t field_634;\n\tint32_t field_638;\n\tint32_t field_63C;\n\tint32_t field_640;\n\tint32_t field_644;\n\tint32_t field_648;\n\tint32_t field_64C;\n\tint32_t field_650;\n\tint32_t field_654;\n\tint32_t field_658;\n\tint32_t field_65C;\n\tint32_t field_660;\n\tint32_t field_664;\n\tint32_t field_668;\n\tint32_t field_66C;\n\tint32_t field_670;\n\tint32_t field_674;\n\tint32_t field_678;\n\tint32_t field_67C;\n\tint32_t field_680;\n\tint32_t field_684;\n\tint32_t field_688;\n\tint32_t field_68C;\n\tint32_t field_690;\n\tint32_t field_694;\n\tint32_t field_698;\n\tint32_t field_69C;\n\tint32_t field_6A0;\n\tint32_t field_6A4;\n\tint32_t field_6A8;\n\tint32_t field_6AC;\n\tint32_t field_6B0;\n\tint32_t field_6B4;\n\tint32_t field_6B8;\n\tint32_t field_6BC;\n\tint32_t field_6C0;\n\tint32_t field_6C4;\n\tint32_t field_6C8;\n\tint32_t field_6CC;\n\tint32_t field_6D0;\n\tint32_t field_6D4;\n\tint32_t field_6D8;\n\tint32_t field_6DC;\n\tint32_t field_6E0;\n\tint32_t field_6E4;\n\tint32_t field_6E8;\n\tint32_t field_6EC;\n\tint32_t field_6F0;\n\tint32_t field_6F4;\n\tint32_t field_6F8;\n\tint32_t field_6FC;\n\tint32_t field_700;\n\tint32_t field_704;\n\tint32_t field_708;\n\tint32_t field_70C;\n\tint32_t field_710;\n\tint32_t field_714;\n\tint32_t field_718;\n\tint32_t field_71C;\n\tint32_t field_720;\n\tint32_t field_724;\n\tint32_t field_728;\n\tint32_t field_72C;\n\tint32_t field_730;\n\tint32_t field_734;\n\tint32_t field_738;\n\tint32_t field_73C;\n\tint32_t field_740;\n\tint32_t field_744;\n\tint32_t field_748;\n\tint32_t field_74C;\n\tint32_t field_750;\n\tint32_t field_754;\n\tint32_t field_758;\n\tint32_t field_75C;\n\tint32_t field_760;\n\tint32_t field_764;\n\tint32_t field_768;\n\tint32_t field_76C;\n\tint32_t field_770;\n\tint32_t field_774;\n\tint32_t field_778;\n\tint32_t field_77C;\n\tint32_t field_780;\n\tint32_t field_784;\n\tint32_t field_788;\n\tint32_t field_78C;\n\tint32_t field_790;\n\tint32_t field_794;\n\tint32_t field_798;\n\tint32_t field_79C;\n\tint32_t field_7A0;\n\tint32_t field_7A4;\n\tint32_t field_7A8;\n\tint32_t field_7AC;\n\tint32_t field_7B0;\n\tint32_t field_7B4;\n\tint32_t field_7B8;\n\tint32_t field_7BC;\n\tint32_t field_7C0;\n\tint32_t field_7C4;\n\tint32_t field_7C8;\n\tint32_t field_7CC;\n\tint32_t field_7D0;\n\tint32_t field_7D4;\n\tint32_t field_7D8;\n\tint32_t field_7DC;\n\tint32_t field_7E0;\n\tint32_t field_7E4;\n\tint32_t field_7E8;\n\tint32_t field_7EC;\n\tint32_t field_7F0;\n\tint32_t field_7F4;\n\tint32_t field_7F8;\n\tint32_t field_7FC;\n\tint32_t field_800;\n\tint32_t field_804;\n\tint32_t field_808;\n\tint32_t field_80C;\n\tint32_t field_810;\n\tint32_t field_814;\n\tint32_t field_818;\n\tint32_t field_81C;\n\tint32_t field_820;\n\tint32_t field_824;\n\tint32_t field_828;\n\tint32_t field_82C;\n\tint32_t field_830;\n\tint32_t field_834;\n\tint32_t field_838;\n\tint32_t field_83C;\n\tint32_t field_840;\n\tint32_t field_844;\n\tint32_t field_848;\n\tint32_t field_84C;\n\tint32_t field_850;\n\tint32_t field_854;\n\tint32_t field_858;\n\tint32_t field_85C;\n\tint32_t field_860;\n\tint32_t field_864;\n\tint32_t field_868;\n\tint32_t field_86C;\n\tint32_t field_870;\n\tint32_t field_874;\n\tint32_t field_878;\n\tint32_t field_87C;\n\tint32_t field_880;\n\tint32_t field_884;\n\tint32_t field_888;\n\tint32_t field_88C;\n\tint32_t field_890;\n\tint32_t field_894;\n\tint32_t field_898;\n\tint32_t field_89C;\n\tint32_t field_8A0;\n\tint32_t field_8A4;\n\tint32_t field_8A8;\n\tint32_t field_8AC;\n\tint32_t field_8B0;\n\tint32_t field_8B4;\n\tint32_t field_8B8;\n\tint32_t field_8BC;\n\tint32_t field_8C0;\n\tint32_t field_8C4;\n\tint32_t field_8C8;\n\tint32_t field_8CC;\n\tint32_t field_8D0;\n\tint32_t field_8D4;\n\tint32_t field_8D8;\n\tint32_t field_8DC;\n\tint32_t field_8E0;\n\tint32_t field_8E4;\n\tint32_t field_8E8;\n\tint32_t field_8EC;\n\tint32_t field_8F0;\n\tint32_t field_8F4;\n\tint32_t field_8F8;\n\tint32_t field_8FC;\n\tint32_t field_900;\n\tint32_t field_904;\n\tint32_t field_908;\n\tint32_t field_90C;\n\tint32_t field_910;\n\tint32_t field_914;\n\tint32_t field_918;\n\tint32_t field_91C;\n\tint32_t field_920;\n\tint32_t field_924;\n\tint32_t field_928;\n\tint32_t field_92C;\n\tint32_t field_930;\n\tint32_t field_934;\n\tint32_t field_938;\n\tint32_t field_93C;\n\tint32_t field_940;\n\tint32_t field_944;\n\tint32_t field_948;\n\tint32_t field_94C;\n\tint32_t field_950;\n\tint32_t field_954;\n\tint32_t field_958;\n\tint32_t field_95C;\n\tint32_t field_960;\n\tint32_t field_964;\n\tint32_t field_968;\n\tint32_t field_96C;\n\tint32_t field_970;\n\tint32_t field_974;\n\tint32_t field_978;\n\tint32_t field_97C;\n\tint32_t field_980;\n\tint32_t field_984;\n\tint32_t field_988;\n\tint32_t field_98C;\n\tint32_t field_990;\n\tint32_t field_994;\n\tint32_t field_998;\n\tint32_t field_99C;\n\tint32_t field_9A0;\n\tint32_t field_9A4;\n\tint32_t field_9A8;\n\tint32_t field_9AC;\n\tint32_t field_9B0;\n\tint32_t field_9B4;\n\tint32_t field_9B8;\n\tint32_t field_9BC;\n\tint32_t field_9C0;\n\tint32_t field_9C4;\n\tint32_t field_9C8;\n\tint32_t field_9CC;\n\tint32_t field_9D0;\n\tint32_t field_9D4;\n\tint32_t field_9D8;\n\tint32_t field_9DC;\n\tint32_t field_9E0;\n\tint32_t field_9E4;\n\tint32_t field_9E8;\n\tint32_t field_9EC;\n\tint32_t field_9F0;\n\tint32_t field_9F4;\n\tint32_t field_9F8;\n\tint32_t field_9FC;\n\tint32_t field_A00;\n\tint32_t field_A04;\n\tint32_t field_A08;\n\tint32_t field_A0C;\n\tint32_t field_A10;\n\tint32_t field_A14;\n\tint32_t field_A18;\n\tint32_t field_A1C;\n\tint32_t field_A20;\n\tint32_t field_A24;\n\tint32_t field_A28;\n\tint32_t field_A2C;\n\tint32_t field_A30;\n\tint32_t field_A34;\n\tint32_t field_A38;\n\tint32_t field_A3C;\n\tint32_t field_A40;\n\tint32_t field_A44;\n\tint32_t field_A48;\n\tint32_t field_A4C;\n\tint32_t field_A50;\n\tint32_t field_A54;\n\tint32_t field_A58;\n\tint32_t field_A5C;\n\tint32_t field_A60;\n\tint32_t field_A64;\n\tint32_t field_A68;\n\tint32_t field_A6C;\n\tint32_t field_A70;\n\tint32_t field_A74;\n\tint32_t field_A78;\n\tint32_t field_A7C;\n\tint32_t field_A80;\n\tint32_t field_A84;\n\tint32_t field_A88;\n\tint32_t field_A8C;\n\tint32_t field_A90;\n\tint32_t field_A94;\n\tint32_t field_A98;\n\tint32_t field_A9C;\n\tint32_t field_AA0;\n\tint32_t field_AA4;\n\tint32_t field_AA8;\n\tint32_t field_AAC;\n\tint32_t field_AB0;\n\tint32_t field_AB4;\n\tint32_t field_AB8;\n\tint32_t field_ABC;\n\tint32_t field_AC0;\n\tint32_t field_AC4;\n\tint32_t field_AC8;\n\tint32_t field_ACC;\n\tint32_t field_AD0;\n\tint32_t field_AD4;\n\tint32_t field_AD8;\n\tint32_t field_ADC;\n\tint32_t field_AE0;\n\tint32_t field_AE4;\n\tint32_t field_AE8;\n\tint32_t field_AEC;\n\tint32_t field_AF0;\n\tint32_t field_AF4;\n\tint32_t field_AF8;\n\tint32_t field_AFC;\n\tint32_t field_B00;\n\tint32_t field_B04;\n\tint32_t field_B08;\n\tint32_t field_B0C;\n\tint32_t field_B10;\n\tint32_t field_B14;\n\tint32_t field_B18;\n\tint32_t field_B1C;\n\tint32_t field_B20;\n\tint32_t field_B24;\n\tint32_t field_B28;\n\tint32_t field_B2C;\n\tint32_t field_B30;\n\tint32_t field_B34;\n\tint32_t field_B38;\n\tint32_t field_B3C;\n\tint32_t field_B40;\n\tint32_t field_B44;\n\tint32_t field_B48;\n\tint32_t field_B4C;\n\tint32_t field_B50;\n\tint32_t field_B54;\n\tint32_t field_B58;\n\tint32_t field_B5C;\n\tint32_t field_B60;\n\tint32_t field_B64;\n\tint32_t field_B68;\n\tint32_t field_B6C;\n\tint32_t field_B70;\n\tint32_t field_B74;\n\tint32_t field_B78;\n\tint32_t field_B7C;\n\tint32_t field_B80;\n\tint32_t field_B84;\n\tint32_t field_B88;\n\tint32_t field_B8C;\n\tint32_t field_B90;\n\tint32_t field_B94;\n\tint32_t field_B98;\n\tint32_t field_B9C;\n\tint32_t field_BA0;\n\tint32_t field_BA4;\n\tint32_t field_BA8;\n\tint32_t field_BAC;\n\tint32_t field_BB0;\n\tint32_t field_BB4;\n\tint32_t field_BB8;\n\tint32_t field_BBC;\n\tint32_t field_BC0;\n\tint32_t field_BC4;\n\tint32_t field_BC8;\n\tint32_t field_BCC;\n\tint32_t field_BD0;\n\tint32_t field_BD4;\n\tint32_t field_BD8;\n\tint32_t field_BDC;\n\tint32_t field_BE0;\n\tint32_t field_BE4;\n\tint32_t field_BE8;\n\tint32_t field_BEC;\n\tint32_t field_BF0;\n\tint32_t field_BF4;\n\tint32_t field_BF8;\n\tint32_t field_BFC;\n\tint32_t field_C00;\n\tint32_t field_C04;\n\tint32_t field_C08;\n\tint32_t field_C0C;\n\tint32_t field_C10;\n\tint32_t field_C14;\n\tint32_t field_C18;\n\tint32_t field_C1C;\n\tint32_t field_C20;\n\tint32_t field_C24;\n\tint32_t field_C28;\n\tint32_t field_C2C;\n\tint32_t field_C30;\n\tint32_t field_C34;\n\tint32_t field_C38;\n\tint32_t field_C3C;\n\tint32_t field_C40;\n\tint32_t field_C44;\n\tint32_t field_C48;\n\tint32_t field_C4C;\n\tint32_t field_C50;\n\tint32_t field_C54;\n\tint32_t field_C58;\n\tint32_t field_C5C;\n\tint32_t field_C60;\n\tint32_t field_C64;\n\tint32_t field_C68;\n\tint32_t field_C6C;\n\tint32_t field_C70;\n\tint32_t field_C74;\n\tint32_t field_C78;\n\tint32_t field_C7C;\n\tint32_t field_C80;\n\tint32_t field_C84;\n\tint32_t field_C88;\n\tint32_t field_C8C;\n\tint32_t field_C90;\n\tint32_t field_C94;\n\tint32_t field_C98;\n\tint32_t field_C9C;\n\tint32_t field_CA0;\n\tint32_t field_CA4;\n\tint32_t field_CA8;\n\tint32_t field_CAC;\n\tint32_t field_CB0;\n\tint32_t field_CB4;\n\tint32_t field_CB8;\n\tint32_t field_CBC;\n\tint32_t field_CC0;\n\tint32_t field_CC4;\n\tint32_t field_CC8;\n\tint32_t field_CCC;\n\tint32_t field_CD0;\n\tint32_t field_CD4;\n\tint32_t field_CD8;\n\tint32_t field_CDC;\n\tint32_t field_CE0;\n\tint32_t field_CE4;\n\tint32_t field_CE8;\n\tint32_t field_CEC;\n\tint32_t field_CF0;\n\tint32_t field_CF4;\n\tint32_t field_CF8;\n\tint32_t field_CFC;\n\tint32_t field_D00;\n\tint32_t field_D04;\n\tint32_t field_D08;\n\tint32_t field_D0C;\n\tint32_t field_D10;\n\tint32_t field_D14;\n\tint32_t field_D18;\n\tint32_t field_D1C;\n\tint32_t field_D20;\n\tint32_t field_D24;\n\tint32_t field_D28;\n\tint32_t field_D2C;\n\tint32_t field_D30;\n\tint32_t field_D34;\n\tint32_t field_D38;\n\tint32_t field_D3C;\n\tint32_t field_D40;\n\tint32_t field_D44;\n\tint32_t field_D48;\n\tint32_t field_D4C;\n\tint32_t field_D50;\n\tint32_t field_D54;\n\tint32_t field_D58;\n\tint32_t field_D5C;\n\tint32_t field_D60;\n\tint32_t field_D64;\n\tint32_t field_D68;\n\tint32_t field_D6C;\n\tint32_t field_D70;\n\tint32_t field_D74;\n\tint32_t field_D78;\n\tint32_t field_D7C;\n\tint32_t field_D80;\n\tint32_t field_D84;\n\tint32_t field_D88;\n\tint32_t field_D8C;\n\tint32_t field_D90;\n\tuint8_t clear_border;\n\tuint8_t field_D95;\n\tuint8_t field_D96;\n\tuint8_t field_D97;\n\tint32_t field_D98;\n\tint32_t field_D9C;\n\tint32_t field_DA0;\n\tint32_t field_DA4;\n\tint32_t field_DA8;\n\tint32_t field_DAC;\n\tint32_t field_DB0;\n\tint32_t field_DB4;\n\tint32_t field_DB8;\n\tint32_t field_DBC;\n\tint32_t field_DC0;\n\tint32_t field_DC4;\n\tint32_t field_DC8;\n\tint32_t field_DCC;\n\tint32_t field_DD0;\n\tint32_t field_DD4;\n\tint32_t field_DD8;\n\tint32_t field_DDC;\n\tint32_t field_DE0;\n\tint32_t field_DE4;\n\tint32_t field_DE8;\n\tint32_t field_DEC;\n\tint32_t field_DF0;\n\tint32_t field_DF4;\n\tint32_t field_DF8;\n\tint32_t field_DFC;\n\tint32_t field_E00;\n\tint32_t field_E04;\n\tint32_t field_E08;\n\tint32_t field_E0C;\n\tint32_t field_E10;\n\tint32_t field_E14;\n\tint32_t field_E18;\n\tint32_t field_E1C;\n\tint32_t field_E20;\n\tint32_t field_E24;\n\tint32_t field_E28;\n\tint32_t field_E2C;\n\tint32_t field_E30;\n\tint8_t field_E34;\n\tint8_t game_opts;\n\tint8_t field_E36;\n\tint8_t field_E37;\n\tint32_t field_E38;\n\tint32_t field_E3C;\n\tint32_t field_E40;\n\tint32_t field_E44;\n\tint32_t field_E48;\n\tint32_t field_E4C;\n\tint32_t field_E50;\n\tint32_t field_E54;\n\tint32_t field_E58;\n\tint32_t field_E5C;\n\tint32_t field_E60;\n\tint32_t field_E64;\n\tint32_t field_E68;\n\tint32_t field_E6C;\n\tint32_t field_E70;\n\tint32_t field_E74;\n\tint32_t field_E78;\n\tint32_t field_E7C;\n\tint32_t field_E80;\n\tint32_t field_E84;\n\tint32_t field_E88;\n\tint32_t field_E8C;\n\tint32_t field_E90;\n\tint32_t field_E94;\n\tint32_t field_E98;\n\tint32_t field_E9C;\n\tint32_t field_EA0;\n\tint32_t field_EA4;\n\tint32_t field_EA8;\n\tint32_t field_EAC;\n\tint32_t field_EB0;\n\tint32_t field_EB4;\n\tint32_t field_EB8;\n\tint32_t field_EBC;\n\tint32_t field_EC0;\n\tint32_t field_EC4;\n\tint32_t field_EC8;\n\tint32_t field_ECC;\n\tint32_t field_ED0;\n\tint32_t field_ED4;\n\tint32_t field_ED8;\n\tint32_t field_EDC;\n\tint32_t field_EE0;\n\tint32_t field_EE4;\n\tint32_t field_EE8;\n\tint32_t field_EEC;\n\tint32_t field_EF0;\n\tint32_t field_EF4;\n\tint32_t field_EF8;\n\tint32_t field_EFC;\n};"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/PlayerDataManager.cpp",
    "content": "#include \"PlayerDataManager.h\"\n#include <string>\n#include \"../framework.h\"\n#include \"../Constants.h\"\n#include \"../Input/Keyboard/Keyboard.h\"\n#include \"../FileSystem/ConfigFile.h\"\n#include \"../Utilities/Operations.h\"\n#include <windows.h>\n#include \"GameState.h\"\n\nconst std::string PLAYER_DATA_FILE_NAME = \"playerdata.ini\";\nstatic WCHAR configPath[256];\nint* headitemequip = (int*)0x0000000141804CDC;\nint customheaditemequip;\nnamespace TLAC::Components\n{\n\tPlayerDataManager::PlayerDataManager()\n\t{\n\t}\n\n\tPlayerDataManager::~PlayerDataManager()\n\t{\n\t\tif (customPlayerData != nullptr)\n\t\t\tdelete customPlayerData;\n\t}\n\n\tconst char* PlayerDataManager::GetDisplayName()\n\t{\n\t\treturn \"player_data_manager\";\n\t}\n\n\tvoid PlayerDataManager::Initialize(ComponentsManager*)\n\t{\n\t\tplayerData = (PlayerData*)PLAYER_DATA_ADDRESS;\n\n\t\tApplyPatch();\n\t\tLoadConfig();\n\t\tApplyCustomData();\n\t}\n\n\tvoid PlayerDataManager::Update()\n\t{\n\t\tApplyCustomData();\n\n\t\t/*if (false && Input::Keyboard::GetInstance()->IsTapped(VK_F12))\n\t\t{\n\t\t\tprintf(\"[TLAC] PlayerDataManager::Update(): Loading config...\\n\");\n\t\t\tLoadConfig();\n\t\t}*/\n\n\t\t// nas, I moved the patches back to patches because please..  at least don't apply it every frame when it's not necessary lol\n\t\t// and reverting was the easiest way to undo that\n\n\t\tif (moduleCardWorkaround) {\n\t\t\tint* pvId = (int*)0x00000001418054C4;\n\t\t\tint* modState = (int*)0x00000001411A9790;\n\t\t\tint* loadState = (int*)0x0000000141197E58;\n\n\t\t\tif (!customPlayerData->UseCard)\n\t\t\t{\n\t\t\t\tif (*(char*)0x000000014CC5E270 == 32)\n\t\t\t\t{\n\t\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t*((BYTE*)0x00000001405BC8E6 + 0) = 0x00;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck);\n\t\t\t\t\tpvModuleLoaded = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!pvModuleLoaded)\n\t\t\t\t\t{\n\t\t\t\t\t\tpvModuleLoaded = true;\n\t\t\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t\t*((BYTE*)0x00000001405BC8E6 + 0) = 0x01;\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ((initPvId == false) || ((lastModState == 0) && (*modState == 1)))\n\t\t\t\t{\n\t\t\t\t\tif ((lastModState == 0) && (*modState == 1))\n\t\t\t\t\t{\n\t\t\t\t\t\t*(int*)0x00000001411A8A10 = *(int*)0x00000001411A8A28;\n\t\t\t\t\t\t*(int*)(0x00000001411A8A10 + 4) = *(int*)(0x00000001411A8A28 + 4);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A10 + 8) = *(int*)(0x00000001411A8A28 + 8);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A10 + 12) = *(int*)(0x00000001411A8A28 + 12);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A10 + 16) = *(int*)(0x00000001411A8A28 + 16);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A10 + 18) = *(int*)(0x00000001411A8A28 + 18);\n\t\t\t\t\t}\n\n\t\t\t\t\tinitPvId = true;\n\t\t\t\t\tlastModState = *modState;\n\t\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 0) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 1) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 2) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 3) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 4) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 5) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 6) = 0x90;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 7) = 0x90;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck);\n\t\t\t\t}\n\n\t\t\t\tif (((*modState == 0) && (*pvId != lastPvId)) || ((lastModState == 1) && (*modState == 0)))\n\t\t\t\t{\n\t\t\t\t\tif ((lastModState == 1) && (*modState == 0))\n\t\t\t\t\t{\n\t\t\t\t\t\t*(int*)0x00000001411A8A28 = *(int*)0x00000001411A8A10;\n\t\t\t\t\t\t*(int*)(0x00000001411A8A28 + 4) = *(int*)(0x00000001411A8A10 + 4);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A28 + 8) = *(int*)(0x00000001411A8A10 + 8);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A28 + 12) = *(int*)(0x00000001411A8A10 + 12);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A28 + 16) = *(int*)(0x00000001411A8A10 + 16);\n\t\t\t\t\t\t*(int*)(0x00000001411A8A28 + 18) = *(int*)(0x00000001411A8A10 + 18);\n\t\t\t\t\t}\n\n\t\t\t\t\tinitPvId = false;\n\t\t\t\t\tlastPvId = *pvId;\n\t\t\t\t\tlastModState = *modState;\n\t\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 0) = 0x42;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 1) = 0x89;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 2) = 0x84;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 3) = 0xb6;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 4) = 0xc0;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 5) = 0x01;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 6) = 0x00;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 7) = 0x00;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (*(char*)0x000000014CC5E270 == 32)\n\t\t\t\t{\n\t\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t*((BYTE*)0x00000001405BC8E6 + 0) = 0x00;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck);\n\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 0) = 0x42;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 1) = 0x89;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 2) = 0x84;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 3) = 0xb6;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 4) = 0xc0;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 5) = 0x01;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 6) = 0x00;\n\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 7) = 0x00;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck);\n\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCBE3, 2, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t*((BYTE*)0x00000001405BCBE3 + 0) = 0x00;\n\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCBE3, 2, oldProtect, &bck);\n\n\t\t\t\t\tpvModuleLoaded = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!pvModuleLoaded)\n\t\t\t\t\t{\n\t\t\t\t\t\tpvModuleLoaded = true;\n\t\t\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t\t*((BYTE*)0x00000001405BC8E6 + 0) = 0x00;\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck);\n\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 0) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 1) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 2) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 3) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 4) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 5) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 6) = 0x90;\n\t\t\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 7) = 0x90;\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck);\n\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCBE3, 2, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t\t\t*((BYTE*)0x00000001405BCBE3 + 0) = 0x01;\n\t\t\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCBE3, 2, oldProtect, &bck);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid PlayerDataManager::ApplyPatch()\n\t{\n\t\tDWORD oldProtect;\n\t\tVirtualProtect((void*)SET_DEFAULT_PLAYER_DATA_ADDRESS, sizeof(uint8_t), PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t{\n\t\t\t// prevent the PlayerData from being reset\n\t\t\t*(uint8_t*)(SET_DEFAULT_PLAYER_DATA_ADDRESS) = RET_OPCODE;\n\t\t}\n\t\tVirtualProtect((void*)SET_DEFAULT_PLAYER_DATA_ADDRESS, sizeof(uint8_t), oldProtect, &oldProtect);\n\n\t\t// allow player to select the module and extra item\n\t\tVirtualProtect((void*)MODSELECTOR_CHECK_FUNCTION_ERRRET_ADDRESS, sizeof(byte) * 2, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t{\n\t\t\t*(byte*)(MODSELECTOR_CHECK_FUNCTION_ERRRET_ADDRESS) = 0xB0; // xor al,al -> ld al,1\n\t\t\t*(byte*)(MODSELECTOR_CHECK_FUNCTION_ERRRET_ADDRESS + 0x1) = 0x01;\n\t\t}\n\t\tVirtualProtect((void*)MODSELECTOR_CHECK_FUNCTION_ERRRET_ADDRESS, sizeof(byte) * 2, oldProtect, &oldProtect);\n\t\t\n\t\t// fix annoying behavior of closing after changing module or item (don't yet know the reason, maybe NW/Card checks)\n\t\t{\n\t\t\tVirtualProtect((void*)MODSELECTOR_CLOSE_AFTER_MODULE, sizeof(uint8_t), PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t{\n\t\t\t\t*(uint8_t*)(MODSELECTOR_CLOSE_AFTER_MODULE) = JNE_OPCODE;\n\t\t\t}\n\t\t\tVirtualProtect((void*)MODSELECTOR_CLOSE_AFTER_MODULE, sizeof(uint8_t), oldProtect, &oldProtect);\n\t\t\tVirtualProtect((void*)MODSELECTOR_CLOSE_AFTER_CUSTOMIZE, sizeof(uint8_t), PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t{\n\t\t\t\t*(uint8_t*)(MODSELECTOR_CLOSE_AFTER_CUSTOMIZE) = JNE_OPCODE;\n\t\t\t}\n\t\t\tVirtualProtect((void*)MODSELECTOR_CLOSE_AFTER_CUSTOMIZE, sizeof(uint8_t), oldProtect, &oldProtect);\n\t\t}\n\t}\n\n\tvoid PlayerDataManager::LoadConfig()\n\t{\n\t\tif (playerData == nullptr)\n\t\t\treturn;\n\n\t\tFileSystem::ConfigFile config(framework::GetModuleDirectory(), PLAYER_DATA_FILE_NAME);\n\n\t\tif (!config.OpenRead())\n\t\t\treturn;\n\n\t\tif (customPlayerData != nullptr)\n\t\t\tdelete customPlayerData;\n\n\t\tcustomPlayerData = new CustomPlayerData();\n\t\tconfig.TryGetValue(\"player_name\", &customPlayerData->PlayerName);\n\t\tconfig.TryGetValue(\"level_name\", &customPlayerData->LevelName);\n\n\t\t// ScoreSaver copies & declaring non-playerdata values\n\t\tstd::string utf8path = TLAC::framework::GetModuleDirectory() + \"/playerdata.ini\";\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, configPath, 256);\n\n\t\tcustomPlayerData->LevelNum = config.GetIntegerValue(\"level\");\n\t\tcustomPlayerData->VocaloidPoints = config.GetIntegerValue(\"vocaloid_point\");\n\t\tcustomPlayerData->LevelPlateId = config.GetIntegerValue(\"level_plate_id\");\n\t\tcustomPlayerData->LevelPlateEffect = config.GetIntegerValue(\"level_plate_effect\");\n\t\tcustomPlayerData->SkinEquip = config.GetIntegerValue(\"skin_equip\");\n\t\tcustomPlayerData->BtnSeEquip = config.GetIntegerValue(\"btn_se_equip\");\n\t\tcustomPlayerData->SlideSeEquip = config.GetIntegerValue(\"slide_se_equip\");\n\t\tcustomPlayerData->ChainslideSeEquip = config.GetIntegerValue(\"chainslide_se_equip\");\n\t\tcustomPlayerData->SlidertouchSeEquip = config.GetIntegerValue(\"slidertouch_se_equip\");\n\t\tcustomPlayerData->ModuleEquipCmn0 = config.GetIntegerValue(\"module_equip_cmn0\");\n\t\tcustomPlayerData->ModuleEquipCmn1 = config.GetIntegerValue(\"module_equip_cmn1\");\n\t\tcustomPlayerData->ModuleEquipCmn2 = config.GetIntegerValue(\"module_equip_cmn2\");\n\t\tcustomPlayerData->ModuleEquipCmn3 = config.GetIntegerValue(\"module_equip_cmn3\");\n\t\tcustomPlayerData->ModuleEquipCmn4 = config.GetIntegerValue(\"module_equip_cmn4\");\n\t\tcustomPlayerData->ModuleEquipCmn5 = config.GetIntegerValue(\"module_equip_cmn5\");\n\t\tcustomPlayerData->ActionVol = config.GetIntegerValue(\"act_vol\");\n\t\tcustomPlayerData->ActionSlideVol = config.GetIntegerValue(\"act_slide_vol\");\n\t\tcustomPlayerData->UsePVSFXEquip = config.GetBooleanValue(\"use_pv_sfx_equip\");\n\t\tcustomPlayerData->UsePVSkinEquip = config.GetBooleanValue(\"use_pv_skin_equip\");\n\t\tcustomPlayerData->UsePVEquip = config.GetBooleanValue(\"use_pv_module_equip\");\n\t\tcustomPlayerData->ShowExcellentClearBorder = config.GetBooleanValue(\"border_excellent\");\n\t\tcustomPlayerData->ShowGreatClearBorder = config.GetBooleanValue(\"border_great\");\n\t\tcustomPlayerData->ShowRivalClearBorder = config.GetBooleanValue(\"border_rival\");\n\t\tcustomPlayerData->UseCard = config.GetBooleanValue(\"use_card\");\n\t\tcustomPlayerData->GameModifierOptions = config.GetBooleanValue(\"gamemode_options\");\n\t\tcustomPlayerData->ActionSE = config.GetBooleanValue(\"act_toggle\");\n\t\tmoduleCardWorkaround = config.GetBooleanValue(\"module_card_workaround\");\n\n\t\t// don't want to overwrite the default values\n\t\tauto setIfNotEqual = [](int* target, int value, int comparison)\n\t\t{\n\t\t\tif (value != comparison)\n\t\t\t\t* target = value;\n\t\t};\n\n\t\t// only need to run this line once on startup, otherwise cannot increase/decrease in-game (or use per-song settings!)\n\t\tsetIfNotEqual(&playerData->vocaloid_point, customPlayerData->VocaloidPoints, 0);\n\t\tsetIfNotEqual(&playerData->skin_equip_cmn, customPlayerData->SkinEquip, 0);\n\t\tsetIfNotEqual(&playerData->module_equip_cmn0, customPlayerData->ModuleEquipCmn0, 0);\n\t\tsetIfNotEqual(&playerData->module_equip_cmn1, customPlayerData->ModuleEquipCmn1, 0);\n\t\tsetIfNotEqual(&playerData->module_equip_cmn2, customPlayerData->ModuleEquipCmn2, 0);\n\t\tsetIfNotEqual(&playerData->module_equip_cmn3, customPlayerData->ModuleEquipCmn3, 0);\n\t\tsetIfNotEqual(&playerData->module_equip_cmn4, customPlayerData->ModuleEquipCmn4, 0);\n\t\tsetIfNotEqual(&playerData->module_equip_cmn5, customPlayerData->ModuleEquipCmn5, 0);\n\t\tsetIfNotEqual(&playerData->act_vol, customPlayerData->ActionVol, 100);\n\t\tsetIfNotEqual(&playerData->act_slide_vol, customPlayerData->ActionSlideVol, 100);\n\t\tsetIfNotEqual(&playerData->btn_se_equip_cmn, customPlayerData->BtnSeEquip, -1);\n\t\tsetIfNotEqual(&playerData->slide_se_equip_cmn, customPlayerData->SlideSeEquip, -1);\n\t\tsetIfNotEqual(&playerData->chainslide_se_equip_cmn, customPlayerData->ChainslideSeEquip, -1);\n\t\tsetIfNotEqual(&playerData->slidertouch_se_equip_cmn, customPlayerData->SlidertouchSeEquip, -1);\n\t\tsetIfNotEqual(&playerData->act_toggle, customPlayerData->ActionSE, 1);\n\n\t\tstd::string* mylistString;\n\t\tstd::vector<std::string> mylistStringVec;\n\n\t\tcustomPlayerData->Mylist[0].clear();\n\t\tconfig.TryGetValue(\"mylist_A\", &mylistString);\n\t\tif (mylistString != nullptr)\n\t\t{\n\t\t\tfor (std::string &pvStr : TLAC::Utilities::Split(*mylistString, \",\"))\n\t\t\t\tcustomPlayerData->Mylist[0].push_back(atoi(pvStr.c_str()));\n\t\t\tdelete mylistString;\n\t\t}\n\n\t\tcustomPlayerData->Mylist[1].clear();\n\t\tconfig.TryGetValue(\"mylist_B\", &mylistString);\n\t\tif (mylistString != nullptr)\n\t\t{\n\t\t\tfor (std::string &pvStr : TLAC::Utilities::Split(*mylistString, \",\"))\n\t\t\t\tcustomPlayerData->Mylist[1].push_back(atoi(pvStr.c_str()));\n\t\t\tdelete mylistString;\n\t\t}\n\n\t\tcustomPlayerData->Mylist[2].clear();\n\t\tconfig.TryGetValue(\"mylist_C\", &mylistString);\n\t\tif (mylistString != nullptr)\n\t\t{\n\t\t\tfor (std::string &pvStr : TLAC::Utilities::Split(*mylistString, \",\"))\n\t\t\t\tcustomPlayerData->Mylist[2].push_back(atoi(pvStr.c_str()));\n\t\t\tdelete mylistString;\n\t\t}\n\n\t\tif (moduleCardWorkaround) {\n\t\t\tif (!customPlayerData->UseCard)\n\t\t\t{\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x000000014010523F, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x000000014010523F + 0) = 0x30;\n\t\t\t\t*((BYTE*)0x000000014010523F + 1) = 0xC0;\n\t\t\t\t*((BYTE*)0x000000014010523F + 2) = 0x90;\n\t\t\t\tVirtualProtect((BYTE*)0x000000014010523F, 3, oldProtect, &bck);\n\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCC48, 6, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 0) = 0x90;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 1) = 0x90;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 2) = 0x90;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 3) = 0x90;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 4) = 0x90;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 5) = 0x90;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCC48, 6, oldProtect, &bck);\n\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x00000001405BC8E6 + 0) = 0x01;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck);\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x00000001405BC8E6 + 0) = 0x00;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BC8E6, 3, oldProtect, &bck);\n\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCC48, 6, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 0) = 0xC7;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 1) = 0x03;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 2) = 0x00;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 3) = 0x00;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 4) = 0x00;\n\t\t\t\t*((BYTE*)0x00000001405BCC48 + 5) = 0x00;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405BCC48, 6, oldProtect, &bck);\n\n\t\t\t\tVirtualProtect((BYTE*)0x000000014010523F, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x000000014010523F + 0) = 0x0F;\n\t\t\t\t*((BYTE*)0x000000014010523F + 1) = 0x94;\n\t\t\t\t*((BYTE*)0x000000014010523F + 2) = 0xC1;\n\t\t\t\tVirtualProtect((BYTE*)0x000000014010523F, 3, oldProtect, &bck);\n\n\t\t\t\t//just incase the player is reloading\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 0) = 0x42;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 1) = 0x89;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 2) = 0x84;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 3) = 0xb6;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 4) = 0xc0;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 5) = 0x01;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 6) = 0x00;\n\t\t\t\t*((BYTE*)0x00000001405CBBA3 + 7) = 0x00;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001405CBBA3, 8, oldProtect, &bck);\n\t\t\t}\n\t\t}\n\t}\n\n\n\tvoid PlayerDataManager::ApplyCustomData()\n\t{\n\t\t// don't want to overwrite the default values\n\t\tauto setIfNotEqual = [](int *target, int value, int comparison)\n\t\t{\n\t\t\tif (value != comparison)\n\t\t\t\t*target = value;\n\t\t};\n\t\t// check if the playerData in-game value is different from the customPlayerData value and update and save the ini\n\t\tif (customPlayerData->VocaloidPoints != playerData->vocaloid_point)\n\t\t{\n\t\t\tcustomPlayerData->VocaloidPoints = playerData->vocaloid_point;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->vocaloid_point);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"vocaloid_point\", val, configPath);\n\t\t}\n\t\t// save module choices to module_equip_cmn[0-5]\n\t\tif (customPlayerData->ModuleEquipCmn0 != playerData->module_equip_cmn0)\n\t\t{\n\t\t\tcustomPlayerData->ModuleEquipCmn0 = playerData->module_equip_cmn0;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->module_equip_cmn0);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"module_equip_cmn0\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ModuleEquipCmn1 != playerData->module_equip_cmn1)\n\t\t{\n\t\t\tcustomPlayerData->ModuleEquipCmn1 = playerData->module_equip_cmn1;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->module_equip_cmn1);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"module_equip_cmn1\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ModuleEquipCmn2 != playerData->module_equip_cmn2)\n\t\t{\n\t\t\tcustomPlayerData->ModuleEquipCmn2 = playerData->module_equip_cmn2;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->module_equip_cmn2);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"module_equip_cmn2\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ModuleEquipCmn3 != playerData->module_equip_cmn3)\n\t\t{\n\t\t\tcustomPlayerData->ModuleEquipCmn3 = playerData->module_equip_cmn3;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->module_equip_cmn3);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"module_equip_cmn3\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ModuleEquipCmn4 != playerData->module_equip_cmn4)\n\t\t{\n\t\t\tcustomPlayerData->ModuleEquipCmn4 = playerData->module_equip_cmn4;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->module_equip_cmn4);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"module_equip_cmn4\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ModuleEquipCmn5 != playerData->module_equip_cmn5)\n\t\t{\n\t\t\tcustomPlayerData->ModuleEquipCmn5 = playerData->module_equip_cmn5;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->module_equip_cmn5);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"module_equip_cmn5\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ActionVol != playerData->act_vol)\n\t\t{\n\t\t\tcustomPlayerData->ActionVol = playerData->act_vol;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->act_vol);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"act_vol\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->ActionSlideVol != playerData->act_slide_vol)\n\t\t{\n\t\t\tcustomPlayerData->ActionSlideVol = playerData->act_slide_vol;\n\t\t\tWCHAR val[32];\n\t\t\tswprintf(val, 32, L\"%d\", playerData->act_slide_vol);\n\t\t\tWritePrivateProfileStringW(L\"playerdata\", L\"act_slide_vol\", val, configPath);\n\t\t}\n\t\tif (customPlayerData->UsePVEquip != playerData->use_pv_module_equip)\n\t\t{\n\t\t\tplayerData->use_pv_module_equip = 1;\n\t\t}\n\t\tif (customPlayerData->UsePVSFXEquip != playerData->use_pv_btn_se_equip)\n\t\t{\n\t\t\tplayerData->use_pv_btn_se_equip = 1;\n\t\t\tplayerData->use_pv_chainslide_se_equip = 1;\n\t\t\tplayerData->use_pv_slidertouch_se_equip = 1;\n\t\t\tplayerData->use_pv_slide_se_equip = 1;\n\t\t}\n\t\tif (customPlayerData->UsePVSkinEquip != playerData->use_pv_skin_equip)\n\t\t{\n\t\t\tplayerData->use_pv_skin_equip = 1;\n\t\t}\n\t\t\t\t\n\n\t\tsetIfNotEqual(&playerData->level, customPlayerData->LevelNum, 1);\n\t\tsetIfNotEqual(&playerData->level_plate_id, customPlayerData->LevelPlateId, 0);\n\t\tsetIfNotEqual(&playerData->level_plate_effect, customPlayerData->LevelPlateEffect, 0);\n\n\t\t// Display clear borders on the progress bar\n\t\tplayerData->clear_border = (customPlayerData->ShowRivalClearBorder << 2) | (customPlayerData->ShowExcellentClearBorder << 1) | (customPlayerData->ShowGreatClearBorder);\n\t\t\n\t\tplayerData->use_card = customPlayerData->UseCard; // required to allow for module selection\n\n\t\tplayerData->game_opts = customPlayerData->GameModifierOptions; // hi-speed, etc..\n\n\t\tmemset((void*)MODULE_TABLE_START, 0xFF, 128);\n\t\tmemset((void*)ITEM_TABLE_START, 0xFF, 128);\n\n\t\tplayerData->mylistA_begin = customPlayerData->Mylist[0].begin()._Ptr;\n\t\tplayerData->mylistA_end = customPlayerData->Mylist[0].end()._Ptr;\n\t\tplayerData->mylistB_begin = customPlayerData->Mylist[1].begin()._Ptr;\n\t\tplayerData->mylistB_end = customPlayerData->Mylist[1].end()._Ptr;\n\t\tplayerData->mylistC_begin = customPlayerData->Mylist[2].begin()._Ptr;\n\t\tplayerData->mylistC_end = customPlayerData->Mylist[2].end()._Ptr;\n\n\t\tif (customPlayerData->PlayerName != nullptr)\n\t\t{\n\t\t\tplayerData->field_DC = 0x10;\n\t\t\tplayerData->player_name = (char*)customPlayerData->PlayerName->c_str();\n\t\t}\n\n\n\t\tif (customPlayerData->LevelName != nullptr) \n\t\t{\n\t\t\tplayerData->level_name = (char*)customPlayerData->LevelName->c_str();\n\t\t\tplayerData->field_110 = 0xFF;\n\t\t\tplayerData->field_118 = 0x1F;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/PlayerDataManager.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"PlayerData.h\"\n#include \"CustomPlayerData.h\"\n#include <string>\n\nnamespace TLAC::Components\n{\n\tclass PlayerDataManager : public EmulatorComponent\n\t{\n\tpublic:\n\t\tPlayerDataManager();\n\t\t~PlayerDataManager();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\n\tprivate:\n\t\tPlayerData* playerData;\n\t\tCustomPlayerData* customPlayerData;\n\t\tint lastPvId = -1;\n\t\tbool initPvId = true;\n\t\tbool pvModuleLoaded = true;\n\t\tbool moduleCardWorkaround = true;\n\t\tint lastModState = 0;\n\t\tvoid ApplyPatch();\n\t\tvoid LoadConfig();\n\t\tvoid ApplyCustomData();\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/ScaleComponent.cpp",
    "content": "#include \"ScaleComponent.h\"\n#include <iostream>\n#include <Windows.h>\n#include \"../Constants.h\"\n#include <stdio.h>\n#include \"../framework.h\"\n#include <chrono>\n#include <thread>\n#include <tchar.h>\n#include <GL/freeglut.h>\n\nnamespace TLAC::Components\n{\n\n\tScaleComponent::ScaleComponent()\n\t{\n\t}\n\n\tScaleComponent::~ScaleComponent()\n\t{\n\t}\n\n\tconst char* ScaleComponent::GetDisplayName()\n\t{\n\t\treturn \"scale_component\";\n\t}\n\n\tvoid ScaleComponent::Initialize(ComponentsManager*)\n\t{\n\t\t{\n\t\t\tDWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x00000001404ACD24, 7, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x00000001404ACD24 + 0) = 0x44;\n\t\t\t*((byte*)0x00000001404ACD24 + 1) = 0x8B;\n\t\t\t*((byte*)0x00000001404ACD24 + 2) = 0x0D;\n\t\t\t*((byte*)0x00000001404ACD24 + 3) = 0xD1;\n\t\t\t*((byte*)0x00000001404ACD24 + 4) = 0x08;\n\t\t\t*((byte*)0x00000001404ACD24 + 5) = 0xD0;\n\t\t\t*((byte*)0x00000001404ACD24 + 6) = 0x00;\n\t\t\tVirtualProtect((BYTE*)0x00000001404ACD24, 7, oldProtect, &bck);\n\t\t}\n\t\t{\n\t\t\tDWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x00000001404ACD2B, 7, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x00000001404ACD2B + 0) = 0x44;\n\t\t\t*((byte*)0x00000001404ACD2B + 1) = 0x8B;\n\t\t\t*((byte*)0x00000001404ACD2B + 2) = 0x05;\n\t\t\t*((byte*)0x00000001404ACD2B + 3) = 0xC6;\n\t\t\t*((byte*)0x00000001404ACD2B + 4) = 0x08;\n\t\t\t*((byte*)0x00000001404ACD2B + 5) = 0xD0;\n\t\t\t*((byte*)0x00000001404ACD2B + 6) = 0x00;\n\t\t\tVirtualProtect((BYTE*)0x00000001404ACD2B, 7, oldProtect, &bck);\n\t\t}\n\t\t{\n\t\t\tDWORD oldProtect, bck;\n\t\t\tVirtualProtect((BYTE*)0x00000001405030A0, 6, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t*((byte*)0x00000001405030A0 + 0) = 0x90;\n\t\t\t*((byte*)0x00000001405030A0 + 1) = 0x90;\n\t\t\t*((byte*)0x00000001405030A0 + 2) = 0x90;\n\t\t\t*((byte*)0x00000001405030A0 + 3) = 0x90;\n\t\t\t*((byte*)0x00000001405030A0 + 4) = 0x90;\n\t\t\t*((byte*)0x00000001405030A0 + 5) = 0x90;\n\t\t\tVirtualProtect((BYTE*)0x00000001404ACD2B, 6, oldProtect, &bck);\n\t\t}\n\t}\n\n\tvoid ScaleComponent::Update()\n\t{\n\t\tuiAspectRatio = (float*)UI_ASPECT_RATIO;\n\t\tuiWidth = (float*)UI_WIDTH_ADDRESS;\n\t\tuiHeight = (float*)UI_HEIGHT_ADDRESS;\n\t\tfb1Height = (int*)FB1_HEIGHT_ADDRESS;\n\t\tfb1Width = (int*)FB1_WIDTH_ADDRESS;\n\t\t//fb2Height = (int*)FB2_HEIGHT_ADDRESS;\n\t\t//fb2Width = (int*)FB2_WIDTH_ADDRESS;\n\t\tfbAspectRatio = (double*)FB_ASPECT_RATIO;\n\t\tRECT hWindow;\n\t\tGetClientRect(TLAC::framework::DivaWindowHandle, &hWindow);\n\t\t*uiAspectRatio = (float)(hWindow.right - hWindow.left) / (float)(hWindow.bottom - hWindow.top);\n\t\t*fbAspectRatio = (double)(hWindow.right - hWindow.left) / (double)(hWindow.bottom - hWindow.top);\n\t\t*uiWidth = hWindow.right - hWindow.left;\n\t\t*uiHeight = hWindow.bottom - hWindow.top;\n\t\t*fb1Width = hWindow.right - hWindow.left;\n\t\t*fb1Height = hWindow.bottom - hWindow.top;\n\t\t//*fb2Width = hWindow.right - hWindow.left;\n\t\t//*fb2Height = hWindow.bottom - hWindow.top;\n\n\t\t*((int*)0x00000001411AD608) = 0;\n\n\t\t*((int*)0x0000000140EDA8E4) = *(int*)0x0000000140EDA8BC;\n\t\t*((int*)0x0000000140EDA8E8) = *(int*)0x0000000140EDA8C0;\n\n\t\t*(float*)0x00000001411A1900 = 0;\n\t\t*(float*)0x00000001411A1904 = (float)*(int*)0x0000000140EDA8BC;\n\t\t*(float*)0x00000001411A1908 = (float)*(int*)0x0000000140EDA8C0;\n\t\t//*((int*)0x00000001411AD5F8) = hWindow.right - hWindow.left;\n\t\t//*((int*)0x00000001411AD5FC) = hWindow.bottom - hWindow.top;\n\n\t\t//*((int*)0x00000001411ABB48) = hWindow.right - hWindow.left;\n\t\t//*((int*)0x00000001411ABB4C) = hWindow.bottom - hWindow.top;\n\n\t\t//*((int*)0x00000001411ABB5C) = (int)(*((int*)0x00000001411ABB54) * ((float)8 / (float)9)); //wtf??\n\t}\n\n\tvoid ScaleComponent::UpdateInput()\n\t{\n\t\treturn;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/ScaleComponent.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"GameState.h\"\n\nnamespace TLAC::Components\n{\n\tclass ScaleComponent : public EmulatorComponent\n\t{\n\tpublic:\n\t\tScaleComponent();\n\t\t~ScaleComponent();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\t\tconst int updatesPerFrame = 39;\n\n\t\tfloat* uiAspectRatio;\n\t\tfloat* uiWidth;\n\t\tfloat* uiHeight;\n\n\t\tint* fb1Width;\n\t\tint* fb1Height;\n\t\tint* fb2Width;\n\t\tint* fb2Height;\n\n\t\tdouble* fbAspectRatio;\n\n\tprivate:\n\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/ScoreSaver.cpp",
    "content": "#include \"ScoreSaver.h\"\n#include \"GameState.h\"\n#include \"../Constants.h\"\n#include \"../framework.h\"\n#include \"../Utilities/Operations.h\"\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n#include <algorithm>\n#pragma comment(lib, \"detours.lib\")\n\nnamespace TLAC::Components\n{\n\tWCHAR ScoreSaver::configPath[256];\n\tWCHAR ScoreSaver::rival_configPath[256];\n\tWCHAR ScoreSaver::modules_configPath[256];\n\tWCHAR ScoreSaver::skins_configPath[256];\n\tWCHAR ScoreSaver::sfx_configPath[256];\n\tScoreSaver::ScoreSaver()\n\t{\n\t\tstd::string utf8path = TLAC::framework::GetModuleDirectory() + \"/scores.ini\";\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, configPath, 256);\n\t\tutf8path = TLAC::framework::GetModuleDirectory() + \"/rivalscores.ini\";\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, rival_configPath, 256);\n\t\tutf8path = TLAC::framework::GetModuleDirectory() + \"/pv_equip/modules.ini\";\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, modules_configPath, 256);\n\t\tutf8path = TLAC::framework::GetModuleDirectory() + \"/pv_equip/skins.ini\";\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, skins_configPath, 256);\n\t\tutf8path = TLAC::framework::GetModuleDirectory() + \"/pv_equip/sfx.ini\";\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, sfx_configPath, 256);\n\n\t}\n\n\tScoreSaver::~ScoreSaver()\n\t{\n\t\tfor (int diff = 0; diff < 4; diff++)\n\t\t{\n\t\t\t*(DivaScore**)(PLAYER_DATA_ADDRESS + diff * 0x18 + 0x5d0) = 0;\n\t\t\t*(DivaScore**)(PLAYER_DATA_ADDRESS + diff * 0x18 + 0x5d8) = 0;\n\t\t}\n\t}\n\n\tconst char* ScoreSaver::GetDisplayName()\n\t{\n\t\treturn \"score_saver\";\n\t}\n\n\tbool ScoreSaver::initCacheFinished = false;\n\tvoid ScoreSaver::initCache()\n\t{\n\t\t// build the score cache\n\t\tUpdateScoreCache();\n\t\tUpdateClearCounts();\n\t\tinitCacheFinished = true;\n\t}\n\n\tbool(__stdcall* ScoreSaver::divaInitResults)(void* cls) = (bool(__stdcall*)(void* cls))RESULTS_INIT_ADDRESS;\n\tstd::thread ScoreSaver::initThread;\n\tvoid ScoreSaver::Initialize(ComponentsManager*)\n\t{\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)ScoreSaver::divaInitResults, (PVOID)(ScoreSaver::hookedInitResults));\n\t\tDetourTransactionCommit();\n\n\t\tinitThread = std::thread(initCache);\n\t}\n\n\tbool ScoreSaver::checkExistingScoreValid(int pv, int difficulty, int isEx)\n\t{\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999.diff.3.ex\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.diff.3.alltimemodifiers\n\n\t\tconst WCHAR section[] = L\"scores\";\n\n\t\tif (isEx == 0)\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d\", pv, difficulty);\n\t\telse\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d.ex\", pv, difficulty);\n\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"score\");\n\t\tint score = GetPrivateProfileIntW(section, key, 0, configPath);\n\t\t\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"notecounts\");\n\t\tWCHAR countsBufW[32];\n\t\tchar countsBufA[32];\n\t\tint cntHitTypes[2] = { 0, 0 };\n\t\tGetPrivateProfileStringW(section, key, L\"\", countsBufW, 32, configPath);\n\t\tWideCharToMultiByte(CP_UTF8, 0, countsBufW, -1, countsBufA, 32, NULL, NULL);\n\t\tstd::vector<std::string> countToks = TLAC::Utilities::Split(countsBufA, \",\");\n\t\tif (countToks.size() >= 2)\n\t\t{\n\t\t\tcntHitTypes[0] = atoi(countToks[0].c_str());\n\t\t\tcntHitTypes[1] = atoi(countToks[1].c_str());\n\t\t}\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"percent\");\n\t\tint percent = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"combo\");\n\t\tint combo = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"rank\");\n\t\tint clearRank = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimerank\");\n\t\tint allTimeRank = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimemodifiers\");\n\t\tint allTimeModifiers = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimepercent\");\n\t\tint allTimePercent = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"check\");\n\t\tint expectedCheck = GetPrivateProfileIntW(section, key, -1, configPath);\n\n\t\treturn expectedCheck == calculateCheck(score, cntHitTypes[0], cntHitTypes[1], percent, combo, clearRank, allTimeRank, allTimeModifiers, allTimePercent);\n\t}\n\n\tint ScoreSaver::calculateCheck(int score, int cntCools, int cntFines, int percent, int combo, int clearRank, int allTimeRank, int allTimeModifiers, int allTimePercent)\n\t{\n\t\tint checkField = ((short)score ^ ((short)cntCools << 16) ^ ((short)cntFines) ^ ((short)percent << 16) ^ ((short)combo)) * clearRank;\n\t\tcheckField += (allTimeRank * clearRank); // first extension\n\t\tcheckField ^= (allTimeModifiers * allTimePercent);\n\t\treturn checkField;\n\t}\n\t\n\tbool ScoreSaver::hookedInitResults(void* cls)\n\t{\n\t\tbool result = divaInitResults(cls);\n\t\t\t\t\n\t\tint clearRank = *(int*)(RESULTS_BASE_ADDRESS + 0xe8);\n\t\tbyte insurance = *(byte*)(GAME_INFO_ADDRESS + 0x14);\n\t\t\n\t\tif (insurance != 0)\n\t\t\treturn result;\n\n\t\t// get the base for this specific set of results\n\t\tuint64_t resultBase = *(uint64_t*)(RESULTS_BASE_ADDRESS + 0x100);\n\t\t\n\t\tint pvNum = *(int*)(resultBase + 0x2c);\n\t\tint pvDifficulty = *(int*)(resultBase + 0x34);\n\t\tint pvDifficultyIsEx = *(int*)(resultBase + 0x44);\n\t\tint modifier = *(int*)(resultBase + 0x70);\n\t\t\n\t\tint* cntHitTypes = (int*)(resultBase + 0x158);\n\t\tint* pctHitTypes = (int*)(resultBase + 0x16c);\n\t\tint combo = *(int*)(resultBase + 0x180);\n\t\tint challengeScore = *(int*)(resultBase + 0x184);\n\t\tint holdScore = *(int*)(resultBase + 0x188);\n\t\tint score = *(int*)(resultBase + 0x18c);\n\t\tint percent = *(int*)(resultBase + 0x190);\n\t\tint slideScore = *(int*)(resultBase + 0x194);\n\t\t\n\t\tWCHAR songName[256];\n\t\t//std::string utf8song = *(std::string*)(CURRENT_SONG_NAME_ADDRESS);\n\t\tuint64_t songnamelen = *(uint64_t*)(CURRENT_SONG_NAME_ADDRESS + 0x18);\n\t\tchar* utf8song = songnamelen < 0x10 ? (char*)CURRENT_SONG_NAME_ADDRESS : *(char**)CURRENT_SONG_NAME_ADDRESS;\n\t\tMultiByteToWideChar(CP_UTF8, 0, utf8song, -1, songName, 256);\n\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999.diff.3.ex\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.diff.3.alltimemodifiers\n\t\tWCHAR val[32]; // needs to be big enough to store five <=four digit ints (with comma separators)\n\n\t\tconst WCHAR section[] = L\"scores\";\n\n\t\tif (pvDifficultyIsEx == 0)\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d\", pvNum, pvDifficulty);\n\t\telse\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d.ex\", pvNum, pvDifficulty);\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"score\");\n\t\tint oldScore = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimerank\");\n\t\tint oldAlltimeRank = GetPrivateProfileIntW(section, key, -1, configPath);\n\n\t\tif (oldAlltimeRank == -1) // fallback for old scores without alltimerank\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"rank\");\n\t\t\toldAlltimeRank = GetPrivateProfileIntW(section, key, 0, configPath);\n\t\t}\n\t\tint allTimeRank = clearRank > oldAlltimeRank ? clearRank : oldAlltimeRank;\n\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimemodifiers\");\n\t\tint oldAlltimeModifiers = GetPrivateProfileIntW(section, key, -1, configPath);\n\n\t\tif (oldAlltimeModifiers == -1) // fallback for old scores without alltimemodifiers\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"modifier\");\n\t\t\toldAlltimeModifiers = GetPrivateProfileIntW(section, key, 0, configPath);\n\t\t\toldAlltimeModifiers = oldAlltimeModifiers > 0 ? 1 << (oldAlltimeModifiers - 1) : 0;\n\t\t}\n\t\tint allTimeModifiers = oldAlltimeModifiers | ((clearRank > 1 && modifier > 0) ? (1 << (modifier - 1)) : 0); // use clearRank to not update if didn't clear\n\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimepercent\");\n\t\tint oldAlltimePercent = GetPrivateProfileIntW(section, key, -1, configPath);\n\t\tif (oldAlltimePercent == -1) // fallback for old scores without alltimepercent\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"percent\");\n\t\t\toldAlltimePercent = GetPrivateProfileIntW(section, key, 0, configPath);\n\t\t}\n\t\tint allTimePercent = percent > oldAlltimePercent ? percent : oldAlltimePercent;\n\n\t\tbool oldScoreValid = true;\n\t\tif (!checkExistingScoreValid(pvNum, pvDifficulty, pvDifficultyIsEx))\n\t\t{\n\t\t\toldScore = 0; // ensure new score is written\n\t\t\tallTimeRank = clearRank; // don't trust old all-time clear rank, use a new one\n\t\t\tallTimeModifiers = ((clearRank > 1 && modifier > 0) ? (1 << (modifier - 1)) : 0); // don't trust old all-time modifiers, use a new one\n\t\t\tallTimePercent = percent; // don't trust old all-time percent, use a new one\n\t\t\toldScoreValid = false;\n\t\t}\n\n\t\tif (clearRank > 1 && score > oldScore)\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimemodifiers\");\n\t\t\tswprintf(val, 32, L\"%d\", allTimeModifiers);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimepercent\");\n\t\t\tswprintf(val, 32, L\"%d\", allTimePercent);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimerank\");\n\t\t\tswprintf(val, 32, L\"%d\", allTimeRank);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"challengescore\");\n\t\t\tswprintf(val, 32, L\"%d\", challengeScore);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"combo\");\n\t\t\tswprintf(val, 32, L\"%d\", combo);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"holdscore\");\n\t\t\tswprintf(val, 32, L\"%d\", holdScore);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"modifier\");\n\t\t\tswprintf(val, 32, L\"%d\", modifier);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"name\");\n\t\t\tWritePrivateProfileStringW(section, key, songName, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"notecounts\");\n\t\t\tswprintf(val, 32, L\"%d,%d,%d,%d,%d\", cntHitTypes[0], cntHitTypes[1], cntHitTypes[2], cntHitTypes[3], cntHitTypes[4]);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"notepercents\");\n\t\t\tswprintf(val, 32, L\"%d,%d,%d,%d,%d\", pctHitTypes[0], pctHitTypes[1], pctHitTypes[2], pctHitTypes[3], pctHitTypes[4]);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"percent\");\n\t\t\tswprintf(val, 32, L\"%d\", percent);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"rank\");\n\t\t\tswprintf(val, 32, L\"%d\", clearRank);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"score\");\n\t\t\tswprintf(val, 32, L\"%d\", score);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"slidescore\");\n\t\t\tswprintf(val, 32, L\"%d\", slideScore);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\tint checkField = calculateCheck(score, cntHitTypes[0], cntHitTypes[1], percent, combo, clearRank, allTimeRank, allTimeModifiers, allTimePercent);\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"check\");\n\t\t\tswprintf(val, 32, L\"%d\", checkField);\n\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\t\t}\n\t\telse // if (oldScoreValid)\n\t\t{\n\t\t\tif (allTimeRank != oldAlltimeRank) // first extension\n\t\t\t{\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimerank\");\n\t\t\t\tswprintf(val, 32, L\"%d\", allTimeRank);\n\t\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"rank\");\n\t\t\t\tint oldClearRank = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"check\");\n\t\t\t\tint oldCheck = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"check\");\n\t\t\t\tswprintf(val, 32, L\"%d\", oldCheck - (oldAlltimeRank * oldClearRank) + (allTimeRank * oldClearRank));\n\t\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\t\t\t}\n\t\t\tif (allTimeModifiers != oldAlltimeModifiers || allTimePercent != oldAlltimePercent) // second extension\n\t\t\t{\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimemodifiers\");\n\t\t\t\tswprintf(val, 32, L\"%d\", allTimeModifiers);\n\t\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimepercent\");\n\t\t\t\tswprintf(val, 32, L\"%d\", allTimePercent);\n\t\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"check\");\n\t\t\t\tint oldCheck = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"check\");\n\t\t\t\tswprintf(val, 32, L\"%d\", oldCheck ^ (oldAlltimeModifiers * oldAlltimePercent) ^ (allTimeModifiers * allTimePercent));\n\t\t\t\tWritePrivateProfileStringW(section, key, val, configPath);\n\t\t\t}\n\t\t}\n\n\t\tUpdateSingleScoreCacheEntry(pvNum, pvDifficulty, pvDifficultyIsEx, true);\n\t\tif (initCacheFinished) // don't update clear counts if they're not ready yet\n\t\t\tUpdateClearCounts();\n\t\tif (didInitialAddressUpdate) // don't set the addresses if they're not ready yet\n\t\t\tFixScoreCacheAddresses(pvDifficulty);\n\n\t\treturn result;\n\t}\n\n\tbool ScoreSaver::didInitialAddressUpdate = false;\n\tvoid ScoreSaver::Update()\n\t{\n\t\t// the below stuff is only verified for operating in menus\n\t\tif (*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && (*(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_SELECTOR || *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_SEL))\n\t\t{\n\t\t\tif (!didInitialAddressUpdate)\n\t\t\t{\n\t\t\t\tif (initCacheFinished) // check for initThread to be done\n\t\t\t\t{\n\t\t\t\t\t// fix the addresses here instead of doing it unsafely in initThread\n\t\t\t\t\tFixScoreCacheAddresses(0);\n\t\t\t\t\tFixScoreCacheAddresses(1);\n\t\t\t\t\tFixScoreCacheAddresses(2);\n\t\t\t\t\tFixScoreCacheAddresses(3);\n\t\t\t\t\tdidInitialAddressUpdate = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// it probably doesn't really matter whether the initial address update is done first if I add some locks,\n\t\t\t\t// but I feel better knowing that there won't be multiple things racing to modify the vector\n\t\t\t\t// this does mean that with a lot of scores you can beat the loading into the game, thus not getting the new record banner etc. after a song....\n\t\t\t\tint pvNum = *(int*)SELPV_CURRENT_SONG_ADDRESS;\n\t\t\t\tint diff = *(int*)(GAME_INFO_ADDRESS);\n\t\t\t\tint diffIsEx = *(int*)(GAME_INFO_ADDRESS + 0x4);\n\t\t\t\tbyte insurance = *(byte*)(GAME_INFO_ADDRESS + 0x14);\n\n\t\t\t\tif (pvNum != currentPv || diff != currentDifficulty || diffIsEx != currentDifficultyIsEx || insurance != currentInsurance)\n\t\t\t\t{\n\t\t\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, diffIsEx);\n\t\t\t\t\tif (cachedScore == nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\t// create a score cache entry if none exists for current song\n\t\t\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, diffIsEx));\n\t\t\t\t\t\t// update score begin and end vars from game\n\t\t\t\t\t\tFixScoreCacheAddresses(diff);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tUpdateSingleScoreCacheModulesEntry;\n\t\t\t\t\t}\n\t\t\t\t\tcurrentPv = pvNum;\n\t\t\t\t\tcurrentDifficulty = diff;\n\t\t\t\t\tcurrentDifficultyIsEx = diffIsEx;\n\t\t\t\t\tcurrentInsurance = insurance;\n\t\t\t\t}\n\t\t\t\tModuleCheck(pvNum, diff, diffIsEx);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ScoreSaver::UpdateInput()\n\t{\n\t\treturn;\n\t}\n\n\tvoid ScoreSaver::InjectCode(void* address, const std::vector<uint8_t> data)\n\t{\n\t\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\t\tDWORD oldProtect;\n\t\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\tmemcpy(address, data.data(), byteCount);\n\t\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n\t}\n\n\tstd::vector<ScoreSaver::DivaScore> ScoreSaver::ScoreCache[4] = { // * 4 difficulties\n\t\t{},\n\t\t{},\n\t\t{},\n\t\t{}\n\t};\n\n\tScoreSaver::DivaScore* ScoreSaver::GetCachedScore(int pvNum, int diff, int exDiff)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn nullptr;\n\n\t\tfor (DivaScore &scoreinfo : ScoreCache[diff])\n\t\t{\n\t\t\tif (scoreinfo.pvNum == pvNum && scoreinfo.exDifficulty == exDiff)\n\t\t\t\treturn &scoreinfo;\n\t\t}\n\n\t\treturn nullptr;\n\t}\n\tvoid ScoreSaver::UpdateSingleScoreCacheEntry(int pvNum, int diff, int exDiff, bool doDefaultsReset)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn;\n\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999.diff.3.ex\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.diff.3.alltimemodifiers\n\n\t\tconst WCHAR section[] = L\"scores\";\n\n\t\tif (exDiff == 0)\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d\", pvNum, diff);\n\t\telse\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d.ex\", pvNum, diff);\n\n\t\t\n\t\tif (checkExistingScoreValid(pvNum, diff, exDiff))\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"score\");\n\t\t\tint score = GetPrivateProfileIntW(section, key, 0, configPath);\n\n\t\t\tif (score > 99999999)\n\t\t\t\tscore = 99999999;\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimepercent\");\n\t\t\tint percent = GetPrivateProfileIntW(section, key, -1, configPath);\n\n\t\t\tif (percent == -1) // fallback for old scores without alltimepercent\n\t\t\t{\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"percent\");\n\t\t\t\tpercent = GetPrivateProfileIntW(section, key, 0, configPath);\n\t\t\t}\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimerank\");\n\t\t\tint allTimeRank = GetPrivateProfileIntW(section, key, -1, configPath);\n\n\t\t\tif (allTimeRank == -1) // fallback for old scores without alltimerank\n\t\t\t{\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"rank\");\n\t\t\t\tallTimeRank = GetPrivateProfileIntW(section, key, -1, configPath);\n\t\t\t}\n\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimemodifiers\");\n\t\t\tint modifiers = GetPrivateProfileIntW(section, key, -1, configPath);\n\n\t\t\tif (modifiers == -1) // fallback for old scores without alltimemodifiers\n\t\t\t{\n\t\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"modifier\");\n\t\t\t\tmodifiers = GetPrivateProfileIntW(section, key, 0, configPath);\n\t\t\t\tmodifiers = modifiers > 0 ? 1 << (modifiers - 1) : 0;\n\t\t\t}\n\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->score = score;\n\t\t\t\tcachedScore->percent = percent;\n\t\t\t\tcachedScore->clearRank = allTimeRank;\n\t\t\t\tif (modifiers & 1) cachedScore->optionA = 1;\n\t\t\t\tif (modifiers & 2) cachedScore->optionB = 1;\n\t\t\t\tif (modifiers & 4) cachedScore->optionC = 1;\n\t\t\t}\n\t\t}\n\t\telse if (doDefaultsReset) // reset to defaults if not valid\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->score = 0;\n\t\t\t\tcachedScore->percent = 0;\n\t\t\t\tcachedScore->clearRank = -1;\n\t\t\t\tcachedScore->optionA = 0;\n\t\t\t\tcachedScore->optionB = 0;\n\t\t\t\tcachedScore->optionC = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ScoreSaver::UpdateSingleScoreCacheRivalEntry(int pvNum, int diff, int exDiff)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn;\n\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999.diff.3.ex\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.diff.3.alltimemodifiers\n\n\t\tconst WCHAR section[] = L\"scores\";\n\n\t\tif (exDiff == 0)\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d\", pvNum, diff);\n\t\telse\n\t\t\tswprintf(keyBase, 32, L\"pv.%03d.diff.%01d.ex\", pvNum, diff);\n\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"score\");\n\t\tint score = GetPrivateProfileIntW(section, key, 0, rival_configPath);\n\n\t\tif (score > 99999999)\n\t\t\tscore = 99999999;\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimepercent\");\n\t\tint percent = GetPrivateProfileIntW(section, key, -1, rival_configPath);\n\n\t\tif (percent == -1) // fallback for old scores without alltimepercent\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"percent\");\n\t\t\tpercent = GetPrivateProfileIntW(section, key, 0, rival_configPath);\n\t\t}\n\n\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"alltimerank\");\n\t\tint allTimeRank = GetPrivateProfileIntW(section, key, -1, rival_configPath);\n\n\t\tif (allTimeRank == -1) // fallback for old scores without alltimerank\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.%ls\", keyBase, L\"rank\");\n\t\t\tallTimeRank = GetPrivateProfileIntW(section, key, -1, rival_configPath);\n\t\t}\n\n\t\tif (score > 0 || percent > 0)\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->rival_clearRank = allTimeRank;\n\t\t\t\tcachedScore->rival_score = score;\n\t\t\t\tcachedScore->rival_percent = percent;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ScoreSaver::UpdateSingleScoreCacheModulesEntry(int pvNum, int diff, int exDiff)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn;\n\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.module5\n\n\t\tconst WCHAR section[] = L\"modules\";\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tfor (int i = 0; i < 6; ++i)\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.module%d\", keyBase, i);\n\t\t\tint INImodule = GetPrivateProfileIntW(section, key, 0, modules_configPath);\n\n\t\t\tif (INImodule > 0)\n\t\t\t{\n\t\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t\tif (cachedScore == nullptr)\n\t\t\t\t{\n\t\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t\t}\n\t\t\t\tif (cachedScore != nullptr)\n\t\t\t\t{\n\t\t\t\t\tcachedScore->per_module_equip[i] = INImodule;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t}\n\n\tvoid ScoreSaver::ModuleCheck(int pvNum, int diff, int exDiff)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn;\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.module5\n\t\tconst WCHAR section[] = L\"modules\";\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\tfor (int i = 0; i < 6; ++i)\n\t\t{\n\t\t\tswprintf(key, 32, L\"%ls.module%d\", keyBase, i);\n\t\t\tint INImodule = GetPrivateProfileIntW(section, key, 0, modules_configPath);\n\t\t\tif (INImodule != cachedScore->per_module_equip[i])\n\t\t\t{\n\t\t\t\tINImodule = *cachedScore->per_module_equip;\n\t\t\t\tWCHAR val[32];\n\t\t\t\tswprintf(val, 32, L\"%d\", cachedScore->per_module_equip[i]);\n\t\t\t\tWritePrivateProfileStringW(L\"modules\", key, val, modules_configPath);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n\tvoid ScoreSaver::UpdateSingleScoreCacheSkinsEntry(int pvNum, int diff, int exDiff)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn;\n\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.module5\n\n\t\tconst WCHAR section[] = L\"skins\";\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tswprintf(key, 32, L\"%ls.skin\", keyBase);\n\t\tint INISkin = GetPrivateProfileIntW(section, key, 0, skins_configPath);\n\t\tif (INISkin > -1)\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->per_skin_equip = INISkin;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ScoreSaver::UpdateSingleScoreCacheSFXEntry(int pvNum, int diff, int exDiff)\n\t{\n\t\tif (pvNum < 0 || diff < 0 || exDiff < 0 || pvNum > 999 || diff > 3 || exDiff > 1)\n\t\t\treturn;\n\n\n\t\tWCHAR keyBase[32]; // needs to be big enough to store pv.999\n\t\tWCHAR key[32]; // needs to be big enough to store pv.999.module5\n\n\t\tconst WCHAR section[] = L\"SFX\";\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tswprintf(key, 32, L\"%ls.btn\", keyBase);\n\t\tint INIBtn = GetPrivateProfileIntW(section, key, 0, sfx_configPath);\n\t\tif (INIBtn > 0)\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->per_btn_se_equip = INIBtn;\n\t\t\t}\n\t\t}\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tswprintf(key, 32, L\"%ls.chain\", keyBase);\n\t\tint INIChain = GetPrivateProfileIntW(section, key, 0, sfx_configPath);\n\t\tif (INIChain > 0)\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->per_chainslide_se_equip = INIChain;\n\t\t\t}\n\t\t}\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tswprintf(key, 32, L\"%ls.slide\", keyBase);\n\t\tint INISlide = GetPrivateProfileIntW(section, key, 0, sfx_configPath);\n\t\tif (INISlide > 0)\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->per_slide_se_equip = INISlide;\n\t\t\t}\n\t\t}\n\t\tswprintf(keyBase, 32, L\"pv.%03d\", pvNum);\n\t\tswprintf(key, 32, L\"%ls.touch\", keyBase);\n\t\tint INITouch = GetPrivateProfileIntW(section, key, 0, sfx_configPath);\n\t\tif (INITouch > 0)\n\t\t{\n\t\t\tDivaScore* cachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\tif (cachedScore == nullptr)\n\t\t\t{\n\t\t\t\tScoreCache[diff].push_back(DivaScore(pvNum, exDiff));\n\t\t\t\tcachedScore = GetCachedScore(pvNum, diff, exDiff);\n\t\t\t}\n\t\t\tif (cachedScore != nullptr)\n\t\t\t{\n\t\t\t\tcachedScore->per_slidertouch_se_equip = INITouch;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ScoreSaver::FixScoreCacheAddresses(int diff)\n\t{\n\t\t// update score begin and end vars from game\n\t\t*(DivaScore**)(PLAYER_DATA_ADDRESS + diff * 0x18 + 0x5d0) = ScoreCache[diff].begin()._Ptr;\n\t\t*(DivaScore**)(PLAYER_DATA_ADDRESS + diff * 0x18 + 0x5d8) = ScoreCache[diff].end()._Ptr;\n\t}\n\n\tvoid ScoreSaver::UpdateScoreCache()\n\t{\n\t\tfor (int pvNum = 0; pvNum < 1000; pvNum++)\n\t\t{\n\t\t\tfor (int diff = 0; diff < 4; diff++)\n\t\t\t{\n\t\t\t\tfor (int exDiff = 0; exDiff < 2; exDiff++)\n\t\t\t\t{\n\t\t\t\t\tUpdateSingleScoreCacheEntry(pvNum, diff, exDiff, false);\n\t\t\t\t\tUpdateSingleScoreCacheRivalEntry(pvNum, diff, exDiff);\n\t\t\t\t\tUpdateSingleScoreCacheModulesEntry(pvNum, diff, exDiff);\n\t\t\t\t\tUpdateSingleScoreCacheSkinsEntry(pvNum, diff, exDiff);\n\t\t\t\t\tUpdateSingleScoreCacheSFXEntry(pvNum, diff, exDiff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ScoreSaver::UpdateClearCounts()\n\t{\n\t\tint* counts = (int*)SONG_CLEAR_COUNTS_ADDRESS;\n\t\tfor (int i = 0; i < 20; i++)\n\t\t{\n\t\t\tcounts[i] = 0;\n\t\t}\n\n\t\tfor (int diff = 0; diff < 4; diff++)\n\t\t{\n\t\t\tfor (DivaScore &scoreinfo : ScoreCache[diff])\n\t\t\t{\n\t\t\t\tif (scoreinfo.clearRank > 1 && scoreinfo.clearRank <= 5 && scoreinfo.exDifficulty == 0) // at least clear and no greater than perfect and not ex\n\t\t\t\t{\n\t\t\t\t\tcounts[diff * 4 + scoreinfo.clearRank - 2] += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// exex special case\n\t\tfor (DivaScore &scoreinfo : ScoreCache[3])\n\t\t{\n\t\t\tif (scoreinfo.clearRank > 1 && scoreinfo.clearRank <= 5 && scoreinfo.exDifficulty == 1) // at least clear and no greater than perfect and IS ex\n\t\t\t{\n\t\t\t\tcounts[4 * 4 + scoreinfo.clearRank - 2] += 1;\n\t\t\t}\n\t\t}\n\n\t\t// perfects count as clears for <= excellent, etc\n\t\tfor (int diff = 0; diff < 5; diff++)\n\t\t{\n\t\t\tcounts[diff * 4 + 2] += counts[diff * 4 + 3];\n\t\t\tcounts[diff * 4 + 1] += counts[diff * 4 + 2];\n\t\t\tcounts[diff * 4 + 0] += counts[diff * 4 + 1];\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Components/ScoreSaver.h",
    "content": "#pragma once\n#include \"EmulatorComponent.h\"\n#include \"../Constants.h\"\n#include <windows.h>\n#include <vector>\n#include <thread>\n\nnamespace TLAC::Components\n{\n\tclass ScoreSaver : public EmulatorComponent\n\t{\n\tpublic:\n\t\tScoreSaver();\n\t\t~ScoreSaver();\n\n\t\tvirtual const char* GetDisplayName() override;\n\n\t\tvirtual void Initialize(ComponentsManager*) override;\n\t\tvirtual void Update() override;\n\t\tvirtual void UpdateInput() override;\n\n\t\tstruct DivaScore\n\t\t{\n\t\t\tint pvNum;\n\t\t\tint exDifficulty;\n\t\t\tint per_module_equip[6];\n\t\t\tint other_module_shit[30]; // ??? -- seems to be 6*6 ints (0x90 bytes) for modules + 5 ints (0x14 bytes) for skin and button se\n\t\t\tint per_skin_equip;\n\t\t\tint per_btn_se_equip;\n\t\t\tint per_slide_se_equip;\n\t\t\tint per_chainslide_se_equip;\n\t\t\tint per_slidertouch_se_equip;\n\t\t\tint clearRank;        // +0xac: clear rank\n\t\t\tint score;            // +0xb0: score\n\t\t\tint percent;          // +0xb4: best percent\n\t\t\tbyte paddingB8[0x14]; // ??? -- challenge_kind, chain_challenge_flag, chain_challenge_num, chain_challenge_max, challenge_ng_flag\n\t\t\tint rival_clearRank;  // +0xcc: rival clear rank?\n\t\t\tint rival_score;      // +0xd0: rival score\n\t\t\tint rival_percent;    // +0xd4: rival percent\n\t\t\tbyte paddingD8[0x9];  // ??? -- interim_ranking int?\n\t\t\tbyte optionA;         // +0xe1: gamemode options\n\t\t\tbyte optionB;\n\t\t\tbyte optionC;\n\n\t\t\tinline bool operator==(const DivaScore& cmp)\n\t\t\t{\n\t\t\t\treturn cmp.pvNum == pvNum && cmp.exDifficulty == exDifficulty;\n\t\t\t}\n\n\t\t\tDivaScore(int pv, int exDiff)\n\t\t\t{\n\t\t\t\t// this is just copied from 140113510\n\t\t\t\t// no clue what most of it is\n\t\t\t\tpvNum = pv;\n\t\t\t\texDifficulty = exDiff;\n\t\t\t\t*(int*)((uint64_t)this + 0x08) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0x0c) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0x10) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0x14) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0x18) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0x1c) = 0;\n\t\t\t\t*(long long*)((uint64_t)this + 0x20) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x28) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x30) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x38) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x40) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x48) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x50) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x58) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x60) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x68) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x70) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0x78) = -1;\n\t\t\t\t*(int*)((uint64_t)this + 0x80) = 0x01010101;\n\t\t\t\t*(int*)((uint64_t)this + 0x84) = 0x01010101;\n\t\t\t\t*(int*)((uint64_t)this + 0x88) = 0x01010101;\n\t\t\t\t*(int*)((uint64_t)this + 0x8c) = 0x01010101;\n\t\t\t\t*(int*)((uint64_t)this + 0x90) = 0x01010101;\n\t\t\t\t*(int*)((uint64_t)this + 0x94) = 0x01010101;\n\t\t\t\t*(int*)((uint64_t)this + 0x98) = 0;\n\t\t\t\t*(long long*)((uint64_t)this + 0x9c) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0xa4) = -1;\n\t\t\t\t*(int*)((uint64_t)this + 0xac) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0xb0) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0xb8) = -1;\n\t\t\t\t*(byte*)((uint64_t)this + 0xbc) = 0;\n\t\t\t\t*(long long*)((uint64_t)this + 0xc0) = -1;\n\t\t\t\t*(byte*)((uint64_t)this + 0xc8) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0xcc) = -1;\n\t\t\t\t*(long long*)((uint64_t)this + 0xd0) = 0;\n\t\t\t\t*(int*)((uint64_t)this + 0xd8) = -1;\n\t\t\t\t*(byte*)((uint64_t)this + 0xdc) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xdd) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xde) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xdf) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xe0) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xe1) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xe2) = 0;\n\t\t\t\t*(byte*)((uint64_t)this + 0xe3) = 0;\n\t\t\t}\n\t\t\tDivaScore()\n\t\t\t{\n\t\t\t\tDivaScore(0, 0);\n\t\t\t}\n\t\t};\n\n\n\t\tstatic std::vector<ScoreSaver::DivaScore> ScoreCache[4]; // * 4 difficulties\n\n\t\tstatic void UpdateScoreCache();\n\t\tstatic void UpdateSingleScoreCacheEntry(int pvNum, int diff, int exDiff, bool doDefaultsReset);\n\t\tstatic void UpdateSingleScoreCacheRivalEntry(int pvNum, int diff, int exDiff);\n\t\tstatic void UpdateSingleScoreCacheModulesEntry(int pvNum, int diff, int exDiff);\n\t\tstatic void UpdateSingleScoreCacheSkinsEntry(int pvNum, int diff, int exDiff);\n\t\tstatic void UpdateSingleScoreCacheSFXEntry(int pvNum, int diff, int exDiff);\n\t\tstatic void FixScoreCacheAddresses(int diff); // only call this from the main thread\n\t\tstatic DivaScore* GetCachedScore(int pvNum, int diff, int exDiff);\n\t\tstatic void UpdateClearCounts();\n\t\tstatic void ModuleCheck(int pvNum, int diff, int exDiff);\n\n\tprivate:\n\t\tstatic bool(__stdcall* divaInitResults)(void* cls);\n\t\tstatic bool hookedInitResults(void* cls);\n\t\tstatic void InjectCode(void* address, const std::vector<uint8_t> data);\n\t\tstatic void initCache();\n\t\tstatic bool checkExistingScoreValid(int pv, int difficulty, int isEx);\n\t\tstatic int calculateCheck(int score, int cntCools, int cntFines, int percent, int combo, int clearRank, int allTimeRank, int allTimeModifiers, int allTimePercent);\n\n\t\tstatic WCHAR configPath[256];\n\t\tstatic WCHAR rival_configPath[256];\n\t\tstatic WCHAR modules_configPath[256];\n\t\tstatic WCHAR skins_configPath[256];\n\t\tstatic WCHAR sfx_configPath[256];\n\t\tstatic std::thread initThread;\n\n\t\tint currentPv;\n\t\tint currentDifficulty;\n\t\tint currentDifficultyIsEx;\n\t\tbyte currentInsurance;\n\n\t\tstatic bool initCacheFinished;\n\t\tstatic bool didInitialAddressUpdate;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Constants.h",
    "content": "#pragma once\n#include <stdint.h>\n\nconstexpr uint8_t NOP_OPCODE = 0x90;\nconstexpr uint8_t RET_OPCODE = 0xC3;\nconstexpr uint8_t JMP_OPCODE = 0xE9;\nconstexpr uint8_t JNE_OPCODE = 0x85;\n\n//constexpr uint64_t ENGINE_UPDATE_HOOK_TARGET_ADDRESS\t= 0x000000014018CC40;\nconstexpr uint64_t ENGINE_UPDATE_INPUT_ADDRESS\t\t\t= 0x000000014018CBB0;\nconstexpr uint64_t ENGINE_STAGE_DISP_SHADOW_ADDRESS\t\t= 0x0000000140649840;\nconstexpr uint64_t ENGINE_FINISH_DRAW_ADDRESS\t\t\t= 0x0000000140192730;\n\nconstexpr uint64_t CURRENT_GAME_STATE_ADDRESS\t\t\t= 0x0000000140EDA810;\nconstexpr uint64_t CURRENT_GAME_SUB_STATE_ADDRESS\t\t= 0x0000000140EDA82C;\nconstexpr uint64_t RESOLUTION_WIDTH_ADDRESS\t\t\t\t= 0x0000000140EDA8BC;\nconstexpr uint64_t RESOLUTION_HEIGHT_ADDRESS\t\t\t= 0x0000000140EDA8C0;\n\t\t  \nconstexpr uint64_t SYSTEM_WARNING_ELAPSED_ADDRESS\t\t= (0x00000001411A1430 + 0x68);\nconstexpr uint64_t DATA_INIT_STATE_ADDRESS\t\t\t\t= 0x0000000140EDA7A8;\n\t\t  \nconstexpr uint64_t AET_FRAME_DURATION_ADDRESS\t\t\t= 0x00000001409A0A58;\nconstexpr uint64_t PV_FRAME_RATE_ADDRESS\t\t\t\t= 0x0000000140EDA7CC;\nconstexpr uint64_t FRAME_SPEED_ADDRESS\t\t\t\t\t= 0x0000000140EDA798;\nconstexpr uint64_t FRAME_RATE_ADDRESS\t\t\t\t\t= 0x0000000140EDA6D0;\nconstexpr uint64_t USE_AUTO_FRAMESPEED_ADDRESS\t\t\t= 0x0000000140EDA79C;\nconstexpr uint64_t AUTO_FRAMESPEED_TARGET_FRAMERATE_ADDRESS = 0x0000000140EDA6CC;\n\t\t  \nconstexpr uint64_t DW_GUI_DISPLAY_INSTANCE_PTR_ADDRESS\t= 0x0000000141190108;\nconstexpr uint64_t INPUT_STATE_PTR_ADDRESS\t\t\t\t= 0x0000000140EDA330;\nconstexpr uint64_t SLIDER_CTRL_TASK_ADDRESS\t\t\t\t= 0x000000014CC5DE40;\nconstexpr uint64_t TASK_TOUCH_ADDRESS\t\t\t\t\t= 0x000000014CC9EC30;\nconstexpr uint64_t SEL_PV_TIME_ADDRESS\t\t\t\t\t= 0x000000014CC12498;\nconstexpr uint64_t PLAYER_DATA_ADDRESS\t\t\t\t\t= 0x00000001411A8850;\nconstexpr uint64_t SET_DEFAULT_PLAYER_DATA_ADDRESS\t\t= 0x00000001404A7370;\nconstexpr uint64_t PLAYS_PER_SESSION_GETTER_ADDRESS\t\t= 0x000000014038AEE0;\nconstexpr uint64_t PV_SEL_SLOTS_TO_SCROLL\t\t\t\t= 0x000000014CC12470;\nconstexpr uint64_t PV_SEL_SLOTS_CONST\t\t\t\t\t= 0x000000014CC119C8;\nconstexpr uint64_t MODULE_SEL_SLOTS_TO_SCROLL\t\t\t= 0x00000001418047EC;\nconstexpr uint64_t MODULE_IS_RECOMMENDED\t\t\t\t= 0x00000001418047E0;\n\nconstexpr uint64_t CAMERA_ADDRESS\t\t\t\t\t\t= 0x0000000140FBC2C0;\nconstexpr uint64_t CAMERA_POS_SETTER_ADDRESS\t\t\t= 0x00000001401F9460;\nconstexpr uint64_t CAMERA_INTR_SETTER_ADDRESS\t\t\t= 0x00000001401F93F0;\nconstexpr uint64_t CAMERA_ROT_SETTER_ADDRESS\t\t\t= 0x00000001401F9480;\nconstexpr uint64_t CAMERA_PERS_SETTER_ADDRESS\t\t\t= 0x00000001401F9430;\n\nconstexpr uint64_t UPDATE_TASKS_ADDRESS\t\t\t\t\t= 0x000000014019B980;\nconstexpr uint64_t GLUT_SET_CURSOR_ADDRESS\t\t\t\t= 0x00000001408B68E6;\nconstexpr uint64_t CHANGE_MODE_ADDRESS\t\t\t\t\t= 0x00000001401953D0;\nconstexpr uint64_t CHANGE_SUB_MODE_ADDRESS\t\t\t\t= 0x0000000140195260;\n\nconstexpr uint64_t TGT_CLASS_ADDRESS = 0x0000000140D0B660;\nconstexpr uint64_t TGT_STATES_FIRST_POINTER_ADDRESS = 0x0000000140D0B680;\nconstexpr uint64_t TGT_STATES_BASE_ADDRESS = 0x0000000140D0B688;\nconstexpr uint64_t TGT_ON_SCREEN_ADDRESS = 0x0000000140D0B678;\n\nconstexpr uint64_t HOLD_STATE_ADDRESS = 0x0000000140D1E20C;\nconstexpr uint64_t MAX_HOLD_STATE_ADDRESS = 0x0000000140D1E234;\n\nconstexpr uint64_t CHECK_SOMETHING_SET_MODULE_ADDRESS = 0x0000000140581C78;\nconstexpr uint64_t MODSELECTOR_CHECK_FUNCTION_ERRRET_ADDRESS = 0x00000001405869AD;\nconstexpr uint64_t MODSELECTOR_CLOSE_AFTER_MODULE = 0x0000000140583B45;\nconstexpr uint64_t MODSELECTOR_CLOSE_AFTER_CUSTOMIZE = 0x0000000140583C8C;\nconstexpr uint64_t MODULE_TABLE_START = PLAYER_DATA_ADDRESS + 0x140;\nconstexpr uint64_t MODULE_TABLE_END = MODULE_TABLE_START + 128;\nconstexpr uint64_t ITEM_TABLE_START = PLAYER_DATA_ADDRESS + 0x2B8;\nconstexpr uint64_t ITEM_TABLE_END = ITEM_TABLE_START + 128;\n\nconstexpr uint64_t FB_WIDTH_ADDRESS = 0x00000001411ABCA8;\nconstexpr uint64_t FB_HEIGHT_ADDRESS = 0x00000001411ABCAC;\nconstexpr uint64_t FB1_WIDTH_ADDRESS = 0x00000001411AD5F8;\nconstexpr uint64_t FB1_HEIGHT_ADDRESS = 0x00000001411AD5FC;\nconstexpr uint64_t FB2_WIDTH_ADDRESS = 0x0000000140EDA8E4;\nconstexpr uint64_t FB2_HEIGHT_ADDRESS = 0x0000000140EDA8E8;\n\nconstexpr uint64_t FB_RESOLUTION_WIDTH_ADDRESS = 0x00000001411ABB50;\nconstexpr uint64_t FB_RESOLUTION_HEIGHT_ADDRESS = 0x00000001411ABB54;\n\nconstexpr uint64_t UI_WIDTH_ADDRESS = 0x000000014CC621E4;\nconstexpr uint64_t UI_HEIGHT_ADDRESS = 0x000000014CC621E8;\n\nconstexpr uint64_t FB_ASPECT_RATIO = 0x0000000140FBC2E8;\nconstexpr uint64_t UI_ASPECT_RATIO = 0x000000014CC621D0;\n\nconstexpr uint64_t GET_SLIDER_TAPPED_ADDRESS = 0x0000000140618C60;\nconstexpr uint64_t GET_SLIDER_RELEASED_ADDRESS = 0x0000000140618C40;\nconstexpr uint64_t GET_SLIDER_DOWN_ADDRESS = 0x0000000140618C20;\n\nconstexpr uint64_t SHOULD_EXIT_BOOL_ADDRESS = 0x0000000140EDA6B0;\nconstexpr uint64_t DOEXIT_ADDRESS = 0x000000014085B574;\n\nconstexpr uint64_t RESULTS_INIT_ADDRESS = 0x000000014065BBC0;\nconstexpr uint64_t RESULTS_BASE_ADDRESS = 0x000000014CC93830;\nconstexpr uint64_t GAME_INFO_ADDRESS = 0x0000000141197E00;\n\nconstexpr uint64_t CURRENT_SONG_NAME_ADDRESS = 0x0000000140D0A578;\nconstexpr uint64_t CURRENT_SONG_ID_ADDRESS = 0x0000000140CDD8E0;\nconstexpr uint64_t SELPV_CURRENT_SONG_ADDRESS = 0x000000014CC12438;\nconstexpr uint64_t SONG_CLEAR_COUNTS_ADDRESS = 0x00000001411A95E8;\n\nconstexpr uint64_t AUDIO_MAIN_CLASS_ADDRESS = 0x000000014CC61120;\n\nconstexpr uint64_t DSC_TIME_ADDRESS = 0x0000000140D0B518;\nconstexpr uint64_t DSC_START_FROM_TIME_ADDRESS = 0x0000000140D0B540;\nconstexpr uint64_t DSC_START_SYS_TIME_ADDRESS = 0x0000000140D0B548;\nconstexpr uint64_t DSC_TIME_ADDRESS_2 = 0x0000000140D0B520;\nconstexpr uint64_t DSC_START_FROM_TIME_ADDRESS_2 = 0x0000000140D0B560;\nconstexpr uint64_t DSC_START_SYS_TIME_ADDRESS_2 = 0x0000000140D0B568;\n\nconstexpr uint64_t DSC_PAUSE_FUNC_ADDRESS = 0x00000001401295C0;\nconstexpr uint64_t DSC_UNPAUSE_FUNC_ADDRESS = 0x0000000140129590;\n\nconstexpr uint64_t DSC_POSITION_ADDRESS = 0x0000000140D098A4;\nconstexpr uint64_t DSC_TIME_RESET_ADDRESS = 0x0000000140D0B538;\nconstexpr uint64_t DSC_TIME_RESET_ADDRESS_2 = 0x0000000140D0B512;\nconstexpr uint64_t DSC_TIME_RESET_FLAG_1 = 0x0000000140CDD7D0;\nconstexpr uint64_t DSC_TIME_RESET_FLAG_2 = 0x0000000140CDD7D4;\n\nconstexpr uint64_t PV_GAME_BASE_ADDRESS = 0x000000014CC95270;\nconstexpr uint64_t GIVEUP_FUNC_ADDRESS = 0x000000014010EF00;\n\nconstexpr uint64_t PV_STATE_ADDRESS = 0x0000000140D0B512;\nconstexpr uint64_t PV_LOADING_STATE_ADDRESS = 0x0000000140D0B524;\nconstexpr uint64_t PV_INNER_LOADING_STATE_ADDRESS = 0x0000000140CDD8D8;\n\nconstexpr uint64_t AET_DEBUG_ARRAY_POINTER_ADDRESS = 0x0000000140EC5430 + 0x98;\nconstexpr uint64_t AET_ARRAY_POINTER_ADDRESS = 0x0000000140EC5430 + 0xD8;\n\n\n#define XINPUT_A 0x00\n#define XINPUT_B 0x01\n#define XINPUT_X 0x02\n#define XINPUT_Y 0x03\n#define XINPUT_UP 0x10\n#define XINPUT_DOWN 0x11\n#define XINPUT_LEFT 0x12\n#define XINPUT_RIGHT 0x13\n#define XINPUT_LS 0x20\n#define XINPUT_RS 0x21\n#define XINPUT_LT 0x22\n#define XINPUT_RT 0x23\n#define XINPUT_LSB 0x24\n#define XINPUT_RSB 0x25\n#define XINPUT_START 0x30\n#define XINPUT_BACK 0x31\n#define XINPUT_LUP 0x40\n#define XINPUT_LDOWN 0x41\n#define XINPUT_LLEFT 0x42\n#define XINPUT_LRIGHT 0x43\n#define XINPUT_RUP 0x50\n#define XINPUT_RDOWN 0x51\n#define XINPUT_RLEFT 0x52\n#define XINPUT_RRIGHT 0x53  "
  },
  {
    "path": "source-code/source/plugins/TLAC/FileSystem/ConfigFile.cpp",
    "content": "#include <stdio.h>\n#include \"ConfigFile.h\"\n#include \"../Utilities/Operations.h\"\n\nnamespace TLAC::FileSystem\n{\n\tConfigFile::ConfigFile(const std::string &path) : TextFile(path)\n\t{\n\t\treturn;\n\t}\n\n\tConfigFile::ConfigFile(const std::string &directory, const std::string &file) : TextFile(directory, file)\n\t{\n\t\treturn;\n\t}\n\n\tbool ConfigFile::TryGetValue(const std::string &key, std::string **value)\n\t{\n\t\tauto pair = ConfigMap.find(key);\n\t\tbool found = pair != ConfigMap.end();\n\n\t\t*value = found ? new std::string(pair->second) : nullptr;\n\t\treturn found;\n\t}\n\n\tint ConfigFile::GetIntegerValue(const std::string& key, int defaultval)\n\t{\n\t\tauto pair = ConfigMap.find(key);\n\t\tbool found = pair != ConfigMap.end();\n\n\t\treturn found ? atoi(pair->second.c_str()) : defaultval;\n\t}\n\n\tbool ConfigFile::GetBooleanValue(const std::string& key)\n\t{\n\t\tauto pair = ConfigMap.find(key);\n\t\tbool found = pair != ConfigMap.end();\n\n\t\treturn found ? pair->second == \"true\" : false;\n\t}\n\n\tfloat ConfigFile::GetFloatValue(const std::string & key)\n\t{\n\t\tauto pair = ConfigMap.find(key);\n\t\tbool found = pair != ConfigMap.end();\n\n\t\treturn found ? (float)atof(pair->second.c_str()) : 0.0f;\n\t}\n\n\tstd::string ConfigFile::GetStringValue(const std::string& key)\n\t{\n\t\tauto pair = ConfigMap.find(key);\n\t\tbool found = pair != ConfigMap.end();\n\n\t\treturn found ? pair->second : \"\";\n\t}\n\n\tvoid ConfigFile::Parse(std::ifstream &fileStream)\n\t{\n\t\tstd::string line;\n\n\t\t// check for BOM\n\t\tstd::getline(fileStream, line);\n\t\tif (line.size() >= 3 && line.rfind(\"\\xEF\\xBB\\xBF\", 0) == 0)\n\t\t\tfileStream.seekg(3);\n\t\telse\n\t\t\tfileStream.seekg(0);\n\n\t\twhile (std::getline(fileStream, line))\n\t\t{\n\t\t\tif (IsComment(line))\n\t\t\t\tcontinue;\n\n\t\t\tauto splitline = Utilities::Split(line, \"=\");\n\t\t\tif (splitline.size() < 2)\n\t\t\t\tcontinue;\n\n\t\t\tfor (auto &line : splitline)\n\t\t\t\tUtilities::Trim(line);\n\n\t\t\tConfigMap.insert(std::make_pair(splitline[0], splitline[1]));\n\t\t}\n\t}\n\n\tbool ConfigFile::IsComment(const std::string &line)\n\t{\n\t\treturn line.size() <= 0 || line[0] == '#' || line[0] == '[' || (line.size() >= 2 && line.rfind(\"//\", 0) == 0);\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/FileSystem/ConfigFile.h",
    "content": "#pragma once\n\n#include \"TextFile.h\"\n#include <unordered_map>\n\nnamespace TLAC::FileSystem\n{\n\tclass ConfigFile : public TextFile\n\t{\n\tpublic:\n\t\tConfigFile(const std::string &path);\n\t\tConfigFile(const std::string &directory, const std::string &file);\n\n\t\tstd::unordered_map<std::string, std::string> ConfigMap;\n\n\t\tbool TryGetValue(const std::string &key, std::string **value);\n\t\tint GetIntegerValue(const std::string& key, int defaultval = 0);\n\t\tbool GetBooleanValue(const std::string& key);\n\t\tfloat GetFloatValue(const std::string& key);\n\t\tstd::string GetStringValue(const std::string& key);\n\n\tprotected:\n\t\tvirtual void Parse(std::ifstream &fileStream) override;\n\n\tprivate:\n\t\tbool IsComment(const std::string &line);\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/FileSystem/TextFile.cpp",
    "content": "#include \"TextFile.h\"\n#include <filesystem>\n\nnamespace fs = std::filesystem;\n\nnamespace TLAC::FileSystem\n{\n\tTextFile::TextFile(const std::string &path)\n\t{\n\t\tFileName = path;\n\t}\n\n\tTextFile::TextFile(const std::string &directory, const std::string &file)\n\t{\n\t\tauto fullPath = directory + \"/\" + file;\n\t\tFileName = fullPath;\n\t}\n\n\tTextFile::~TextFile()\n\t{\n\t}\n\n\tbool TextFile::OpenRead()\n\t{\n\t\tfs::path configPath = fs::u8path(FileName);\n\n\t\tif (!fs::exists(configPath))\n\t\t\treturn false;\n\n\t\tstd::ifstream fileStream(configPath.wstring().c_str());\n\t\t\n\t\tif (!fileStream.is_open())\n\t\t\treturn false;\n\n\t\tParse(fileStream);\n\n\t\tfileStream.close();\n\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/FileSystem/TextFile.h",
    "content": "#pragma once\n\n#include <string>\n#include <fstream>\n\nnamespace TLAC::FileSystem\n{\n\tclass TextFile\n\t{\n\tpublic:\n\t\tstd::string FileName;\n\n\t\tTextFile(const std::string &path);\n\t\tTextFile(const std::string &directory, const std::string &file);\n\t\t~TextFile();\n\t\n\t\tbool OpenRead();\n\t\n\tprotected:\n\t\tvirtual void Parse(std::ifstream &fileStream) = 0;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/Binding.cpp",
    "content": "#include \"Binding.h\"\n\nnamespace TLAC::Input\n{\n\tBinding::Binding()\n\t{\n\t}\n\n\tBinding::~Binding()\n\t{\n\t\tfor (auto& binding : InputBindings)\n\t\t\tdelete binding;\n\t}\n\n\tvoid Binding::AddBinding(IInputBinding* inputBinding)\n\t{\n\t\tInputBindings.push_back(inputBinding);\n\t}\n\n\tbool Binding::AnyDown()\n\t{\n\t\tint i = 0;\n\t\tfor (const auto& binding : InputBindings)\n\t\t{\n\t\t\t// If an old input is still held down, don't register it, only a new input is allowed.\n\t\t\tif (binding->IsDown() && (this->lastDownId == i || binding->BypassTransferCheck()))\n\t\t\t\treturn true;\n\n\t\t\ti++;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tbool Binding::AnyTapped()\n\t{\n\t\tint i = 0;\n\t\tfor (const auto& binding : InputBindings)\n\t\t{\n\t\t\tif (binding->IsTapped()) {\n\t\t\t\t// This saves the last button id to a variable, so that it's known as the last input registered (see AnyDown()).\n\t\t\t\tthis->lastDownId = i;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tbool Binding::AnyReleased()\n\t{\n\t\tfor (const auto& binding : InputBindings)\n\t\t{\n\t\t\tif (binding->IsReleased())\n\t\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tint Binding::GetDownCount()\n\t{\n\t\tint count = 0;\n\n\t\tfor (const auto& binding : InputBindings)\n\t\t{\n\t\t\tif (binding->IsDown())\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tint Binding::GetTappedCount()\n\t{\n\t\tint count = 0;\n\n\t\tfor (const auto& binding : InputBindings)\n\t\t{\n\t\t\tif (binding->IsTapped())\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tint Binding::GetReleasedCount()\n\t{\n\t\tint count = 0;\n\n\t\tfor (const auto& binding : InputBindings)\n\t\t{\n\t\t\tif (binding->IsReleased())\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/Binding.h",
    "content": "#pragma once\n#include <vector>\n#include \"IInputBinding.h\"\n\nnamespace TLAC::Input\n{\n\tclass Binding\n\t{\n\t\t// Used in down & tapped events\n\t\tint lastDownId = -1;\n\n\tpublic:\n\t\tstd::vector<IInputBinding*> InputBindings;\n\n\t\tBinding();\n\t\t~Binding();\n\n\t\tvoid AddBinding(IInputBinding* inputBinding);\n\n\t\tbool AnyDown();\n\t\tbool AnyTapped();\n\t\tbool AnyReleased();\n\n\t\tint GetDownCount();\n\t\tint GetTappedCount();\n\t\tint GetReleasedCount();\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/DVLBinding.cpp",
    "content": "#include \"DVLBinding.h\"\n\nnamespace TLAC::Input\n{\n\t#define DivallerInstanceCheckDefault(checkFunc) (Divaller::InstanceInitialized() ? Divaller::GetInstance()->checkFunc : false)\n\n\tDivallerBinding::DivallerBinding(DivallerButton button) : Button(button)\n\t{\n\t}\n\n\tDivallerBinding::~DivallerBinding()\n\t{\n\t}\n\n\tbool DivallerBinding::BypassTransferCheck()\n\t{\n\t\treturn false;\n\t}\n\n\tbool DivallerBinding::IsDown()\n\t{\n\t\treturn DivallerInstanceCheckDefault(IsDown(Button));\n\t}\n\n\tbool DivallerBinding::IsTapped()\n\t{\n\t\treturn DivallerInstanceCheckDefault(IsTapped(Button));\n\t}\n\n\tbool DivallerBinding::IsReleased()\n\t{\n\t\treturn DivallerInstanceCheckDefault(IsReleased(Button));\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/DVLBinding.h",
    "content": "#pragma once\n#include \"IInputBinding.h\"\n#include \"../Divaller/Divaller.h\"\n\nnamespace TLAC::Input\n{\n\tclass DivallerBinding : public IInputBinding\n\t{\n\tpublic:\n\t\tDivallerButton Button;\n\n\t\tDivallerBinding(DivallerButton button);\n\t\t~DivallerBinding();\n\n\t\tbool BypassTransferCheck() override;\n\n\t\tbool IsDown() override;\n\t\tbool IsTapped() override;\n\t\tbool IsReleased() override;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/Ds4Binding.cpp",
    "content": "#include \"Ds4Binding.h\"\n\nnamespace TLAC::Input\n{\n\t#define Ds4InstanceCheckDefault(checkFunc) (DualShock4::InstanceInitialized() ? DualShock4::GetInstance()->checkFunc : false)\n\n\tDs4Binding::Ds4Binding(Ds4Button button) : Button(button)\n\t{\n\t}\n\n\tDs4Binding::~Ds4Binding()\n\t{\n\t}\n\n\tbool Ds4Binding::BypassTransferCheck()\n\t{\n\t\treturn false;\n\t}\n\n\tbool Ds4Binding::IsDown()\n\t{\n\t\treturn Ds4InstanceCheckDefault(IsDown(Button));\n\t}\n\n\tbool Ds4Binding::IsTapped()\n\t{\n\t\treturn Ds4InstanceCheckDefault(IsTapped(Button));\n\t}\n\n\tbool Ds4Binding::IsReleased()\n\t{\n\t\treturn Ds4InstanceCheckDefault(IsReleased(Button));\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/Ds4Binding.h",
    "content": "#pragma once\n#include \"IInputBinding.h\"\n#include \"../DirectInput/Ds4/DualShock4.h\"\n\nnamespace TLAC::Input\n{\n\tclass Ds4Binding : public IInputBinding\n\t{\n\tpublic:\n\t\tDs4Button Button;\n\n\t\tDs4Binding(Ds4Button button);\n\t\t~Ds4Binding();\n\n\t\tbool BypassTransferCheck() override;\n\n\t\tbool IsDown() override;\n\t\tbool IsTapped() override;\n\t\tbool IsReleased() override;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/GuBinding.cpp",
    "content": "#include \"GuBinding.h\"\n\nnamespace TLAC::Input\n{\n\t#define GuInstanceCheckDefault(checkFunc) (GenericUsbInput::InstanceInitialized() ? GenericUsbInput::GetInstance()->checkFunc : false)\n\n\tGuBinding::GuBinding(GuButton button) : Button(button)\n\t{\n\t}\n\n\tGuBinding::~GuBinding()\n\t{\n\t}\n\n\tbool GuBinding::BypassTransferCheck()\n\t{\n\t\treturn false;\n\t}\n\n\tbool GuBinding::IsDown()\n\t{\n\t\treturn GuInstanceCheckDefault(IsDown(Button));\n\t}\n\n\tbool GuBinding::IsTapped()\n\t{\n\t\treturn GuInstanceCheckDefault(IsTapped(Button));\n\t}\n\n\tbool GuBinding::IsReleased()\n\t{\n\t\treturn GuInstanceCheckDefault(IsReleased(Button));\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/GuBinding.h",
    "content": "#pragma once\n#include \"IInputBinding.h\"\n#include \"../DirectInput/GenericUsb/GenericUsbInput.h\"\n\nnamespace TLAC::Input\n{\n\tclass GuBinding : public IInputBinding\n\t{\n\tpublic:\n\t\tGuButton Button;\n\n\t\tGuBinding(GuButton button);\n\t\t~GuBinding();\n\n\t\tbool BypassTransferCheck() override;\n\n\t\tbool IsDown() override;\n\t\tbool IsTapped() override;\n\t\tbool IsReleased() override;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/IInputBinding.h",
    "content": "#pragma once\n\nnamespace TLAC::Input\n{\n\tclass IInputBinding\n\t{\n\tpublic:\n\t\tvirtual bool BypassTransferCheck() = 0;\n\n\t\tvirtual bool IsDown() = 0;\n\t\tvirtual bool IsTapped() = 0;\n\t\tvirtual bool IsReleased() = 0;\t\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/KeyboardBinding.cpp",
    "content": "#include \"KeyboardBinding.h\"\n\nnamespace TLAC::Input\n{\n\tKeyboardBinding::KeyboardBinding(BYTE keycode, bool bypassTransferCheck) : Keycode(keycode), SetBypassTransferCheck(bypassTransferCheck)\n\t{\n\t}\n\n\tKeyboardBinding::~KeyboardBinding()\n\t{\n\t}\n\n\tbool KeyboardBinding::BypassTransferCheck()\n\t{\n\t\treturn SetBypassTransferCheck;\n\t}\n\t\n\tbool KeyboardBinding::IsDown()\n\t{\n\t\treturn Keyboard::GetInstance()->IsDown(Keycode);\n\t}\n\n\tbool KeyboardBinding::IsTapped()\n\t{\n\t\treturn Keyboard::GetInstance()->IsTapped(Keycode);\n\t}\n\n\tbool KeyboardBinding::IsReleased()\n\t{\n\t\treturn Keyboard::GetInstance()->IsReleased(Keycode);\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/KeyboardBinding.h",
    "content": "#pragma once\n#include \"IInputBinding.h\"\n#include \"../Keyboard/Keyboard.h\"\n\nnamespace TLAC::Input\n{\n\tclass KeyboardBinding : public IInputBinding\n\t{\n\tpublic:\n\t\tBYTE Keycode;\n\t\tbool SetBypassTransferCheck;\n\n\t\tKeyboardBinding(BYTE keycode, bool bypassTransferCheck = false);\n\t\t~KeyboardBinding();\n\n\t\tbool BypassTransferCheck() override;\n\n\t\tbool IsDown() override;\n\t\tbool IsTapped() override;\n\t\tbool IsReleased() override;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/MouseBinding.cpp",
    "content": "#include \"MouseBinding.h\"\n#include \"../Keyboard/Keyboard.h\"\n\nnamespace TLAC::Input\n{\n\tMouseBinding::MouseBinding(MouseAction action) : Action(action)\n\t{\n\t}\n\n\tMouseBinding::~MouseBinding()\n\t{\n\t}\n\n\tbool MouseBinding::IsDown()\n\t{\n\t\tswitch (Action)\n\t\t{\n\t\tcase MouseAction_LeftButton:\n\t\t\treturn Keyboard::GetInstance()->IsDown(MK_LBUTTON);\n\t\tcase MouseAction_RightButton:\n\t\t\treturn Keyboard::GetInstance()->IsDown(MK_RBUTTON);\n\t\tcase MouseAction_MiddleButton:\n\t\t\treturn Keyboard::GetInstance()->IsDown(MK_MBUTTON);\n\t\tcase MouseAction_ScrollUp:\n\t\t\treturn Mouse::GetInstance()->GetIsScrolledUp();\n\t\tcase MouseAction_ScrollDown:\n\t\t\treturn Mouse::GetInstance()->GetIsScrolledDown();\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool MouseBinding::IsTapped()\n\t{\n\t\tswitch (Action)\n\t\t{\n\t\tcase MouseAction_LeftButton:\n\t\t\treturn Keyboard::GetInstance()->IsTapped(MK_LBUTTON);\n\t\tcase MouseAction_RightButton:\n\t\t\treturn Keyboard::GetInstance()->IsTapped(MK_RBUTTON);\n\t\tcase MouseAction_MiddleButton:\n\t\t\treturn Keyboard::GetInstance()->IsTapped(MK_MBUTTON);\n\t\tcase MouseAction_ScrollUp:\n\t\t\treturn Mouse::GetInstance()->GetIsScrolledUp();\n\t\tcase MouseAction_ScrollDown:\n\t\t\treturn Mouse::GetInstance()->GetIsScrolledDown();\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool MouseBinding::IsReleased()\n\t{\n\t\tswitch (Action)\n\t\t{\n\t\tcase MouseAction_LeftButton:\n\t\t\treturn Keyboard::GetInstance()->IsReleased(MK_LBUTTON);\n\t\tcase MouseAction_RightButton:\n\t\t\treturn Keyboard::GetInstance()->IsReleased(MK_RBUTTON);\n\t\tcase MouseAction_MiddleButton:\n\t\t\treturn Keyboard::GetInstance()->IsReleased(MK_MBUTTON);\n\t\tcase MouseAction_ScrollUp:\n\t\t\treturn Mouse::GetInstance()->GetWasScrolledUp();\n\t\tcase MouseAction_ScrollDown:\n\t\t\treturn Mouse::GetInstance()->GetWasScrolledDown();\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/MouseBinding.h",
    "content": "#pragma once\n#include \"IInputBinding.h\"\n#include \"../Mouse/Mouse.h\"\n\nnamespace TLAC::Input\n{\n\tenum MouseAction\n\t{\n\t\tMouseAction_LeftButton,\n\t\tMouseAction_RightButton,\n\t\tMouseAction_MiddleButton,\n\t\tMouseAction_ScrollUp,\n\t\tMouseAction_ScrollDown,\n\t};\n\n\tclass MouseBinding : public IInputBinding\n\t{\n\tpublic:\n\t\tMouseAction Action;\n\n\t\tMouseBinding(MouseAction action);\n\t\t~MouseBinding();\n\n\t\tbool IsDown() override;\n\t\tbool IsTapped() override;\n\t\tbool IsReleased() override;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/XinputBinding.cpp",
    "content": "#include \"XinputBinding.h\"\n#include \"..\\Xinput\\Xinput.h\"\n\nnamespace TLAC::Input\n{\n\tXinputBinding::XinputBinding(BYTE keycode) : Keycode(keycode)\n\t{\n\t}\n\n\tXinputBinding::~XinputBinding()\n\t{\n\t}\n\n\tbool XinputBinding::BypassTransferCheck()\n\t{\n\t\treturn false;\n\t}\n\n\tbool XinputBinding::IsDown()\n\t{\n\t\treturn Xinput::GetInstance()->IsDown(Keycode);\n\t}\n\n\tbool XinputBinding::IsTapped()\n\t{\n\t\treturn Xinput::GetInstance()->IsTapped(Keycode);\n\t}\n\n\tbool XinputBinding::IsReleased()\n\t{\n\t\treturn Xinput::GetInstance()->IsReleased(Keycode);\n\t}\n\n\tbool XinputBinding::IsDoubleTapped()\n\t{\n\t\treturn Xinput::GetInstance()->IsDoubleTapped(Keycode);\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Bindings/XinputBinding.h",
    "content": "#pragma once\n#include \"IInputBinding.h\"\n#include <windows.h>\n#include <vector>\n\nnamespace TLAC::Input\n{\n\tclass XinputBinding : public IInputBinding\n\t{\n\tpublic:\n\t\tBYTE Keycode;\n\n\t\tXinputBinding(BYTE keycode);\n\t\t~XinputBinding();\n\n\t\tbool BypassTransferCheck() override;\n\n\t\tbool IsDown() override;\n\t\tbool IsTapped() override;\n\t\tbool IsReleased() override;\n\t\tbool IsDoubleTapped();\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Controller.cpp",
    "content": "#include \"Controller.h\"\n\nnamespace TLAC::Input\n{\n\tController::Controller()\n\t{\n\t}\n\n\tController::~Controller()\n\t{\n\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Controller.h",
    "content": "#pragma once\n#include \"DirectInputDevice.h\"\n\nnamespace TLAC::Input\n{\n\tclass Controller : public DirectInputDevice\n\t{\n\tprotected:\n\t\tController();\n\t\t~Controller();\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/DirectInput.cpp",
    "content": "#include \"DirectInput.h\"\n\nnamespace TLAC::Input\n{\n\tIDirectInput8 *IDirectInputInstance = nullptr;\n\n\tHRESULT InitializeDirectInput(HMODULE module)\n\t{\n\t\tHRESULT result = DirectInput8Create(module, DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&IDirectInputInstance, nullptr);\n\t\treturn result;\n\t}\n\n\tbool DirectInputInitialized()\n\t{\n\t\treturn IDirectInputInstance != nullptr;\n\t}\n\n\tvoid DisposeDirectInput()\n\t{\n\t\tif (IDirectInputInstance == nullptr)\n\t\t\treturn;\n\n\t\tIDirectInputInstance->Release();\n\t\tIDirectInputInstance = nullptr;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/DirectInput.h",
    "content": "#pragma once\n#define DIRECTINPUT_VERSION 0x0800\n#include <dinput.h>\n\nnamespace TLAC::Input\n{\n\textern IDirectInput8 *IDirectInputInstance;\n\n\tHRESULT InitializeDirectInput(HMODULE module);\n\tbool DirectInputInitialized();\n\tvoid DisposeDirectInput();\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/DirectInputDevice.cpp",
    "content": "#include \"DirectInputDevice.h\"\n\nnamespace TLAC::Input\n{\n\tHRESULT DirectInputDevice::DI_CreateDevice(const GUID &guid)\n\t{\n\t\tif (!DirectInputInitialized())\n\t\t\treturn DIERR_NOTINITIALIZED;\n\n\t\tHRESULT result = IDirectInputInstance->CreateDevice(guid, &directInputdevice, NULL);\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_SetDataFormat(LPCDIDATAFORMAT dataFormat)\n\t{\n\t\tHRESULT result = directInputdevice->SetDataFormat(dataFormat);\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_SetCooperativeLevel(HWND windowHandle, DWORD flags)\n\t{\n\t\tHRESULT result = directInputdevice->SetCooperativeLevel(windowHandle, flags);\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_Acquire()\n\t{\n\t\tHRESULT result = directInputdevice->Acquire();\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_Unacquire()\n\t{\n\t\tHRESULT result = directInputdevice->Unacquire();\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_Release()\n\t{\n\t\tHRESULT result = directInputdevice->Release();\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_Poll()\n\t{\n\t\tHRESULT result = directInputdevice->Poll();\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_GetDeviceState(DWORD size, LPVOID data)\n\t{\n\t\tHRESULT result = directInputdevice->GetDeviceState(size, data);\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_SetRange(LONG min, LONG max)\n\t{\n\t\tDIPROPRANGE propData;\n\t\tpropData.lMin = min;\n\t\tpropData.lMax = max;\n\n\t\tpropData.diph.dwSize = sizeof(DIPROPRANGE);\n\t\tpropData.diph.dwHeaderSize = sizeof(DIPROPHEADER);\n\t\tpropData.diph.dwHow = DIPH_DEVICE;\n\t\tpropData.diph.dwObj = 0;\n\n\t\tHRESULT result = directInputdevice->SetProperty(DIPROP_RANGE, &propData.diph);\n\t\treturn result;\n\t}\n\n\tHRESULT DirectInputDevice::DI_SetRawMode(BOOL raw)\n\t{\n\t\t// extra unacquire/acquire logic so this can be called on an active device\n\t\tBOOL wasAcquired = DI_Unacquire() == DI_OK;\n\n\t\tDIPROPDWORD propData;\n\t\tpropData.dwData = raw ? DIPROPCALIBRATIONMODE_RAW : DIPROPCALIBRATIONMODE_COOKED;\n\n\t\tpropData.diph.dwSize = sizeof(DIPROPDWORD);\n\t\tpropData.diph.dwHeaderSize = sizeof(DIPROPHEADER);\n\t\tpropData.diph.dwHow = DIPH_DEVICE;\n\t\tpropData.diph.dwObj = 0;\n\n\t\tHRESULT result = NULL;\n\n\t\tif (FAILED(result = directInputdevice->SetProperty(DIPROP_CALIBRATIONMODE, &propData.diph)))\n\t\t\treturn result;\n\n\t\tif (wasAcquired)\n\t\t\tresult = DI_Acquire();\n\n\t\treturn result;\n\t}\n\n\tvoid DirectInputDevice::DI_Dispose()\n\t{\n\t\tif (directInputdevice == nullptr)\n\t\t\treturn;\n\n\t\tHRESULT result = NULL;\n\n\t\tresult = DI_Unacquire();\n\t\tresult = DI_Release();\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/DirectInputDevice.h",
    "content": "#pragma once\n#include \"DirectInput.h\"\n\nnamespace TLAC::Input\n{\n\tclass DirectInputDevice\n\t{\n\tprotected:\n\t\tIDirectInputDevice8 *directInputdevice;\n\n\t\tHRESULT DI_CreateDevice(const GUID& guid);\n\t\tHRESULT DI_SetDataFormat(LPCDIDATAFORMAT dataFormat);\n\t\tHRESULT DI_SetCooperativeLevel(HWND windowHandle, DWORD flags);\n\t\tHRESULT DI_Acquire();\n\t\tHRESULT DI_Unacquire();\n\t\tHRESULT DI_Release();\n\t\tHRESULT DI_Poll();\n\t\tHRESULT DI_GetDeviceState(DWORD size, LPVOID data);\n\t\tHRESULT DI_SetRange(LONG min, LONG max);\n\t\tHRESULT DI_SetRawMode(BOOL raw);\n\n\t\tvoid DI_Dispose();\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/DirectInputMouse.cpp",
    "content": "#include \"DirectInputMouse.h\"\n\nnamespace TLAC::Input\n{\n\tDirectInputMouse::DirectInputMouse()\n\t{\n\t\tHRESULT result = NULL;\n\n\t\tresult = DI_CreateDevice(GUID_SysMouse);\n\t\t\n\t\tif (FAILED(result))\n\t\t\treturn;\n\n\t\tresult = DI_SetDataFormat(&c_dfDIMouse);\n\t\tresult = DI_Acquire();\n\t}\n\n\tDirectInputMouse::~DirectInputMouse()\n\t{\n\t\tDI_Dispose();\n\t}\n\n\tbool DirectInputMouse::Poll()\n\t{\n\t\tif (!DirectInputInitialized())\n\t\t\treturn FALSE;\n\n\t\tHRESULT result = NULL;\n\n\t\tresult = DI_Poll();\n\t\tresult = DI_GetDeviceState(sizeof(mouseState), &mouseState);\n\n\t\treturn !FAILED(result);\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/DirectInputMouse.h",
    "content": "#pragma once\n#include \"DirectInputDevice.h\"\n\nnamespace TLAC::Input\n{\n\tclass DirectInputMouse : public DirectInputDevice\n\t{\n\tpublic:\n\t\tDirectInputMouse();\n\t\t~DirectInputMouse();\n\n\t\tbool Poll();\n\n\t\tinline long GetXPosition() { return mouseState.lX; };\n\t\tinline long GetYPosition() { return mouseState.lY; };\n\t\tinline long GetMouseWheel() { return mouseState.lZ; };\n\n\tprivate:\n\t\tDIMOUSESTATE mouseState;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Ds4/Ds4Button.h",
    "content": "#pragma once\n\nnamespace TLAC::Input\n{\n\tenum Direction\n\t{\n\t\tDIR_UP, \n\t\tDIR_RIGHT, \n\t\tDIR_DOWN, \n\t\tDIR_LEFT\n\t};\n\n\tenum Ds4Button : int\n\t{\n\t\tDS4_SQUARE = 0,\n\t\tDS4_CROSS = 1,\n\t\tDS4_CIRCLE = 2,\n\t\tDS4_TRIANGLE = 3,\n\t\t\n\t\tDS4_L1 = 4,\n\t\tDS4_R1 = 5,\n\n\t\tDS4_L_TRIGGER = 6,\n\t\tDS4_R_TRIGGER = 7,\n\n\t\tDS4_SHARE = 8,\n\t\tDS4_OPTIONS = 9,\n\n\t\tDS4_L3 = 10,\n\t\tDS4_R3 = 11,\n\n\t\tDS4_PS = 12,\n\t\tDS4_TOUCH = 13,\n\t\n\t\tDS4_DPAD_UP,\n\t\tDS4_DPAD_RIGHT,\n\t\tDS4_DPAD_DOWN,\n\t\tDS4_DPAD_LEFT,\n\n\t\tDS4_L_STICK_UP,\n\t\tDS4_L_STICK_RIGHT,\n\t\tDS4_L_STICK_DOWN,\n\t\tDS4_L_STICK_LEFT,\n\n\t\tDS4_R_STICK_UP,\n\t\tDS4_R_STICK_RIGHT,\n\t\tDS4_R_STICK_DOWN,\n\t\tDS4_R_STICK_LEFT,\n\n\t\tDS4_BUTTON_MAX,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Ds4/Ds4State.cpp",
    "content": "#include \"Ds4State.h\"\n\nnamespace TLAC::Input\n{\n\tJoystick::Joystick() : XAxis(0.0f), YAxis(0.0f)\n\t{\n\t\treturn;\n\t};\n\n\tJoystick::Joystick(float xAxis, float yAxis) : XAxis(xAxis), YAxis(yAxis) \n\t{\n\t\treturn;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Ds4/Ds4State.h",
    "content": "#pragma once\n#include \"../DirectInput.h\"\n#include \"Ds4Button.h\"\n\nnamespace TLAC::Input\n{\n\tstruct Joystick\n\t{\n\t\tFLOAT XAxis, YAxis;\n\n\t\tJoystick();\n\t\tJoystick(float xAxis, float yAxis);\n\t};\n\n\tstruct Dpad\n\t{\n\t\tBOOL IsDown;\n\t\tFLOAT Angle;\n\t\tJoystick Stick;\n\t};\n\n\tstruct Trigger\n\t{\n\t\tFLOAT Axis;\n\t};\n\n\tstruct Ds4State\n\t{\n\t\tDIJOYSTATE2 DI_JoyState;\n\n\t\tBYTE Buttons[DS4_BUTTON_MAX];\n\n\t\tDpad Dpad;\n\t\tJoystick LeftStick;\n\t\tJoystick RightStick;\n\t\tTrigger LeftTrigger;\n\t\tTrigger RightTrigger;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Ds4/DualShock4.cpp",
    "content": "#include \"DualShock4.h\"\n#include \"../../../Utilities/Math.h\"\n#include \"../../../framework.h\"\n#include <stdio.h>\n\nnamespace TLAC::Input\n{\n\tDualShock4* DualShock4::instance;\n\tbool DualShock4::rawMode = false;\n\n\tDualShock4::DualShock4()\n\t{\n\t}\n\n\tDualShock4::~DualShock4()\n\t{\n\t\tDI_Dispose();\n\t}\n\n\tbool DualShock4::TryInitializeInstance()\n\t{\n\t\tif (InstanceInitialized())\n\t\t\treturn true;\n\n\t\tif (!DirectInputInitialized())\n\t\t\treturn false;\n\t\t\n\t\tDualShock4 *dualShock4 = new DualShock4();\n\n\t\tbool success = dualShock4->Initialize();\n\t\tinstance = success ? dualShock4 : nullptr;\n\n\t\tif (!success)\n\t\t\tdelete dualShock4;\n\n\t\treturn success;\n\t}\n\n\tbool DualShock4::Initialize()\n\t{\n\t\tHRESULT result = NULL;\n\n\t\tconst size_t guidCount = sizeof(GUID_Ds4) / sizeof(GUID);\n\t\tfor (size_t i = 0; i < guidCount; i++)\n\t\t{\n\t\t\tresult = DI_CreateDevice(GUID_Ds4[i]);\n\n\t\t\tif (!FAILED(result))\n\t\t\t\tbreak;\n\t\t\telse if (i == guidCount - 1)\n\t\t\t\treturn false;\n\t\t}\n\n\t\tif (FAILED(result = DI_SetDataFormat(&c_dfDIJoystick2)))\n\t\t\treturn false;\n\n\t\tif (FAILED(result = DI_SetRange(0, 255))) // use 8-bit data\n\t\t\treturn false;\n\n\t\t// set raw mode from previous instance\n\t\tif (rawMode && FAILED(result = DI_SetRawMode(true)))\n\t\t\treturn false;\n\n\t\tresult = DI_Acquire();\n\n\t\treturn true;\n\t}\n\n\tbool DualShock4::SetRawMode(bool raw)\n\t{\n\t\tHRESULT result = NULL;\n\t\tif (FAILED(result = DI_SetRawMode(raw)))\n\t\t\treturn false;\n\n\t\trawMode = raw;\n\n\t\treturn true;\n\t}\n\n\tbool DualShock4::PollInput()\n\t{\n\t\tlastState = currentState;\n\n\t\tHRESULT result = NULL;\n\t\tresult = DI_Poll();\n\t\tresult = DI_GetDeviceState(sizeof(DIJOYSTATE2), &currentState.DI_JoyState);\n\n\t\tif (result != DI_OK)\n\t\t\treturn false;\n\n\t\tUpdateInternalDs4State(currentState);\n\n\t\tfor (int button = 0; button < DS4_BUTTON_MAX; button++)\n\t\t\tcurrentState.Buttons[button] = GetButtonState(currentState, (Ds4Button)button);\n\n\t\treturn true;\n\t}\n\n\tvoid DualShock4::UpdateInternalDs4State(Ds4State &state)\n\t{\n\t\tif (state.Dpad.IsDown = state.DI_JoyState.rgdwPOV[0] != -1)\n\t\t{\n\t\t\tstate.Dpad.Angle = (state.DI_JoyState.rgdwPOV[0] / 100.0f);\n\n\t\t\tauto direction = Utilities::GetDirection(state.Dpad.Angle);\n\t\t\tstate.Dpad.Stick = { direction.Y, -direction.X };\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstate.Dpad.Angle = 0;\n\t\t\tstate.Dpad.Stick = Joystick();\n\t\t}\n\n\t\tstate.LeftStick = NormalizeStick(state.DI_JoyState.lX, state.DI_JoyState.lY);\n\t\tstate.RightStick = NormalizeStick(state.DI_JoyState.lZ, state.DI_JoyState.lRz);\n\n\t\tstate.LeftTrigger = { NormalizeTrigger(state.DI_JoyState.lRx) };\n\t\tstate.RightTrigger = { NormalizeTrigger(state.DI_JoyState.lRy) };\n\t}\n\n\tbool DualShock4::IsDown(Ds4Button button)\n\t{\n\t\treturn currentState.Buttons[button];\n\t}\n\n\tbool DualShock4::IsUp(Ds4Button button)\n\t{\n\t\treturn !IsDown(button);\n\t}\n\n\tbool DualShock4::IsTapped(Ds4Button button)\n\t{\n\t\treturn IsDown(button) && WasUp(button);\n\t}\n\n\tbool DualShock4::IsReleased(Ds4Button button)\n\t{\n\t\treturn IsUp(button) && WasDown(button);\n\t}\n\n\tbool DualShock4::WasDown(Ds4Button button)\n\t{\n\t\treturn lastState.Buttons[button];\n\t}\n\n\tbool DualShock4::WasUp(Ds4Button button)\n\t{\n\t\treturn !WasDown(button);\n\t}\n\n\tbool DualShock4::MatchesDirection(Joystick joystick, Direction directionEnum, float threshold)\n\t{\n\t\tswitch (directionEnum)\n\t\t{\n\t\tcase TLAC::Input::DIR_UP:\n\t\t\treturn joystick.YAxis <= -threshold;\n\n\t\tcase TLAC::Input::DIR_RIGHT:\n\t\t\treturn joystick.XAxis >= +threshold;\n\n\t\tcase TLAC::Input::DIR_DOWN:\n\t\t\treturn joystick.YAxis >= +threshold;\n\n\t\tcase TLAC::Input::DIR_LEFT:\n\t\t\treturn joystick.XAxis <= -threshold;\n\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool DualShock4::GetButtonState(Ds4State &state, Ds4Button button)\n\t{\n\t\tif (button >= DS4_SQUARE && button <= DS4_TOUCH)\n\t\t\treturn state.DI_JoyState.rgbButtons[button];\n\n\t\tif (button >= DS4_DPAD_UP && button <= DS4_DPAD_LEFT)\n\t\t\treturn state.Dpad.IsDown ? MatchesDirection(state.Dpad.Stick, (Direction)(button - DS4_DPAD_UP), dpadThreshold) : false;\n\n\t\tif (button >= DS4_L_STICK_UP && button <= DS4_L_STICK_LEFT)\n\t\t\treturn MatchesDirection(state.LeftStick, (Direction)(button - DS4_L_STICK_UP), joystickThreshold);\n\n\t\tif (button >= DS4_R_STICK_UP && button <= DS4_R_STICK_LEFT)\n\t\t\treturn MatchesDirection(state.RightStick, (Direction)(button - DS4_R_STICK_UP), joystickThreshold);\n\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/Ds4/DualShock4.h",
    "content": "#pragma once\n#include \"../Controller.h\"\n#include \"../../IInputDevice.h\"\n#include \"Ds4State.h\"\n\nnamespace TLAC::Input\n{\n\t// Controller GUIDs:\n\tconst GUID GUID_Ds4[] = \n\t{ \n\t\t// First Generation:  {05C4054C-0000-0000-0000-504944564944}\n\t\t{ 0x05C4054C, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// Second Generation: {09CC054C-0000-0000-0000-504944564944}\n\t\t{ 0x09CC054C, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// PS5 DualSense: {0CE6054C-0000-0000-0000-504944564944}\n\t\t{ 0x0CE6054C, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// GAMO2 DIVALLER: {11140E8F-0000-0000-0000-504944564944}\n\t\t{ 0x11140E8F, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// Hori HATSUNE MIKU X: {00A50F0D-0000-0000-0000-504944564944}\n\t\t{ 0x00A50F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// Hori F2nd Miniboard (Hatsune Miku Sho): {00490F0D-0000-0000-0000-504944564944}\n\t\t{ 0x00490F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// Hori FT Senyou: {013C0F0D-0000-0000-0000-504944564944}\n\t\t{ 0x013C0F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },\n\t\t// HORI HATSUNE MIKU 39S CONTROLLER: {00FB0F0D-0000-0000-0000-504944564944}\n\t\t{ 0x00FB0F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }\n\t};\n\n\tclass DualShock4 : public Controller, public IInputDevice\n\t{\n\tpublic:\n\t\tDualShock4();\n\t\t~DualShock4();\n\n\t\tstatic bool TryInitializeInstance();\n\n\t\tbool Initialize();\n\t\tbool SetRawMode(bool raw);\n\t\tbool PollInput() override;\n\n\t\tbool IsDown(Ds4Button button);\n\t\tbool IsUp(Ds4Button button);\n\t\tbool IsTapped(Ds4Button button);\n\t\tbool IsReleased(Ds4Button button);\n\t\tbool WasDown(Ds4Button button);\n\t\tbool WasUp(Ds4Button button);\n\n\t\tinline Joystick GetLeftStick() { return currentState.LeftStick; };\n\t\tinline Joystick GetRightStick() { return currentState.RightStick; };\n\t\tinline Joystick GetDpad() { return currentState.Dpad.Stick; };\n\n\t\tstatic inline bool InstanceInitialized() { return instance != nullptr; };\n\t\tstatic inline DualShock4* GetInstance() { return instance; };\n\t\tstatic inline void DeleteInstance() { delete instance; instance = nullptr; };\n\n\t\tstatic bool rawMode; // kinda dodgy, used to set raw mode for all instances without waiting for a single one\n\n\tprivate:\n\t\tstatic DualShock4* instance;\n\n\t\tDs4State lastState;\n\t\tDs4State currentState;\n\n\t\tconst float triggerThreshold = 0.5f;\n\t\tconst float joystickThreshold = 0.5f;\n\t\tconst float dpadThreshold = 0.5f;\n\t\n\t\tinline float NormalizeTrigger(long value) { return (float)value / UCHAR_MAX; };\n\t\tinline float NormalizeStick(long value) { return (float)value / UCHAR_MAX * 2.0f - 1.0f; };\n\t\tinline Joystick NormalizeStick(long x, long y) { return Joystick(NormalizeStick(x), NormalizeStick(y)); };\n\n\t\tvoid UpdateInternalDs4State(Ds4State &state);\n\n\t\tbool MatchesDirection(Joystick joystick, Direction directionEnum, float threshold);\n\t\tbool GetButtonState(Ds4State &state, Ds4Button button);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/GenericUsb/GenericUsbInput.cpp",
    "content": "#include \"GenericUsbInput.h\"\n#include \"../../../Utilities/Math.h\"\n#include \"../../../Utilities/Operations.h\"\n#include \"../../../framework.h\"\n#include \"../../../FileSystem/ConfigFile.h\"\n#include <stdio.h>\n\nconst std::string GU_CONFIG_FILE_NAME = \"keyconfig.ini\";\n\nnamespace TLAC::Input\n{\n\tGenericUsbInput* GenericUsbInput::instance;\n\n\tGenericUsbInput::GenericUsbInput()\n\t{\n\t}\n\n\tGenericUsbInput::~GenericUsbInput()\n\t{\n\t\tDI_Dispose();\n\t}\n\n\tbool GenericUsbInput::TryInitializeInstance()\n\t{\n\t\tif (InstanceInitialized())\n\t\t\treturn true;\n\n\t\tif (!DirectInputInitialized())\n\t\t\treturn false;\n\t\t\n\t\tGenericUsbInput *genericUsbInput = new GenericUsbInput ();\n\n\t\tbool success = genericUsbInput->Initialize();\n\t\tinstance = success ? genericUsbInput : nullptr;\n\n\t\tif (!success)\n\t\t\tdelete genericUsbInput;\n\n\t\treturn success;\n\t}\n\n\tbool GenericUsbInput::Initialize()\n\t{\n\t\tHRESULT result = NULL; \n\t\t\n\t\tFileSystem::ConfigFile configFile(framework::GetModuleDirectory(), GU_CONFIG_FILE_NAME);\n\t\tconfigFile.OpenRead();\n\n\t\tcustomKeyMapping = configFile.ConfigMap;\n\n\t\tstd::string stt = \"0x\";\n\t\tstd::string vid = configFile.GetStringValue(\"VID\");\n\t\tstd::string pid = configFile.GetStringValue(\"PID\");\n\t\t\n\t\tunsigned int gid = std::strtoul((stt + pid + vid).c_str(), 0, 16);\n\n\t\tGUID GUID_GenericUsb = { gid, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } };\n\t\t\n\t\tresult = DI_CreateDevice(GUID_GenericUsb);\n\t\t\n\t\tif (!FAILED(result))\n\t\t{\n\t\t\tif (FAILED(result = DI_SetDataFormat(&c_dfDIJoystick2)))\n\t\t\t\treturn false;\n\n\t\t\tresult = DI_Acquire();\n\n\t\t\treturn true;\n\t\t}\n\t\telse\t\t\t\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool GenericUsbInput::PollInput()\n\t{\n\t\tlastState = currentState;\n\n\t\tHRESULT result = NULL;\n\t\tresult = DI_Poll();\n\t\tresult = DI_GetDeviceState(sizeof(DIJOYSTATE2), &currentState.DI_JoyState);\n\n\t\tif (result != DI_OK)\n\t\t\treturn false;\n\n\t\tUpdateInternalGuState(currentState);\n\n\t\tfor (int button = 0; button < GU_BUTTON_MAX; button++)\n\t\t{\n\t\t\tbool buttonState = GetButtonState(currentState, (GuButton)button);\n\t\t\tcurrentState.Buttons[button] = buttonState;\n\n\t\t\t// If custom button is pressed\n\t\t\tif (buttonState)\n\t\t\t{\n\t\t\t\t// Check whether this button is a custom mapped button\n\t\t\t\tauto customMapping = customKeyMapping.find(buttonNames[button]);\n\t\t\t\tif (customMapping != customKeyMapping.end())\n\t\t\t\t{\n\t\t\t\t\tstd::vector<std::string> keys = Utilities::Split(customMapping->second, \"+\");\n\t\t\t\t\tfor (std::string key : keys)\n\t\t\t\t\t{\n\t\t\t\t\t\tUtilities::Trim(key);\n\n\t\t\t\t\t\tauto guButton = KeyConfig::Config::GuMap.find(key.c_str());\n\t\t\t\t\t\tcurrentState.Buttons[guButton->second] = buttonState;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tvoid GenericUsbInput::UpdateInternalGuState(GuState &state)\n\t{\n\t\tif (state.Dpad.IsDown = state.DI_JoyState.rgdwPOV[0] != -1)\n\t\t{\n\t\t\tstate.Dpad.Angle = (state.DI_JoyState.rgdwPOV[0] / 100.0f);\n\n\t\t\tauto direction = Utilities::GetDirection(state.Dpad.Angle);\n\t\t\tstate.Dpad.Stick = { direction.Y, -direction.X };\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstate.Dpad.Angle = 0;\n\t\t\tstate.Dpad.Stick = GuJoystick();\n\t\t}\n\n\t\tstate.LeftStick = NormalizeStick(state.DI_JoyState.lX, state.DI_JoyState.lY);\n\t\tstate.RightStick = NormalizeStick(state.DI_JoyState.lZ, state.DI_JoyState.lRz);\n\n\t\tstate.LeftTrigger = { NormalizeTrigger(state.DI_JoyState.lRx) };\n\t\tstate.RightTrigger = { NormalizeTrigger(state.DI_JoyState.lRy) };\n\t}\n\n\tbool GenericUsbInput::IsDown(GuButton button)\n\t{\n\t\treturn currentState.Buttons[button];\n\t}\n\n\tbool GenericUsbInput::IsUp(GuButton button)\n\t{\n\t\treturn !IsDown(button);\n\t}\n\n\tbool GenericUsbInput::IsTapped(GuButton button)\n\t{\n\t\treturn IsDown(button) && WasUp(button);\n\t}\n\n\tbool GenericUsbInput::IsReleased(GuButton button)\n\t{\n\t\treturn IsUp(button) && WasDown(button);\n\t}\n\n\tbool GenericUsbInput::WasDown(GuButton button)\n\t{\n\t\treturn lastState.Buttons[button];\n\t}\n\n\tbool GenericUsbInput::WasUp(GuButton button)\n\t{\n\t\treturn !WasDown(button);\n\t}\n\n\tbool GenericUsbInput::MatchesDirection(GuJoystick joystick, GuDirection directionEnum, float threshold)\n\t{\n\t\tswitch (directionEnum)\n\t\t{\n\t\tcase TLAC::Input::GU_DIR_UP:\n\t\t\treturn joystick.YAxis <= -threshold;\n\n\t\tcase TLAC::Input::GU_DIR_RIGHT:\n\t\t\treturn joystick.XAxis >= +threshold;\n\n\t\tcase TLAC::Input::GU_DIR_DOWN:\n\t\t\treturn joystick.YAxis >= +threshold;\n\n\t\tcase TLAC::Input::GU_DIR_LEFT:\n\t\t\treturn joystick.XAxis <= -threshold;\n\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool GenericUsbInput::GetButtonState(GuState &state, GuButton button)\n\t{\n\t\tif (button >= GU_BUTTON1 && button <= GU_BUTTON13)\n\t\t\treturn state.DI_JoyState.rgbButtons[button];\n\n\t\tif (button >= GU_DPAD_UP && button <= GU_DPAD_LEFT)\n\t\t\treturn state.Dpad.IsDown ? MatchesDirection(state.Dpad.Stick, (GuDirection)(button - GU_DPAD_UP), dpadThreshold) : false;\n\n\t\tif (button >= GU_L_STICK_UP && button <= GU_L_STICK_LEFT)\n\t\t\treturn MatchesDirection(state.LeftStick, (GuDirection)(button - GU_L_STICK_UP), joystickThreshold);\n\n\t\tif (button >= GU_R_STICK_UP && button <= GU_R_STICK_LEFT)\n\t\t\treturn MatchesDirection(state.RightStick, (GuDirection)(button - GU_R_STICK_UP), joystickThreshold);\n\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/GenericUsb/GenericUsbInput.h",
    "content": "#pragma once\n#include \"../Controller.h\"\n#include \"../../IInputDevice.h\"\n#include \"../../../Input/KeyConfig/Config.h\"\n#include \"GuState.h\"\n#include <unordered_map>\n\nnamespace TLAC::Input\n{\n\tclass GenericUsbInput : public Controller, public IInputDevice\n\t{\n\tpublic:\n\t\tGenericUsbInput();\n\t\t~GenericUsbInput();\n\n\t\tstatic bool TryInitializeInstance();\n\n\t\tbool Initialize();\n\t\tbool PollInput() override;\n\n\t\tbool IsDown(GuButton button);\n\t\tbool IsUp(GuButton button);\n\t\tbool IsTapped(GuButton button);\n\t\tbool IsReleased(GuButton button);\n\t\tbool WasDown(GuButton button);\n\t\tbool WasUp(GuButton button);\n\n\t\tinline GuJoystick GetLeftStick() { return currentState.LeftStick; };\n\t\tinline GuJoystick GetRightStick() { return currentState.RightStick; };\n\t\tinline GuJoystick GetDpad() { return currentState.Dpad.Stick; };\n\n\t\tstatic inline bool InstanceInitialized() { return instance != nullptr; };\n\t\tstatic inline GenericUsbInput* GetInstance() { return instance; };\n\t\tstatic inline void DeleteInstance() { delete instance; instance = nullptr; };\n\n\tprivate:\n\t\tstatic GenericUsbInput* instance;\n\n\t\tGuState lastState;\n\t\tGuState currentState;\n\n\t\tstd::unordered_map<std::string, std::string> customKeyMapping;\n\t\t\n\t\tstd::vector<std::string> buttonNames = { \"GU_BUTTON1\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON2\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON3\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON4\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON5\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON6\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON7\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON8\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON9\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON10\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON11\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON12\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON13\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_DPAD_UP\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_DPAD_RIGHT\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_DPAD_DOWN\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_DPAD_LEFT\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_L_STICK_UP\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_L_STICK_RIGHT\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_L_STICK_DOWN\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_L_STICK_LEFT\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_R_STICK_UP\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_R_STICK_RIGHT\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_R_STICK_DOWN\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_R_STICK_LEFT\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"GU_BUTTON_MAX\"\n\t\t                                       };\n\n\t\tconst float triggerThreshold = 0.5f;\n\t\tconst float joystickThreshold = 0.5f;\n\t\tconst float dpadThreshold = 0.5f;\n\t\n\t\tinline float NormalizeTrigger(long value) { return (float)value / USHRT_MAX; };\n\t\tinline float NormalizeStick(long value) { return (float)value / USHRT_MAX * 2.0f - 1.0f; };\n\t\tinline GuJoystick NormalizeStick(long x, long y) { return GuJoystick(NormalizeStick(x), NormalizeStick(y)); };\n\n\t\tvoid UpdateInternalGuState(GuState &state);\n\n\t\tbool MatchesDirection(GuJoystick joystick, GuDirection directionEnum, float threshold);\n\t\tbool GetButtonState(GuState &state, GuButton button);\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/GenericUsb/GuButton.h",
    "content": "#pragma once\n\nnamespace TLAC::Input\n{\n\tenum GuDirection\n\t{\n\t\tGU_DIR_UP, \n\t\tGU_DIR_RIGHT, \n\t\tGU_DIR_DOWN, \n\t\tGU_DIR_LEFT\n\t};\n\n\tenum GuButton : int\n\t{\n\t\tGU_BUTTON1 = 0,\n\t\tGU_BUTTON2 = 1,\n\t\tGU_BUTTON3 = 2,\n\t\tGU_BUTTON4 = 3,\n\t\t\n\t\tGU_BUTTON5 = 4,\n\t\tGU_BUTTON6 = 5,\n\n\t\tGU_BUTTON7 = 6,\n\t\tGU_BUTTON8 = 7,\n\n\t\tGU_BUTTON9 = 8,\n\t\tGU_BUTTON10 = 9,\n\n\t\tGU_BUTTON11 = 10,\n\t\tGU_BUTTON12 = 11,\n\n\t\tGU_BUTTON13 = 12,\n\t\t\n\t\n\t\tGU_DPAD_UP = 14,\n\t\tGU_DPAD_RIGHT = 15,\n\t\tGU_DPAD_DOWN = 16,\n\t\tGU_DPAD_LEFT = 17,\n\n\t\tGU_L_STICK_UP = 18,\n\t\tGU_L_STICK_RIGHT = 19,\n\t\tGU_L_STICK_DOWN = 20,\n\t\tGU_L_STICK_LEFT = 21,\n\n\t\tGU_R_STICK_UP = 22,\n\t\tGU_R_STICK_RIGHT = 23,\n\t\tGU_R_STICK_DOWN = 24,\n\t\tGU_R_STICK_LEFT = 25,\n\n\t\tGU_BUTTON_MAX = 26,\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/GenericUsb/GuState.cpp",
    "content": "#include \"GuState.h\"\n\nnamespace TLAC::Input\n{\n\tGuJoystick::GuJoystick() : XAxis(0.0f), YAxis(0.0f)\n\t{\n\t\treturn;\n\t};\n\n\tGuJoystick::GuJoystick(float xAxis, float yAxis) : XAxis(xAxis), YAxis(yAxis) \n\t{\n\t\treturn;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/DirectInput/GenericUsb/GuState.h",
    "content": "#pragma once\n#include \"../DirectInput.h\"\n#include \"GuButton.h\"\n\nnamespace TLAC::Input\n{\n\tstruct GuJoystick\n\t{\n\t\tFLOAT XAxis, YAxis;\n\n\t\tGuJoystick();\n\t\tGuJoystick(float xAxis, float yAxis);\n\t};\n\n\tstruct GuDpad\n\t{\n\t\tBOOL IsDown;\n\t\tFLOAT Angle;\n\t\tGuJoystick Stick;\n\t};\n\n\tstruct GuTrigger\n\t{\n\t\tFLOAT Axis;\n\t};\n\n\tstruct GuState\n\t{\n\t\tDIJOYSTATE2 DI_JoyState;\n\n\t\tBYTE Buttons[GU_BUTTON_MAX];\n\n\t\tGuDpad Dpad;\n\t\tGuJoystick LeftStick;\n\t\tGuJoystick RightStick;\n\t\tGuTrigger LeftTrigger;\n\t\tGuTrigger RightTrigger;\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Divaller/Divaller.cpp",
    "content": "#include \"Divaller.h\"\r\n#include \"../../framework.h\"\r\n#include \"DivallerButton.h\"\r\n#include \"DivallerState.h\"\r\n#include <stdio.h>\r\n#include <string>\r\n#include <iostream>\r\n\r\nnamespace TLAC::Input\r\n{\r\n\tDivaller *Divaller::instance;\r\n\r\n\tDivaller::Divaller()\r\n\t{\r\n\t\tmemset(outputBuffer, 0, sizeof(outputBuffer));\r\n\t\toutputBuffer[0] = 0x44;\r\n\t\toutputBuffer[1] = 0x4c;\r\n\t\toutputBuffer[2] = 0x61;\r\n\t}\r\n\r\n\tDivaller::~Divaller()\r\n\t{\r\n\t\tCloseHandle(hDeviceHandle);\r\n\t}\r\n\r\n\tbool Divaller::TryInitializeInstance()\r\n\t{\r\n\t\tif (InstanceInitialized())\r\n\t\t\treturn true;\r\n\r\n\t\tDivaller *divaller = new Divaller();\r\n\r\n\t\tBOOL success = divaller->Initialize();\r\n\t\tinstance = success ? divaller : nullptr;\r\n\r\n\t\tif (!success)\r\n\t\t\tdelete divaller;\r\n\r\n\t\treturn success;\r\n\t}\r\n\r\n\tbool Divaller::Initialize()\r\n\t{\r\n\t\tHDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);\r\n\t\tif (hDevInfo == INVALID_HANDLE_VALUE)\r\n\t\t{\r\n\t\t\tprintf(\"[TLAC] Divaller::Initialize(): SetupDiGetClassDevs returned INVALID_HANDLE_VALUE\\n\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tLPCWSTR devPath = NULL;\r\n\t\tfor (size_t i = 0;; i++)\r\n\t\t{\r\n\t\t\tSP_DEVICE_INTERFACE_DATA device_interface_data = {0};\r\n\t\t\tdevice_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);\r\n\t\t\tBOOL success = SetupDiEnumDeviceInterfaces(\r\n\t\t\t\t\thDevInfo,\r\n\t\t\t\t\tNULL,\r\n\t\t\t\t\t&GUID_DEVINTERFACE_USB_DEVICE,\r\n\t\t\t\t\t(DWORD)i,\r\n\t\t\t\t\t&device_interface_data);\r\n\t\t\tif (!success)\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tULONG required_length = 0;\r\n\t\t\tsuccess = SetupDiGetDeviceInterfaceDetail(\r\n\t\t\t\t\thDevInfo,\r\n\t\t\t\t\t&device_interface_data,\r\n\t\t\t\t\tNULL,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\t&required_length,\r\n\t\t\t\t\tNULL);\r\n\r\n\t\t\tUINT8 *interface_data = (UINT8 *)calloc(required_length, sizeof(UINT8));\r\n\r\n\t\t\tPSP_DEVICE_INTERFACE_DETAIL_DATA device_interface_detail_data = (PSP_DEVICE_INTERFACE_DETAIL_DATA)interface_data;\r\n\t\t\tdevice_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);\r\n\r\n\t\t\tULONG actual_length = required_length;\r\n\t\t\tsuccess = SetupDiGetDeviceInterfaceDetail(\r\n\t\t\t\t\thDevInfo,\r\n\t\t\t\t\t&device_interface_data,\r\n\t\t\t\t\tdevice_interface_detail_data,\r\n\t\t\t\t\tactual_length,\r\n\t\t\t\t\t&required_length,\r\n\t\t\t\t\tNULL);\r\n\r\n\t\t\tif (!success)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\t\twcsstr(device_interface_detail_data->DevicePath, L\"vid_0e8f\") == 0 ||\r\n\t\t\t\t\twcsstr(device_interface_detail_data->DevicePath, L\"pid_2213\") == 0)\r\n\t\t\t{\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tdevPath = device_interface_detail_data->DevicePath;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (devPath == NULL)\r\n\t\t{\r\n\t\t\tSetupDiDestroyDeviceInfoList(hDevInfo);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\thDeviceHandle = CreateFile(\r\n\t\t\t\tdevPath,\r\n\t\t\t\tGENERIC_READ | GENERIC_WRITE,\r\n\t\t\t\tFILE_SHARE_READ | FILE_SHARE_WRITE,\r\n\t\t\t\tNULL,\r\n\t\t\t\tOPEN_EXISTING,\r\n\t\t\t\tFILE_FLAG_OVERLAPPED,\r\n\t\t\t\tNULL);\r\n\t\tif (hDeviceHandle == INVALID_HANDLE_VALUE)\r\n\t\t{\r\n\t\t\tprintf(\"[TLAC] Divaller::Initialize(): Open device failed.\\n\");\r\n\t\t\tSetupDiDestroyDeviceInfoList(hDevInfo);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!WinUsb_Initialize(hDeviceHandle, &hInterfaceHandle))\r\n\t\t{\r\n\t\t\tprintf(\"[TLAC] Divaller::Initialize(): WinUsb_Initialize failed.\\n\");\r\n\t\t\tstd::cout << GetLastError() << std::endl;\r\n\t\t\tSetupDiDestroyDeviceInfoList(hDevInfo);\r\n\t\t\tCloseHandle(hDeviceHandle);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tUSB_INTERFACE_DESCRIPTOR USBInterfaceDescriptor;\r\n\t\tif (!WinUsb_QueryInterfaceSettings(hInterfaceHandle, 0, &USBInterfaceDescriptor))\r\n\t\t{\r\n\t\t\tstd::cout << GetLastError() << std::endl;\r\n\t\t\tSetupDiDestroyDeviceInfoList(hDevInfo);\r\n\t\t\tCloseHandle(hDeviceHandle);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tSetupDiDestroyDeviceInfoList(hDevInfo);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tbool Divaller::PollInput()\r\n\t{\r\n\t\tlastState = currentState;\r\n\t\tULONG len = 0;\r\n\t\tmemset(currentState.state, 0, sizeof(currentState.state));\r\n\t\tBOOL bResult = WinUsb_ReadPipe(hInterfaceHandle, (UCHAR)132, currentState.state, _countof(currentState.state), &len, nullptr);\r\n\t\tif (!bResult || currentState.state[0] != 0x42 || currentState.state[1] != 0x56 || currentState.state[2] != 0x5a)\r\n\t\t{\r\n\t\t\tprintf(\"[TLAC] Divaller::PollInput(): WinUsb_ReadPipe failed.\\n\");\r\n\t\t\tstd::cout << GetLastError() << std::endl;\r\n\t\t}\r\n\t\tSetLED();\r\n\t\treturn bResult;\r\n\t}\r\n\r\n\tbool Divaller::SetLED()\r\n\t{\r\n\t\toutputBuffer[3] &= 0x0F;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t // Reset Button LED\r\n\t\toutputBuffer[3] |= (!(*buttonLed >> 1 & 0x0001)) << 4; // SQUARE\r\n\t\toutputBuffer[3] |= (!(*buttonLed >> 3 & 0x0001)) << 5; // CIRCLE\r\n\t\toutputBuffer[3] |= (!(*buttonLed & 0x0001)) << 6;\t\t\t // TRIANGLE\r\n\t\toutputBuffer[3] |= (!(*buttonLed >> 2 & 0x0001)) << 7; // CROSS\r\n\t\tif (*sliderLedInit && !sliderLedData)\r\n\t\t{\r\n\t\t\tsliderLedData = reinterpret_cast<UCHAR *>(*(uint64_t *)(0x14cc5de40 + 0x68) + 0x189c);\r\n\t\t}\r\n\t\tif (sliderLedData)\r\n\t\t{\r\n\t\t\tfor (int n = 0; n < 32; n++)\r\n\t\t\t{\r\n\t\t\t\t// LED number + 3 bytes header + color offset\r\n\t\t\t\toutputBuffer[(31 - n) * 3 + 3 + 3] = sliderLedData[n * 3 + 1]; // BLUE\r\n\t\t\t\toutputBuffer[(31 - n) * 3 + 3 + 2] = sliderLedData[n * 3 + 2]; // RED\r\n\t\t\t\toutputBuffer[(31 - n) * 3 + 3 + 1] = sliderLedData[n * 3 + 3]; // GREEN\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tULONG len = 0;\r\n\t\tBOOL bResult = WinUsb_WritePipe(hInterfaceHandle, (UCHAR)0x03, outputBuffer, 100, &len, NULL);\r\n\t\tif (!bResult)\r\n\t\t{\r\n\t\t\tprintf(\"[TLAC] Divaller::SetLED(): WinUsb_WritePipe failed.\\n\");\r\n\t\t\tstd::cout << GetLastError() << std::endl;\r\n\t\t}\r\n\t\treturn bResult;\r\n\t}\r\n\r\n\tbool Divaller::IsDown(DivallerButton button)\r\n\t{\r\n\t\tswitch (button)\r\n\t\t{\r\n\t\tcase DivallerButton::DVL_L1:\r\n\t\t\treturn (currentState.state[5] >> 0) & 1;\r\n\t\tcase DivallerButton::DVL_L2:\r\n\t\t\treturn (currentState.state[4] >> 7) & 1;\r\n\t\tcase DivallerButton::DVL_L3:\r\n\t\t\treturn (currentState.state[4] >> 6) & 1;\r\n\t\tcase DivallerButton::DVL_FN:\r\n\t\t\treturn (currentState.state[3] >> 1) & 1;\r\n\t\tcase DivallerButton::DVL_TRIANGLE:\r\n\t\t\treturn (currentState.state[3] >> 4) & 1;\r\n\t\tcase DivallerButton::DVL_SQUARE:\r\n\t\t\treturn (currentState.state[3] >> 2) & 1;\r\n\t\tcase DivallerButton::DVL_CROSS:\r\n\t\t\treturn (currentState.state[3] >> 5) & 1;\r\n\t\tcase DivallerButton::DVL_CIRCLE:\r\n\t\t\treturn (currentState.state[3] >> 3) & 1;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tbool Divaller::IsUp(DivallerButton button)\r\n\t{\r\n\t\treturn !IsDown(button);\r\n\t}\r\n\r\n\tbool Divaller::IsTapped(DivallerButton button)\r\n\t{\r\n\t\treturn IsDown(button) && WasUp(button);\r\n\t}\r\n\r\n\tbool Divaller::IsReleased(DivallerButton button)\r\n\t{\r\n\t\treturn IsUp(button) && WasDown(button);\r\n\t}\r\n\r\n\tbool Divaller::WasDown(DivallerButton button)\r\n\t{\r\n\t\tswitch (button)\r\n\t\t{\r\n\t\tcase DivallerButton::DVL_L1:\r\n\t\t\treturn (lastState.state[5] >> 0) & 1;\r\n\t\tcase DivallerButton::DVL_L2:\r\n\t\t\treturn (lastState.state[4] >> 7) & 1;\r\n\t\tcase DivallerButton::DVL_L3:\r\n\t\t\treturn (lastState.state[4] >> 6) & 1;\r\n\t\tcase DivallerButton::DVL_FN:\r\n\t\t\treturn (lastState.state[3] >> 1) & 1;\r\n\t\tcase DivallerButton::DVL_TRIANGLE:\r\n\t\t\treturn (lastState.state[3] >> 4) & 1;\r\n\t\tcase DivallerButton::DVL_SQUARE:\r\n\t\t\treturn (lastState.state[3] >> 2) & 1;\r\n\t\tcase DivallerButton::DVL_CROSS:\r\n\t\t\treturn (lastState.state[3] >> 5) & 1;\r\n\t\tcase DivallerButton::DVL_CIRCLE:\r\n\t\t\treturn (lastState.state[3] >> 3) & 1;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tbool Divaller::WasUp(DivallerButton button)\r\n\t{\r\n\t\treturn !WasDown(button);\r\n\t}\r\n\r\n\tuint32_t Divaller::GetSlider()\r\n\t{\r\n\t\tuint32_t i = 0;\r\n\t\ti |= currentState.state[5] >> 4;\r\n\t\ti |= currentState.state[6] << 4;\r\n\t\ti |= currentState.state[7] << 12;\r\n\t\ti |= currentState.state[8] << 20;\r\n\t\ti |= currentState.state[9] << 28;\r\n\t\t// Reverse the bit order of uint32\r\n\t\ti = (i & 0xaaaaaaaa) >> 1 | (i & 0x55555555) << 1;\r\n\t\ti = (i & 0xcccccccc) >> 2 | (i & 0x33333333) << 2;\r\n\t\ti = (i & 0xf0f0f0f0) >> 4 | (i & 0x0f0f0f0f) << 4;\r\n\t\ti = (i & 0xff00ff00) >> 8 | (i & 0x00ff00ff) << 8;\r\n\t\treturn i >> 16 | i << 16;\r\n\t};\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Divaller/Divaller.h",
    "content": "#pragma once\r\n#include \"../IInputDevice.h\"\r\n#include \"DivallerState.h\"\r\n#include \"DivallerButton.h\"\r\n#include <SetupAPI.h>\r\n#include <initguid.h>\r\n#include <usbiodef.h>\r\n#include <winusb.h>\r\n\r\nnamespace TLAC::Input\r\n{\r\n\r\n\tclass Divaller : public IInputDevice\r\n\t{\r\n\tpublic:\r\n\t\tDivaller();\r\n\t\t~Divaller();\r\n\r\n\t\tstatic bool TryInitializeInstance();\r\n\r\n\t\tbool Initialize();\r\n\t\tbool PollInput() override;\r\n\t\tbool SetLED();\r\n\t\tbool IsDown(DivallerButton button);\r\n\t\tbool IsUp(DivallerButton button);\r\n\t\tbool IsTapped(DivallerButton button);\r\n\t\tbool IsReleased(DivallerButton button);\r\n\r\n\t\tbool WasDown(DivallerButton button);\r\n\t\tbool WasUp(DivallerButton button);\r\n\t\tuint32_t GetSlider();\r\n\t\tstatic inline bool InstanceInitialized() { return instance != nullptr; };\r\n\t\tstatic inline Divaller *GetInstance() { return instance; };\r\n\t\tstatic inline void DeleteInstance()\r\n\t\t{\r\n\t\t\tdelete instance;\r\n\t\t\tinstance = nullptr;\r\n\t\t};\r\n\r\n\tprivate:\r\n\t\tstatic Divaller *instance;\r\n\t\tDivallerState lastState;\r\n\t\tDivallerState currentState;\r\n\t\tWINUSB_INTERFACE_HANDLE hInterfaceHandle;\r\n\t\tHANDLE hDeviceHandle;\r\n\t\tUCHAR outputBuffer[100];\r\n\t\tint *buttonLed = reinterpret_cast<int *>(0x14119b950);\r\n\t\tuint64_t *partionLed = reinterpret_cast<uint64_t *>(*(uint64_t *)0x140eda330 + 0xc9);\r\n\t\tuint64_t *sliderLedInit = reinterpret_cast<uint64_t *>((uint64_t *)0x14cc5dea8);\r\n\t\tUCHAR *sliderLedData = nullptr;\r\n\t};\r\n}\r\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Divaller/DivallerButton.h",
    "content": "#pragma once\r\n\r\nnamespace TLAC::Input\r\n{\r\n\tenum DivallerButton : int\r\n\t{\r\n\t\tDVL_SQUARE = 0,\r\n\t\tDVL_CROSS = 1,\r\n\t\tDVL_CIRCLE = 2,\r\n\t\tDVL_TRIANGLE = 3,\r\n\t\t\r\n\t\tDVL_FN = 4,\r\n\r\n\t\tDVL_L1 = 5,\r\n\t\tDVL_L2 = 6,\r\n\t\tDVL_L3 = 7,\r\n\r\n\t\tDVL_R1 = 8,\r\n\t\tDVL_R2 = 9,\r\n\t\tDVL_R3 = 10,\r\n\r\n\t\tDVL_UP = 11,\r\n\t\tDVL_LEFT = 12,\r\n\t\tDVL_DOWN = 13,\r\n\t\tDVL_RIGHT = 14,\r\n\r\n\t\tDVL_PAD = 11,\r\n\t\tDVL_SHARE = 12,\r\n\t\tDVL_HOME = 13,\r\n\t\tDVL_OPTION = 14\r\n\t};\r\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Divaller/DivallerState.h",
    "content": "#pragma once\r\n#include \"../../framework.h\"\r\nnamespace TLAC::Input\r\n{\r\n\r\n\tstruct DivallerState\r\n\t{\r\n\t\tuint8_t state[24];\r\n\t};\r\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/IInputDevice.h",
    "content": "#pragma once\n\nnamespace TLAC::Input\n{\n\tclass IInputDevice\n\t{\n\tpublic:\n\t\tvirtual bool PollInput() = 0;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/KeyConfig/Config.cpp",
    "content": "#include \"Config.h\"\n#include \"windows.h\"\n#include \"../Bindings/KeyboardBinding.h\"\n#include \"../Bindings/Ds4Binding.h\"\n#include \"../Bindings/GuBinding.h\"\n#include \"../../Utilities/Operations.h\"\n#include \"../Bindings/XinputBinding.h\"\n#include \"../../Constants.h\"\n\nnamespace TLAC::Input::KeyConfig\n{\n\tKeycodeMap Config::Keymap =\n\t{\n\t\t// NumPad Keys\n\t\t{ \"NumPad0\", VK_NUMPAD0 },\n\t\t{ \"NumPad1\", VK_NUMPAD1 },\n\t\t{ \"NumPad2\", VK_NUMPAD2 },\n\t\t{ \"NumPad3\", VK_NUMPAD3 },\n\t\t{ \"NumPad4\", VK_NUMPAD4 },\n\t\t{ \"NumPad5\", VK_NUMPAD5 },\n\t\t{ \"NumPad6\", VK_NUMPAD6 },\n\t\t{ \"NumPad7\", VK_NUMPAD7 },\n\t\t{ \"NumPad8\", VK_NUMPAD8 },\n\t\t{ \"NumPad9\", VK_NUMPAD9 },\n\t\t{ \"Plus\", VK_ADD },\n\t\t{ \"Minus\", VK_SUBTRACT },\n\t\t{ \"Divide\", VK_DIVIDE },\n\t\t{ \"Multiply\", VK_MULTIPLY },\n\t\t// F-Keys\n\t\t{ \"F1\", VK_F1 },\n\t\t{ \"F2\", VK_F2 },\n\t\t{ \"F3\", VK_F3 },\n\t\t{ \"F4\", VK_F4 },\n\t\t{ \"F5\", VK_F5 },\n\t\t{ \"F6\", VK_F6 },\n\t\t{ \"F7\", VK_F7 },\n\t\t{ \"F8\", VK_F8 },\n\t\t{ \"F9\", VK_F9 },\n\t\t{ \"F10\", VK_F10 },\n\t\t{ \"F11\", VK_F11 },\n\t\t{ \"F12\", VK_F12 },\n\t\t{ \"F13\", VK_F13 },\n\t\t{ \"F14\", VK_F14 },\n\t\t{ \"F15\", VK_F15 },\n\t\t{ \"F16\", VK_F16 },\n\t\t{ \"F17\", VK_F17 },\n\t\t{ \"F18\", VK_F18 },\n\t\t{ \"F19\", VK_F19 },\n\t\t{ \"F20\", VK_F20 },\n\t\t{ \"F21\", VK_F21 },\n\t\t{ \"F22\", VK_F22 },\n\t\t{ \"F23\", VK_F23 },\n\t\t{ \"F24\", VK_F24 },\n\t\t// Shift Keys\n\t\t{ \"LeftShift\", VK_LSHIFT },\n\t\t{ \"LShift\",    VK_LSHIFT },\n\t\t{ \"RightShift\", VK_RSHIFT },\n\t\t{ \"RShift\",     VK_RSHIFT },\n\t\t// Control Keys\n\t\t{ \"LeftControl\",  VK_LCONTROL },\n\t\t{ \"LControl\",     VK_LCONTROL },\n\t\t{ \"LCtrl\",        VK_LCONTROL },\n\t\t{ \"RightControl\", VK_RCONTROL },\n\t\t{ \"RControl\",     VK_RCONTROL },\n\t\t{ \"RCtrl\",        VK_RCONTROL },\n\t\t// Arrow Keys\n\t\t{ \"Up\",    VK_UP },\n\t\t{ \"Down\",  VK_DOWN },\n\t\t{ \"Left\",  VK_LEFT },\n\t\t{ \"Right\", VK_RIGHT },\n\t\t// Special Keys\n\t\t{ \"Enter\",  VK_RETURN },\n\t\t{ \"Return\", VK_RETURN },\n\t\t{ \"Tab\",\tVK_TAB },\n\t\t{ \"Back\",      VK_BACK },\n\t\t{ \"Backspace\", VK_BACK },\n\t\t{ \"Space\", VK_SPACE },\n\t\t{ \"Spacebar\", VK_SPACE },\n\t\t{ \"Insert\", VK_INSERT },\n\t\t{ \"Ins\",    VK_INSERT },\n\t\t{ \"Delete\", VK_DELETE },\n\t\t{ \"Del\",    VK_DELETE },\n\t\t{ \"Home\", VK_HOME },\n\t\t{ \"End\",  VK_END },\n\t\t{ \"PageUp\",   VK_PRIOR },\n\t\t{ \"PageDown\", VK_NEXT },\n\t\t{ \"ESC\",    VK_ESCAPE },\n\t\t{ \"Escape\", VK_ESCAPE },\n\t\t{ \"Comma\",\tVK_OEM_COMMA },\n\t\t{ \"Period\", VK_OEM_PERIOD },\n\t\t{ \"Colon\", VK_OEM_1 },\n\t\t{ \"Slash\",\tVK_OEM_2 },\n\t\t{ \"Tilde\",\tVK_OEM_3 },\n\t\t{ \"LeftBracket\",\tVK_OEM_4 },\n\t\t{ \"Backslash\",\tVK_OEM_5 },\n\t\t{ \"RightBracket\",\tVK_OEM_6 },\n\t\t{ \"SingleDoubleQuote\",\tVK_OEM_7 },\n\t\t{ \"OEM_8\",\tVK_OEM_8 },\n\t\t// Mouse buttons\n\t\t{ \"MouseLeft\",\tVK_LBUTTON },\n\t\t{ \"MouseMiddle\",\tVK_MBUTTON },\n\t\t{ \"MouseRight\",\tVK_RBUTTON },\n\t\t{ \"MouseX1\",\tVK_XBUTTON1 },\n\t\t{ \"MouseX2\",\tVK_XBUTTON2 },\n\t};\n\n\tKeycodeMap Config::XinputMap =\n\t{\n\t\t//XINPUT\n\t\t{ \"XINPUT_A\", XINPUT_A},\n\t\t{ \"XINPUT_B\", XINPUT_B},\n\t\t{ \"XINPUT_X\", XINPUT_X},\n\t\t{ \"XINPUT_Y\", XINPUT_Y},\n\t\t{ \"XINPUT_UP\", XINPUT_UP},\n\t\t{ \"XINPUT_DOWN\", XINPUT_DOWN},\n\t\t{ \"XINPUT_LEFT\", XINPUT_LEFT},\n\t\t{ \"XINPUT_RIGHT\", XINPUT_RIGHT},\n\t\t{ \"XINPUT_START\", XINPUT_START},\n\t\t{ \"XINPUT_BACK\", XINPUT_BACK},\n\t\t{ \"XINPUT_LS\", XINPUT_LS},\n\t\t{ \"XINPUT_RS\", XINPUT_RS},\n\t\t{ \"XINPUT_LB\", XINPUT_LS},\n\t\t{ \"XINPUT_RB\", XINPUT_RS},\n\t\t{ \"XINPUT_LT\", XINPUT_LT},\n\t\t{ \"XINPUT_RT\", XINPUT_RT},\n\t\t{ \"XINPUT_LSB\", XINPUT_LSB},\n\t\t{ \"XINPUT_RSB\", XINPUT_RSB},\n\t\t{ \"XINPUT_LLEFT\", XINPUT_LLEFT},\n\t\t{ \"XINPUT_LRIGHT\", XINPUT_LRIGHT},\n\t\t{ \"XINPUT_LUP\", XINPUT_LUP},\n\t\t{ \"XINPUT_LDOWN\", XINPUT_LDOWN},\n\t\t{ \"XINPUT_RLEFT\", XINPUT_RLEFT},\n\t\t{ \"XINPUT_RRIGHT\", XINPUT_RRIGHT},\n\t\t{ \"XINPUT_RUP\", XINPUT_RUP},\n\t\t{ \"XINPUT_RDOWN\", XINPUT_RDOWN},\n\t};\n\n\tDs4ButtonMap Config::Ds4Map =\n\t{\n\t\t// Face Buttons\n\t\t{ \"DS4_SQUARE\", DS4_SQUARE },\n\t\t{ \"Ds4_Square\", DS4_SQUARE },\n\n\t\t{ \"DS4_CROSS\", DS4_CROSS },\n\t\t{ \"Ds4_Cross\", DS4_CROSS },\n\n\t\t{ \"DS4_CIRCLE\", DS4_CIRCLE },\n\t\t{ \"Ds4_Circle\", DS4_CIRCLE },\n\n\t\t{ \"DS4_TRIANGLE\", DS4_TRIANGLE },\n\t\t{ \"Ds4_Triangle\", DS4_TRIANGLE },\n\n\t\t// Standard Buttons\n\t\t{ \"DS4_SHARE\", DS4_SHARE },\n\t\t{ \"Ds4_Share\", DS4_SHARE },\n\n\t\t{ \"DS4_OPTIONS\", DS4_OPTIONS },\n\t\t{ \"Ds4_Options\", DS4_OPTIONS },\n\n\t\t{ \"DS4_PS\", DS4_PS },\n\t\t{ \"Ds4_PS\", DS4_PS },\n\n\t\t{ \"DS4_TOUCH\", DS4_TOUCH },\n\t\t{ \"Ds4_Touch\", DS4_TOUCH },\n\n\t\t{ \"DS4_L1\", DS4_L1 },\n\t\t{ \"Ds4_L1\", DS4_L1 },\n\n\t\t{ \"DS4_R1\", DS4_R1 },\n\t\t{ \"Ds4_R1\", DS4_R1 },\n\n\t\t// D-Pad Directions\n\t\t{ \"DS4_DPAD_UP\", DS4_DPAD_UP },\n\t\t{ \"Ds4_DPad_Up\", DS4_DPAD_UP },\n\n\t\t{ \"DS4_DPAD_RIGHT\", DS4_DPAD_RIGHT },\n\t\t{ \"Ds4_DPad_Right\", DS4_DPAD_RIGHT },\n\n\t\t{ \"DS4_DPAD_DOWN\", DS4_DPAD_DOWN },\n\t\t{ \"Ds4_DPad_Down\", DS4_DPAD_DOWN },\n\n\t\t{ \"DS4_DPAD_LEFT\", DS4_DPAD_LEFT },\n\t\t{ \"Ds4_DPad_Left\", DS4_DPAD_LEFT },\n\n\t\t// Trigger Buttons\n\t\t{ \"DS4_L_TRIGGER\", DS4_L_TRIGGER },\n\t\t{ \"Ds4_L_Trigger\", DS4_L_TRIGGER },\n\n\t\t{ \"DS4_R_TRIGGER\", DS4_R_TRIGGER },\n\t\t{ \"Ds4_R_Trigger\", DS4_R_TRIGGER },\n\t\t\n\t\t// Joystick Buttons\n\t\t{ \"DS4_L3\", DS4_L3 },\n\t\t{ \"Ds4_L3\", DS4_L3 },\n\n\t\t{ \"DS4_R3\", DS4_R3 },\n\t\t{ \"Ds4_R3\", DS4_R3 },\n\n\t\t// Left Joystick\n\t\t{ \"DS4_L_STICK_UP\", DS4_L_STICK_UP },\n\t\t{ \"Ds4_L_Stick_Up\", DS4_L_STICK_UP },\n\n\t\t{ \"DS4_L_STICK_RIGHT\", DS4_L_STICK_RIGHT },\n\t\t{ \"Ds4_L_Stick_Right\", DS4_L_STICK_RIGHT },\n\n\t\t{ \"DS4_L_STICK_DOWN\", DS4_L_STICK_DOWN },\n\t\t{ \"Ds4_L_Stick_Down\", DS4_L_STICK_DOWN },\n\n\t\t{ \"DS4_L_STICK_LEFT\", DS4_L_STICK_LEFT },\n\t\t{ \"Ds4_L_Stick_Left\", DS4_L_STICK_LEFT },\n\n\t\t// Right Joystick\n\t\t{ \"DS4_R_STICK_UP\", DS4_R_STICK_UP },\n\t\t{ \"Ds4_R_Stick_Up\", DS4_R_STICK_UP },\n\n\t\t{ \"DS4_R_STICK_RIGHT\", DS4_R_STICK_RIGHT },\n\t\t{ \"Ds4_R_Stick_Right\", DS4_R_STICK_RIGHT },\n\n\t\t{ \"DS4_R_STICK_DOWN\", DS4_R_STICK_DOWN },\n\t\t{ \"Ds4_R_Stick_Down\", DS4_R_STICK_DOWN },\n\n\t\t{ \"DS4_R_STICK_LEFT\", DS4_R_STICK_LEFT },\n\t\t{ \"Ds4_R_Stick_Left\", DS4_R_STICK_LEFT },\n\t};\n\n\tGuButtonMap Config::GuMap =\n\t{\n\t\t// Face Buttons\n\t\t{ \"GU_BUTTON1\", GU_BUTTON1 },\n\t\t{ \"GU_BUTTON2\", GU_BUTTON2 },\n\t\t{ \"GU_BUTTON3\", GU_BUTTON3 },\n\t\t{ \"GU_BUTTON4\", GU_BUTTON4 },\n\t\t{ \"GU_BUTTON5\", GU_BUTTON5 },\n\t\t{ \"GU_BUTTON6\", GU_BUTTON6 },\n\t\t{ \"GU_BUTTON7\", GU_BUTTON7 },\n\t\t{ \"GU_BUTTON8\", GU_BUTTON8 },\n\t\t{ \"GU_BUTTON9\", GU_BUTTON9 },\n\t\t{ \"GU_BUTTON10\", GU_BUTTON10 },\n\t\t{ \"GU_BUTTON11\", GU_BUTTON11 },\n\t\t{ \"GU_BUTTON12\", GU_BUTTON12 },\n\t\t{ \"GU_BUTTON13\", GU_BUTTON13 },\n\n\t\t// D-Pad Directions\n\t\t{ \"GU_DPAD_UP\", GU_DPAD_UP },\n\t\t{ \"GU_DPAD_RIGHT\", GU_DPAD_RIGHT },\n\t\t{ \"GU_DPAD_DOWN\", GU_DPAD_DOWN },\n\t\t{ \"GU_DPAD_LEFT\", GU_DPAD_LEFT },\n\n\t\t// Left Joystick\n\t\t{ \"GU_L_STICK_UP\", GU_L_STICK_UP },\n\t\t{ \"GU_L_STICK_RIGHT\", GU_L_STICK_RIGHT },\n\t\t{ \"GU_L_STICK_DOWN\", GU_L_STICK_DOWN },\n\t\t{ \"GU_L_STICK_LEFT\", GU_L_STICK_LEFT },\n\t\t\n\t\t// Right Joystick\n\t\t{ \"GU_R_STICK_UP\", GU_R_STICK_UP },\n\t\t{ \"GU_R_STICK_RIGHT\", GU_R_STICK_RIGHT },\n\t\t{ \"GU_R_STICK_DOWN\", GU_R_STICK_DOWN },\t\t\n\t\t{ \"GU_R_STICK_LEFT\", GU_R_STICK_LEFT },\n\n\t};\n\n\tvoid Config::BindConfigKeys(std::unordered_map<std::string, std::string> &configMap, const char *configKeyName, Binding &bindObj, std::vector<std::string> defaultKeys)\n\t{\n\t\tstd::vector<std::string> keys;\n\n\t\tauto configPair = configMap.find(configKeyName);\n\n\t\t// config variable was found in the ini\n\t\tif (configPair != configMap.end())\n\t\t{\n\t\t\tkeys = Utilities::Split(configPair->second, \",\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tkeys = defaultKeys;\n\t\t}\n\n\t\tfor (std::string key : keys)\n\t\t{\n\t\t\tUtilities::Trim(key);\n\n\t\t\t// Applies only for Single-Character keys\n\t\t\tif (key.length() == 1)\n\t\t\t{\n\t\t\t\tbindObj.AddBinding(new KeyboardBinding(key[0]));\n\t\t\t}\n\t\t\telse // for special key names\n\t\t\t{\n\t\t\t\tauto keycode = Config::Keymap.find(key.c_str());\n\n\t\t\t\t// name is known in the special keys map\n\t\t\t\tif (keycode != Config::Keymap.end())\n\t\t\t\t{\n\t\t\t\t\tbindObj.AddBinding(new KeyboardBinding(keycode->second));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tauto xinputBtn = Config::XinputMap.find(key.c_str());\n\n\t\t\t\t\tif (xinputBtn != Config::XinputMap.end())\n\t\t\t\t\t{\n\t\t\t\t\t\tbindObj.AddBinding(new XinputBinding(xinputBtn->second));\n\t\t\t\t\t}\n\t\t\t\t\telse \n\t\t\t\t\t{\n\t\t\t\t\t\t// just gonna be lazy for now and put this inside an else statement\n\t\t\t\t\t\tauto ds4Button = Config::Ds4Map.find(key.c_str());\n\n\t\t\t\t\t\tif (ds4Button != Config::Ds4Map.end())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbindObj.AddBinding(new Ds4Binding(ds4Button->second));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto guButton = Config::GuMap.find(key.c_str());\n\n\t\t\t\t\t\t\tif (guButton != Config::GuMap.end())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbindObj.AddBinding(new GuBinding(guButton->second));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tprintf(\"[TLAC] Config::BindConfigKeys(): Unable to parse key: '%s'\\n\", key.c_str());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/KeyConfig/Config.h",
    "content": "#pragma once\n\n#include <unordered_map>\n#include \"KeyString.h\"\n#include \"KeyStringHash.h\"\n#include \"../Bindings/Binding.h\"\n#include \"../DirectInput/Ds4/Ds4Button.h\"\n#include \"../DirectInput/GenericUsb/GuButton.h\"\n\nnamespace TLAC::Input::KeyConfig\n{\n\ttypedef std::unordered_map<KeyString, uint8_t, KeyStringHash> KeycodeMap;\n\ttypedef std::unordered_map<KeyString, Ds4Button, KeyStringHash> Ds4ButtonMap;\n\ttypedef std::unordered_map<KeyString, GuButton, KeyStringHash> GuButtonMap;\n\n\tclass Config\n\t{\n\tpublic:\n\t\tstatic KeycodeMap Keymap;\n\t\tstatic Ds4ButtonMap Ds4Map;\n\t\tstatic KeycodeMap XinputMap;\n\t\tstatic GuButtonMap GuMap;\n\n\t\tstatic void BindConfigKeys(std::unordered_map<std::string, std::string> &configMap, const char *configKeyName, Binding &bindObj, std::vector<std::string> defaultKeys);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/KeyConfig/KeyString.cpp",
    "content": "#include \"KeyString.h\"\n\nnamespace TLAC::Input::KeyConfig\n{\n\tKeyString::KeyString(const char* str) : value(str)\n\t{\n\t}\n\n\tbool KeyString::operator==(const KeyString& rsv) const\n\t{\n\t\treturn !_strcmpi(value.c_str(), rsv.value.c_str());\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/KeyConfig/KeyString.h",
    "content": "#pragma once\n#include <string>\n\nnamespace TLAC::Input::KeyConfig\n{\n\tstruct KeyString\n\t{\n\t\tstd::string value;\n\n\t\tKeyString(const char* str);\n\t\tbool operator==(const KeyString& rsv) const;\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/KeyConfig/KeyStringHash.cpp",
    "content": "#include \"KeyStringHash.h\"\n#include <filesystem>\n\nnamespace TLAC::Input::KeyConfig\n{\n\tsize_t KeyStringHash::operator()(const KeyString& key) const\n\t{\n\t\tstd::string ret = key.value;\n\t\tstd::transform(ret.begin(), ret.end(), ret.begin(),\n\t\t\t[](unsigned char c) { return std::tolower(c, std::locale()); });\n\t\treturn std::hash<std::string>()(ret);\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/KeyConfig/KeyStringHash.h",
    "content": "#pragma once\n#include \"KeyString.h\"\n\nnamespace TLAC::Input::KeyConfig\n{\n\tstruct KeyStringHash\n\t{\n\t\tsize_t operator()(const KeyString& key) const;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Keyboard/Keyboard.cpp",
    "content": "#include \"Keyboard.h\"\n\nnamespace TLAC::Input\n{\n\tKeyboard* Keyboard::instance;\n\n\tKeyboard::Keyboard()\n\t{\n\t}\n\n\tKeyboard* Keyboard::GetInstance()\n\t{\n\t\tif (instance == nullptr)\n\t\t\tinstance = new Keyboard();\n\n\t\treturn instance;\n\t}\n\n\tbool Keyboard::PollInput()\n\t{\n\t\tlastState = currentState;\n\n\t\tfloat elapsed = keyIntervalWatch.Restart();\n\n\t\tfor (BYTE i = 0; i < KEYBOARD_KEYS; i++)\n\t\t{\n\t\t\t// DOWN\n\t\t\tbool isDown = GetAsyncKeyState(i) < 0;\n\t\t\tcurrentState.KeyStates[i] = isDown;\n\n\t\t\t// DOUBLE TAPPED\n\t\t\tbool isTapped = IsTapped(i);\n\t\t\tkeyDoubleTapStates[i] = isTapped ? keyDoubleTapWatches[i].Restart() <= DOUBLE_TAP_THRESHOLD : false;\n\n\t\t\t// INTERVAL TAPPED\n\t\t\tkeyIntervalTapStates[i] = isTapped;\n\n\t\t\tif (isTapped)\n\t\t\t{\n\t\t\t\tkeyIntervalTapTimes[i] = 0;\n\t\t\t\tkeyIntervalInitials[i] = true;\n\t\t\t}\n\t\t\telse if (isDown)\n\t\t\t{\n\t\t\t\tfloat threshold = keyIntervalInitials[i] ? INTERVAL_TAP_DELAY_THRESHOLD : INTERVAL_TAP_THRESHOLD;\n\n\t\t\t\tbool intervalTapped = (keyIntervalTapTimes[i] += elapsed) > threshold;\n\t\t\t\tkeyIntervalTapStates[i] = intervalTapped;\n\n\t\t\t\tif (intervalTapped)\n\t\t\t\t{\n\t\t\t\t\tkeyIntervalTapTimes[i] = 0;\n\t\t\t\t\tkeyIntervalInitials[i] = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tbool Keyboard::IsDown(BYTE keycode)\n\t{\n\t\treturn currentState.IsDown(keycode);\n\t}\n\n\tbool Keyboard::IsUp(BYTE keycode)\n\t{\n\t\treturn !IsDown(keycode);\n\t}\n\n\tbool Keyboard::IsTapped(BYTE keycode)\n\t{\n\t\treturn IsDown(keycode) && WasUp(keycode);\n\t}\n\n\tbool Keyboard::IsDoubleTapped(BYTE keycode)\n\t{\n\t\treturn keyDoubleTapStates[keycode];\n\t}\n\n\tbool Keyboard::IsReleased(BYTE keycode)\n\t{\n\t\treturn IsUp(keycode) && WasDown(keycode);\n\t}\n\n\tinline bool Keyboard::WasDown(BYTE keycode)\n\t{\n\t\treturn lastState.IsDown(keycode);\n\t}\n\n\tinline bool Keyboard::WasUp(BYTE keycode)\n\t{\n\t\treturn !WasDown(keycode);\n\t}\n\n\tbool Keyboard::IsIntervalTapped(BYTE keycode)\n\t{\n\t\treturn keyIntervalTapStates[keycode];\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Keyboard/Keyboard.h",
    "content": "#pragma once\n#include \"../IInputDevice.h\"\n#include \"KeyboardState.h\"\n#include \"../../Utilities/Stopwatch.h\"\n\nusing Stopwatch = TLAC::Utilities::Stopwatch;\n\nnamespace TLAC::Input\n{\n\tconstexpr float DOUBLE_TAP_THRESHOLD = 200.0f;\n\tconstexpr float INTERVAL_TAP_DELAY_THRESHOLD = 500.0f;\n\tconstexpr float INTERVAL_TAP_THRESHOLD = 75.0f;\n\n\tclass Keyboard : public IInputDevice\n\t{\n\tpublic:\n\t\tstatic Keyboard* GetInstance();\n\t\t\n\t\tbool PollInput() override;\n\t\tbool IsDown(BYTE keycode);\n\t\tbool IsUp(BYTE keycode);\n\t\tbool IsTapped(BYTE keycode);\n\t\tbool IsDoubleTapped(BYTE keycode);\n\t\tbool IsReleased(BYTE keycode);\n\t\tbool IsIntervalTapped(BYTE keycode);\n\n\t\tbool WasDown(BYTE keycode);\n\t\tbool WasUp(BYTE keycode);\n\n\tprivate:\n\t\tKeyboard();\n\t\tKeyboardState lastState;\n\t\tKeyboardState currentState;\n\n\t\tStopwatch keyIntervalWatch;\n\n\t\tBYTE keyDoubleTapStates[KEYBOARD_KEYS];\n\t\tStopwatch keyDoubleTapWatches[KEYBOARD_KEYS];\n\n\t\tBOOL keyIntervalInitials[KEYBOARD_KEYS];\n\t\tBYTE keyIntervalTapStates[KEYBOARD_KEYS];\n\t\tFLOAT keyIntervalTapTimes[KEYBOARD_KEYS];\n\n\t\tstatic Keyboard* instance;\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Keyboard/KeyboardState.cpp",
    "content": "#include \"KeyboardState.h\"\n\nnamespace TLAC::Input\n{\n\tbool KeyboardState::IsDown(BYTE keycode)\n\t{\n\t\treturn KeyStates[keycode];\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Keyboard/KeyboardState.h",
    "content": "#pragma once\n#include <windows.h>\n\nnamespace TLAC::Input\n{\n\tconst int KEYBOARD_KEYS = 0xFF;\n\n\tstruct KeyboardState\n\t{\n\t\tBYTE KeyStates[KEYBOARD_KEYS];\n\t\n\t\tbool IsDown(BYTE keycode);\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Mouse/Mouse.cpp",
    "content": "#include \"Mouse.h\"\n#include \"../../framework.h\"\n#include \"../../Constants.h\"\n\nnamespace TLAC::Input\n{\n\tMouse* Mouse::instance;\n\n\tMouse::Mouse()\n\t{\n\t\tdirectInputMouse = new DirectInputMouse();\n\t}\n\n\tMouse::~Mouse()\n\t{\n\t\tif (directInputMouse != nullptr)\n\t\t\tdelete directInputMouse;\n\t}\n\n\tMouse* Mouse::GetInstance()\n\t{\n\t\tif (instance == nullptr)\n\t\t\tinstance = new Mouse();\n\n\t\treturn instance;\n\t}\n\n\tPOINT Mouse::GetPosition()\n\t{\n\t\treturn currentState.Position;\n\t}\n\n\tPOINT Mouse::GetRelativePosition()\n\t{\n\t\treturn currentState.RelativePosition;\n\t}\n\n\tPOINT Mouse::GetDeltaPosition()\n\t{\n\t\treturn \n\t\t{ \n\t\t\tcurrentState.Position.x - lastState.Position.x, \n\t\t\tcurrentState.Position.y - lastState.Position.y \n\t\t};\n\t}\n\n\tlong Mouse::GetMouseWheel()\n\t{\n\t\treturn currentState.MouseWheel;\n\t}\n\n\tlong Mouse::GetDeltaMouseWheel()\n\t{\n\t\treturn currentState.MouseWheel - lastState.MouseWheel;\n\t}\n\n\tbool Mouse::HasMoved()\n\t{\n\t\tPOINT delta = GetDeltaPosition();\n\t\treturn delta.x != 0 || delta.y != 0;\n\t}\n\n\tbool Mouse::GetIsScrolledUp()\n\t{\n\t\treturn currentState.ScrolledUp;\n\t}\n\n\tbool Mouse::GetIsScrolledDown()\n\t{\n\t\treturn currentState.ScrolledDown;\n\t}\n\n\tbool Mouse::GetWasScrolledUp()\n\t{\n\t\treturn lastState.ScrolledUp;\n\t}\n\n\tbool Mouse::GetWasScrolledDown()\n\t{\n\t\treturn lastState.ScrolledDown;\n\t}\n\n\tvoid Mouse::SetPosition(int x, int y)\n\t{\n\t\tlastState.Position.x = x;\n\t\tlastState.Position.y = y;\n\t\tSetCursorPos(x, y);\n\t}\n\n\tbool Mouse::PollInput()\n\t{\n\t\tlastState = currentState;\n\n\t\tGetCursorPos(&currentState.Position);\n\t\tcurrentState.RelativePosition = currentState.Position;\n\n\t\tif (framework::DivaWindowHandle != NULL)\n\t\t\tScreenToClient(framework::DivaWindowHandle, &currentState.RelativePosition);\n\n\t\t\tRECT hWindow;\n\t\tGetClientRect(TLAC::framework::DivaWindowHandle, &hWindow);\n\n\t\tgameHeight = (int*)RESOLUTION_HEIGHT_ADDRESS;\n\t\tgameWidth = (int*)RESOLUTION_WIDTH_ADDRESS;\n\t\tfbWidth = (int*)FB_WIDTH_ADDRESS;\n\t\tfbHeight = (int*)FB_HEIGHT_ADDRESS;\n\n\t\tif (directInputMouse != nullptr)\n\t\t{\n\t\t\tif (directInputMouse->Poll())\n\t\t\t\tcurrentState.MouseWheel += directInputMouse->GetMouseWheel();\n\t\t\n\t\t\tcurrentState.ScrolledUp = (GetDeltaMouseWheel() > 0);\n\t\t\tcurrentState.ScrolledDown = (GetDeltaMouseWheel() < 0);\n\t\t}\n\n\t\tif ((fbWidth != gameWidth) && (fbHeight != gameHeight)) {\n\t\t\txoffset = ((float)16 / (float)9) * (hWindow.bottom - hWindow.top);\n\t\t\tif (xoffset != (hWindow.right - hWindow.left))\n\t\t\t{\n\t\t\t\tscale = xoffset / (hWindow.right - hWindow.left);\n\t\t\t\txoffset = ((hWindow.right - hWindow.left) / 2) - (xoffset / 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\txoffset = 0;\n\t\t\t\tscale = 1;\n\t\t\t}\n\t\t\t\n\t\t\tcurrentState.RelativePosition.x = ((currentState.RelativePosition.x - round(xoffset)) * *gameWidth / (hWindow.right - hWindow.left)) / scale;\n\t\t\tcurrentState.RelativePosition.y = currentState.RelativePosition.y * *gameHeight / (hWindow.bottom - hWindow.top);\n\t\t}\n\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Mouse/Mouse.h",
    "content": "#pragma once\n#include \"../IInputDevice.h\"\n#include \"../DirectInput/DirectInputMouse.h\"\n#include \"MouseState.h\"\n\nnamespace TLAC::Input\n{\n\tclass Mouse : public IInputDevice\n\t{\n\tpublic:\n\t\t~Mouse();\n\t\t\n\t\tstatic Mouse* GetInstance();\n\n\t\tbool PollInput() override;\n\t\t\n\t\tPOINT GetPosition();\n\t\tPOINT GetRelativePosition();\n\t\tPOINT GetDeltaPosition();\n\t\t\n\t\tlong GetMouseWheel();\n\t\tlong GetDeltaMouseWheel();\n\t\t\n\t\tbool HasMoved();\n\t\tbool GetIsScrolledUp();\n\t\tbool GetIsScrolledDown();\n\t\tbool GetWasScrolledUp();\n\t\tbool GetWasScrolledDown();\n\n\t\tvoid SetPosition(int x, int y);\n\n\tprivate:\n\t\tMouse();\n\t\tMouseState lastState;\n\t\tMouseState currentState;\n\t\tDirectInputMouse* directInputMouse = nullptr;\n\n\t\tint* gameWidth;\n\t\tint* gameHeight;\n\t\tint* fbWidth;\n\t\tint* fbHeight;\n\n\t\tfloat xoffset;\n\t\tfloat scale;\n\n\t\tstatic Mouse* instance;\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Mouse/MouseState.h",
    "content": "#pragma once\n#include <windows.h>\n\nnamespace TLAC::Input\n{\n\tstruct MouseState\n\t{\n\t\tPOINT Position;\n\t\tPOINT RelativePosition;\n\t\tlong MouseWheel;\n\t\tbool ScrolledUp;\n\t\tbool ScrolledDown;\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Xinput/Xinput.cpp",
    "content": "#include <windows.h>\n#include \"Xinput.h\"\n#include \"../../Constants.h\"\n#include \"../../FileSystem/ConfigFile.h\"\n#include \"../../framework.h\"\n#include \"../../Components/GameTargets/TargetInspector.h\"\n#include \"../../Components/Input/TouchSliderEmulator.h\"\n\nnamespace TLAC::Input\n{\n\tXinput* Xinput::instance;\n\n\tXinput::Xinput()\n\t{\n\t\tTLAC::FileSystem::ConfigFile config(TLAC::framework::GetModuleDirectory(), \"keyconfig.ini\");\n\t\tconfig.OpenRead();\n\t\txinput_num = config.GetIntegerValue(\"xinput_preferred\");\n\t\trumble = config.GetBooleanValue(\"rumble\");\n\t\trumble_left = config.GetIntegerValue(\"xinput_rumble_intensity_left\", 8000);\n\t\trumble_right = config.GetIntegerValue(\"xinput_rumble_intensity_right\", 4000);\n\t}\n\n\tXinput* Xinput::GetInstance()\n\t{\n\t\tif (instance == nullptr)\n\t\t{\n\t\t\tinstance = new Xinput();\n\t\t}\n\t\treturn instance;\n\t}\n\n\tvoid Xinput::SetTapStates(BYTE keycode, float elapsed)\n\t{\n\t\tKeyDoubleTapStates[keycode] = IsTapped(keycode) ? KeyDoubleTapWatches[keycode].Restart() <= DOUBLE_TAP_THRESHOLD : false;\n\n\t\tbool isDown = currentState.KeyStates[keycode];\n\t\tbool isTapped = IsTapped(keycode);\n\n\t\tkeyIntervalTapStates[keycode] = isTapped;\n\n\t\tif (isTapped)\n\t\t{\n\t\t\tkeyIntervalTapTimes[keycode] = 0;\n\t\t\tkeyIntervalInitials[keycode] = true;\n\t\t}\n\t\telse if (isDown)\n\t\t{\n\t\t\tfloat threshold = keyIntervalInitials[keycode] ? INTERVAL_TAP_DELAY_THRESHOLD : INTERVAL_TAP_THRESHOLD;\n\n\t\t\tbool intervalTapped = (keyIntervalTapTimes[keycode] += elapsed) > threshold;\n\t\t\tkeyIntervalTapStates[keycode] = intervalTapped;\n\n\t\t\tif (intervalTapped)\n\t\t\t{\n\t\t\t\tkeyIntervalTapTimes[keycode] = 0;\n\t\t\t\tkeyIntervalInitials[keycode] = false;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tbool Xinput::PollInput()\n\t{\n\t\tlastState = currentState;\n\t\tZeroMemory(&state, sizeof(XINPUT_STATE));\n\t\tfloat elapsed = keyIntervalWatch.Restart();\n\n\t\tint xc_pref = xinput_num;\n\t\tif (xc_pref < 0 || xc_pref > 3) xc_pref = 0;\n\t\tfor (int n = 0; n < 4; n++)\n\t\t{\n\t\t\tZeroMemory(&state, sizeof(XINPUT_STATE));\n\t\t\tif (XInputGetState(xc_pref, &state) == ERROR_SUCCESS)\n\t\t\t{\n\t\t\t\tBYTE i = XINPUT_A;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_A)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_DOWN;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_B;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_B)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_RIGHT;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_X;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_X)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_LEFT;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_Y;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_Y)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_UP;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_LS;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_RS;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_LSB;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_RSB;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_START;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_START)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_BACK;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_LT;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.bLeftTrigger > 230)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\ti = XINPUT_RT;\n\t\t\t\t{\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.bRightTrigger > 230)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\n\t\t\t\t{\n\t\t\t\t\t//float normLX = fmaxf(-1, (float)state.Gamepad.sThumbLX / 32767);\n\t\t\t\t\ti = XINPUT_LRIGHT;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbLX > 10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\n\t\t\t\t\ti = XINPUT_LLEFT;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbLX < -10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\n\t\t\t\t\ti = XINPUT_LUP;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbLY > 10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\n\t\t\t\t\ti = XINPUT_LDOWN;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbLY < -10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\t{\n\t\t\t\t\t//float normLX = fmaxf(-1, (float)state.Gamepad.sThumbRX / 32767);\n\t\t\t\t\ti = XINPUT_RRIGHT;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbRX > 10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\n\t\t\t\t\ti = XINPUT_RLEFT;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbRX < -10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\n\t\t\t\t\ti = XINPUT_RUP;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbRY > 10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\n\t\t\t\t\ti = XINPUT_RDOWN;\n\t\t\t\t\tcurrentState.KeyStates[i] = false;\n\t\t\t\t\tif (state.Gamepad.sThumbRY < -10000)\n\t\t\t\t\t\tcurrentState.KeyStates[i] = true;\n\t\t\t\t\tSetTapStates(i, elapsed);\n\t\t\t\t}\n\n\t\t\t\tif (rumble && TLAC::Components::touchSliderEmulatorIsEnabled && TLAC::Components::TouchSliderEmulator::LatestInstance->isSliderTouched() && TLAC::Components::TargetInspector::ShouldVibrate)\n\t\t\t\t{\n\t\t\t\t\tXINPUT_VIBRATION vibration;\n\t\t\t\t\tZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));\n\t\t\t\t\tvibration.wLeftMotorSpeed = rumble_left; // use any value between 0-65535 here\n\t\t\t\t\tvibration.wRightMotorSpeed = rumble_right; // use any value between 0-65535 here\n\t\t\t\t\tXInputSetState(xc_pref, &vibration);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tXINPUT_VIBRATION vibration;\n\t\t\t\t\tZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));\n\t\t\t\t\tvibration.wLeftMotorSpeed = 0; // use any value between 0-65535 here\n\t\t\t\t\tvibration.wRightMotorSpeed = 0; // use any value between 0-65535 here\n\t\t\t\t\tXInputSetState(xc_pref, &vibration);\n\t\t\t\t\t//printf(\"0\");\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (n == 3) {\n\t\t\t\tZeroMemory(&state, sizeof(XINPUT_STATE));\n\t\t\t\tZeroMemory(&currentState, sizeof(currentState));\n\t\t\t}\n\n\t\t\tif (xc_pref == 3) xc_pref = 0;\n\t\t\telse xc_pref++;\n\t\t}\n\t\t\treturn TRUE;\n\t}\n\n\n\tbool Xinput::IsDown(BYTE keycode)\n\t{\n\t\treturn currentState.IsDown(keycode);\n\t}\n\n\tbool Xinput::IsUp(BYTE keycode)\n\t{\n\t\treturn !IsDown(keycode);\n\t}\n\n\tbool Xinput::IsTapped(BYTE keycode)\n\t{\n\t\treturn IsDown(keycode) && WasUp(keycode);\n\t}\n\n\tbool Xinput::IsDoubleTapped(BYTE keycode)\n\t{\n\t\treturn KeyDoubleTapStates[keycode];\n\t}\n\n\tbool Xinput::IsReleased(BYTE keycode)\n\t{\n\t\treturn IsUp(keycode) && WasDown(keycode);\n\t}\n\n\tinline bool Xinput::WasDown(BYTE keycode)\n\t{\n\t\treturn lastState.IsDown(keycode);\n\t}\n\n\tinline bool Xinput::WasUp(BYTE keycode)\n\t{\n\t\treturn !WasDown(keycode);\n\t}\n\n\tbool Xinput::IsIntervalTapped(BYTE keycode)\n\t{\n\t\treturn keyIntervalTapStates[keycode];\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Xinput/Xinput.h",
    "content": "#pragma once\n#include \"../IInputDevice.h\"\n#include <xinput.h>\n#include \"../../Utilities/Stopwatch.h\"\n#include \"XinputState.h\"\n\nusing Stopwatch = TLAC::Utilities::Stopwatch;\n\nnamespace TLAC::Input\n{\n\tclass Xinput : public IInputDevice\n\t{\n\t\tconst float DOUBLE_TAP_THRESHOLD = 200.0f;\n\t\tconst float INTERVAL_TAP_DELAY_THRESHOLD = 500.0f;\n\t\tconst float INTERVAL_TAP_THRESHOLD = 75.0f;\n\n\tpublic:\n\t\tstatic Xinput* GetInstance();\n\n\t\tbool PollInput() override; \n\t\tbool IsDown(BYTE keycode);\n\t\tbool IsUp(BYTE keycode);\n\t\tbool IsTapped(BYTE keycode);\n\t\tbool IsReleased(BYTE keycode);\n\t\tbool IsDoubleTapped(BYTE keycode);\n\t\tbool IsIntervalTapped(BYTE keycode);\n\n\t\tbool WasDown(BYTE keycode);\n\t\tbool WasUp(BYTE keycode);\n\n\tprivate:\n\t\tXinput();\n\t\tXinputState lastState;\n\t\tXinputState currentState;\n\n\t\tXINPUT_STATE state;\n\n\t\tBYTE KeyDoubleTapStates[0xFF];\n\t\tUtilities::Stopwatch KeyDoubleTapWatches[0xFF];\n\n\t\tStopwatch keyIntervalWatch;\n\n\t\tBOOL keyIntervalInitials[0xFF];\n\t\tBYTE keyIntervalTapStates[0xFF];\n\t\tFLOAT keyIntervalTapTimes[0xFF];\n\n\t\tstatic Xinput* instance;\n\n\t\tvoid SetTapStates(BYTE keycode, float elapsed);\n\n\t\tint xinput_num, rumble_left, rumble_right;\n\t\tbool rumble;\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Xinput/XinputState.cpp",
    "content": "#include \"XinputState.h\"\n\nnamespace TLAC::Input\n{\n\tbool XinputState::IsDown(BYTE keycode)\n\t{\n\t\treturn KeyStates[keycode];\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Input/Xinput/XinputState.h",
    "content": "#pragma once\n#include <windows.h>\n\nnamespace TLAC::Input\n{\n\tstruct XinputState\n\t{\n\t\tbool KeyStates[0x8F];\n\n\t\tbool IsDown(BYTE keycode);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/TLAC.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <VCProjectVersion>16.0</VCProjectVersion>\r\n    <ProjectGuid>{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>TLAC</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"Shared\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <TargetName>$(ProjectName)</TargetName>\r\n    <TargetExt>.dva</TargetExt>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <TargetName>$(ProjectName)</TargetName>\r\n    <TargetExt>.dva</TargetExt>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>NDEBUG;TLAC_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <LanguageStandard>stdcpp17</LanguageStandard>\r\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\detours\\include;..\\..\\..\\dependencies\\freeglut\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableUAC>false</EnableUAC>\r\n      <AdditionalDependencies>XINPUT9_1_0.LIB;dinput8.lib;dxguid.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Winusb.lib;Setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n      <IgnoreSpecificDefaultLibraries>Xinput.h</IgnoreSpecificDefaultLibraries>\r\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>_DEBUG;TLAC_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <LanguageStandard>stdcpp17</LanguageStandard>\r\n      <AdditionalIncludeDirectories>..\\..\\..\\dependencies\\PluginConfigApi;..\\..\\..\\dependencies\\detours\\include;..\\..\\..\\dependencies\\freeglut\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r\n      <AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableUAC>false</EnableUAC>\r\n      <AdditionalLibraryDirectories>..\\..\\..\\dependencies\\detours\\lib;..\\..\\..\\dependencies\\freeglut\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r\n      <AdditionalDependencies>XINPUT9_1_0.LIB;dinput8.lib;dxguid.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n      <IgnoreSpecificDefaultLibraries>Xinput.h</IgnoreSpecificDefaultLibraries>\r\n      <AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"Components\\CameraController.h\" />\r\n    <ClInclude Include=\"Components\\ComponentsManager.h\" />\r\n    <ClInclude Include=\"Components\\CustomPlayerData.h\" />\r\n    <ClInclude Include=\"Components\\DebugComponent.h\" />\r\n    <ClInclude Include=\"Components\\EmulatorComponent.h\" />\r\n    <ClInclude Include=\"Components\\FastLoader.h\" />\r\n    <ClInclude Include=\"Components\\FrameRateManager.h\" />\r\n    <ClInclude Include=\"Components\\GameState.h\" />\r\n    <ClInclude Include=\"Components\\GameTargets\\HoldState.h\" />\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetHitStates.h\" />\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetInspector.h\" />\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetState.h\" />\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetTypes.h\" />\r\n    <ClInclude Include=\"Components\\Input\\InputBufferType.h\" />\r\n    <ClInclude Include=\"Components\\Input\\InputEmulator.h\" />\r\n    <ClInclude Include=\"Components\\Input\\InputState.h\" />\r\n    <ClInclude Include=\"Components\\Input\\JvsButtons.h\" />\r\n    <ClInclude Include=\"Components\\Input\\TouchPanelEmulator.h\" />\r\n    <ClInclude Include=\"Components\\Input\\TouchPanelState.h\" />\r\n    <ClInclude Include=\"Components\\Input\\TouchSliderEmulator.h\" />\r\n    <ClInclude Include=\"Components\\Input\\TouchSliderState.h\" />\r\n    <ClInclude Include=\"Components\\Pause.h\" />\r\n    <ClInclude Include=\"Components\\PlayerData.h\" />\r\n    <ClInclude Include=\"Components\\PlayerDataManager.h\" />\r\n    <ClInclude Include=\"Components\\ScaleComponent.h\" />\r\n    <ClInclude Include=\"Components\\ScoreSaver.h\" />\r\n    <ClInclude Include=\"Constants.h\" />\r\n    <ClInclude Include=\"FileSystem\\ConfigFile.h\" />\r\n    <ClInclude Include=\"FileSystem\\TextFile.h\" />\r\n    <ClInclude Include=\"framework.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\Binding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\Ds4Binding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\DVLBinding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\GuBinding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\IInputBinding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\KeyboardBinding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\MouseBinding.h\" />\r\n    <ClInclude Include=\"Input\\Bindings\\XinputBinding.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\Controller.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\DirectInput.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\DirectInputDevice.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\DirectInputMouse.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\Ds4\\Ds4Button.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\Ds4\\Ds4State.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\Ds4\\DualShock4.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\GenericUsb\\GenericUsbInput.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\GenericUsb\\GuButton.h\" />\r\n    <ClInclude Include=\"Input\\DirectInput\\GenericUsb\\GuState.h\" />\r\n    <ClInclude Include=\"Input\\Divaller\\Divaller.h\" />\r\n    <ClInclude Include=\"Input\\Divaller\\DivallerButton.h\" />\r\n    <ClInclude Include=\"Input\\Divaller\\DivallerState.h\" />\r\n    <ClInclude Include=\"Input\\IInputDevice.h\" />\r\n    <ClInclude Include=\"Input\\Keyboard\\Keyboard.h\" />\r\n    <ClInclude Include=\"Input\\Keyboard\\KeyboardState.h\" />\r\n    <ClInclude Include=\"Input\\KeyConfig\\Config.h\" />\r\n    <ClInclude Include=\"Input\\KeyConfig\\KeyString.h\" />\r\n    <ClInclude Include=\"Input\\KeyConfig\\KeyStringHash.h\" />\r\n    <ClInclude Include=\"Input\\Mouse\\Mouse.h\" />\r\n    <ClInclude Include=\"Input\\Mouse\\MouseState.h\" />\r\n    <ClInclude Include=\"Input\\Xinput\\Xinput.h\" />\r\n    <ClInclude Include=\"Input\\Xinput\\XinputState.h\" />\r\n    <ClInclude Include=\"pluginconfig.h\" />\r\n    <ClInclude Include=\"Utilities\\Drawing.h\" />\r\n    <ClInclude Include=\"Utilities\\EnumBitwiseOperations.h\" />\r\n    <ClInclude Include=\"Utilities\\Math.h\" />\r\n    <ClInclude Include=\"Utilities\\Operations.h\" />\r\n    <ClInclude Include=\"Utilities\\Stopwatch.h\" />\r\n    <ClInclude Include=\"Utilities\\Vec2.h\" />\r\n    <ClInclude Include=\"Utilities\\Vec3.h\" />\r\n    <ClInclude Include=\"Utils.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"Components\\CameraController.cpp\" />\r\n    <ClCompile Include=\"Components\\ComponentsManager.cpp\" />\r\n    <ClCompile Include=\"Components\\DebugComponent.cpp\" />\r\n    <ClCompile Include=\"Components\\EmulatorComponent.cpp\" />\r\n    <ClCompile Include=\"Components\\FastLoader.cpp\" />\r\n    <ClCompile Include=\"Components\\FrameRateManager.cpp\" />\r\n    <ClCompile Include=\"Components\\GameTargets\\TargetInspector.cpp\" />\r\n    <ClCompile Include=\"Components\\Input\\InputEmulator.cpp\" />\r\n    <ClCompile Include=\"Components\\Input\\InputState.cpp\" />\r\n    <ClCompile Include=\"Components\\Input\\TouchPanelEmulator.cpp\" />\r\n    <ClCompile Include=\"Components\\Input\\TouchSliderEmulator.cpp\" />\r\n    <ClCompile Include=\"Components\\Input\\TouchSliderState.cpp\" />\r\n    <ClCompile Include=\"Components\\Pause.cpp\" />\r\n    <ClCompile Include=\"Components\\PlayerDataManager.cpp\" />\r\n    <ClCompile Include=\"Components\\ScaleComponent.cpp\" />\r\n    <ClCompile Include=\"Components\\ScoreSaver.cpp\" />\r\n    <ClCompile Include=\"dllmain.cpp\" />\r\n    <ClCompile Include=\"FileSystem\\ConfigFile.cpp\" />\r\n    <ClCompile Include=\"FileSystem\\TextFile.cpp\" />\r\n    <ClCompile Include=\"framework.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\Binding.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\Ds4Binding.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\DVLBinding.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\GuBinding.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\KeyboardBinding.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\MouseBinding.cpp\" />\r\n    <ClCompile Include=\"Input\\Bindings\\XinputBinding.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\Controller.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\DirectInput.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\DirectInputDevice.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\DirectInputMouse.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\Ds4\\Ds4State.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\Ds4\\DualShock4.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\GenericUsb\\GenericUsbInput.cpp\" />\r\n    <ClCompile Include=\"Input\\DirectInput\\GenericUsb\\GuState.cpp\" />\r\n    <ClCompile Include=\"Input\\Divaller\\Divaller.cpp\" />\r\n    <ClCompile Include=\"Input\\Keyboard\\Keyboard.cpp\" />\r\n    <ClCompile Include=\"Input\\Keyboard\\KeyboardState.cpp\" />\r\n    <ClCompile Include=\"Input\\KeyConfig\\Config.cpp\" />\r\n    <ClCompile Include=\"Input\\KeyConfig\\KeyString.cpp\" />\r\n    <ClCompile Include=\"Input\\KeyConfig\\KeyStringHash.cpp\" />\r\n    <ClCompile Include=\"Input\\Mouse\\Mouse.cpp\" />\r\n    <ClCompile Include=\"Input\\Xinput\\Xinput.cpp\" />\r\n    <ClCompile Include=\"Input\\Xinput\\XinputState.cpp\" />\r\n    <ClCompile Include=\"Utilities\\Drawing.cpp\" />\r\n    <ClCompile Include=\"Utilities\\Math.cpp\" />\r\n    <ClCompile Include=\"Utilities\\Operations.cpp\" />\r\n    <ClCompile Include=\"Utilities\\Stopwatch.cpp\" />\r\n    <ClCompile Include=\"Utilities\\Vec2.cpp\" />\r\n    <ClCompile Include=\"Utilities\\Vec3.cpp\" />\r\n    <ClCompile Include=\"Utils.cpp\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "source-code/source/plugins/TLAC/TLAC.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Resource Files\">\r\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"framework.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Constants.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\CameraController.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\ComponentsManager.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\CustomPlayerData.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\DebugComponent.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\EmulatorComponent.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\FastLoader.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\FrameRateManager.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\GameState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\PlayerData.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\PlayerDataManager.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\InputBufferType.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\InputEmulator.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\InputState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\JvsButtons.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\TouchPanelEmulator.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\TouchPanelState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\TouchSliderEmulator.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Input\\TouchSliderState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"FileSystem\\ConfigFile.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"FileSystem\\TextFile.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\Binding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\Ds4Binding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\IInputBinding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\KeyboardBinding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\MouseBinding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\Ds4\\Ds4Button.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\Ds4\\Ds4State.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\Ds4\\DualShock4.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\Controller.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\DirectInput.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\DirectInputDevice.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\DirectInputMouse.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Keyboard\\Keyboard.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Keyboard\\KeyboardState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\KeyConfig\\Config.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\KeyConfig\\KeyString.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\KeyConfig\\KeyStringHash.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Mouse\\Mouse.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Mouse\\MouseState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\IInputDevice.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\EnumBitwiseOperations.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\Math.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\Operations.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\Stopwatch.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\Vec2.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\Vec3.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\ScaleComponent.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\XinputBinding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Xinput\\Xinput.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Xinput\\XinputState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\GameTargets\\HoldState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetHitStates.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetInspector.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\GameTargets\\TargetTypes.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\ScoreSaver.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"pluginconfig.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Components\\Pause.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utilities\\Drawing.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\GenericUsb\\GuButton.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\GenericUsb\\GuState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\DirectInput\\GenericUsb\\GenericUsbInput.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\GuBinding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Utils.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Divaller\\Divaller.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Divaller\\DivallerButton.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Divaller\\DivallerState.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Input\\Bindings\\DVLBinding.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"dllmain.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"framework.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\CameraController.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\ComponentsManager.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\DebugComponent.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\EmulatorComponent.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\FastLoader.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\FrameRateManager.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\PlayerDataManager.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\Input\\InputEmulator.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\Input\\InputState.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\Input\\TouchPanelEmulator.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\Input\\TouchSliderEmulator.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\Input\\TouchSliderState.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"FileSystem\\ConfigFile.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"FileSystem\\TextFile.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\Binding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\Ds4Binding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\KeyboardBinding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\MouseBinding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\Ds4\\Ds4State.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\Ds4\\DualShock4.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\Controller.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\DirectInput.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\DirectInputDevice.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\DirectInputMouse.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Keyboard\\Keyboard.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Keyboard\\KeyboardState.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\KeyConfig\\Config.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\KeyConfig\\KeyString.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\KeyConfig\\KeyStringHash.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Mouse\\Mouse.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utilities\\Math.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utilities\\Operations.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utilities\\Stopwatch.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utilities\\Vec2.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utilities\\Vec3.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\ScaleComponent.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\XinputBinding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Xinput\\Xinput.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Xinput\\XinputState.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\GameTargets\\TargetInspector.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\ScoreSaver.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Components\\Pause.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utilities\\Drawing.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\GenericUsb\\GuState.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\DirectInput\\GenericUsb\\GenericUsbInput.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\GuBinding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Utils.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Divaller\\Divaller.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Input\\Bindings\\DVLBinding.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Drawing.cpp",
    "content": "#pragma once\n#include <stdint.h>\n#include <string>\n#include <vector>\n#include \"Drawing.h\"\n#include \"../Constants.h\"\n\nnamespace TLAC::Utilities\n{\n#pragma pack(push, 1)\n\tDrawing::FontInfo*(*Drawing::getFont)(FontInfo* fi, uint32_t id) = (FontInfo*(*)(FontInfo* fi, uint32_t id))0x140196510;\n\tvoid(*Drawing::fontSize)(FontInfo* fi, float width, float height) = (void(*)(FontInfo* fi, float width, float height))0x140199e60;\n\t\n\tvoid Drawing::drawText(DrawParams* dtParam, drawTextFlags flags, std::string str)\n\t{\n\t\t((void(*)(DrawParams*, uint32_t, const char*, int64_t))0x140198500)(dtParam, flags, str.c_str(), str.length());\n\t}\n\tvoid Drawing::drawTextW(DrawParams* dtParam, drawTextFlags flags, std::wstring str)\n\t{\n\t\tconst wchar_t* ptrs[2];\n\t\tptrs[0] = str.c_str();\n\t\tptrs[1] = (wchar_t*)((uint64_t)ptrs[0] + str.length() * 2);\n\n\t\t((void(*)(DrawParams*, uint32_t, const wchar_t**))0x140198380)(dtParam, flags, &ptrs[0]);\n\t}\n\n\tvoid Drawing::drawTextFormattedW(DrawParams* dtParam, drawTextFlags flags, std::wstring str)\n\t{\n\t\tconst wchar_t* ptrs[2];\n\t\tptrs[0] = str.c_str();\n\t\tptrs[1] = (wchar_t*)((uint64_t)ptrs[0] + str.length() * 2);\n\n\t\t((void(*)(uint32_t, const wchar_t**, DrawParams*))0x1404c2aa0)(flags, &ptrs[0], dtParam);\n\t}\n\n\tvoid Drawing::drawTextWithSpritesW(DrawParams* dtParam, drawTextFlags flags, std::wstring str)\n\t{\n\t\tconst wchar_t* ptrs[2];\n\t\tptrs[0] = str.c_str();\n\t\tptrs[1] = (wchar_t*)((uint64_t)ptrs[0] + str.length() * 2);\n\n\t\t((void(*)(uint32_t, const wchar_t**, DrawParams*))0x1404c2cf0)(flags, &ptrs[0], dtParam);\n\t}\n\n\n\tvoid(*Drawing::fillRectangle)(DrawParams* dtParam, const RectangleBounds &rect) = (void(*)(DrawParams* dtParam, const RectangleBounds &rect))0x140198d80;\n\n\t// draws only a border -- use fillRectangle to fill contained pixels\n\tvoid Drawing::drawRectangle(DrawParams* dtParam, const RectangleBounds &rect)\n\t{\n\t\t((void(*)(DrawParams*, const RectangleBounds&))0x140198320)(dtParam, rect);\n\t}\n\n\t// draws only a border -- use fillRectangle to fill contained pixels\n\tvoid Drawing::drawRectangle(DrawParams* dtParam, const RectangleBounds &rect, float thickness)\n\t{\n\t\tuint32_t oldFillColour = dtParam->fillColour;\n\t\tdtParam->fillColour = dtParam->colour;\n\n\t\t// yes this seems pretty dodgy, but sega does it this way so... I guess it's the only way\n\t\tRectangleBounds tempRect = { rect.x, rect.y, thickness, rect.height }; // left side\n\t\tfillRectangle(dtParam, tempRect);\n\n\t\ttempRect.x = rect.x + rect.width - thickness; // right side\n\t\tfillRectangle(dtParam, tempRect);\n\n\t\ttempRect = { rect.x + thickness, rect.y, rect.width - (thickness * 2), thickness }; // top side\n\t\tfillRectangle(dtParam, tempRect);\n\n\t\ttempRect.y = rect.y + rect.height - thickness; // left side\n\t\tfillRectangle(dtParam, tempRect);\n\n\t\tdtParam->fillColour = oldFillColour;\n\t}\n\n\n\tvoid Drawing::drawLine(DrawParams* dtParam, const Point &p1, const Point &p2)\n\t{\n\t\t((void(*)(DrawParams*, const RectangleBounds&))0x140198080)(dtParam, { p1.x, p1.y, p2.x, p2.y });\n\t}\n\t// draw from the top left corner of rect to the bottom left\n\tvoid Drawing::drawLine(DrawParams* dtParam, const RectangleBounds &rect)\n\t{\n\t\tdrawLine(dtParam, { rect.x, rect.y }, { rect.x + rect.width, rect.y + rect.height });\n\t}\n\n\tvoid Drawing::drawPolyline(DrawParams* dtParam, const std::vector<Point> points)\n\t{\n\t\t((void(*)(DrawParams*, const Point*, uint64_t))0x1401980e0)(dtParam, points.data(), points.size());\n\t}\n\n\t/*\n\tint Drawing::findAetDebugFileId(std::string name)\n\t{\n\tAetDebugFileInfo* aetArray = *(AetDebugFileInfo**)AET_DEBUG_ARRAY_POINTER_ADDRESS;\n\tAetDebugFileInfo* aetArrayEndAddress = *(AetDebugFileInfo**)(AET_DEBUG_ARRAY_POINTER_ADDRESS + 0x08);\n\n\tint id = 0;\n\twhile (&aetArray[id] < aetArrayEndAddress)\n\t{\n\tif (name == aetArray[id].name2.GetCharBuf()) // dwgui enum uses name2, so this should too I guess\n\treturn aetArray[id].gameId;\n\telse\n\tid++;\n\t}\n\treturn -1;\n\t}\n\t*/\n\n\t// gets a file ID for use with createAetLayer\n\t// returns -1 if the file was not found\n\t// note: names are a little different to in 2dauth test -- it seems like they have \"_MAIN\" appended\n\tint Drawing::findAetFileId(std::string name)\n\t{\n\t\tAetFileInfo* aetArray = *(AetFileInfo**)AET_ARRAY_POINTER_ADDRESS;\n\t\tAetFileInfo* aetArrayEndAddress = *(AetFileInfo**)(AET_ARRAY_POINTER_ADDRESS + 0x08);\n\n\t\tint id = 0;\n\t\twhile (&aetArray[id] < aetArrayEndAddress)\n\t\t{\n\t\t\tif (name == aetArray[id].name.GetCharBuf()) // dwgui enum uses name2, so this should too I guess\n\t\t\t\treturn aetArray[id].id1;\n\t\t\telse\n\t\t\t\tid++;\n\t\t}\n\t\treturn -1;\n\t}\n\n\t// draw an aet layer (with all settings)\n\t// aetSpeedCallback is actually a pointer to a class or struct with the callback address at offset +0x8\n\tint Drawing::createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc, int32_t unk2, const char* animation, const char* animation2, float animationInTime, float animationOutTime, const Point &scale, const void* aetSpeedCallback)\n\t{\n\t\treturn ((int(*)(int32_t, uint32_t, createAetFlags, const char*, const Point&, int32_t, const char*, const char*, float, float, const Point&, const void*))0x14013be60)(fileId, drawLayer, flags, name, loc, unk2, animation, animation2, animationInTime, animationOutTime, scale, aetSpeedCallback);\n\t}\n\t// draw an aet layer (with animation timing override)\n\tint Drawing::createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc, float animationInTime, float animationOutTime)\n\t{\n\t\treturn createAetLayer(fileId, drawLayer, flags, name, loc, 0, 0, 0, animationInTime, animationOutTime, *(Point*)0, 0);\n\t}\n\t// draw an aet layer (with scale)\n\tint Drawing::createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc, const Point &scale)\n\t{\n\t\treturn createAetLayer(fileId, drawLayer, flags, name, loc, 0, 0, 0, -1, -1, scale, 0);\n\t}\n\t// draw an aet layer\n\tint Drawing::createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc)\n\t{\n\t\treturn createAetLayer(fileId, drawLayer, flags, name, loc, 0, 0, 0, -1, -1, *(Point*)0, 0);\n\t}\n\n\tvoid Drawing::destroyAetLayer(int &layer)\n\t{\n\t\tif (layer != 0)\n\t\t{\n\t\t\t((void(*)(int layer))0x14019d570)(layer);\n\t\t\tlayer = 0;\n\t\t}\n\t}\n#pragma pack(pop)\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Drawing.h",
    "content": "#pragma once\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace TLAC::Utilities\n{\n\tclass Drawing\n\t{\n\tpublic:\n#pragma pack(push, 1)\n\t\tstruct Point\n\t\t{\n\t\t\tfloat x;\n\t\t\tfloat y;\n\t\t};\n\t\tstruct RectangleBounds\n\t\t{\n\t\t\tfloat x;\n\t\t\tfloat y;\n\t\t\tfloat width;\n\t\t\tfloat height;\n\t\t};\n\n\t\tstruct RawFont\n\t\t{\n\t\t\tuint32_t sprId; // ?\n\t\t\tuint8_t width1; // advance\n\t\t\tuint8_t height1; // advance\n\t\t\tuint8_t width2; // tex glyph box\n\t\t\tuint8_t height2; // tex glyph box\n\t\t\tuint8_t layoutParam2Num; // layout param 2 is a fraction that seems to relate to margins\n\t\t\tuint8_t layoutParam2Div;\n\t\t\tuint8_t padding0a[0x02];\n\t\t\tint32_t fontmapId;\n\t\t\tfloat layoutParam2NumOverDiv;\n\t\t\tuint8_t padding14[0x04];\n\t\t\tuint64_t texWidthChars;\n\t\t\tint64_t dataBegin;\n\t\t\tint64_t dataEnd;\n\t\t\tint64_t dataCapacityEnd;\n\t\t\tuint8_t layoutParam1;\n\t\t\tuint8_t padding39[0x7];\n\t\t};\n\n\t\tstruct RawFontHolderIdk // ...SeemsPrettyPointlessTbh\n\t\t{\n\t\t\tRawFont* rawfont;\n\t\t\tuint16_t width1;\n\t\t\tuint16_t height1;\n\t\t\tuint16_t zero1; // ?\n\t\t\tuint16_t zero2; // ?\n\t\t\tuint8_t proportional; // game always sets this to 0\n\t\t};\n\n\t\tstruct FontInfo\n\t\t{\n\t\t\tuint32_t fontId;\n\t\t\tuint8_t padding04[0x4];\n\t\t\tRawFont* rawfont;\n\t\t\tuint16_t flag10; // (proportional != 0 && layoutParam1 != 0) ? 2 : (layoutParam2NumOverDiv != 1 ? 1 : 0)\n\t\t\tuint8_t padding12[0x02];\n\t\t\tfloat width1;\n\t\t\tfloat height1;\n\t\t\tfloat width2;\n\t\t\tfloat height2;\n\t\t\tfloat userSizeWidth;\n\t\t\tfloat userSizeHeight;\n\t\t\tfloat userSizeWidthMultiplier; // userSizeWidth / width1\n\t\t\tfloat userSizeHeightMultiplier; // userSizeHeight / width2\n\t\t\tfloat spacingWidth; // ?\n\t\t\tfloat spacingHeight; // ?\n\n\t\t\tvoid setSize(float width, float height)\n\t\t\t{\n\t\t\t\t((void(*)(FontInfo* fi, float width, float height))0x140199e60)(this, width, height);\n\t\t\t}\n\n\t\t\tFontInfo(uint32_t id)\n\t\t\t{\n\t\t\t\t((FontInfo*(*)(FontInfo* fi, uint32_t id))0x140196510)(this, id);\n\t\t\t}\n\t\t};\n\n\t\tstatic FontInfo*(*getFont)(FontInfo* fi, uint32_t id);\n\t\tstatic void(*fontSize)(FontInfo* fi, float width, float height);\n\n\t\tstruct DrawParams\n\t\t{\n\t\t\tuint32_t colour; // RGBA byte array?, so set as 0xAABBGGRR\n\t\t\tuint32_t fillColour; // ?? RGBA byte array?, so set as 0xAABBGGRR\n\t\t\tuint8_t clip;\n\t\t\tuint8_t unk09[0x3];\n\t\t\tRectangleBounds clipRect;\n\t\t\tuint32_t layer; // 8 seems similar to default but higher\n\t\t\t\t\t\t\t// 0x18 is below 0x19 but still seems to be above any game elements\n\t\t\t\t\t\t\t// 0x19 is startup screen (below dwgui)\n\t\t\t\t\t\t\t// I noticed some use different scaling\n\t\t\tuint32_t unk20;\n\t\t\tuint32_t unk24;\n\t\t\tuint32_t unk28;\n\t\t\tPoint textCurrentLoc;\n\t\t\tPoint lineOriginLoc; // must be set for newlines to work as expected\n\t\t\tuint8_t padding3c[0x4];\n\t\t\tuint64_t lineLength; // in characters\n\t\t\tFontInfo* font;\n\t\t\tuint16_t unk50;\n\n\t\t\tDrawParams(FontInfo* fi)\n\t\t\t{\n\t\t\t\tcolour = 0xffffffff;\n\t\t\t\tfillColour = 0xff808080; // except it's not?\n\t\t\t\tclip = 0;\n\t\t\t\tclipRect = { 0, 0, 0, 0 };\n\t\t\t\tlayer = 0x7;\n\t\t\t\tunk20 = 0x0;\n\t\t\t\tunk24 = 0xd;\n\t\t\t\tunk28 = 0;\n\t\t\t\ttextCurrentLoc = { 0, 0 };\n\t\t\t\tlineOriginLoc = { 0, 0 };\n\t\t\t\tlineLength = 0;\n\t\t\t\tfont = fi;\n\t\t\t\tunk50 = 0x25a1;\n\t\t\t}\n\n\t\t\tDrawParams()\n\t\t\t{\n\t\t\t\tDrawParams((FontInfo*)0x140eda860);\n\t\t\t}\n\t\t};\n\n\t\tenum drawTextFlags : uint32_t\n\t\t{\n\t\t\tDRAWTEXT_ENABLE_XADVANCE = 1,\n\t\t\tDRAWTEXT_ALIGN_RIGHT = 2,\n\t\t\tDRAWTEXT_ALIGN_SCREEN_CENTRE = 4,\n\t\t\tDRAWTEXT_ALIGN_CENTRE = 8,\n\t\t\tDRAWTEXT_ENABLE_CLIP = 0x200,\n\t\t\tDRAWTEXT_SCALING_OPTIMISED = 0x400, // ? -- seems to be set if the requested font size doesn't match the original font, and the internal width/height 1 and 2 match\n\t\t\t\t\t\t\t\t\t\t\t\t// maybe it's just required for any scaling though\n\t\t\t\t\t\t\t\t\t\t\t\tDRAWTEXT_STROKE = 0x10000,\n\t\t};\n\n\t\tstatic void drawText(DrawParams* dtParam, drawTextFlags flags, std::string str);\n\t\tstatic void drawTextW(DrawParams* dtParam, drawTextFlags flags, std::wstring str);\n\t\tstatic void drawTextFormattedW(DrawParams* dtParam, drawTextFlags flags, std::wstring str);\n\t\tstatic void drawTextWithSpritesW(DrawParams* dtParam, drawTextFlags flags, std::wstring str);\n\n\t\tstatic void(*fillRectangle)(DrawParams* dtParam, const RectangleBounds &rect);\n\t\t// draws only a border -- use fillRectangle to fill contained pixels\n\t\tstatic void drawRectangle(DrawParams* dtParam, const RectangleBounds &rect);\n\t\t// draws only a border -- use fillRectangle to fill contained pixels\n\t\tstatic void drawRectangle(DrawParams* dtParam, const RectangleBounds &rect, float thickness);\n\n\t\tstatic void drawLine(DrawParams* dtParam, const Point &p1, const Point &p2);\n\t\t// draw from the top left corner of rect to the bottom left\n\t\tstatic void drawLine(DrawParams* dtParam, const RectangleBounds &rect);\n\n\t\tstatic void drawPolyline(DrawParams* dtParam, const std::vector<Point> points);\n\n\n\t\tstruct MsString {\n\t\t\tunion {\n\t\t\t\tchar* string_ptr;\n\t\t\t\tchar string_buf[16];\n\t\t\t};\n\t\t\tuint64_t len;\n\t\t\tuint64_t bufsize;\n\n\t\t\tchar* GetCharBuf()\n\t\t\t{\n\t\t\t\tif (bufsize > 0xf && string_ptr != nullptr)\n\t\t\t\t\treturn string_ptr;\n\t\t\t\telse\n\t\t\t\t\treturn string_buf;\n\t\t\t};\n\n\t\t\tvoid SetCharBuf(char* newcontent)\n\t\t\t{\n\t\t\t\tlen = strlen(newcontent);\n\t\t\t\tbufsize = len;\n\t\t\t\tif (len > 0xf)\n\t\t\t\t{\n\t\t\t\t\tstring_ptr = _strdup(newcontent);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstrcpy_s(string_buf, newcontent);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/* struct MsStringW {\n\t\tunion {\n\t\twchar_t* string_ptr;\n\t\twchar_t string_buf[8];\n\t\t};\n\t\tuint64_t len;\n\t\tuint64_t bufsize;\n\n\t\twchar_t* GetCharBuf()\n\t\t{\n\t\tif (bufsize > 0x7 && string_ptr != nullptr)\n\t\treturn string_ptr;\n\t\telse\n\t\treturn string_buf;\n\t\t};\n\n\t\tvoid SetCharBuf(wchar_t* newcontent)\n\t\t{\n\t\tlen = wcslen(newcontent);\n\t\tbufsize = len;\n\t\tif (len > 0xf)\n\t\t{\n\t\tstring_ptr = wcsdup(newcontent);\n\t\t}\n\t\telse\n\t\t{\n\t\twcscpy_s(string_buf, newcontent);\n\t\t}\n\t\t}\n\t\t}; */\n\n\t\tstruct AetDebugFileInfo\n\t\t{\n\t\t\tMsString name1;\n\t\t\tint32_t gameId;\n\t\t\tchar unk[4]; // seems to be some kind of mode prefix (eg. \"GAM_\")\n\t\t\tMsString name2; // same as name1???\n\t\t\tMsString filename;\n\t\t\tint32_t dbId1; // not sure what the db ids are...  this one might be a position\n\t\t\tint32_t dbId12;\n\t\t};\n\n\t\tstruct AetFileInfo\n\t\t{\n\t\t\tint32_t id1;\n\t\t\tchar unk1[4]; // seems to be some kind of mode prefix (eg. \"GAM_\")\n\t\t\tint32_t id2; // same as id1???\n\t\t\tint32_t unk2;\n\t\t\tMsString name;\n\t\t\tint32_t unk3;\n\t\t\tint32_t unk4; // might be related to sprites?\n\t\t};\n\n\n\t\t// int findAetDebugFileId(std::string name);\n\n\t\t// gets a file ID for use with createAetLayer\n\t\t// returns -1 if the file was not found\n\t\t// note: names are a little different to in 2dauth test -- it seems like they have \"_MAIN\" appended\n\t\tstatic int findAetFileId(std::string name);\n\n\t\tenum createAetFlags : uint32_t\n\t\t{\n\t\t\tCREATEAET_20000 = 0x20000,\n\t\t};\n\n\t\t// draw an aet layer (with all settings)\n\t\t// aetSpeedCallback is actually a pointer to a class or struct with the callback address at offset +0x8\n\t\tstatic int createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc, int32_t unk2, const char* animation, const char* animation2, float animationInTime, float animationOutTime, const Point &scale, const void* aetSpeedCallback);\n\t\t// draw an aet layer (with animation timing override)\n\t\tstatic int createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc, float animationInTime, float animationOutTime);\n\t\t// draw an aet layer (with scale)\n\t\tstatic int createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc, const Point &scale);\n\t\t// draw an aet layer\n\t\tstatic int createAetLayer(int32_t fileId, uint32_t drawLayer, createAetFlags flags, const char* name, const Point &loc);\n\n\t\tstatic void destroyAetLayer(int &layer);\n#pragma pack(pop)\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/EnumBitwiseOperations.h",
    "content": "#pragma once\n\nnamespace TLAC::Utilities\n{\n\ttemplate<class T> inline T operator~ (T a) { return (T)~(int)a; }\n\ttemplate<class T> inline T operator| (T a, T b) { return (T)((int)a | (int)b); }\n\ttemplate<class T> inline T operator& (T a, T b) { return (T)((int)a & (int)b); }\n\ttemplate<class T> inline T operator^ (T a, T b) { return (T)((int)a ^ (int)b); }\n\ttemplate<class T> inline T& operator|= (T& a, T b) { return (T&)((int&)a |= (int)b); }\n\ttemplate<class T> inline T& operator&= (T& a, T b) { return (T&)((int&)a &= (int)b); }\n\ttemplate<class T> inline T& operator^= (T& a, T b) { return (T&)((int&)a ^= (int)b); }\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Math.cpp",
    "content": "#define _USE_MATH_DEFINES\n#include \"Math.h\"\n\nnamespace TLAC::Utilities\n{\n\tfloat ToDegrees(float radians)\n\t{\n\t\treturn radians * (180.0f / M_PI);\n\t}\n\n\tfloat ToRadians(float degrees)\n\t{\n\t\treturn (degrees * M_PI) / 180.0f;\n\t}\n\n\tVec2 GetDirection(float degrees)\n\t{\n\t\tfloat radians = ToRadians(degrees);\n\t\treturn Vec2(cos(radians), sin(radians));\n\t}\n\n\tVec2 PointFromAngle(float degrees, float distance)\n\t{\n\t\tfloat radians = ToRadians(degrees + 90.0f);\n\t\treturn Vec2(-1 * std::cos(radians) * distance, -1 * std::sin(radians) * distance);\n\t}\n\n\tfloat AngleFromPoints(Vec2 p0, Vec2 p1)\n\t{\n\t\treturn (float)(std::atan2(p1.Y - p0.Y, p1.X - p0.X) * 180.0 / M_PI) + 90.0f;\n\t}\n\n\tfloat ConvertRange(float originalStart, float originalEnd, float newStart, float newEnd, float value)\n\t{\n\t\treturn newStart + ((value - originalStart) * (newEnd - newStart) / (originalEnd - originalStart));\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Math.h",
    "content": "#pragma once\n#include <cmath>\n#include \"Vec2.h\"\n#include \"Vec3.h\"\n\nnamespace TLAC::Utilities\n{\n\tfloat ToDegrees(float radians);\n\tfloat ToRadians(float degrees);\n\n\tVec2 GetDirection(float degrees);\n\tVec2 PointFromAngle(float degrees, float distance);\n\tfloat AngleFromPoints(Vec2 p0, Vec2 p1);\n\tfloat ConvertRange(float originalStart, float originalEnd, float newStart, float newEnd, float value);\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Operations.cpp",
    "content": "#pragma once\n#include \"Operations.h\"\n\nnamespace TLAC::Utilities\n{\n\tstd::vector<std::string> Split(const std::string& str, const std::string& delim)\n\t{\n\t\tstd::vector<std::string> tokens;\n\t\tsize_t prev = 0, pos = 0;\n\t\tdo\n\t\t{\n\t\t\tpos = str.find(delim, prev);\n\t\t\tif (pos == std::string::npos)\n\t\t\t\tpos = str.length();\n\n\t\t\tstd::string token = str.substr(prev, pos - prev);\n\n\t\t\tif (!token.empty())\n\t\t\t\ttokens.push_back(token);\n\n\t\t\tprev = pos + delim.length();\n\t\t} while (pos < str.length() && prev < str.length());\n\n\t\treturn tokens;\n\t}\n\n\tvoid LeftTrim(std::string &s)\n\t{\n\t\ts.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch)\n\t\t{\n\t\t\treturn !std::isspace(ch);\n\t\t}));\n\t}\n\n\tvoid RightTrim(std::string &s)\n\t{\n\t\ts.erase(std::find_if(s.rbegin(), s.rend(), [](int ch)\n\t\t{\n\t\t\treturn !std::isspace(ch);\n\t\t}).base(), s.end());\n\t}\n\n\tvoid Trim(std::string &s)\n\t{\n\t\ts = trim(s);\n\t}\n\n\tstd::string trim(const std::string& str, const std::string& whitespace)\n\t{\n\t\tconst size_t strBegin = str.find_first_not_of(whitespace);\n\n\t\tif (strBegin == std::string::npos)\n\t\t\treturn \"\";\n\n\t\tconst size_t strEnd = str.find_last_not_of(whitespace);\n\t\tconst size_t strRange = strEnd - strBegin + 1;\n\n\t\treturn str.substr(strBegin, strRange);\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Operations.h",
    "content": "#pragma once\n#include <algorithm> \n#include <cctype>\n#include <locale>\n#include <vector>\n\nnamespace TLAC::Utilities\n{\n\tstd::vector<std::string> Split(const std::string& str, const std::string& delim);\n\n\tvoid LeftTrim(std::string &s);\n\tvoid RightTrim(std::string &s);\n\tvoid Trim(std::string &s);\n\t\n\tstd::string trim(const std::string& str, const std::string& whitespace = \" \\t\");\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Stopwatch.cpp",
    "content": "#include \"Stopwatch.h\"\n\nnamespace TLAC::Utilities\n{\n\tStopwatch::Stopwatch()\n\t{\n\t}\n\n\tStopwatch::~Stopwatch()\n\t{\n\t}\n\n\tvoid Stopwatch::Start() \n\t{\n\t\tstart = high_resolution_clock::now();\n\t}\n\n\tfloat Stopwatch::Stop()\n\t{\n\t\tend = high_resolution_clock::now();\n\t\treturn GetElapsed();\n\t}\n\n\tfloat Stopwatch::Restart()\n\t{\n\t\tfloat elapsed = Stop();\n\t\tStart();\n\n\t\treturn elapsed;\n\t}\n\n\tfloat Stopwatch::GetElapsed()\n\t{\n\t\treturn (float)(chrono::duration_cast<std::chrono::microseconds>(end - start).count() / TIME_FACTOR);\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Stopwatch.h",
    "content": "#pragma once\n#include <chrono>\n\nnamespace chrono = std::chrono;\n\ntypedef chrono::time_point<chrono::steady_clock> steady_clock;\ntypedef chrono::high_resolution_clock high_resolution_clock;\n\nnamespace TLAC::Utilities\n{\n\tclass Stopwatch\n\t{\n\t\tconst float TIME_FACTOR = 1000.0f;\n\n\tpublic:\n\t\tStopwatch();\n\t\t~Stopwatch();\n\n\t\tvoid Start();\n\t\tfloat Stop();\n\t\tfloat Restart();\n\n\t\tfloat GetElapsed();\n\n\tprivate:\n\t\tsteady_clock start;\n\t\tsteady_clock end;\n\t};\n}\n\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Vec2.cpp",
    "content": "#include \"Vec2.h\"\n\nnamespace TLAC::Utilities\n{\n\tVec2::Vec2() \n\t{\n\t};\n\n\tVec2::Vec2(float x, float y) : X(x), Y(y) \n\t{\n\t};\n\n\tVec2 Vec2::operator+(Vec2 value)\n\t{\n\t\treturn Vec2(X + value.X, Y + value.Y);\n\t}\n\n\tvoid Vec2::operator+=(const Vec2 &value)\n\t{\n\t\tX += value.X;\n\t\tY += value.Y;\n\t}\n\n\tVec2 Vec2::operator-(Vec2 value)\n\t{\n\t\treturn Vec2(X - value.X, Y - value.Y);\n\t}\n\n\tvoid Vec2::operator-=(const Vec2 &value)\n\t{\n\t\tX -= value.X;\n\t\tY -= value.Y;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Vec2.h",
    "content": "#pragma once\n\nnamespace TLAC::Utilities\n{\n\tstruct Vec2\n\t{\n\t\tfloat X, Y;\n\n\t\tVec2();\n\t\tVec2(float x, float y);\n\n\t\tVec2 operator+(Vec2 value);\n\t\tvoid operator+=(const Vec2 &value);\n\n\t\tVec2 operator-(Vec2 value);\n\t\tvoid operator-=(const Vec2 &value);\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Vec3.cpp",
    "content": "#include \"Vec3.h\"\n\nnamespace TLAC::Utilities\n{\n\tVec3::Vec3() \n\t{\n\t};\n\n\tVec3::Vec3(float x, float y, float z) : X(x), Y(y), Z(z) \n\t{\n\t};\n\n\tVec3 Vec3::operator+(Vec2 value)\n\t{\n\t\treturn Vec3(X + value.X, Y, Z + value.Y);\n\t}\n\n\tvoid Vec3::operator+=(const Vec2 &value)\n\t{\n\t\tX += value.X;\n\t\tZ += value.Y;\n\t}\n\n\tVec3 Vec3::operator-(Vec2 value)\n\t{\n\t\treturn Vec3(X - value.X, Y, Z - value.Y);\n\t}\n\n\tvoid Vec3::operator-=(const Vec2 &value)\n\t{\n\t\tX -= value.X;\n\t\tZ -= value.Y;\n\t}\n\n\tVec3 Vec3::operator+(Vec3 value)\n\t{\n\t\treturn Vec3(X + value.X, Y + value.Y, Z + value.Z);\n\t}\n\n\tvoid Vec3::operator+=(const Vec3 &value)\n\t{\n\t\tX += value.X;\n\t\tY += value.Y;\n\t\tZ += value.Z;\n\t}\n\n\tVec3 Vec3::operator-(Vec3 value)\n\t{\n\t\treturn Vec3(X - value.X, Y - value.Y, Z - value.Z);\n\t}\n\n\tvoid Vec3::operator-=(const Vec3 &value)\n\t{\n\t\tX -= value.X;\n\t\tY -= value.Y;\n\t\tZ -= value.Z;\n\t}\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utilities/Vec3.h",
    "content": "#pragma once\n#include \"Vec2.h\"\n\nnamespace TLAC::Utilities\n{\n\tstruct Vec3\n\t{\n\t\tfloat X, Y, Z;\n\n\t\tVec3();\n\t\tVec3(float x, float y, float z);\n\n\t\t// Vec2\n\t\tVec3 operator+(Vec2 value);\n\t\tvoid operator+=(const Vec2 &value);\n\n\t\tVec3 operator-(Vec2 value);\n\t\tvoid operator-=(const Vec2 &value);\n\n\t\t// Vec3\n\t\tVec3 operator+(Vec3 value);\n\t\tvoid operator+=(const Vec3 &value);\n\n\t\tVec3 operator-(Vec3 value);\n\t\tvoid operator-=(const Vec3 &value);\n\t};\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utils.cpp",
    "content": "#include \"Utils.h\"\n#include <Windows.h>\n\nvoid InjectCode(void* address, const std::vector<uint8_t> data)\n{\n\tconst size_t byteCount = data.size() * sizeof(uint8_t);\n\n\tDWORD oldProtect;\n\tVirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);\n\tmemcpy(address, data.data(), byteCount);\n\tVirtualProtect(address, byteCount, oldProtect, nullptr);\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/Utils.h",
    "content": "#pragma once\n#include <vector>\n\nvoid InjectCode(void* address, const std::vector<uint8_t> data);\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/dllmain.cpp",
    "content": "#include <iostream>\n#include <vector>\n#include <Windows.h>\n#include <Dbt.h>\n#include <stdio.h>\n#include \"Constants.h\"\n#include \"framework.h\"\n#include \"pluginconfig.h\"\n#include \"Input/Mouse/Mouse.h\"\n#include \"Input/Xinput/Xinput.h\"\n#include \"Input/Keyboard/Keyboard.h\"\n#include \"Input/DirectInput/DirectInput.h\"\n#include \"Input/DirectInput/Ds4/DualShock4.h\"\n#include \"Input/DirectInput/GenericUsb/GenericUsbInput.h\"\n#include \"Input/Divaller/Divaller.h\"\n#include \"Components/ComponentsManager.h\"\n#include <tchar.h>\n#include <GL/freeglut.h>\n\n#include <detours.h>\n#include <fstream>\n#pragma comment(lib, \"detours.lib\")\n\nvoid(__cdecl* divaEngineUpdate)() = (void(__cdecl*)())0x14018CC40;\nvoid(__cdecl* divaEngineStageDispShadow)() = (void(__cdecl*)())ENGINE_STAGE_DISP_SHADOW_ADDRESS;\n\nLRESULT CALLBACK MessageWindowProcessCallback(HWND, UINT, WPARAM, LPARAM);\nDWORD WINAPI WindowMessageDispatcher(LPVOID);\nVOID RegisterMessageWindowClass();\n\nstruct\n{\n\tDWORD ID = NULL;\n\tHANDLE Handle = NULL;\n} MessageThread;\n\nconst wchar_t* MessageWindowClassName = TEXT(\"MessageWindowClass\");\nconst wchar_t* MessageWindowName = TEXT(\"MessageWindowTitle\");\n\nnamespace TLAC\n{\n\tComponents::ComponentsManager ComponentsManager;\n\tbool DeviceConnected = true;\n\tbool FirstUpdateTick = true;\n\tbool HasWindowFocus, HadWindowFocus;\n\n\tvoid InitializeTick()\n\t{\n\t\tRegisterMessageWindowClass();\n\t\tif ((MessageThread.Handle = CreateThread(0, 0, WindowMessageDispatcher, 0, 0, 0)) == NULL)\n\t\t\tprintf(\"[TLAC] InitializeTick(): CreateThread() Error: %d\\n\", GetLastError());\n\n\t\tframework::DivaWindowHandle = WindowFromDC(wglGetCurrentDC());\n\n\t\tHRESULT diInitResult = Input::InitializeDirectInput(framework::Module);\n\t\tif (FAILED(diInitResult))\n\t\t\tprintf(\"[TLAC] InitializeTick(): Failed to initialize DirectInput. Error: 0x%08X\\n\", diInitResult);\n\n\t\tComponentsManager.Initialize();\n\t}\n\n\tvoid UpdateTick()\n\t{\n\t\tif (FirstUpdateTick)\n\t\t{\n\t\t\tFirstUpdateTick = false;\n\t\t\tInitializeTick();\n\t\t}\n\n\t\tif (DeviceConnected)\n\t\t{\n\t\t\tDeviceConnected = false;\n\n\t\t\tif (!Input::DualShock4::InstanceInitialized())\n\t\t\t{\n\t\t\t\tif (Input::DualShock4::TryInitializeInstance())\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): DualShock4 connected and initialized\\n\");\n\t\t\t}\n\n\t\t\tif (!Input::GenericUsbInput::InstanceInitialized())\n\t\t\t{\n\t\t\t\tif (Input::GenericUsbInput::TryInitializeInstance())\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): GenericUsbInput connected and initialized\\n\");\n\t\t\t}\n\n\t\t\tif (!Input::Divaller::InstanceInitialized())\n\t\t\t{\n\t\t\t\tif (Input::Divaller::TryInitializeInstance())\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): Divaller connected and initialized\\n\");\n\t\t\t}\n\t\t}\n\n\t\tComponentsManager.Update();\n\n\t\tHadWindowFocus = HasWindowFocus;\n\t\tHasWindowFocus = framework::DivaWindowHandle == NULL || GetForegroundWindow() == framework::DivaWindowHandle;\n\n\t\tif ((HasWindowFocus) && (!framework::inputDisable))\n\t\t{\n\t\t\tInput::Keyboard::GetInstance()->PollInput();\n\t\t\tInput::Mouse::GetInstance()->PollInput();\n\t\t\tInput::Xinput::GetInstance()->PollInput();\n\n\t\t\tif (Input::DualShock4::GetInstance() != nullptr)\n\t\t\t{\n\t\t\t\tif (!Input::DualShock4::GetInstance()->PollInput())\n\t\t\t\t{\n\t\t\t\t\tInput::DualShock4::DeleteInstance();\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): DualShock4 connection lost\\n\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Input::GenericUsbInput::GetInstance() != nullptr)\n\t\t\t{\n\t\t\t\tif (!Input::GenericUsbInput::GetInstance()->PollInput())\n\t\t\t\t{\n\t\t\t\t\tInput::GenericUsbInput::DeleteInstance();\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): GenericUsbInput connection lost\\n\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Input::Divaller::GetInstance() != nullptr)\n\t\t\t{\n\t\t\t\tif (!Input::Divaller::GetInstance()->PollInput())\n\t\t\t\t{\n\t\t\t\t\tInput::Divaller::DeleteInstance();\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): Divaller connection lost\\n\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tComponentsManager.UpdateInput();\n\t\t}\n\n\t\tComponentsManager.UpdatePostInput();\n\n\t\tif ((framework::inputDisable))\n\t\t{\n\t\t\tInput::Keyboard::GetInstance()->PollInput();\n\t\t\tInput::Mouse::GetInstance()->PollInput();\n\t\t\tInput::Xinput::GetInstance()->PollInput();\n\n\t\t\tif (Input::DualShock4::GetInstance() != nullptr)\n\t\t\t{\n\t\t\t\tif (!Input::DualShock4::GetInstance()->PollInput())\n\t\t\t\t{\n\t\t\t\t\tInput::DualShock4::DeleteInstance();\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): DualShock4 connection lost\\n\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Input::GenericUsbInput::GetInstance() != nullptr)\n\t\t\t{\n\t\t\t\tif (!Input::GenericUsbInput::GetInstance()->PollInput())\n\t\t\t\t{\n\t\t\t\t\tInput::GenericUsbInput::DeleteInstance();\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): GenericUsbInput connection lost\\n\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Input::Divaller::GetInstance() != nullptr)\n\t\t\t{\n\t\t\t\tif (!Input::Divaller::GetInstance()->PollInput())\n\t\t\t\t{\n\t\t\t\t\tInput::Divaller::DeleteInstance();\n\t\t\t\t\tprintf(\"[TLAC] UpdateTick(): Divaller connection lost\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (HasWindowFocus && !HadWindowFocus)\n\t\t\tComponentsManager.OnFocusGain();\n\n\t\tif (!HasWindowFocus && HadWindowFocus)\n\t\t\tComponentsManager.OnFocusLost();\n\t}\n\n\tvoid UpdateDraw2D()\n\t{\n\t\tComponentsManager.UpdateDraw2D();\n\t}\n\n\t/*void InitializeExtraSettings()\n\t{\n\t\tconst LPCTSTR RESOLUTION_CONFIG_FILE_NAME = _T(\".\\\\config.ini\");\n\t\tauto nTAA = GetPrivateProfileIntW(L\"graphics\", L\"taa\", TRUE, RESOLUTION_CONFIG_FILE_NAME);\n\t\tauto nMLAA = GetPrivateProfileIntW(L\"graphics\", L\"mlaa\", TRUE, RESOLUTION_CONFIG_FILE_NAME);\n\n\t\t\n\t\tif (!nTAA)\n\t\t{\n\t\t\t{\n\t\t\t\t// set TAA var (shouldn't be needed but whatever)\n\t\t\t\t*(byte*)0x00000001411AB67C = 0;\n\t\t\t}\n\t\t\t{\n\t\t\t\t// make constructor/init not set TAA\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404AB11D, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((byte*)0x00000001404AB11D + 0) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB11D + 1) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB11D + 2) = 0x90;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404AB11D, 3, oldProtect, &bck);\n\t\t\t}\n\t\t\t{\n\t\t\t\t// not sure, but it's somewhere in TaskPvGame init\n\t\t\t\t// just make it set TAA to 0 instead of 1 to avoid possible issues\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001401063CE, 1, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((byte*)0x00000001401063CE + 0) = 0x00;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001401063CE, 1, oldProtect, &bck);\n\t\t\t}\n\t\t\t{\n\t\t\t\t// prevent re-enabling after taking photos\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x000000014048FBA9, 1, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((byte*)0x000000014048FBA9 + 0) = 0x00;\n\t\t\t\tVirtualProtect((BYTE*)0x000000014048FBA9, 1, oldProtect, &bck);\n\t\t\t}\n\t\t\tprintf(\"[TLAC] TAA disabled\\n\");\n\t\t}\n\t\tif (!nMLAA)\n\t\t{\n\t\t\t{\n\t\t\t\t// set MLAA var (shouldn't be needed but whatever)\n\t\t\t\t*(byte*)0x00000001411AB680 = 0;\n\t\t\t}\n\t\t\t{\n\t\t\t\t// make constructor/init not set MLAA\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404AB11A, 3, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((byte*)0x00000001404AB11A + 0) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB11A + 1) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB11A + 2) = 0x90;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404AB11A, 3, oldProtect, &bck);\n\t\t\t}\n\n\t\t\tprintf(\"[TLAC] MLAA disabled\\n\");\n\t\t}\n\t\t/*if (nMagFilter > -1)\n\t\t{\n\t\t\t{\n\t\t\t\t// set MAG filter var\n\t\t\t\t*(byte*)0x00000001411AC518 = nMagFilter;\n\t\t\t}\n\t\t\t{\n\t\t\t\t// make constructor/init not set  MAG filter (1)\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404AB13C, 6, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((byte*)0x00000001404AB13C + 0) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB13C + 1) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB13C + 2) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB13C + 3) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB13C + 4) = 0x90;\n\t\t\t\t*((byte*)0x00000001404AB13C + 5) = 0x90;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404AB13C, 6, oldProtect, &bck);\n\t\t\t}\n\t\t\t{\n\t\t\t\t// make constructor/init not set  MAG filter (2)\n\t\t\t\tDWORD oldProtect, bck;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404A863F, 10, PAGE_EXECUTE_READWRITE, &oldProtect);\n\t\t\t\t*((byte*)0x00000001404A863F + 0) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 1) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 2) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 3) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 4) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 5) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 6) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 7) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 8) = 0x90;\n\t\t\t\t*((byte*)0x00000001404A863F + 9) = 0x90;\n\t\t\t\tVirtualProtect((BYTE*)0x00000001404A863F, 10, oldProtect, &bck);\n\t\t\t}\n\n\t\t\tprintf(\"[TLAC] MAG Filter set to %d\\n\", nMagFilter);\n\t\t}*\n\t}*/\n\n\tvoid Dispose()\n\t{\n\t\tComponentsManager.Dispose();\n\n\t\tdelete Input::Keyboard::GetInstance();\n\t\tdelete Input::Mouse::GetInstance();\n\t\tdelete Input::DualShock4::GetInstance();\n\t\tdelete Input::GenericUsbInput::GetInstance();\n\n\t\tInput::DisposeDirectInput();\n\n\t\tPostThreadMessage(MessageThread.ID, WM_QUIT, 0, 0);\n\t}\n}\n\nDWORD WINAPI WindowMessageDispatcher(LPVOID lpParam)\n{\n\tHWND windowHandle = CreateWindowW(\n\t\tMessageWindowClassName,\n\t\tMessageWindowName,\n\t\tWS_OVERLAPPEDWINDOW,\n\t\tCW_USEDEFAULT, CW_USEDEFAULT,\n\t\tCW_USEDEFAULT, CW_USEDEFAULT,\n\t\tNULL, NULL,\n\t\tTLAC::framework::Module,\n\t\tNULL);\n\n\tif (!windowHandle)\n\t{\n\t\tprintf(\"[TLAC] WindowMessageDispatcher(): CreateWindowW() Error: %d\\n\", GetLastError());\n\t\treturn 1;\n\t}\n\n\tMessageThread.ID = GetCurrentThreadId();\n\n\tMSG message;\n\tDWORD returnValue;\n\n\tprintf(\"[TLAC] WindowMessageDispatcher(): Entering message loop...\\n\");\n\n\twhile (1)\n\t{\n\t\treturnValue = GetMessage(&message, NULL, 0, 0);\n\t\tif (returnValue != -1)\n\t\t{\n\t\t\tTranslateMessage(&message);\n\t\t\tDispatchMessage(&message);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprintf(\"[TLAC] WindowMessageDispatcher(): GetMessage() Error: %d\\n\", returnValue);\n\t\t}\n\t}\n\n\tDestroyWindow(windowHandle);\n\treturn 0;\n}\n\nBOOL RegisterDeviceInterface(HWND hWnd, HDEVNOTIFY* hDeviceNotify)\n{\n\tDEV_BROADCAST_DEVICEINTERFACE NotificationFilter = {};\n\n\tNotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);\n\tNotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;\n\n\t*hDeviceNotify = RegisterDeviceNotification(hWnd, &NotificationFilter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);\n\n\treturn *hDeviceNotify != NULL;\n}\n\nLRESULT CALLBACK MessageWindowProcessCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n\tswitch (message)\n\t{\n\tcase WM_CREATE:\n\t{\n\t\tHDEVNOTIFY hDevNotify = NULL;\n\n\t\tif (!RegisterDeviceInterface(hWnd, &hDevNotify))\n\t\t\tprintf(\"[TLAC] MessageWindowProcessCallback(): RegisterDeviceInterface() Error: %d\\n\", GetLastError());\n\n\t\tbreak;\n\t}\n\n\tcase WM_DEVICECHANGE:\n\t{\n\t\tswitch (wParam)\n\t\t{\n\t\tcase DBT_DEVICEARRIVAL:\n\t\t\tTLAC::DeviceConnected = true;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tdefault:\n\t\treturn DefWindowProc(hWnd, message, wParam, lParam);\n\t}\n\n\treturn 0;\n}\n\nVOID RegisterMessageWindowClass()\n{\n\tWNDCLASS windowClass = { };\n\n\twindowClass.lpfnWndProc = MessageWindowProcessCallback;\n\twindowClass.hInstance = TLAC::framework::Module;\n\twindowClass.lpszClassName = MessageWindowClassName;\n\n\tRegisterClass(&windowClass);\n}\n\nvoid hookedEngineUpdate()\n{\n\tTLAC::UpdateTick();\n\t//divaEngineUpdate();\n}\n\nvoid hookedEngineStageDispShadow()\n{\n\tdivaEngineStageDispShadow();\n\tTLAC::UpdateDraw2D();\n}\n\nBOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)\n{\n\tHWND consoleHandle = GetConsoleWindow();\n\n\tswitch (ul_reason_for_call)\n\t{\n\tcase DLL_PROCESS_ATTACH:\n\n\t\t// Are you a dev and want to debug? Want to always be able to watch the console upon game initialization? Comment this.\n\t\tShowWindow(consoleHandle, SW_HIDE);\n\n\t\tprintf(\"[TLAC] DllMain(): Installing hooks...\\n\");\n\n\n\t\t//InstallHook((void*)ENGINE_UPDATE_HOOK_TARGET_ADDRESS, (void*)UpdateTick, 0xE);\n\t\tDisableThreadLibraryCalls(hModule);\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaEngineUpdate, hookedEngineUpdate);\n\t\tDetourTransactionCommit();\n\n\t\tDetourTransactionBegin();\n\t\tDetourUpdateThread(GetCurrentThread());\n\t\tDetourAttach(&(PVOID&)divaEngineStageDispShadow, hookedEngineStageDispShadow);\n\t\tDetourTransactionCommit();\n\n\t\t//TLAC::InitializeExtraSettings();\n\n\t\tTLAC::framework::Module = hModule;\n\t\tbreak;\n\n\tcase DLL_PROCESS_DETACH:\n\t\tTLAC::Dispose();\n\t\tbreak;\n\t}\n\n\treturn TRUE;\n}"
  },
  {
    "path": "source-code/source/plugins/TLAC/framework.cpp",
    "content": "#include \"framework.h\"\n#include <filesystem>\n\nnamespace TLAC\n{\n\ttypedef std::filesystem::path fspath;\n\n\tstd::string *framework::moduleDirectory;\n\n\tHWND framework::DivaWindowHandle;\n\tHMODULE framework::Module;\n\n\tbool framework::inputDisable = false;\n\n\tstd::string framework::GetModuleDirectory()\n\t{\n\t\tif (moduleDirectory == nullptr)\n\t\t{\n\t\t\tWCHAR modulePathBuffer[MAX_PATH];\n\t\t\tGetModuleFileNameW(framework::Module, modulePathBuffer, MAX_PATH);\n\n\t\t\tfspath configPath = fspath(modulePathBuffer).parent_path();\n\t\t\tmoduleDirectory = new std::string(configPath.u8string());\n\t\t}\n\n\t\treturn *moduleDirectory;\n\t}\n\n\tRECT framework::GetWindowBounds()\n\t{\n\t\tRECT windowRect;\n\t\tGetWindowRect(DivaWindowHandle, &windowRect);\n\n\t\treturn windowRect;\n\t}\n\n\textern \"C\" __declspec(dllexport) void ChangeDivaWindowHandle(HWND hwnd) {\n\t\tframework::DivaWindowHandle = hwnd;\n\t\treturn;\n\t}\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/framework.h",
    "content": "#pragma once\n#include <Windows.h>\n#include <string>\n\nnamespace TLAC\n{\n\tclass framework\n\t{\n\tprivate:\n\t\tstatic std::string *moduleDirectory;\n\n\tpublic:\n\t\tstatic bool inputDisable;\n\n\t\tstatic HWND DivaWindowHandle;\n\t\tstatic HMODULE Module;\n\n\t\tstatic std::string GetModuleDirectory();\n\t\tstatic RECT GetWindowBounds();\n\t};\n}\n"
  },
  {
    "path": "source-code/source/plugins/TLAC/pluginconfig.h",
    "content": "#include \"PluginConfigApi.h\"\n\nusing namespace PluginConfig;\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginName(void)\n{\n\treturn L\"TLAC\";\n}\n\nextern \"C\" __declspec(dllexport) LPCWSTR GetPluginDescription(void)\n{\n\treturn L\"Provides keyboard/mouse/controller input, player data management, bug fixes for running on more PCs, etc.\\nThis plugin is required.\";\n}"
  }
]