Compare commits

...

41 Commits
1.3.0 ... main

Author SHA1 Message Date
ca15fac6a1 fix: don't store SortByInternal in db 2024-08-30 17:20:26 +00:00
ebb78efcde fix: item popup disappearing 2024-08-30 14:54:59 +00:00
2204fb4756 fix: shop confirmation dialog not showing (#7)
Co-authored-by: Jujuforce <jujuforce@gmail.com>
Co-authored-by: akanyan <alicechecker01@proton.me>
Co-authored-by: あかニャン <akanyan@noreply.gitea.tendokyu.moe>
Reviewed-on: #7
Co-authored-by: jujuforce <jujuforce@noreply.gitea.tendokyu.moe>
Co-committed-by: jujuforce <jujuforce@noreply.gitea.tendokyu.moe>
2024-08-30 14:53:27 +00:00
66fdc27787 feat: implement InfiniteStory (#6)
Infinite Story mod
- Allows watching an infinite number of stories per session
- Skips the dialog about it when selecting a story

Co-authored-by: Jujuforce <jujuforce@gmail.com>
Co-authored-by: akanyan <alicechecker01@proton.me>
Reviewed-on: #6
Co-authored-by: jujuforce <jujuforce@noreply.gitea.tendokyu.moe>
Co-committed-by: jujuforce <jujuforce@noreply.gitea.tendokyu.moe>
2024-08-24 16:29:07 +00:00
032b6864da fix: cache mkdir
I originally left it out because I wanted to avoid unnecessary
code duplication. Turns out it wasn't unnecessary.
2024-08-24 14:14:02 +00:00
07ee892b43 feat: implement SelectBGM 2024-07-30 02:22:25 +09:00
920d2386d5 chore: bump to 2.1.0 2024-07-23 01:51:40 +09:00
4ad595f6c3 feat: various enhancements
* AttractVideoPlayer,LoadBoost: allow setting a cache directory
* AttractVideoPlayer: color leds
* BetterGiveUp: prevent multiple restarts in a row
* use GetTriggerOn in general where applicable
2024-07-23 01:45:36 +09:00
8cbc7e8b86 feat: implement AttractVideoPlayer (#2)
Service Button : Pause the attract video
L2/L3 Buttons : Previous/next to cycle through all the attract videos
Saving the selected video for future game launches

Co-authored-by: akanyan <alicechecker01@proton.me>
Reviewed-on: #2
Co-authored-by: jujuforce <jujuforce@noreply.gitea.tendokyu.moe>
Co-committed-by: jujuforce <jujuforce@noreply.gitea.tendokyu.moe>
2024-07-22 14:55:49 +00:00
7f5cd6d0d7 fix(PlatinumTiming): reset 2024-07-22 01:02:19 +09:00
381d888da6 feat(InfiniteGP): make UI changes optional 2024-07-21 22:07:16 +09:00
946402fa82 feat: implement PlatinumTiming
* Also fix icons in InfiniteGP.
2024-07-21 02:24:09 +09:00
b2ecf368fb fix(UnlockFrameRate): revert a bad idea 2024-07-12 08:32:49 +09:00
c349854cb0 fix: various fixes 2024-07-12 08:14:06 +09:00
26fffefbae fix(SkipPreMusic): allow permanent skip 2024-07-08 04:50:37 +09:00
5872a05c7b chore: bump to 2.0.0 2024-07-08 03:37:49 +09:00
c1954d76c1 feat(SkipPreMusic): now triggered by LMenu 2024-07-08 03:33:38 +09:00
579790663e feat(SkipNotice): merge SkipLoginReward back
Except it's now triggered by LMenu.
2024-07-08 03:19:01 +09:00
8a6ad2e523 docs: stop screwing around 2024-07-08 02:53:10 +09:00
079b7b6495 feat: remove ExportChartData 2024-07-08 02:17:59 +09:00
cc7bc8613b feat: add the remaining things
* DisableMaintenance
* UnlockAllMusic
* UnlockGameEvents
* UnlockMemoryChapters
2024-07-08 02:10:46 +09:00
42cf65bdb7 feat: add 4 things
* DisableEncryption
* LoadBoost
* UnlockFrameRate
* UnlockMasterDifficulty

WIP, not fully reviewed/tested yet.
2024-07-08 00:42:55 +09:00
b54b8676c1 feat(NaiveRating): make it togglable 2024-07-07 23:47:46 +09:00
af15a4410a fix(SortByInternal): better title 2024-07-06 03:39:19 +09:00
8a66b8becd fix(SortByInternal): re:mas de-grouping in act3 2024-07-06 01:21:33 +09:00
de9bcda48d feat(SortByInternal): add sort2 2024-07-05 19:49:45 +09:00
44dfa20ea8 feat: implement SortByInternalDifficulty 2024-07-05 09:15:56 +09:00
76884216dd chore: major cleanup 2024-07-04 21:39:11 +09:00
74ecdf111a feat: implement UnlockAndSetJewelBoostNine (#1)
* UnlockAndSetJewelBoostNine: added.

Co-authored-by: akanyan <alicechecker01@proton.me>
Reviewed-on: #1
Co-authored-by: JUJUX670E\Jujuforce <julien@campy.fr>
Co-committed-by: JUJUX670E\Jujuforce <julien@campy.fr>
2024-07-02 20:47:44 +00:00
3238de75f2 chore: upload project files part 2 2024-07-02 21:38:04 +09:00
b8d6353f8e chore: upload project files 2024-07-02 21:26:00 +09:00
396d1cd20d chore: further cleanup 2024-07-02 10:50:04 +09:00
470d2acae4 chore: cleanup 2024-07-02 10:35:45 +09:00
cc6f7657c7 feat: implement Pause, better InfiniteGP 2024-07-02 10:34:51 +09:00
a31cf82029 chore: name correction 2024-06-27 23:41:03 +09:00
3644cb7813 chore: spin off SkipLoginBonus 2024-06-27 23:33:47 +09:00
c527320178 docs: remove unnecessary warning 2024-06-27 20:58:53 +09:00
fe7d0f297f feat: add LockSelectionTime 2024-06-27 09:41:45 +09:00
8efe0a3a94 fix: remove an obsolete check 2024-06-27 08:28:14 +09:00
5bd9b5ae70 feat: rework NaiveRating, improve InfiniteGP 2024-06-27 08:15:42 +09:00
45095b212b chore: update the readme
* add an "installation guide"
* warn about missless sucking ass
2024-06-05 17:50:09 +00:00
99 changed files with 2681 additions and 286 deletions

7
.gitignore vendored
View File

@ -1,7 +1,6 @@
.vs/
*.sln
*.csproj
**/bin/*
**/obj/*
*.dll
Common/
_*/
Common/*
!Common/mscorlib.dll

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.AttractVideoPlayer.mm</AssemblyName>
<Description>Control attract video</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,57 @@
using System;
using System.Collections.ObjectModel;
using System.IO;
namespace MU3.Operation;
class patch_OperationManager: OperationManager {
private ReadOnlyCollection<MovieData> _movieDataList;
private int _movieIndex;
private string _fileName;
~patch_OperationManager() {
try {
File.WriteAllText(_fileName, MovieIndex.ToString());
} catch(Exception ex) {
System.Console.WriteLine(ex);
}
}
public int MovieIndex {
set {
if(_movieDataList.Count > 0) {
_movieIndex = (value + _movieDataList.Count) % _movieDataList.Count;
} else {
_movieIndex = 0;
}
}
get {
return _movieIndex;
}
}
public new MovieData movieData {
get {
if(_movieDataList.Count > 0) {
return _movieDataList[MovieIndex];
}
return null;
}
}
public extern void orig_initialize();
public new void initialize() {
orig_initialize();
using IniFile iniFile = new("mu3.ini");
var dir = iniFile.getValue("Extra", "CacheDir", ".");
Directory.CreateDirectory(dir);
_fileName = Path.Combine(dir, "data_advert_cache.txt");
try {
_movieIndex = Math.Max(0, int.Parse(File.ReadAllText(_fileName)));
} catch(Exception) {
_movieIndex = 0;
}
}
}

View File

@ -0,0 +1,20 @@
using MU3.Util;
namespace MU3.Sequence;
class patch_Advertise: Advertise {
// Exclude Back/Left/Right
private bool anyKeyDown() {
UIInput instance = Singleton<UIInput>.instance;
if(instance.getTriggerOn(UIInput.Key.Decision)
|| instance.getTriggerOn(UIInput.Key.OptionBackward)
|| instance.getTriggerOn(UIInput.Key.OptionForward)
|| instance.getTriggerOn(UIInput.Key.SkipLeft)
|| instance.getTriggerOn(UIInput.Key.SkipRight)
|| instance.getTriggerOn(UIInput.Key.MenuLeft)
|| instance.getTriggerOn(UIInput.Key.MenuRight)) {
return true;
}
return false;
}
}

View File

@ -0,0 +1,53 @@
using MU3.Operation;
using MU3.Util;
using UnityEngine;
namespace MU3;
class patch_AdvManager: AdvManager {
private GameObject objMovie;
private CriManaMovieMaterial movieController;
private extern bool orig_exec();
public new bool exec() {
if(movieController?.player?.status == CriMana.Player.Status.Playing) {
if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.Service)) {
movieController.player.Pause(!movieController.player.IsPaused());
} else if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.L2)) {
addMovieOffset(-1);
} else if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.L3)) {
addMovieOffset(1);
}
}
return orig_exec();
}
public void addMovieOffset(int offset) {
var om = (patch_OperationManager)Singleton<OperationManager>.instance;
om.MovieIndex += offset;
movieController.Stop();
Utility.destroyGameObject(ref movieController);
Utility.destroyGameObject(ref objMovie);
initMovie();
}
public extern bool orig_initMovie();
public new bool initMovie() {
UIInput instance = Singleton<UIInput>.instance;
instance.setLedColor(UIInput.Key.L2, new Color(0f, 0.7f, 0f));
instance.setLedColor(UIInput.Key.L3, new Color(0f, 0.7f, 0f));
return orig_initMovie();
}
public extern void orig_exitMovie();
public new void exitMovie() {
orig_exitMovie();
UIInput instance = Singleton<UIInput>.instance;
instance.setLedColor(UIInput.Key.L2, Color.black);
instance.setLedColor(UIInput.Key.L3, Color.black);
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.BetterGiveUp.mm</AssemblyName>
<Description>Forfeit (red menu) and restart (yellow menu)</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -1,13 +1,8 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using System.Collections.Generic;
using System.Collections.Generic;
namespace MU3.Game;
public class patch_GameLED: GameLED {
class patch_GameLED: GameLED {
private patch_ButtonList _buttonList = new();
public extern void orig_initialize();

View File

@ -1,14 +1,9 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using UnityEngine;
using UnityEngine;
namespace MU3.Notes;
public class patch_FieldObject: FieldObject {
public class patch_BarNotes {
public class patch_Bar: BarNotes.Bar {
class patch_FieldObject: FieldObject {
class patch_BarNotes {
class patch_Bar: BarNotes.Bar {
public extern void orig_update(NotesManager mgr, float width = 1f);
public new void update(NotesManager mgr, float width = 1f) {

View File

@ -1,13 +1,8 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using UnityEngine;
using UnityEngine;
namespace MU3.Notes;
public class patch_NotesManager: NotesManager {
class patch_NotesManager: NotesManager {
public extern void orig_reset();
public extern Vector3 orig_getEnemyPos();

View File

@ -1,9 +1,4 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using MU3.Battle;
using MU3.Battle;
using MU3.Game;
using MU3.Notes;
using MU3.Util;
@ -12,12 +7,13 @@ using UnityEngine;
namespace MU3.Sequence;
public class patch_PlayMusic: PlayMusic {
class patch_PlayMusic: PlayMusic {
private static readonly TimeSpan HOLD_DURATION = TimeSpan.FromSeconds(1.0f);
private static readonly TimeSpan ROLL_DURATION = TimeSpan.FromSeconds(0.5f);
public static bool QuickSkip = false;
private GameEngine _gameEngine;
private SessionInfo _sessionInfo;
private bool _pressedYellow;
private bool _isRolling;
private float _totalRollingFrame;
private DateTime _rollingStartTime;
@ -35,11 +31,13 @@ public class patch_PlayMusic: PlayMusic {
return min + (max - min) * Math.Pow(progress, 2.0);
}
private static bool IsHolding() {
return Singleton<UIInput>.instance.getStateOn(UIInput.Key.MenuLeft) ^ Singleton<UIInput>.instance.getStateOn(UIInput.Key.MenuRight);
private bool IsHolding() {
return Singleton<UIInput>.instance.getStateOn(UIInput.Key.MenuLeft)
^ (_pressedYellow && Singleton<UIInput>.instance.getStateOn(UIInput.Key.MenuRight));
}
private void StartRolling() {
_pressedYellow = false;
_isRolling = true;
_totalRollingFrame = ntMgr.getCurrentFrame();
_rollingStartTime = CustomDateTime.Now;
@ -51,6 +49,7 @@ public class patch_PlayMusic: PlayMusic {
private void EndRolling() {
_isRolling = false;
ntMgr.stopPlay();
ntMgr.setPause(false);
ntMgr.reset();
ntMgr.reloadScore(_gameEngine.IsStageDazzling);
_gameEngine.counters.reset();
@ -64,6 +63,9 @@ public class patch_PlayMusic: PlayMusic {
}
private void Execute_Play() {
if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.MenuRight)) {
_pressedYellow = true;
}
if(_isRolling) {
TimeSpan timeSpan = CustomDateTime.Now - _rollingStartTime;
if(timeSpan <= ROLL_DURATION) {

View File

@ -1,15 +1,8 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
#pragma warning disable CS0108
#pragma warning disable CS0414
using MU3.Sequence;
using MU3.Sequence;
namespace MU3;
public class patch_Scene_32_PrePlayMusic_MusicSelect: Scene_32_PrePlayMusic_MusicSelect {
class patch_Scene_32_PrePlayMusic_MusicSelect: Scene_32_PrePlayMusic_MusicSelect {
private bool _playVoice;
private extern void orig_Enter_Select();
private void Enter_Select() {

View File

@ -1,14 +1,9 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using MU3.Sequence;
using MU3.Util;
namespace MU3;
public class patch_Scene_37_Result: Scene_37_Result {
class patch_Scene_37_Result: Scene_37_Result {
private Mode<Scene_37_Result, State> mode_;
private extern void orig_Init_Init();
private enum State {
@ -25,7 +20,6 @@ public class patch_Scene_37_Result: Scene_37_Result {
CardCharaEnd,
End
}
private void Init_Init() {
orig_Init_Init();
if(patch_PlayMusic.QuickSkip) {

View File

@ -1,15 +1,9 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable CS0414
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using MU3.Sequence;
using MU3.Util;
namespace MU3;
public class patch_Scene_38_End: Scene_38_End {
class patch_Scene_38_End: Scene_38_End {
private Mode<Scene_38_End, State> mode_;
private extern void orig_Init_Init();
private int result_;

BIN
Common/mscorlib.dll Normal file

Binary file not shown.

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.DisableEncryption.mm</AssemblyName>
<Description>Disable encryption</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,28 @@
using MonoMod;
namespace MU3;
[MonoModPatch("global::MU3.NetConfig")]
public static class patch_NetConfig {
private static int encryptVersion_;
private static bool useTLS_;
public static int EncryptVersion {
get {
return 0;
}
set {
encryptVersion_ = 0;
}
}
public static bool UseTLS {
get {
return false;
}
set {
useTLS_ = false;
}
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.DisableMaintenance.mm</AssemblyName>
<Description>Disable maintenance</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,27 @@
namespace MU3.Operation;
class patch_ClosingManager: ClosingManager {
public new int getRemainingMinutes() {
return int.MaxValue;
}
public new int getClosedRemainingMinutes() {
return int.MaxValue;
}
public new bool isShowRemainingMinutes() {
return false;
}
public new bool isReceptionClosed() {
return false;
}
public new bool isForceLogout() {
return false;
}
public new CreditUseRestriction getCreditUseRestriction() {
return CreditUseRestriction.None;
}
}

View File

@ -0,0 +1,47 @@
namespace MU3.Operation;
class patch_MaintenanceTimer: MaintenanceTimer {
public new bool isUnderServerMaintenance() {
return false;
}
public new int getServerMaintenanceSec() {
return int.MaxValue;
}
public new int getAutoRebootSec() {
return int.MaxValue;
}
public new bool isAutoRebootNeeded() {
return false;
}
public new int getRemainingMinutes() {
return int.MaxValue;
}
public new int getClosedRemainingMinutes() {
return int.MaxValue;
}
public new bool isShowRemainingMinutes() {
return false;
}
public new bool isClosed() {
return false;
}
public new bool isForceLogout() {
return false;
}
public new ClosingManager.CreditUseRestriction getCreditUseRestriction() {
return ClosingManager.CreditUseRestriction.None;
}
public new bool isCoinAcceptable() {
return true;
}
}

View File

@ -1,63 +0,0 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using System.IO;
namespace MU3.Data;
public class patch_DataManager: DataManager {
private extern void orig_linkFumenAnalysisData();
private const string SEPARATOR = "$";
private string PrintHeader() {
return string.Join(SEPARATOR, new string[] {
"id",
"name",
"difficulty",
"name for sort",
"artist",
"genre",
"internal level",
"charter",
"max platinum score",
"release date",
"release version",
"bpm",
"location"
});
}
private string PrintLine(FumenData fumen, MusicData mus, int level) {
return string.Join(SEPARATOR, new string[] {
mus.id.ToString(),
mus.name,
level.ToString(),
mus.nameForSort,
mus.artistName,
mus.genreName,
fumen.fumenConst.ToString(),
fumen.notesDesignerName ?? "",
fumen.platinumScoreMax.ToString(),
mus.ReleaseVersion.ToUniversalTime().ToString(),
mus.versionTitle,
fumen.bpm.ToString(),
fumen.fumenFile.Substring(fumen.fumenFile.LastIndexOf('A'))
});
}
private void linkFumenAnalysisData() {
orig_linkFumenAnalysisData();
using StreamWriter writer = new("charts.csv");
writer.WriteLine(PrintHeader());
foreach(var mus in allMusicData) {
int i = 0;
foreach(var fumen in mus.fumenData) {
if(fumen.isExist) {
writer.WriteLine(PrintLine(fumen, mus, i));
}
i += 1;
}
}
UnityEngine.Debug.Log("[ExportChartData] Written to charts.csv");
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.InfiniteGP.mm</AssemblyName>
<Description>Remove credits and GP</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -1,33 +1,36 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
#pragma warning disable CS0108
namespace MU3.User;
namespace MU3.User;
public class patch_UserManager: UserManager {
public const int DefaultGP = 666;
class patch_UserManager: UserManager {
public new const int DefaultGP = 999;
private int _gp;
private OnUpdate _onUpdateGP;
private OnReset _onResetGP;
public void resetGP() {
_gp = 666;
public new void resetGP() {
if(_onResetGP != null) {
_onResetGP(_gp);
}
}
public int GP {
public new int GP {
get {
return _gp;
}
private set {
_gp = 666;
if(_onUpdateGP != null) {
_onUpdateGP(_gp);
}
}
}
public new bool checkBattleGP(int needed) {
return true;
}
public extern void orig_initialize();
public new void initialize() {
orig_initialize();
using IniFile iniFile = new("mu3.ini");
_gp = iniFile.getIntValue("Extra", "GP", 999);
}
}

View File

@ -0,0 +1,21 @@
using MU3.Util;
namespace MU3;
class patch_Scene_25_Login: Scene_25_Login {
public enum State {
Login = 2
}
private Mode<Scene_25_Login, State> mode_;
private extern void orig_invokeOnFinish(int status);
private void PurchaseGP_Init() {
mode_.set(State.Login);
}
private void invokeOnFinish(int status) {
orig_invokeOnFinish(status);
}
private void ExchangeGP_Init() {
invokeOnFinish(1);
}
}

View File

@ -0,0 +1,55 @@
using MU3.CustomUI;
using UnityEngine;
namespace MU3;
class patch_UICredit: UICredit {
private Animator gpAnimator_;
private GameObject creditRoot_;
private MU3UICounter credit_;
private GameObject freePlayRoot_;
private GameObject gpRoot_;
private MU3UICounter gp_;
private MU3UICounter gpPlus_;
private MU3UICounter gpMinus_;
private MU3UIImageChanger netIcon_;
private MU3UIImageChanger groupIcon_;
private void onUpdateGP(int value) { /* nop */ }
public extern void orig_initialize();
public new void initialize() {
orig_initialize();
using IniFile iniFile = new("mu3.ini");
if(iniFile.getValue("Extra", "HideGP", true)) {
DestroyImmediate(gpAnimator_);
gpRoot_.transform.localScale = new Vector3(0, 0, 0);
gp_.transform.localScale = new Vector3(0, 0, 0);
gpPlus_.transform.localScale = new Vector3(0, 0, 0);
gpMinus_.transform.localScale = new Vector3(0, 0, 0);
}
if(iniFile.getValue("Extra", "HideCredits", true)) {
creditRoot_.transform.localScale = new Vector3(0, 0, 0);
credit_.transform.localScale = new Vector3(0, 0, 0);
freePlayRoot_.transform.localScale = new Vector3(0, 0, 0);
netIcon_.transform.localPosition = new Vector3(
-514,
netIcon_.transform.localPosition.y,
netIcon_.transform.localPosition.z
);
netIcon_.image.rectTransform.pivot = new Vector2(0f, 0.5f);
groupIcon_.transform.localPosition = new Vector3(
-476,
groupIcon_.transform.localPosition.y,
groupIcon_.transform.localPosition.z
);
groupIcon_.image.rectTransform.pivot = new Vector2(0f, 0.5f);
}
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.InfiniteStory.mm</AssemblyName>
<Description>Allows watching the story endlessly</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,12 @@
using MU3.User;
using MU3.Util;
namespace MU3.Sequence;
class patch_Play: Play {
private extern void orig_Enter_PlayScenario();
private void Enter_PlayScenario() {
orig_Enter_PlayScenario();
Singleton<UserManager>.instance.userLocal.isStoryWatched = false;
}
}

View File

@ -0,0 +1,30 @@
using MonoMod;
using MU3.ViewData;
namespace MU3;
class patch_Scene_32_PrePlayMusic_MusicSelect: Scene_32_PrePlayMusic_MusicSelect {
private MusicSelectViewDataList _selectList;
private UIMusicSelector _selector;
private UIDialogBase _dialogBase;
[MonoModIgnore]
private extern void onFinishPlayScenario(int status, bool flag);
[MonoModIgnore]
private extern void updateSystemUIPanel();
private extern void orig_Execute_Select();
private void Execute_Select() {
// Walk around the warning dialog
if(_dialogBase == null && !_selector.isDecided && !_selector.isCanceled && (_selector.isPressed || _selector.isPressedDisabledElement)) {
MusicSelectViewData musicViewData = _selectList.getMusicViewData(_selector.selectIndex);
if(musicViewData != null && musicViewData.kind == MusicSelectViewData.Kind.Scenario
&& musicViewData.scenarioViewData.ngReason == ScenarioViewData.PlayNGReason.None) {
onFinishPlayScenario(0, false);
updateSystemUIPanel();
return;
}
}
orig_Execute_Select();
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.LoadBoost.mm</AssemblyName>
<Description>Speed up startup</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace MU3.Data;
public class patch_DataManager: DataManager {
private Dictionary<int, FumenAnalysisData> _fumenAnalysisData;
private string _fileName;
private void initCache() {
if(File.Exists(_fileName)) {
System.Console.WriteLine("Loading chart analysis cache...");
_fumenAnalysisData = new Dictionary<int, FumenAnalysisData>();
using FileStream input = File.OpenRead(_fileName);
using BinaryReader binaryReader = new BinaryReader(input);
while(binaryReader.BaseStream.Position < binaryReader.BaseStream.Length) {
int key = binaryReader.ReadInt32();
bool isExist = binaryReader.ReadBoolean();
int bpm = binaryReader.ReadInt32();
int platinumScoreMax = binaryReader.ReadInt32();
string notesDesignerName = binaryReader.ReadString();
_fumenAnalysisData.Add(key, new FumenAnalysisData {
isExist = isExist,
bpm = bpm,
platinumScoreMax = platinumScoreMax,
notesDesignerName = notesDesignerName
});
}
} else {
_fumenAnalysisData = new Dictionary<int, FumenAnalysisData>();
}
}
private void saveCache() {
System.Console.WriteLine($"Saving chart analysis cache...{Enumerable.First(_fumenAnalysisData).Key},{Enumerable.First(_fumenAnalysisData).Value.notesDesignerName}");
if(File.Exists(_fileName)) {
File.Delete(_fileName);
}
using FileStream fileStream = File.OpenWrite(_fileName);
using BinaryWriter binaryWriter = new BinaryWriter(fileStream);
foreach(KeyValuePair<int, FumenAnalysisData> fumenAnalysisDatum in _fumenAnalysisData) {
binaryWriter.Write(fumenAnalysisDatum.Key);
binaryWriter.Write(fumenAnalysisDatum.Value.isExist);
binaryWriter.Write(fumenAnalysisDatum.Value.bpm);
binaryWriter.Write(fumenAnalysisDatum.Value.platinumScoreMax);
binaryWriter.Write(fumenAnalysisDatum.Value.notesDesignerName);
}
fileStream.Flush();
}
private extern void orig_makeFumenAnalysisDataList();
private void makeFumenAnalysisDataList() {
using IniFile iniFile = new("mu3.ini");
_fileName = Path.Combine(iniFile.getValue("Extra", "CacheDir", "."), "data_fumen_analysis_cache.bin");
try {
if(patch_DataStudioManager.needSave || !File.Exists(_fileName)) {
orig_makeFumenAnalysisDataList();
saveCache();
} else {
initCache();
}
} catch(Exception value) {
System.Console.WriteLine(value);
}
}
}

View File

@ -0,0 +1,68 @@
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace MU3.Data;
public class patch_DataStudioManager: DataStudioManager {
public static bool needSave;
private static string _fileName;
private static Dictionary<string, object> _dataCache;
private static extern bool orig_Deserialize<T>(string filePath, out T dsr) where T : new();
private static void initCache() {
using IniFile iniFile = new("mu3.ini");
var dir = iniFile.getValue("Extra", "CacheDir", ".");
Directory.CreateDirectory(dir);
_fileName = Path.Combine(dir, "data_cache.bin");
if(File.Exists(_fileName)) {
System.Console.WriteLine("Loading data cache...");
using FileStream serializationStream = File.OpenRead(_fileName);
_dataCache = (Dictionary<string, object>)new BinaryFormatter().Deserialize(serializationStream);
return;
}
_dataCache = new();
}
private static void saveCache() {
if(_fileName == "") {
return;
}
if(File.Exists(_fileName)) {
File.Delete(_fileName);
}
using FileStream serializationStream = File.OpenWrite(_fileName);
new BinaryFormatter().Serialize(serializationStream, _dataCache);
}
private static bool Deserialize<T>(string filePath, out T dsr) where T : new() {
if(_dataCache == null) {
initCache();
}
if(_dataCache.ContainsKey(filePath)) {
dsr = (T)_dataCache[filePath];
return true;
}
if(orig_Deserialize(filePath, out dsr)) {
needSave = true;
_dataCache.Add(filePath, dsr);
return true;
}
return false;
}
public extern bool orig_IsLoaded();
public new bool IsLoaded() {
if(orig_IsLoaded()) {
if(needSave) {
System.Console.WriteLine("Saving data cache...");
saveCache();
}
return true;
}
return false;
}
}

View File

@ -0,0 +1,16 @@
using MU3.SceneObject;
namespace MU3.Sequence;
public class patch_Initialize: Initialize {
private Scene_12_Initialize _initializeObject;
private void Execute_InitQRReader() {
_initializeObject.setQRCodeReaderStatus("SKIP");
setNextState(EState.CheckDelivery);
}
private void Enter_Warning() {
setNextState(EState.StateEnd);
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.LockSelectionTime.mm</AssemblyName>
<Description>Disable all timers</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,14 @@
namespace MU3;
class patch_SystemUI: SystemUI {
class patch_Timer: Timer {
public patch_Timer(UITimer timer) : base(timer) { /* nop */ }
public new void execute() { /* nop */ }
public extern bool orig_get_show();
public extern void orig_set_show(bool value);
public new bool show {
get { return orig_get_show(); }
set { orig_set_show(false); }
}
}
}

View File

@ -0,0 +1,13 @@
using UnityEngine;
namespace MU3;
class patch_UITimer: UITimer {
public new void update() { /* nop */ }
public new void update(float externalCounter) { /* nop */ }
public extern void orig_initialize(float counter);
public new void initialize(float counter) {
orig_initialize(counter);
transform.localScale = new Vector3(0, 0, 0);
}
}

24
Mu3Mods.csproj Normal file
View File

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net35</TargetFramework>
<Company>7EVENDAYS⇔HOLIDAYS</Company>
<Version>2.3.1</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
<Platforms>x64</Platforms>
<NoWarn>IDE0044,IDE0051,IDE0052,IDE1006,CS0414,CS0649,CS0626</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib"><HintPath>..\Common\mscorlib.dll</HintPath></Reference>
<Reference Include="UnityEngine"><HintPath>..\Common\UnityEngine.dll</HintPath></Reference>
<Reference Include="UnityEngine.UI"><HintPath>..\Common\UnityEngine.UI.dll</HintPath></Reference>
<Reference Include="Assembly-CSharp-firstpass"><HintPath>..\Common\Assembly-CSharp-firstpass.dll</HintPath></Reference>
<PackageReference Include="monomod" Version="22.7.31.1" />
<ProjectReference Include="..\Common\Assembly-CSharp_unpacked\Assembly-CSharp_unpacked.csproj" />
</ItemGroup>
<Target Name="CopyDLLs" AfterTargets="Build">
<Copy SourceFiles="$(TargetDir)$(AssemblyName).dll" DestinationFolder="..\Common\mu3\BepInEx\monomod" />
</Target>
</Project>

144
Mu3Mods.sln Normal file
View File

@ -0,0 +1,144 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BetterGiveUp", "BetterGiveUp\BetterGiveUp.csproj", "{003AD3C6-07CA-4824-B4BD-4BEF6F3D8997}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NaiveRating", "NaiveRating\NaiveRating.csproj", "{1FEA698E-DF5E-46CF-8023-F2B2F57885C5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkipNotice", "SkipNotice\SkipNotice.csproj", "{A1F32CB9-56C2-458A-B369-C61BD3A6AFBB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkipPreMusicRitual", "SkipPreMusicRitual\SkipPreMusicRitual.csproj", "{BB9CB905-9989-466C-9A91-D2F323005237}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfiniteGP", "InfiniteGP\InfiniteGP.csproj", "{990DCB96-7A47-45B9-B7CB-A6B2A1B6864A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LockSelectionTime", "LockSelectionTime\LockSelectionTime.csproj", "{66DE85AD-58AD-467C-B1C0-6B98BB27265D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pause", "Pause\Pause.csproj", "{627B3AA0-25E2-4C3E-A211-66BAB0E997E2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockAndSetJewelBoostNine", "UnlockAndSetJewelBoostNine\UnlockAndSetJewelBoostNine.csproj", "{70C775D7-8C47-4CFE-B91D-6AAEB17389F2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SortByInternalDifficulty", "SortByInternalDifficulty\SortByInternalDifficulty.csproj", "{0BF799DF-8837-4372-9F36-705CDC22374C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LoadBoost", "LoadBoost\LoadBoost.csproj", "{56B75395-ED26-479B-B59F-DABB74513335}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisableEncryption", "DisableEncryption\DisableEncryption.csproj", "{3F05931E-4444-4616-A0AC-047809821B0E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockMasterDifficulty", "UnlockMasterDifficulty\UnlockMasterDifficulty.csproj", "{965FCDBC-12EA-4F31-AAF6-9C4C3B9F7022}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockFrameRate", "UnlockFrameRate\UnlockFrameRate.csproj", "{0C3E8145-F91B-4F1F-97D1-17E12D49891B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockAllMusic", "UnlockAllMusic\UnlockAllMusic.csproj", "{C8948C3E-0434-429E-AFE6-4FB2DF246872}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DisableMaintenance", "DisableMaintenance\DisableMaintenance.csproj", "{6C91EB92-3A30-43B5-8954-E84C610C1D67}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockGameEvents", "UnlockGameEvents\UnlockGameEvents.csproj", "{3B9B843D-DCA0-41FE-B642-6BCB187BBD5D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockMemoryChapters", "UnlockMemoryChapters\UnlockMemoryChapters.csproj", "{3A217A12-6082-491B-89F6-C1D13AD69A19}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlatinumTiming", "PlatinumTiming\PlatinumTiming.csproj", "{099AD6AF-181A-4745-88C4-1D0466BECCB1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AttractVideoPlayer", "AttractVideoPlayer\AttractVideoPlayer.csproj", "{6889330F-2E7E-4778-ADFF-70AF036F1BD5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SelectBGM", "SelectBGM\SelectBGM.csproj", "{07C01DA1-7ABF-4759-A1C2-9DCD04298E85}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InfiniteStory", "InfiniteStory\InfiniteStory.csproj", "{939914E5-8D9A-4696-9957-AA6C6480FE94}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{003AD3C6-07CA-4824-B4BD-4BEF6F3D8997}.Debug|x64.ActiveCfg = Debug|x64
{003AD3C6-07CA-4824-B4BD-4BEF6F3D8997}.Debug|x64.Build.0 = Debug|x64
{003AD3C6-07CA-4824-B4BD-4BEF6F3D8997}.Release|x64.ActiveCfg = Release|x64
{003AD3C6-07CA-4824-B4BD-4BEF6F3D8997}.Release|x64.Build.0 = Release|x64
{1FEA698E-DF5E-46CF-8023-F2B2F57885C5}.Debug|x64.ActiveCfg = Debug|x64
{1FEA698E-DF5E-46CF-8023-F2B2F57885C5}.Debug|x64.Build.0 = Debug|x64
{1FEA698E-DF5E-46CF-8023-F2B2F57885C5}.Release|x64.ActiveCfg = Release|x64
{1FEA698E-DF5E-46CF-8023-F2B2F57885C5}.Release|x64.Build.0 = Release|x64
{A1F32CB9-56C2-458A-B369-C61BD3A6AFBB}.Debug|x64.ActiveCfg = Debug|x64
{A1F32CB9-56C2-458A-B369-C61BD3A6AFBB}.Debug|x64.Build.0 = Debug|x64
{A1F32CB9-56C2-458A-B369-C61BD3A6AFBB}.Release|x64.ActiveCfg = Release|x64
{A1F32CB9-56C2-458A-B369-C61BD3A6AFBB}.Release|x64.Build.0 = Release|x64
{BB9CB905-9989-466C-9A91-D2F323005237}.Debug|x64.ActiveCfg = Debug|x64
{BB9CB905-9989-466C-9A91-D2F323005237}.Debug|x64.Build.0 = Debug|x64
{BB9CB905-9989-466C-9A91-D2F323005237}.Release|x64.ActiveCfg = Release|x64
{BB9CB905-9989-466C-9A91-D2F323005237}.Release|x64.Build.0 = Release|x64
{990DCB96-7A47-45B9-B7CB-A6B2A1B6864A}.Debug|x64.ActiveCfg = Debug|x64
{990DCB96-7A47-45B9-B7CB-A6B2A1B6864A}.Debug|x64.Build.0 = Debug|x64
{990DCB96-7A47-45B9-B7CB-A6B2A1B6864A}.Release|x64.ActiveCfg = Release|x64
{990DCB96-7A47-45B9-B7CB-A6B2A1B6864A}.Release|x64.Build.0 = Release|x64
{66DE85AD-58AD-467C-B1C0-6B98BB27265D}.Debug|x64.ActiveCfg = Debug|x64
{66DE85AD-58AD-467C-B1C0-6B98BB27265D}.Debug|x64.Build.0 = Debug|x64
{66DE85AD-58AD-467C-B1C0-6B98BB27265D}.Release|x64.ActiveCfg = Release|x64
{66DE85AD-58AD-467C-B1C0-6B98BB27265D}.Release|x64.Build.0 = Release|x64
{627B3AA0-25E2-4C3E-A211-66BAB0E997E2}.Debug|x64.ActiveCfg = Debug|x64
{627B3AA0-25E2-4C3E-A211-66BAB0E997E2}.Debug|x64.Build.0 = Debug|x64
{627B3AA0-25E2-4C3E-A211-66BAB0E997E2}.Release|x64.ActiveCfg = Release|x64
{627B3AA0-25E2-4C3E-A211-66BAB0E997E2}.Release|x64.Build.0 = Release|x64
{70C775D7-8C47-4CFE-B91D-6AAEB17389F2}.Debug|x64.ActiveCfg = Debug|x64
{70C775D7-8C47-4CFE-B91D-6AAEB17389F2}.Debug|x64.Build.0 = Debug|x64
{70C775D7-8C47-4CFE-B91D-6AAEB17389F2}.Release|x64.ActiveCfg = Release|x64
{70C775D7-8C47-4CFE-B91D-6AAEB17389F2}.Release|x64.Build.0 = Release|x64
{0BF799DF-8837-4372-9F36-705CDC22374C}.Debug|x64.ActiveCfg = Debug|x64
{0BF799DF-8837-4372-9F36-705CDC22374C}.Debug|x64.Build.0 = Debug|x64
{0BF799DF-8837-4372-9F36-705CDC22374C}.Release|x64.ActiveCfg = Release|x64
{0BF799DF-8837-4372-9F36-705CDC22374C}.Release|x64.Build.0 = Release|x64
{56B75395-ED26-479B-B59F-DABB74513335}.Debug|x64.ActiveCfg = Debug|x64
{56B75395-ED26-479B-B59F-DABB74513335}.Debug|x64.Build.0 = Debug|x64
{56B75395-ED26-479B-B59F-DABB74513335}.Release|x64.ActiveCfg = Release|x64
{56B75395-ED26-479B-B59F-DABB74513335}.Release|x64.Build.0 = Release|x64
{3F05931E-4444-4616-A0AC-047809821B0E}.Debug|x64.ActiveCfg = Debug|x64
{3F05931E-4444-4616-A0AC-047809821B0E}.Debug|x64.Build.0 = Debug|x64
{3F05931E-4444-4616-A0AC-047809821B0E}.Release|x64.ActiveCfg = Release|x64
{3F05931E-4444-4616-A0AC-047809821B0E}.Release|x64.Build.0 = Release|x64
{965FCDBC-12EA-4F31-AAF6-9C4C3B9F7022}.Debug|x64.ActiveCfg = Debug|x64
{965FCDBC-12EA-4F31-AAF6-9C4C3B9F7022}.Debug|x64.Build.0 = Debug|x64
{965FCDBC-12EA-4F31-AAF6-9C4C3B9F7022}.Release|x64.ActiveCfg = Release|x64
{965FCDBC-12EA-4F31-AAF6-9C4C3B9F7022}.Release|x64.Build.0 = Release|x64
{0C3E8145-F91B-4F1F-97D1-17E12D49891B}.Debug|x64.ActiveCfg = Debug|x64
{0C3E8145-F91B-4F1F-97D1-17E12D49891B}.Debug|x64.Build.0 = Debug|x64
{0C3E8145-F91B-4F1F-97D1-17E12D49891B}.Release|x64.ActiveCfg = Release|x64
{0C3E8145-F91B-4F1F-97D1-17E12D49891B}.Release|x64.Build.0 = Release|x64
{C8948C3E-0434-429E-AFE6-4FB2DF246872}.Debug|x64.ActiveCfg = Debug|x64
{C8948C3E-0434-429E-AFE6-4FB2DF246872}.Debug|x64.Build.0 = Debug|x64
{C8948C3E-0434-429E-AFE6-4FB2DF246872}.Release|x64.ActiveCfg = Release|x64
{C8948C3E-0434-429E-AFE6-4FB2DF246872}.Release|x64.Build.0 = Release|x64
{6C91EB92-3A30-43B5-8954-E84C610C1D67}.Debug|x64.ActiveCfg = Debug|x64
{6C91EB92-3A30-43B5-8954-E84C610C1D67}.Debug|x64.Build.0 = Debug|x64
{6C91EB92-3A30-43B5-8954-E84C610C1D67}.Release|x64.ActiveCfg = Release|x64
{6C91EB92-3A30-43B5-8954-E84C610C1D67}.Release|x64.Build.0 = Release|x64
{3B9B843D-DCA0-41FE-B642-6BCB187BBD5D}.Debug|x64.ActiveCfg = Debug|x64
{3B9B843D-DCA0-41FE-B642-6BCB187BBD5D}.Debug|x64.Build.0 = Debug|x64
{3B9B843D-DCA0-41FE-B642-6BCB187BBD5D}.Release|x64.ActiveCfg = Release|x64
{3B9B843D-DCA0-41FE-B642-6BCB187BBD5D}.Release|x64.Build.0 = Release|x64
{3A217A12-6082-491B-89F6-C1D13AD69A19}.Debug|x64.ActiveCfg = Debug|x64
{3A217A12-6082-491B-89F6-C1D13AD69A19}.Debug|x64.Build.0 = Debug|x64
{3A217A12-6082-491B-89F6-C1D13AD69A19}.Release|x64.ActiveCfg = Release|x64
{3A217A12-6082-491B-89F6-C1D13AD69A19}.Release|x64.Build.0 = Release|x64
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Debug|x64.ActiveCfg = Debug|x64
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Debug|x64.Build.0 = Debug|x64
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Release|x64.ActiveCfg = Release|x64
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Release|x64.Build.0 = Release|x64
{6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Debug|x64.ActiveCfg = Debug|x64
{6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Debug|x64.Build.0 = Debug|x64
{6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Release|x64.ActiveCfg = Release|x64
{6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Release|x64.Build.0 = Release|x64
{07C01DA1-7ABF-4759-A1C2-9DCD04298E85}.Debug|x64.ActiveCfg = Debug|x64
{07C01DA1-7ABF-4759-A1C2-9DCD04298E85}.Debug|x64.Build.0 = Debug|x64
{07C01DA1-7ABF-4759-A1C2-9DCD04298E85}.Release|x64.ActiveCfg = Release|x64
{07C01DA1-7ABF-4759-A1C2-9DCD04298E85}.Release|x64.Build.0 = Release|x64
{939914E5-8D9A-4696-9957-AA6C6480FE94}.Debug|x64.ActiveCfg = Debug|x64
{939914E5-8D9A-4696-9957-AA6C6480FE94}.Debug|x64.Build.0 = Debug|x64
{939914E5-8D9A-4696-9957-AA6C6480FE94}.Release|x64.ActiveCfg = Release|x64
{939914E5-8D9A-4696-9957-AA6C6480FE94}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D9317002-F66D-4CDE-8FF5-FF2A0D8DC021}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,18 @@
namespace MU3.CustomUI;
class patch_MU3UICounter: MU3UICounter {
protected extern void orig_calcNumFiguresFloat(double value);
protected new void calcNumFiguresFloat(double value) {
orig_calcNumFiguresFloat(value);
if(isDispSuffix) {
pushFigureFront(10);
}
}
public bool isDispSuffix { get; set; }
protected void pushFigureFront(byte c) {
for(int i = numFigures_; i > 0; --i) {
figures_[i] = figures_[i - 1];
}
figures_[0] = c;
numFigures_ += 1;
}
}

View File

@ -0,0 +1,14 @@
using MU3.DB;
namespace MU3.Data;
class patch_GameData: GameData {
public extern static RatingColorID orig_getRatingColorIDFromRating100(int rating100);
public static new RatingColorID getRatingColorIDFromRating100(int rating100) {
if(NaiveRating.IsEnabled()) {
return orig_getRatingColorIDFromRating100(NaiveRating.Get());
} else {
return orig_getRatingColorIDFromRating100(rating100);
}
}
}

View File

@ -0,0 +1,11 @@
using MU3.CustomUI;
namespace MU3.SceneObject;
class patch_ANM_CMN_UserDeta_01: ANM_CMN_UserDeta_01 {
private MU3UICounter rating;
public extern void orig_setUserDetail();
public new void setUserDetail() {
((patch_MU3UICounter)rating).isDispSuffix = NaiveRating.IsEnabled();
orig_setUserDetail();
}
}

View File

@ -0,0 +1,36 @@
using MonoMod;
namespace MU3.User;
class patch_UserOption: UserOption {
[MonoModEnumReplace]
public enum patch_eRating {
OFF = 0,
Default = 1,
ON = 1,
Naive = 2,
MAX = 2
}
class patch_DataSet: DataSet {
private patch_eRating rating = patch_eRating.ON;
public extern bool orig_isMax(OptionName id);
public new bool isMax(OptionName id) {
if(id == OptionName.Rating) {
return rating == patch_eRating.MAX;
}
return orig_isMax(id);
}
public new patch_eRating Rating {
get => rating;
set {
if(patch_eRating.MAX < value) {
rating = patch_eRating.MAX;
} else if(value < patch_eRating.OFF) {
rating = patch_eRating.OFF;
} else {
rating = value;
}
}
}
}
}

View File

@ -1,56 +0,0 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using MU3.Data;
using MU3.DataStudio;
using MU3.Util;
using System.Collections.Generic;
using System.Linq;
namespace MU3.User;
public class patch_UserRating: UserRating {
private int _rating100;
private UserManager usMgr => Singleton<UserManager>.instance;
// Adaptation of calcBest() without bullshit
// The original lists stay intact because the game expects them to be filled
private RatingList calcSane() {
RatingList ratingList = new();
var musicDict = usMgr.userMusic;
foreach(KeyValuePair<int, UserMusic> item in musicDict) {
MU3.Data.MusicData musicData = SingletonStateMachine<DataManager, DataManager.EState>.instance.getMusicData(item.Key);
if(musicData == null || item.Key == 1 || musicData.isBonusTrack) {
continue;
}
for(int i = 0; i < 5; i++) {
FumenDifficulty fumenDifficulty = (FumenDifficulty)i;
UserFumen userFumen = usMgr.getUserFumen(item.Key, fumenDifficulty, create: false);
if(userFumen == null) {
continue;
}
Rating rating = new Rating(musicData.id, fumenDifficulty, userFumen.TechScoreMax);
if(rating.level100 == 0) {
continue;
}
ratingList.Add(rating);
}
}
ratingList.Sort();
return ratingList;
}
private void calcRate() {
_rating100 = 0;
foreach(Rating best in calcSane().Take(45)) {
_rating100 += best.rate100;
}
_rating100 /= 45;
}
}

View File

@ -0,0 +1,15 @@
using MonoMod;
namespace MU3.User;
[MonoModPatch("global::MU3.User.UserUtil")]
public static class patch_UserUtil {
public extern static float orig_toRatingFloat(int rating);
public static float toRatingFloat(int rating) {
if(NaiveRating.IsEnabled()) {
return orig_toRatingFloat(NaiveRating.Get());
} else {
return orig_toRatingFloat(rating);
}
}
}

View File

@ -0,0 +1,23 @@
using MU3.User;
using MU3.Util;
namespace MU3;
class patch_ANM_SWH_Profile: ANM_SWH_Profile {
public extern void orig_setUpLogin();
// Fixes login display
public new void setUpLogin() {
UserManager instance = Singleton<UserManager>.instance;
var up = instance.userPreview;
if(NaiveRating.IsEnabled()) {
up.dispRating = 0;
instance.userPreview = up;
orig_setUpLogin();
up.dispRating = 2;
instance.userPreview = up;
} else {
orig_setUpLogin();
}
}
}

View File

@ -0,0 +1,23 @@
using MU3.CustomUI;
using MU3.User;
using MU3.Util;
namespace MU3;
class patch_OptionSelecterController: OptionSelecterController {
private chengeParamFuncArray[] cpFuncArray = new chengeParamFuncArray[35];
public extern void orig_init(UserOption.OptionName id);
private extern void orig_chengeParamOther(int currentParam);
public new void init(UserOption.OptionName id) {
orig_init(id);
cpFuncArray[33].max = 2;
}
private void chengeParamOther(int currentParam) {
if(myOptionId == UserOption.OptionName.Rating) {
transform.Find("NUL_SWH_Option_00/NUL_Select/PAT_OnOff").GetComponent<MU3UIImageChanger>().patternNumber = currentParam != 0 ? 0f : 1f;
Singleton<UserManager>.instance.userOption.customSet.Rating = (UserOption.eRating)currentParam;
SingletonMonoBehaviour<SystemUI>.instance.userData.setUserDetail();
} else {
orig_chengeParamOther(currentParam);
}
}
}

View File

@ -0,0 +1,10 @@
namespace MU3;
// It doesn't have to be PrePlayMusic_Confirm, but it prev rating has to be stored at some point
class patch_Scene_32_PrePlayMusic_Confirm: Scene_32_PrePlayMusic_Confirm {
private extern void orig_Enter_Select();
private void Enter_Select() {
NaiveRating.SavePrev();
orig_Enter_Select();
}
}

View File

@ -0,0 +1,47 @@
using MU3.CustomUI;
using MU3.Sequence;
using MU3.User;
using UnityEngine;
namespace MU3;
class patch_UIResultBattlePoint: UIResultBattlePoint {
private Animator animator_;
private MU3UICounter counterScore_;
private MU3UIImageChanger imageHeader_;
private MU3UICounter counterScorePlus_;
private MU3UICounter counterScoreMinus_;
private GameObject hideScore_;
private extern void orig_disable(MU3UICounter counter);
private void disable(MU3UICounter counter) => orig_disable(counter);
public extern void orig_initTechRating(PlayInfo playInfo);
public new void initTechRating(PlayInfo playInfo) {
((patch_MU3UICounter)counterScore_).isDispSuffix = NaiveRating.IsEnabled();
if(!NaiveRating.IsEnabled()) {
orig_initTechRating(playInfo);
return;
}
int prevRating = NaiveRating.PrevRating;
int rating1 = NaiveRating.Get();
if((bool)hideScore_) {
hideScore_.SetActive(false);
}
counterScore_.Counter = (double)UserUtil.toRatingFloat(rating1);
int ratingPatternNo = UserUtil.toRatingPatternNo(rating1);
counterScore_.SpriteIndex = ratingPatternNo;
imageHeader_.patternNumber = (float)ratingPatternNo;
int rating2 = rating1 - prevRating;
if(rating2 == 0) {
disable(counterScorePlus_);
disable(counterScoreMinus_);
animator_.SetInteger(MU3.Sys.Const.AnimatorID_State, 2);
} else if(0 < rating2) {
disable(counterScoreMinus_);
if((bool)counterScorePlus_) {
counterScorePlus_.Counter = rating2 * 0.01f + 1E-05f;
}
animator_.SetInteger(MU3.Sys.Const.AnimatorID_State, 0);
}
animator_.SetTrigger(MU3.Sys.Const.AnimatorID_In);
}
}

View File

@ -0,0 +1,55 @@
using MU3.Data;
using MU3.DataStudio;
using MU3.User;
using MU3.Util;
using System.Collections.Generic;
using System.Linq;
public static class NaiveRating {
public static int PrevRating { get; private set; }
// Adapted from MU3.User.UserRating.calcBest()
private static RatingList calcSane() {
RatingList ratingList = new();
var usMgr = Singleton<UserManager>.instance;
var musicDict = usMgr.userMusic;
foreach(KeyValuePair<int, UserMusic> item in musicDict) {
var musicData = SingletonStateMachine<DataManager, DataManager.EState>
.instance.getMusicData(item.Key);
if(musicData == null || item.Key == 1 || musicData.isBonusTrack) {
continue;
}
for(int i = 0; i < 5; i++) {
var fumenDifficulty = (FumenDifficulty)i;
var userFumen = usMgr.getUserFumen(item.Key, fumenDifficulty, create: false);
if(userFumen == null) {
continue;
}
Rating rating = new(musicData.id, fumenDifficulty, userFumen.TechScoreMax);
if(rating.level100 == 0) {
continue;
}
ratingList.Add(rating);
}
}
ratingList.Sort();
return ratingList;
}
public static int Get() {
int res = 0;
foreach(Rating best in calcSane().Take(45)) {
res += best.rate100;
}
return res / 45;
}
public static bool IsEnabled() {
return Singleton<UserManager>.instance.userOption.customSet.Rating == (UserOption.eRating)patch_UserOption.patch_eRating.Naive;
}
public static void SavePrev() {
PrevRating = Get();
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.NaiveRating.mm</AssemblyName>
<Description>Best45 rating</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,11 @@
using MU3.Sequence;
namespace MU3.Battle;
class patch_GameEngine: GameEngine {
public extern void orig_reset();
public new void reset() {
orig_reset();
patch_PlayMusic.Paused = false;
}
}

View File

@ -0,0 +1,13 @@
using MU3.Sound;
using MU3.Util;
namespace MU3.Game;
class patch_GameBGM: GameBGM {
private patch_SoundManager psm => ((patch_SoundManager)Singleton<SoundManager>.instance);
private HandleInfo _handle;
public void pause(bool val) {
psm.pause(_handle, val);
}
}

View File

@ -0,0 +1,35 @@
using MU3.Battle;
using MU3.Game;
using MU3.Notes;
using MU3.Util;
namespace MU3.Sequence;
class patch_PlayMusic: PlayMusic {
private static readonly float PAUSE_CD = 5f;
private static readonly float UNPAUSE_CD = 0.5f;
private GameEngine _gameEngine;
private NotesManager ntMgr => _gameEngine?.notesManager;
private patch_GameBGM pgm => (patch_GameBGM)Singleton<GameSound>.instance.gameBGM;
public static bool Paused = false;
private float pauseTimer = 0f;
public extern bool orig_updateState(float deltaTime = -1f);
public extern void orig_destroy();
private extern void orig_Enter_SetupScene();
private void Enter_SetupScene() {
orig_Enter_SetupScene();
Paused = false;
}
public override bool updateState(float deltaTime = -1f) {
pauseTimer += deltaTime;
if(Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.Service) && !Singleton<UIInput>.instance.getStateOn(UIInput.Key.Test)) {
if((!Paused && pauseTimer >= PAUSE_CD) || (Paused && pauseTimer >= UNPAUSE_CD)) {
Paused = !Paused;
pgm.pause(Paused);
ntMgr.setPause(Paused);
pauseTimer = 0f;
}
}
return orig_updateState(deltaTime);
}
}

View File

@ -0,0 +1,10 @@
namespace MU3.Sound;
class patch_SoundManager: SoundManager {
private extern HandleInfo orig_getHandle(Priority priority);
private HandleInfo getHandle(Priority priority) => orig_getHandle(priority);
private patch_SoundPlayer[] _soundPlayers;
public void pause(HandleInfo handle, bool val) {
_soundPlayers[handle.Index].pause(val);
}
}

View File

@ -0,0 +1,15 @@
namespace MU3.Sound;
class patch_SoundPlayer: SoundPlayer {
private CriAtomExPlayer _player;
public extern void orig_stop();
public void pause(bool val) {
_player.Pause(val);
}
public new void stop() {
_player.Pause(false);
orig_stop();
}
}

7
Pause/Pause.csproj Normal file
View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.Pause.mm</AssemblyName>
<Description>Enables pausing the game with the service button</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,10 @@
using MU3.Sequence;
class patch_GameDeviceManager: GameDeviceManager {
private extern void orig_update();
private void update() {
if(!patch_PlayMusic.Paused) {
orig_update();
}
}
}

View File

@ -0,0 +1,26 @@
using MU3.Notes;
namespace MU3.Battle;
class patch_Counters: Counters {
public int PlatinumFastCount { get; private set; } = 0;
public int PlatinumLateCount { get; private set; } = 0;
public extern void orig_addPlatinumScore(Judge judge, Timing timing);
public new void addPlatinumScore(Judge judge, Timing timing) {
orig_addPlatinumScore(judge, timing);
if(judge == Judge.Perfect) {
if(timing == Timing.Fast) {
PlatinumFastCount += 1;
} else if(timing == Timing.Late) {
PlatinumLateCount += 1;
}
}
}
public extern void orig_reset();
public new void reset() {
orig_reset();
PlatinumFastCount = 0;
PlatinumLateCount = 0;
}
}

View File

@ -0,0 +1,13 @@
using MU3.Game;
namespace MU3.Battle;
class patch_GameEngine: GameEngine {
private patch_Counters _counters;
public extern void orig_calcCurrentBattleResult(SessionResult sessionResult);
public void calcCurrentBattleResult(patch_SessionResult sessionResult) {
orig_calcCurrentBattleResult(sessionResult);
sessionResult.PlatinumFastCount = _counters.PlatinumFastCount;
sessionResult.PlatinumLateCount = _counters.PlatinumLateCount;
}
}

View File

@ -0,0 +1,5 @@
namespace MU3.Game;
class patch_SessionResult: SessionResult {
public int PlatinumFastCount { get; set; }
public int PlatinumLateCount { get; set; }
}

View File

@ -0,0 +1,63 @@
using MU3.CustomUI;
using MU3.Game;
using MU3.Sequence;
using MU3.Util;
using System.Collections;
using UnityEngine;
namespace MU3;
class patch_UIResultTechScore: UIResultTechScore {
private MU3UICounter counterFast_;
private MU3UICounter counterLate_;
private Animator animator_;
private static readonly int State_TechnicalScore_Loop;
private void cloneCounter(MU3UICounter counter, Color color, int value) {
var otherValue = counter.CounterAsInt;
var offset = 12;
while(otherValue > 9) {
otherValue /= 10;
offset += 8;
}
var cpy = Instantiate(counter);
cpy.color = color;
cpy.gameObject.transform.SetParent(counter.transform.parent, false);
var pos = counter.gameObject.transform.localPosition;
cpy.gameObject.transform.localPosition = new Vector3(pos.x - offset, pos.y, pos.z);
cpy.gameObject.SetActive(true);
cpy.CounterAsInt = value;
}
private void drawCounters() {
float posXf = counterFast_.gameObject.transform.localPosition.x + 5.0f;
float posXl = counterLate_.gameObject.transform.localPosition.x + 5.0f;
float posY = counterLate_.gameObject.transform.localPosition.y;
counterFast_.gameObject.transform.localPosition = new Vector3(posXf, posY, 0.0f);
counterLate_.gameObject.transform.localPosition = new Vector3(posXl, posY, 0.0f);
var sessionResult = (patch_SessionResult)Singleton<PlayInfo>.instance.sessionResult;
cloneCounter(
counterFast_,
new Color(0.630f, 0.766f, 0.829f, 1.000f),
sessionResult.PlatinumFastCount
);
cloneCounter(
counterLate_,
new Color(0.809f, 0.396f, 0.365f, 1.000f),
sessionResult.PlatinumLateCount
);
}
private extern IEnumerator orig_showPlatinumScore(PlayInfo playInfo);
private IEnumerator showPlatinumScore(PlayInfo playInfo) {
StartCoroutine(orig_showPlatinumScore(playInfo));
while(!AnimatorState.stateEquals(animator_, State_TechnicalScore_Loop)) {
yield return null;
}
drawCounters();
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.PlatinumTiming.mm</AssemblyName>
<Description>Platinum early/late</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -1,35 +1,10 @@
## µ3 mods
Miscellaneous mods for µ3/SDDT; mainly for my personal use, though suggestions/PRs are welcome.
Miscellaneous mods for Ongeki. Suggestions/PRs are welcome.
### BetterGiveUp
Visit [the wiki](https://gitea.tendokyu.moe/akanyan/mu3-mods/wiki) for more information.
Enables these buttons in music play:
### Supported versions
- 1.45
* Red menu: instant return to song select
* Yellow menu: instant restart
To avoid misclicks, you have to hold the button down for 1 second.
Based on GiveUp, but Better.
### ExportChartData
Exports some useful chart data into a dollar-separated file (charts.csv) when the game launches.
### NaiveRating
Replaces the in-game rating algorithm (OldBest30+NewBest15+Recent10) with Best45.
This change is client-side and immediate, but the server **will** acknowledge it. I host my own server and don't care, but you have been warned.
### SkipNotice
Skips the safety warning screen, notices, login bonuses, etc.
### SkipPreMusicRitual
Skips the battle intro, card flex, "are you ready? let's shoot!", etc.
### InfiniteGP
Saves you time.
1.39/1.40 should work but they are generally untested.

View File

@ -0,0 +1,14 @@
using MU3.Sound;
namespace MU3.Game;
class patch_GameBGM: GameBGM {
public static bool WithholdPlay = false;
public extern void orig_playBGM(SoundManager.ACBData acbData, int soundId, int selectorID, bool forcePlay = false);
public new void playBGM(SoundManager.ACBData acbData, int soundId, int selectorID, bool forcePlay = false) {
// Prevents theme music from being restarted
if(!WithholdPlay) {
orig_playBGM(acbData, soundId, selectorID, forcePlay);
}
}
}

View File

@ -0,0 +1,38 @@
using MU3.Data;
using MU3.Game;
using MU3.Util;
using System;
namespace MU3.Sequence;
class patch_Play: Play {
private LocalSessionInfo _localSessionInfo;
public static int RecentID = 6;
private extern void orig_Enter_Login();
private void Enter_Login() {
orig_Enter_Login();
using IniFile iniFile = new("mu3.ini");
var index = iniFile.getIntValue("Extra", "BGM", 6);
if(index == 0) {
var rnd = new Random();
index = rnd.Next(1, 7);
}
if(index < 0 || index > 6) {
index = 6;
}
RecentID = index;
Singleton<GameSound>.instance.gameBGM.playBGM(233, index);
}
private extern void orig_Enter_ChapterSelect();
private void Enter_ChapterSelect() {
patch_GameBGM.WithholdPlay = true;
orig_Enter_ChapterSelect();
patch_GameBGM.WithholdPlay = false;
int selectorID = SingletonStateMachine<DataManager, DataManager.EState>.instance.getMemoryChapterData(
_localSessionInfo.chapterSelection.memoryChapterId
)?.getMemoryChapterSelectorID() ?? RecentID;
Singleton<GameSound>.instance.gameBGM.playBGM(233, selectorID);
}
}

View File

@ -0,0 +1,22 @@
using MU3.Game;
using MU3.Sequence;
using MU3.Util;
using MU3.ViewData;
namespace MU3;
class patch_Scene_32_PrePlayMusic_ChapterSelect: Scene_32_PrePlayMusic_ChapterSelect {
private ChapterSelectorItemViewData _selectItemViewData;
private extern void orig_onChangeElement(int index, int indexRaw);
private void onChangeElement(int index, int indexRaw) {
patch_GameBGM.WithholdPlay = true;
orig_onChangeElement(index, indexRaw);
patch_GameBGM.WithholdPlay = false;
int selectorID = (
(_selectItemViewData.memoryChapterViewData == null)
? null
: _selectItemViewData.memoryChapterViewData.memoryChapterData
)?.getMemoryChapterSelectorID() ?? patch_Play.RecentID;
Singleton<GameSound>.instance.gameBGM.playBGM(233, selectorID);
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.SelectBGM.mm</AssemblyName>
<Description>Select main menu BGM</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -1,30 +1,30 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using MU3.Util;
namespace MU3;
public class patch_Scene_30_NoticeReward: Scene_30_NoticeReward {
class patch_Scene_30_NoticeReward: Scene_30_NoticeReward {
private Mode<Scene_30_NoticeReward, State> _mode;
public static bool Skipped { get; private set; }
private enum State {
Attention,
Notice,
RankingReward,
TechnicalChallengeReward,
DailyBonus,
AimeCollab,
Present,
TrainingRoom,
FadeOut,
End
RankingReward = 2,
FadeOut = 8,
}
private void Start() {
Skipped = false;
_mode = new Mode<Scene_30_NoticeReward, State>(this);
_mode.set(State.FadeOut);
_mode.set(State.RankingReward);
SingletonMonoBehaviour<SystemUI>.instance.Panel.pushState(0, show: true);
}
private void Update() {
if(_mode.get() < (int)State.FadeOut && Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.MenuLeft)) {
Skipped = true;
_mode.set(State.FadeOut);
} else {
_mode.update();
}
}
private void End_Init() {
Skipped = false;
}
}

View File

@ -0,0 +1,18 @@
namespace MU3;
class patch_UIGetRewards: UIGetRewards {
private extern void orig_invokeOnFinish();
private extern void orig_startNextItem();
private void invokeOnFinish() => orig_invokeOnFinish();
private void startNextItem() {
if(!patch_Scene_30_NoticeReward.Skipped) {
orig_startNextItem();
}
}
void Update() {
// The panel state will still be screwed up for some reason but it won't crash
// This could be improved
if(patch_Scene_30_NoticeReward.Skipped) {
invokeOnFinish();
}
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.SkipNotice.mm</AssemblyName>
<Description>Skip event/safety notices</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -1,8 +0,0 @@

using MU3.Battle;
public class patch_BattleCamera: BattleCamera {
private void Enter_StartCutscene() {
setNextState(EState.ToPlay);
}
}

View File

@ -1,22 +0,0 @@
using MU3.Util;
using System;
using UnityEngine;
namespace MU3;
public class patch_BattleUI: BattleUI {
private System.Collections.IEnumerator playReadyProc(Action onFinish) {
if(!SystemUI.Exists) {
onFinish();
yield break;
}
SystemUI systemUI = SingletonMonoBehaviour<SystemUI>.instance;
float time = 1.5f;
while(0f < time) {
yield return null;
time -= Time.deltaTime;
}
onFinish();
systemUI.removeCanvas(MU3.Graphics.Const.SortOrder.UI);
}
}

View File

@ -1,9 +0,0 @@
#pragma warning disable CS0108
namespace MU3.Battle;
public class patch_GameEngine: GameEngine {
public bool isStartCutsceneFinish() {
return true;
}
}

View File

@ -1,19 +1,20 @@
#pragma warning disable CS0626
#pragma warning disable CS0649
#pragma warning disable IDE0051
#pragma warning disable IDE1006
using MU3.Battle;
using MU3.Util;
namespace MU3.Sequence;
public class patch_PlayMusic: PlayMusic {
class patch_PlayMusic: PlayMusic {
private GameEngine _gameEngine;
private extern void orig_Execute_StartCutscene();
public static bool ForceSkipped { get; private set; }
private void Execute_StartCutscene() {
orig_Execute_StartCutscene();
_gameEngine.skipStartCutscene();
setNextState(EState.Countdown);
ForceSkipped = false;
if(Singleton<Sys.System>.instance.config.isQuickStart || Singleton<UIInput>.instance.getTriggerOn(UIInput.Key.MenuLeft)) {
ForceSkipped = true;
_gameEngine.skipStartCutscene();
setNextState(EState.Countdown);
}
}
}

View File

@ -0,0 +1,35 @@
using MonoMod;
using MU3.Sequence;
using MU3.Util;
using System;
using UnityEngine;
namespace MU3;
class patch_BattleUI: BattleUI {
[MonoModIgnore]
private extern System.Collections.IEnumerator playReadyProc(Action onFinish);
private System.Collections.IEnumerator playReadyProcSkipped(Action onFinish) {
if(!SystemUI.Exists) {
onFinish();
yield break;
}
SystemUI systemUI = SingletonMonoBehaviour<SystemUI>.instance;
float time = 1.5f;
while(0f < time) {
yield return null;
time -= Time.deltaTime;
}
onFinish();
systemUI.removeCanvas(Graphics.Const.SortOrder.UI);
}
public new void playReady(Action onFinish) {
if(patch_PlayMusic.ForceSkipped) {
StartCoroutine(playReadyProcSkipped(onFinish));
} else {
StartCoroutine(playReadyProc(onFinish));
}
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.SkipPreMusicRitual.mm</AssemblyName>
<Description>Skip "Are you ready? Let's shoot"</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,649 @@
public static class InternalSortPreview {
// This really shouldn't be a png but it's just one texture
public static byte[] Bytes = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x79, 0x08, 0x02, 0x00, 0x00, 0x00, 0x96, 0x41, 0x0b,
0x66, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x7d, 0x79, 0x9c, 0x5d,
0x45, 0x99, 0xf6, 0xf3, 0x56, 0xd5, 0xd9, 0xee, 0x3d, 0x77, 0xe9, 0xdb, 0x7b, 0xf6, 0x74, 0x36,
0x02, 0x49, 0x20, 0x40, 0x00, 0x59, 0x12, 0xf6, 0x45, 0x50, 0x50, 0xc1, 0x05, 0x18, 0x44, 0x70,
0x54, 0xd4, 0xc1, 0x9f, 0x8c, 0x0b, 0xa3, 0xb8, 0x7c, 0xae, 0x88, 0x8a, 0xe8, 0x8c, 0xe3, 0x38,
0xa0, 0xe8, 0xa7, 0xce, 0xb8, 0x7e, 0x20, 0xca, 0x22, 0x20, 0x10, 0x96, 0x18, 0x20, 0x92, 0x10,
0x76, 0xb2, 0xef, 0xbd, 0xdf, 0xbe, 0xfb, 0x3d, 0x4b, 0x55, 0x7d, 0x7f, 0xdc, 0x5e, 0x6e, 0x87,
0xee, 0x24, 0xae, 0xb1, 0xd3, 0xe7, 0xf9, 0xd5, 0x1f, 0xdd, 0xe7, 0x9e, 0x7b, 0x96, 0xb7, 0x9e,
0x7a, 0xeb, 0xa9, 0xb7, 0xde, 0xaa, 0x4b, 0x9f, 0x79, 0x1b, 0x22, 0xec, 0x03, 0xc4, 0x38, 0x00,
0xad, 0x64, 0x64, 0x8a, 0x43, 0x06, 0x8c, 0x00, 0x40, 0x44, 0x86, 0xd8, 0x0f, 0xf5, 0x89, 0x00,
0xe8, 0xc8, 0x10, 0x87, 0x10, 0x94, 0x06, 0x00, 0x16, 0x19, 0x22, 0xc2, 0x24, 0xf5, 0xfd, 0x91,
0x09, 0x22, 0x44, 0xd4, 0x8f, 0x10, 0x21, 0xa2, 0x7e, 0x84, 0x08, 0x11, 0xf5, 0x23, 0x44, 0x88,
0xa8, 0x1f, 0x21, 0x42, 0x44, 0xfd, 0x08, 0x11, 0x22, 0xea, 0x47, 0x88, 0x10, 0x51, 0x3f, 0x42,
0x84, 0x88, 0xfa, 0x11, 0x22, 0x44, 0xd4, 0x8f, 0x10, 0x21, 0xa2, 0x7e, 0x84, 0x08, 0x11, 0xf5,
0x23, 0x44, 0x88, 0xa8, 0x1f, 0x21, 0x42, 0x44, 0xfd, 0x08, 0x11, 0x22, 0xea, 0x47, 0x88, 0x10,
0x51, 0x3f, 0x42, 0x84, 0xbf, 0x3a, 0x46, 0xad, 0xd2, 0xfa, 0xef, 0xfb, 0x09, 0x80, 0x54, 0xd1,
0x9a, 0x24, 0x00, 0x90, 0x8a, 0xdd, 0x79, 0xc7, 0xff, 0x1e, 0xb1, 0x78, 0x19, 0x54, 0x31, 0xa8,
0x96, 0x26, 0xc4, 0x33, 0x2b, 0x12, 0x00, 0xb8, 0x30, 0x0a, 0x85, 0xc2, 0x79, 0xe7, 0x5d, 0xd8,
0xd3, 0xdb, 0x5f, 0x3b, 0x6e, 0xf0, 0xa8, 0x3e, 0x01, 0xe0, 0x9a, 0x73, 0xc7, 0xa1, 0x7e, 0x57,
0x0e, 0x00, 0x74, 0xc4, 0x7c, 0x00, 0xc0, 0xfb, 0xde, 0xf3, 0xae, 0xe3, 0x4e, 0x7e, 0xa3, 0x29,
0x42, 0xa0, 0x51, 0x2b, 0x35, 0x31, 0x1e, 0x5a, 0x0b, 0x00, 0x50, 0x61, 0x63, 0x9b, 0xfb, 0xe9,
0xcf, 0x7e, 0xfe, 0xf2, 0x2b, 0x3f, 0x50, 0x3b, 0x4c, 0x14, 0xd5, 0xe7, 0xde, 0xe0, 0xa7, 0x2e,
0x1a, 0xf9, 0x67, 0xe5, 0x0b, 0x14, 0x51, 0xbf, 0x86, 0xb6, 0xd6, 0x96, 0x5f, 0xfd, 0xf2, 0xa7,
0x6e, 0x22, 0x05, 0x55, 0x05, 0x34, 0x11, 0x26, 0x46, 0x91, 0x9a, 0xb4, 0x26, 0x80, 0x18, 0xe6,
0xcc, 0x5f, 0xbc, 0x76, 0xcd, 0x93, 0x1b, 0x37, 0x6f, 0x89, 0x6a, 0x73, 0x18, 0xf5, 0x6c, 0x8f,
0xb4, 0xfe, 0xd8, 0xf8, 0xce, 0x2d, 0x37, 0x65, 0x9a, 0xa6, 0x40, 0x0e, 0xeb, 0x1c, 0x3d, 0xa1,
0x0a, 0x10, 0x06, 0x4e, 0x2c, 0xfe, 0xf5, 0x5b, 0xbe, 0x11, 0x8b, 0xc5, 0xa2, 0xda, 0xdc, 0xff,
0x30, 0x57, 0x6b, 0xad, 0x23, 0x9f, 0x0f, 0xbc, 0xf9, 0x4d, 0xe7, 0x9f, 0x7b, 0xe1, 0x25, 0x5a,
0x96, 0xa1, 0x42, 0x28, 0x05, 0xa5, 0xa0, 0x30, 0x31, 0x0a, 0xd3, 0x43, 0x45, 0x31, 0x5d, 0x98,
0xbf, 0xe0, 0x88, 0xcf, 0xdc, 0xf0, 0x91, 0xa8, 0x42, 0xa3, 0x08, 0xcf, 0x01, 0xa1, 0xa9, 0x29,
0xf3, 0xcd, 0x9b, 0xbf, 0x68, 0x3b, 0x31, 0x0a, 0xab, 0xf5, 0x6e, 0x61, 0xe2, 0x15, 0x1d, 0x70,
0xf2, 0xae, 0xf9, 0xc0, 0x75, 0xcb, 0x8e, 0x5d, 0x1a, 0x55, 0x6b, 0x44, 0xfd, 0xfd, 0xe3, 0xd3,
0x9f, 0xbc, 0x6e, 0xea, 0x8c, 0x23, 0x42, 0x3f, 0x0f, 0x9a, 0x98, 0x8c, 0xaf, 0x97, 0x3d, 0xaa,
0x92, 0x48, 0xa6, 0xbe, 0xf1, 0xf5, 0x2f, 0x46, 0xd5, 0x1a, 0x51, 0x7f, 0x3f, 0x38, 0xe5, 0xa4,
0xe3, 0xdf, 0x75, 0xf5, 0xbf, 0x28, 0xe5, 0x2b, 0x19, 0x4c, 0x70, 0xde, 0xeb, 0xc1, 0xce, 0x4a,
0x66, 0x8f, 0x3b, 0xe1, 0xf4, 0x6b, 0x3f, 0x70, 0x55, 0x54, 0xb9, 0x11, 0xf5, 0xf7, 0x85, 0x6f,
0x7f, 0xe3, 0x46, 0x37, 0x91, 0xe4, 0x61, 0xd1, 0xe0, 0x0a, 0x5a, 0x4f, 0xec, 0xa2, 0x34, 0x94,
0x46, 0x18, 0x18, 0xa6, 0xfe, 0xec, 0xe7, 0xbe, 0x3c, 0xb7, 0x63, 0x46, 0x54, 0xbf, 0x11, 0xf5,
0xc7, 0xc6, 0xf5, 0xd7, 0xbd, 0xff, 0xf0, 0xa5, 0x27, 0x22, 0xe8, 0x07, 0x81, 0xb4, 0x9e, 0xf0,
0x5e, 0xbf, 0xd6, 0x00, 0x00, 0xf8, 0x85, 0x86, 0x4c, 0xe6, 0xe6, 0xaf, 0x7c, 0x3a, 0xaa, 0xe2,
0x88, 0xfa, 0x63, 0x60, 0xc1, 0xbc, 0x39, 0x1f, 0xff, 0xd4, 0xe7, 0xb8, 0x08, 0x21, 0xfd, 0x09,
0x3c, 0xb4, 0x1d, 0xbb, 0x0d, 0x28, 0xaf, 0x5a, 0x3e, 0xfb, 0xfc, 0x4b, 0xde, 0x72, 0xd1, 0x79,
0x51, 0x45, 0x47, 0xd4, 0xdf, 0x1b, 0xdf, 0xfa, 0xe6, 0x17, 0xd2, 0xe9, 0x06, 0x78, 0x45, 0x00,
0xd0, 0x0a, 0x7a, 0xe2, 0x0b, 0x9e, 0xba, 0xa2, 0xb5, 0xb6, 0x9c, 0xd8, 0x57, 0x6e, 0xba, 0xc9,
0x8d, 0x47, 0x61, 0xfe, 0x88, 0xfa, 0x75, 0xb8, 0xe2, 0xd2, 0xb7, 0x9d, 0x7a, 0xfa, 0xf9, 0xda,
0xeb, 0xd1, 0x50, 0x4a, 0xc9, 0x5a, 0x99, 0xe8, 0x2f, 0xa5, 0x95, 0x1c, 0x2e, 0xa6, 0x2e, 0xeb,
0x4a, 0xdf, 0xcc, 0xd9, 0x0b, 0x6e, 0xfc, 0xd2, 0x0d, 0x51, 0x75, 0xd7, 0x20, 0x34, 0x08, 0x00,
0x41, 0x03, 0x58, 0xbe, 0x7c, 0x39, 0x80, 0x52, 0xa9, 0x34, 0xa9, 0x4c, 0xd0, 0x90, 0x8c, 0x7f,
0xfd, 0xa6, 0x4f, 0x99, 0x96, 0xa3, 0xab, 0x05, 0x10, 0x63, 0x4e, 0x1a, 0x00, 0x60, 0x01, 0x13,
0x3b, 0xf1, 0x85, 0x30, 0x98, 0x77, 0xa4, 0xc3, 0x32, 0x05, 0x25, 0x68, 0xc9, 0x83, 0xfe, 0x2b,
0xae, 0x7c, 0xff, 0xa3, 0x4f, 0xac, 0xdb, 0xb0, 0x61, 0xc3, 0xa0, 0xe7, 0x63, 0x93, 0xcb, 0xf7,
0x69, 0x3c, 0x33, 0x62, 0x9f, 0xff, 0xf3, 0x0e, 0x01, 0x40, 0xa9, 0x10, 0xc0, 0xfb, 0x6e, 0xd9,
0x03, 0x20, 0x08, 0x82, 0x49, 0x65, 0x0e, 0xc3, 0xa0, 0xd6, 0x34, 0x23, 0xbb, 0x05, 0x5a, 0xaa,
0x4a, 0xaf, 0xca, 0xbf, 0xa2, 0x8a, 0x3b, 0xb4, 0x5f, 0x98, 0xe8, 0x5d, 0x22, 0x31, 0x06, 0x80,
0x39, 0xcd, 0x14, 0x9f, 0xce, 0x62, 0xd3, 0xc8, 0x69, 0xd5, 0x95, 0x2e, 0x10, 0xef, 0x29, 0x50,
0xa5, 0x52, 0x99, 0x6c, 0xa4, 0xaf, 0xe1, 0xf6, 0x8f, 0x77, 0x8c, 0x78, 0xfd, 0xfa, 0x0f, 0x3c,
0xcf, 0x03, 0x90, 0x48, 0x24, 0x0e, 0xfd, 0xd6, 0x3f, 0x94, 0xaf, 0x61, 0x9a, 0x66, 0x22, 0xe1,
0x40, 0x4b, 0xd9, 0xfd, 0x87, 0x70, 0xfb, 0xaf, 0xc3, 0xe2, 0x36, 0x66, 0x36, 0xc0, 0x6a, 0x64,
0x4e, 0x3b, 0xf1, 0xd8, 0x28, 0x7f, 0x31, 0x51, 0x7c, 0xfd, 0x08, 0xf5, 0xa1, 0x2a, 0xdd, 0x41,
0xee, 0x25, 0x78, 0x59, 0xc6, 0x14, 0x6b, 0x58, 0xca, 0xdb, 0x4f, 0x67, 0x0d, 0x4b, 0x5a, 0x9c,
0x52, 0x2e, 0xc7, 0xc2, 0x10, 0x00, 0x88, 0x26, 0xaf, 0xe2, 0x15, 0x35, 0x7f, 0x5f, 0x83, 0x65,
0x59, 0x00, 0xc2, 0x30, 0x3c, 0xe4, 0x5f, 0x5b, 0xd5, 0x92, 0x90, 0x99, 0x0c, 0xbd, 0x72, 0xcc,
0x7b, 0xde, 0x7b, 0xf1, 0x56, 0x78, 0x7d, 0xbc, 0x7d, 0x85, 0x33, 0xfb, 0xed, 0x14, 0x6f, 0x45,
0x75, 0x00, 0x32, 0x50, 0xb2, 0x0c, 0x48, 0x60, 0x82, 0xa6, 0xba, 0x4b, 0xc6, 0x6d, 0xf0, 0x63,
0x20, 0x6c, 0x70, 0x5b, 0x66, 0x5f, 0x0d, 0xb6, 0xfd, 0xda, 0xdb, 0x7a, 0xad, 0x68, 0x3f, 0x8d,
0x8e, 0xf8, 0x80, 0x4e, 0x34, 0x85, 0x7d, 0xfd, 0x5a, 0xca, 0xc9, 0xe6, 0xfb, 0xeb, 0xd9, 0x3e,
0xca, 0xeb, 0x4f, 0x2e, 0x43, 0x90, 0xd6, 0x08, 0x93, 0xbb, 0xbe, 0x5f, 0xde, 0xf6, 0xa0, 0x35,
0xef, 0x52, 0x63, 0xe6, 0x9b, 0x54, 0xd8, 0x1f, 0x6c, 0xbf, 0x27, 0xdc, 0x79, 0xbf, 0xcc, 0x6d,
0x80, 0x56, 0x14, 0xd6, 0x82, 0x83, 0x13, 0x54, 0xf1, 0x6b, 0x2d, 0x08, 0xc4, 0x78, 0xac, 0x59,
0x34, 0x1d, 0x46, 0x4d, 0x67, 0x5b, 0x8b, 0xae, 0xd3, 0xb2, 0x52, 0x5d, 0xfb, 0x05, 0x7e, 0xdf,
0x59, 0xd6, 0xb1, 0x5f, 0xd1, 0x6d, 0x67, 0x07, 0xb9, 0x1c, 0x42, 0x7f, 0xd2, 0x86, 0x3a, 0x0e,
0xfd, 0xdf, 0xd2, 0x62, 0x60, 0x0a, 0x6a, 0x34, 0x29, 0x24, 0x08, 0x1a, 0x61, 0x7c, 0xfd, 0xbb,
0x55, 0x90, 0x8d, 0x9f, 0x71, 0x07, 0x64, 0xa1, 0xb2, 0xe6, 0x06, 0xb5, 0xf3, 0x41, 0x59, 0x29,
0x68, 0xa3, 0x04, 0x15, 0xc0, 0x00, 0xab, 0xf7, 0xf7, 0x13, 0x25, 0xa1, 0xb5, 0x6e, 0x4d, 0x8a,
0x92, 0x12, 0x12, 0xaa, 0xba, 0x3b, 0xec, 0x7f, 0x09, 0x5b, 0x7e, 0x4f, 0x22, 0x6e, 0x1d, 0xf6,
0xde, 0xd8, 0x09, 0xdf, 0x44, 0x76, 0x8d, 0xb7, 0xfa, 0x43, 0x76, 0xc7, 0xa5, 0xea, 0xb0, 0xeb,
0xc3, 0x12, 0xa3, 0x91, 0x79, 0x8c, 0xfa, 0xcb, 0xd0, 0x21, 0x9f, 0xc3, 0x7b, 0xe8, 0x53, 0x5f,
0x2a, 0x29, 0x21, 0x99, 0xc9, 0x58, 0xc0, 0x40, 0xd0, 0x5a, 0x92, 0x99, 0xd6, 0xc1, 0x80, 0xfb,
0xec, 0x55, 0x66, 0x6a, 0x96, 0x79, 0xc4, 0x77, 0x82, 0xad, 0x77, 0x54, 0x9f, 0xbb, 0x19, 0xe5,
0x1e, 0xa5, 0xaa, 0xb0, 0x15, 0x08, 0xe0, 0x00, 0xed, 0xe5, 0xee, 0x69, 0xa2, 0x56, 0xaf, 0x96,
0x1a, 0x15, 0x54, 0x7d, 0x8d, 0xde, 0xea, 0xfa, 0x9b, 0xfc, 0xcd, 0x3f, 0x4b, 0x9c, 0x7a, 0x9b,
0x75, 0xf6, 0xfd, 0xde, 0xca, 0xb7, 0xc5, 0xb4, 0xce, 0x76, 0x7c, 0xc6, 0x50, 0x59, 0xad, 0x47,
0x22, 0xb9, 0x5a, 0x68, 0xe9, 0x4b, 0x06, 0x76, 0xc8, 0x4b, 0x80, 0x31, 0xa8, 0x4f, 0x9c, 0x01,
0x08, 0x43, 0x05, 0x80, 0x71, 0x53, 0xf3, 0x04, 0x00, 0x92, 0x05, 0x7d, 0x90, 0x54, 0x2f, 0x41,
0x02, 0xa8, 0x3d, 0x06, 0x53, 0x0a, 0x61, 0x7e, 0xe8, 0x83, 0xfd, 0x87, 0xde, 0xc3, 0x20, 0xd4,
0x5a, 0xc7, 0xda, 0x63, 0xe8, 0xc5, 0x00, 0x1b, 0x70, 0xa4, 0x63, 0x59, 0x2d, 0x20, 0x26, 0xd6,
0xbf, 0x4b, 0xb8, 0xd3, 0xcd, 0x25, 0x5f, 0xae, 0xae, 0xfb, 0x78, 0x75, 0xfd, 0x1d, 0xcc, 0xce,
0x92, 0x6d, 0x30, 0xcd, 0x46, 0xaf, 0xe4, 0x9b, 0xd8, 0xc1, 0xcd, 0xc1, 0x5e, 0xab, 0xf6, 0x12,
0x16, 0x01, 0x00, 0xcb, 0xcb, 0xde, 0x67, 0x0b, 0xf7, 0xbc, 0xc1, 0x39, 0xf5, 0xbb, 0xd6, 0x8a,
0x9f, 0x96, 0x1f, 0xba, 0x80, 0xfb, 0x09, 0x31, 0xff, 0xc3, 0xbe, 0xdf, 0x0f, 0xc0, 0x54, 0xc8,
0xa1, 0x90, 0x52, 0x09, 0x34, 0x53, 0xae, 0xaf, 0x6c, 0x86, 0x66, 0x8d, 0xfd, 0xe3, 0xb5, 0x01,
0xad, 0x39, 0x00, 0xce, 0x02, 0x00, 0x92, 0x4c, 0xcd, 0xdd, 0x21, 0x67, 0xe3, 0x1d, 0x9c, 0xf7,
0xad, 0xaf, 0x3b, 0x61, 0xe9, 0xb0, 0x0a, 0x59, 0xc5, 0x50, 0xe0, 0xfe, 0x80, 0xa8, 0x1f, 0x4a,
0x05, 0x80, 0xcc, 0x34, 0x00, 0xca, 0xad, 0x63, 0xc5, 0x8d, 0x00, 0x20, 0xe2, 0x06, 0x82, 0x51,
0x86, 0xfd, 0xbb, 0x0d, 0x4d, 0x6a, 0x8f, 0x4e, 0x8c, 0x82, 0x42, 0x60, 0xcf, 0x40, 0x62, 0x31,
0x44, 0x0a, 0x61, 0x6e, 0x7f, 0x3d, 0x3f, 0x05, 0x41, 0xe0, 0x17, 0xfd, 0xd4, 0x9c, 0x54, 0xea,
0xe5, 0x54, 0xfe, 0xf1, 0x1e, 0xf5, 0x66, 0x05, 0x80, 0x88, 0xe3, 0xa5, 0x4f, 0x70, 0x06, 0xfb,
0xe8, 0x9b, 0xaa, 0x6b, 0xaf, 0xaf, 0xae, 0xfb, 0x29, 0x8b, 0x97, 0x89, 0x0b, 0x60, 0x68, 0x86,
0xe3, 0x10, 0x1a, 0xcd, 0xec, 0xfd, 0xa7, 0xd6, 0xcc, 0x21, 0x55, 0xda, 0x55, 0x7e, 0xe8, 0xaa,
0xd8, 0xe9, 0xdf, 0x8f, 0x9d, 0x76, 0x97, 0xff, 0xd0, 0x79, 0x15, 0xf7, 0x64, 0xbb, 0xfd, 0x18,
0xdf, 0xef, 0x23, 0x70, 0x0d, 0x45, 0x0f, 0x20, 0x39, 0xcd, 0xd5, 0xcb, 0x45, 0xcf, 0x8e, 0x1e,
0xd7, 0x70, 0x39, 0xdf, 0x87, 0xbf, 0xa3, 0x1a, 0xef, 0x15, 0x6f, 0xd4, 0xa4, 0x79, 0xdf, 0x2a,
0x54, 0xbb, 0x00, 0x18, 0xc2, 0x38, 0x48, 0x83, 0x9b, 0x11, 0x59, 0x6b, 0x89, 0x72, 0x8e, 0x1d,
0xc6, 0x9b, 0x96, 0x02, 0x80, 0x97, 0x3d, 0x20, 0xea, 0x6b, 0xad, 0x39, 0xe7, 0x8a, 0x27, 0x91,
0x7f, 0x91, 0xf5, 0xaf, 0x4a, 0x3a, 0x8c, 0xc5, 0x92, 0xaa, 0xda, 0xcb, 0x2c, 0x46, 0xfa, 0xe0,
0xb4, 0x66, 0xd2, 0x43, 0x55, 0xc8, 0x95, 0x52, 0x2f, 0x0f, 0xec, 0x5a, 0x07, 0x67, 0x36, 0x5a,
0xce, 0x27, 0x54, 0xb5, 0x2c, 0x8f, 0xf7, 0xad, 0x20, 0x08, 0x8a, 0xc5, 0x62, 0x53, 0x47, 0x53,
0x7c, 0x6b, 0x9c, 0xdd, 0xcc, 0xc4, 0x14, 0xd3, 0x2f, 0xfa, 0x96, 0x6c, 0x45, 0x75, 0x0d, 0xba,
0xee, 0x73, 0xce, 0xb9, 0x27, 0xd8, 0xf6, 0x8b, 0xea, 0xba, 0xff, 0x65, 0xf1, 0x32, 0xbd, 0xa6,
0x76, 0x09, 0xe1, 0x6b, 0xf8, 0x43, 0x7b, 0x91, 0x89, 0xfe, 0xdc, 0xce, 0x41, 0xef, 0x9f, 0xac,
0xfa, 0xcf, 0xbd, 0x92, 0x1e, 0x75, 0x50, 0xef, 0xfd, 0xa1, 0x26, 0x01, 0x02, 0xc5, 0x85, 0x2e,
0x75, 0x97, 0x1f, 0xba, 0x2a, 0x79, 0xe9, 0x0e, 0x77, 0xe1, 0x0d, 0x6a, 0xcb, 0xe7, 0x0b, 0xee,
0xdd, 0x8e, 0x63, 0x42, 0xca, 0x3c, 0x4a, 0x0d, 0x5b, 0x53, 0xec, 0x77, 0x2c, 0xdd, 0x92, 0xd6,
0x0b, 0x74, 0xef, 0xce, 0x5e, 0x17, 0x2e, 0x63, 0x0c, 0x34, 0xc6, 0xdd, 0x38, 0x0b, 0x14, 0x8f,
0x03, 0x96, 0xec, 0x7a, 0x20, 0x1d, 0xbe, 0x44, 0x86, 0xcd, 0x62, 0x49, 0x00, 0x84, 0xea, 0x41,
0xe2, 0xc9, 0x88, 0x0a, 0x50, 0xc2, 0x49, 0x55, 0xd6, 0xc9, 0x6d, 0x8f, 0x17, 0xec, 0x65, 0x68,
0x3c, 0x41, 0xa0, 0x08, 0x19, 0xec, 0x8b, 0xfa, 0x35, 0xde, 0x07, 0xcc, 0x65, 0x3b, 0x7f, 0x96,
0x76, 0xfa, 0x83, 0x74, 0x23, 0xab, 0xf6, 0xa9, 0x9e, 0x27, 0x82, 0xdd, 0x0f, 0x6b, 0x2f, 0x4b,
0x5c, 0x1e, 0xa4, 0x57, 0x02, 0x00, 0xb2, 0x9a, 0x78, 0x6a, 0x01, 0x25, 0x97, 0x36, 0x66, 0xa6,
0x4b, 0x6f, 0xd7, 0xc0, 0xf6, 0xff, 0xac, 0xb6, 0xbc, 0xdd, 0x89, 0xa5, 0x55, 0x30, 0xb0, 0x77,
0x05, 0x43, 0x87, 0x61, 0x58, 0x2a, 0x95, 0x52, 0xb3, 0x1b, 0xdd, 0x6d, 0x2e, 0x7d, 0x57, 0x61,
0x00, 0x72, 0x81, 0xef, 0xe5, 0x3d, 0x87, 0xdb, 0xe8, 0xfc, 0x1a, 0x66, 0x5e, 0xad, 0xb5, 0xae,
0x3c, 0x7d, 0x03, 0x73, 0xca, 0xc4, 0xf7, 0xc9, 0x5d, 0xc2, 0x01, 0xe8, 0x7d, 0xfd, 0x27, 0xb5,
0x01, 0xda, 0x57, 0x1b, 0xd0, 0x07, 0xf6, 0x5d, 0x3d, 0xd6, 0xd7, 0xf4, 0x18, 0x67, 0xeb, 0xb1,
0x6e, 0xcc, 0xa8, 0xc6, 0xfe, 0xea, 0xe3, 0x6f, 0xb6, 0x4f, 0xfc, 0x79, 0x6c, 0xe3, 0xff, 0xab,
0xf6, 0xfe, 0xb2, 0xdc, 0xf8, 0x66, 0x33, 0xd7, 0xa7, 0xa0, 0x72, 0x8d, 0x85, 0x74, 0x3e, 0xc1,
0xbe, 0x1d, 0x34, 0x7c, 0xa0, 0x01, 0x0b, 0xd0, 0xbb, 0xb3, 0xd7, 0x55, 0xae, 0x61, 0xbd, 0xc6,
0x91, 0x6b, 0xa5, 0x84, 0xab, 0xc3, 0x40, 0xee, 0xfa, 0x49, 0x43, 0x2c, 0x34, 0xe2, 0x19, 0x99,
0xdf, 0x1a, 0x76, 0xaf, 0x0e, 0xbb, 0xff, 0x48, 0xba, 0xf7, 0x20, 0xf2, 0x04, 0x80, 0x76, 0xa6,
0x23, 0x7d, 0xac, 0x68, 0x98, 0x6b, 0x26, 0xda, 0x53, 0xc5, 0x3f, 0xe6, 0x76, 0x6d, 0x0a, 0xa7,
0x5d, 0x2e, 0x78, 0x69, 0x2f, 0x25, 0x26, 0xf6, 0xea, 0xc1, 0xa4, 0x68, 0xd0, 0x5b, 0x6e, 0x4b,
0x27, 0xaa, 0x46, 0xe3, 0xe2, 0xd2, 0xaa, 0xaf, 0x85, 0xdd, 0x4f, 0x81, 0xf9, 0xc4, 0xca, 0x80,
0x44, 0xb8, 0x7f, 0x1a, 0xe8, 0x3a, 0xbd, 0x45, 0x07, 0x14, 0x22, 0xd0, 0xe3, 0x5c, 0x53, 0xef,
0x1d, 0x5c, 0xf1, 0xfb, 0xd5, 0xc0, 0xd6, 0x30, 0x5c, 0xc9, 0x63, 0x53, 0x63, 0xc7, 0x7d, 0xb8,
0xa1, 0xb5, 0xb9, 0x7b, 0xeb, 0x2d, 0xc1, 0x9c, 0xeb, 0xb4, 0x68, 0x40, 0xd0, 0xcf, 0x01, 0x62,
0x04, 0x40, 0x49, 0x2d, 0xfd, 0xb0, 0x32, 0x50, 0x69, 0x9c, 0xde, 0x98, 0xd8, 0x94, 0xd0, 0xdf,
0x09, 0x8d, 0xdd, 0x46, 0x6e, 0x5a, 0xff, 0x86, 0xd8, 0xf6, 0x86, 0xec, 0xec, 0x29, 0xc6, 0x3a,
0xd9, 0xeb, 0x59, 0x47, 0xbd, 0xd3, 0x5b, 0xf3, 0x11, 0x2a, 0x66, 0x91, 0xe0, 0x7f, 0x92, 0x5e,
0x18, 0x37, 0xd6, 0x49, 0x38, 0x30, 0x6f, 0x3d, 0x4a, 0x76, 0x1e, 0xb8, 0x87, 0xa7, 0xfd, 0x35,
0x8f, 0xf1, 0xda, 0x9c, 0x1e, 0xcb, 0x5b, 0x43, 0x29, 0x00, 0xe4, 0x70, 0xef, 0x95, 0x07, 0x8c,
0x86, 0x67, 0xcc, 0x69, 0x9f, 0x6c, 0x78, 0xe5, 0x5b, 0xd5, 0xcc, 0xc5, 0xe1, 0x6e, 0xa6, 0x35,
0xdf, 0xe3, 0xf6, 0xd3, 0x74, 0x6a, 0xed, 0x6a, 0xc7, 0xcd, 0x81, 0x71, 0x8d, 0xd1, 0xd4, 0xd1,
0xd4, 0xd7, 0xd9, 0x67, 0x49, 0xcb, 0x76, 0x6c, 0x00, 0x34, 0x2c, 0x74, 0x79, 0xbc, 0x1c, 0x48,
0x7b, 0xfb, 0xb7, 0x9b, 0xda, 0xe7, 0x71, 0x46, 0xe5, 0xd5, 0x5f, 0x0b, 0x07, 0x36, 0x10, 0x0b,
0xc1, 0x3c, 0xc6, 0x82, 0xbf, 0xc1, 0x78, 0x49, 0xef, 0x9f, 0x7b, 0xc3, 0xe7, 0x78, 0x59, 0xd9,
0xfb, 0x6a, 0xa8, 0x4d, 0xa3, 0xf5, 0x68, 0xe7, 0xe8, 0xeb, 0x44, 0x75, 0x4f, 0xcf, 0xc6, 0xff,
0x50, 0xf3, 0xaf, 0xd5, 0x72, 0x14, 0x83, 0x47, 0x6d, 0x46, 0x72, 0xec, 0x1b, 0xbf, 0x6c, 0x74,
0xfe, 0x3a, 0x65, 0xf7, 0x0a, 0xb7, 0xb5, 0xf2, 0xc0, 0x35, 0x18, 0x78, 0x89, 0xec, 0x32, 0x63,
0x01, 0x11, 0x88, 0x31, 0xd0, 0xd8, 0x45, 0xa3, 0xee, 0xdf, 0x91, 0x47, 0x64, 0xf5, 0x5f, 0xa9,
0x3f, 0x67, 0xf4, 0xa5, 0x68, 0x9c, 0xcb, 0xd6, 0x1d, 0x67, 0x0c, 0xb5, 0x3e, 0x97, 0x49, 0x12,
0x9e, 0x0e, 0xfa, 0xfd, 0x4d, 0x8f, 0x9b, 0x8d, 0x0b, 0xe3, 0x53, 0x17, 0x95, 0x76, 0x3e, 0x8c,
0xcc, 0x49, 0x90, 0x65, 0xce, 0x08, 0x80, 0x56, 0x3a, 0xf0, 0xfc, 0x52, 0x77, 0x29, 0xd1, 0x94,
0x48, 0x67, 0xd3, 0xd5, 0xff, 0xa8, 0xc6, 0x3a, 0xad, 0xfc, 0x94, 0xfc, 0x73, 0xa9, 0x97, 0xb4,
0x8b, 0x8e, 0x53, 0x66, 0x8b, 0x1d, 0xf7, 0xf1, 0xf8, 0x22, 0xd6, 0xd4, 0x51, 0x79, 0xf2, 0x6a,
0x58, 0x12, 0x8c, 0xc6, 0xb4, 0x23, 0x41, 0x79, 0x21, 0xb6, 0xf5, 0xb8, 0xb6, 0x11, 0x9a, 0xa2,
0xa6, 0xb7, 0x06, 0x4f, 0x2b, 0x7a, 0x66, 0xb6, 0xe4, 0x94, 0x3c, 0x73, 0xb8, 0x68, 0xb0, 0x72,
0xd5, 0xec, 0x2b, 0x3a, 0xae, 0x13, 0x30, 0x1a, 0x8a, 0x0c, 0x69, 0xec, 0xce, 0x26, 0x8a, 0x15,
0xcb, 0x12, 0x6a, 0xa0, 0x64, 0x17, 0x2a, 0x56, 0xa9, 0x6a, 0x96, 0xaa, 0x66, 0xc9, 0x33, 0x2b,
0xbe, 0x61, 0x09, 0x59, 0x0e, 0xc4, 0xce, 0x7e, 0x37, 0xe1, 0x04, 0x7c, 0x44, 0xcf, 0x8d, 0x81,
0x62, 0xd5, 0xdc, 0xd6, 0x9d, 0x70, 0xcc, 0xd0, 0x10, 0xaa, 0x66, 0xdb, 0xb2, 0x6f, 0x64, 0x8b,
0x76, 0xd1, 0xb3, 0x4a, 0x9e, 0x51, 0xf6, 0x0c, 0xce, 0x95, 0xe0, 0x7a, 0x34, 0xb1, 0x69, 0x57,
0xbf, 0xfb, 0xc2, 0x8e, 0x54, 0x57, 0xce, 0x8e, 0x59, 0x15, 0xdb, 0xc4, 0xd8, 0x23, 0x34, 0x02,
0xfc, 0x50, 0x2b, 0xdf, 0x9a, 0xfa, 0x3e, 0xdd, 0xf9, 0x6c, 0x6c, 0xe1, 0x3c, 0x65, 0xa7, 0xf4,
0x63, 0x41, 0x37, 0x7a, 0x73, 0xa9, 0x62, 0xc6, 0x4c, 0x7b, 0x55, 0xcf, 0x7f, 0xca, 0x37, 0x63,
0x26, 0xeb, 0x60, 0xa5, 0x7c, 0x09, 0x80, 0x30, 0x04, 0x0d, 0xeb, 0x3f, 0x33, 0xc5, 0xb6, 0x7c,
0xbd, 0xb1, 0xbd, 0x43, 0x97, 0xba, 0x2b, 0x2b, 0x3f, 0xa9, 0xaa, 0x5b, 0x99, 0x55, 0x25, 0x1e,
0x32, 0x36, 0xd8, 0xb4, 0xea, 0xef, 0x43, 0x00, 0x0d, 0x59, 0x66, 0xd8, 0x3e, 0xf5, 0xf1, 0xd8,
0xfa, 0xe3, 0x1a, 0x63, 0xa4, 0x5d, 0x8f, 0xb7, 0x8f, 0x90, 0x56, 0x75, 0xe7, 0xd4, 0x1d, 0x25,
0xee, 0x13, 0xaf, 0xa8, 0xfc, 0x6e, 0x7f, 0xcb, 0xfd, 0x76, 0xc7, 0x99, 0x8e, 0x2d, 0x4a, 0x9d,
0xcf, 0xb1, 0xc6, 0x13, 0xd6, 0xdc, 0xfd, 0xb9, 0xb1, 0xbd, 0x3e, 0xcf, 0xaf, 0xe7, 0xf9, 0xe7,
0xcc, 0xf9, 0xcb, 0x4b, 0x77, 0xbf, 0x43, 0x97, 0xbb, 0x28, 0xc9, 0xa1, 0x68, 0xcc, 0x36, 0xa6,
0x14, 0xd5, 0x8d, 0xfb, 0xf5, 0x18, 0xd1, 0x85, 0x61, 0xba, 0xe8, 0xda, 0x83, 0xeb, 0x03, 0xf0,
0x04, 0x34, 0xe2, 0x96, 0xd8, 0x38, 0xce, 0x95, 0x34, 0x19, 0x0a, 0xbc, 0xbf, 0xb4, 0xea, 0x4b,
0xee, 0xeb, 0xbf, 0xd9, 0xd8, 0x98, 0xee, 0xdb, 0xf9, 0x23, 0x4c, 0xbd, 0x14, 0x32, 0xab, 0x95,
0xf6, 0xab, 0x7e, 0x21, 0x5b, 0x48, 0x64, 0x12, 0x2d, 0x53, 0x5b, 0xa8, 0x9b, 0x8c, 0xcb, 0x8c,
0xde, 0xdf, 0xf4, 0x3e, 0x5b, 0x78, 0x9e, 0x31, 0x3e, 0xe7, 0x84, 0x39, 0xf1, 0x16, 0x43, 0xdb,
0x73, 0x98, 0xbb, 0x30, 0x78, 0xf5, 0x0e, 0x78, 0x45, 0x38, 0x62, 0x1f, 0x6e, 0xb6, 0x2b, 0x6b,
0x2f, 0xbd, 0xb1, 0xfd, 0xd1, 0x0f, 0xf5, 0x2d, 0x9d, 0xdd, 0x3f, 0x7c, 0xb8, 0xe4, 0x99, 0x1f,
0xfd, 0xd1, 0xd4, 0x1f, 0x3f, 0x6a, 0xa3, 0x81, 0x0d, 0x7b, 0xfa, 0x6b, 0x4f, 0x28, 0xcf, 0x6b,
0x0d, 0x6f, 0x7d, 0xdc, 0xfa, 0xcd, 0x87, 0xc3, 0xc6, 0x44, 0x65, 0xf0, 0xcc, 0xaa, 0xf5, 0xf1,
0xff, 0x6d, 0x9b, 0xd3, 0x2c, 0x5f, 0x37, 0xaf, 0x7c, 0xf1, 0x77, 0x93, 0x30, 0x39, 0x38, 0xd5,
0x6a, 0x68, 0x7a, 0x5a, 0xdd, 0xf9, 0xde, 0xae, 0xce, 0xac, 0x79, 0xd5, 0x8f, 0x13, 0xab, 0x3e,
0x1e, 0xb6, 0xa4, 0xca, 0xaf, 0xd5, 0x26, 0xb5, 0x23, 0xdb, 0x7b, 0x13, 0xdf, 0xb8, 0xa7, 0xf1,
0xb6, 0xfb, 0xcc, 0xbb, 0x3f, 0x65, 0x2e, 0x5f, 0xd8, 0x05, 0xa0, 0x1a, 0x88, 0x2f, 0xdf, 0x39,
0xed, 0x96, 0xbb, 0x2c, 0x24, 0x09, 0x80, 0x9d, 0x54, 0x77, 0x5c, 0xd9, 0x7f, 0xd2, 0x82, 0x1e,
0x62, 0x83, 0x2e, 0x4f, 0x6b, 0xfc, 0xe1, 0xd5, 0xe6, 0x73, 0xbf, 0x90, 0x82, 0x02, 0xa0, 0xdf,
0x72, 0x4a, 0xfc, 0xa6, 0x4b, 0x77, 0x34, 0xa7, 0xc6, 0xee, 0x5c, 0x28, 0xc6, 0x83, 0xde, 0x7b,
0x94, 0xb7, 0x87, 0xc7, 0xce, 0x65, 0x2c, 0xb4, 0x3b, 0xec, 0xf8, 0x1c, 0x77, 0x51, 0xf3, 0xe1,
0xbc, 0xc3, 0x70, 0x4a, 0x96, 0x96, 0x1a, 0x12, 0x6a, 0x8f, 0x8a, 0x3d, 0x17, 0x93, 0x87, 0xcb,
0x52, 0xbe, 0x24, 0x84, 0x30, 0x4c, 0x13, 0x00, 0x59, 0x0d, 0x72, 0xcf, 0x5d, 0x0d, 0x0d, 0x4d,
0x5c, 0xd8, 0xc5, 0x27, 0x3e, 0xaf, 0x29, 0x47, 0x96, 0x1e, 0x21, 0x0a, 0x8d, 0x9e, 0x60, 0x78,
0xcd, 0xad, 0xb5, 0xdc, 0x57, 0x94, 0x64, 0xcc, 0x58, 0xc3, 0x98, 0x8c, 0xd1, 0x12, 0x8c, 0xa0,
0xe8, 0x35, 0x27, 0x0d, 0x3f, 0x88, 0x1d, 0x68, 0xbf, 0xab, 0xf8, 0xd0, 0xc7, 0x92, 0x17, 0xfc,
0x30, 0x53, 0x5a, 0x97, 0xed, 0x59, 0x39, 0xae, 0xe0, 0x11, 0x5d, 0xf7, 0xca, 0xc4, 0xa2, 0xdc,
0xea, 0x9b, 0x79, 0xb9, 0x0b, 0x49, 0x0e, 0x36, 0x94, 0xfc, 0xa7, 0xc3, 0xbd, 0xee, 0xcd, 0xeb,
0xea, 0x6a, 0xcc, 0xa6, 0x31, 0xea, 0x9d, 0xf5, 0xe8, 0x73, 0x0e, 0x40, 0x17, 0x0c, 0xaf, 0x2c,
0xdd, 0xbb, 0x4b, 0x13, 0x7c, 0x30, 0xee, 0x6e, 0x0e, 0x14, 0x1f, 0xf9, 0x58, 0xf2, 0xdc, 0xef,
0x35, 0x94, 0xd7, 0x67, 0xc3, 0x1c, 0xe3, 0xcc, 0xf3, 0xbd, 0x52, 0xa1, 0x14, 0x73, 0x92, 0xed,
0xb3, 0xda, 0x82, 0xbb, 0x82, 0xd5, 0x37, 0xaf, 0x3e, 0xea, 0x8b, 0x47, 0xe5, 0x57, 0x94, 0xaa,
0xbf, 0xf1, 0x16, 0x9d, 0xbf, 0xa8, 0x69, 0x71, 0x13, 0x71, 0x22, 0x77, 0x11, 0x98, 0x29, 0x3b,
0x9f, 0x81, 0xd8, 0x4f, 0x47, 0x1c, 0x6a, 0x86, 0x6e, 0x94, 0x3c, 0x3e, 0xd8, 0x72, 0x49, 0x03,
0xe4, 0xf9, 0xfc, 0xc7, 0xeb, 0x8c, 0xeb, 0xdf, 0x54, 0x3d, 0x73, 0xb1, 0x5f, 0x7b, 0x4c, 0x05,
0xb4, 0x24, 0xca, 0xc5, 0x0a, 0x5b, 0x7f, 0x6b, 0x7c, 0xed, 0x96, 0xe4, 0x19, 0x8b, 0x2b, 0xb5,
0x2a, 0xdf, 0xb0, 0xc7, 0xbd, 0x73, 0x35, 0xfb, 0x9f, 0x6b, 0x4b, 0x2f, 0xed, 0x36, 0xa1, 0x70,
0xe7, 0x3f, 0xe7, 0x13, 0xf6, 0xe0, 0xcb, 0x08, 0xae, 0xa6, 0x64, 0xca, 0xdb, 0x7b, 0xac, 0xae,
0xad, 0xcc, 0x0f, 0x87, 0xae, 0xff, 0x1a, 0x33, 0xfa, 0x92, 0x7d, 0xef, 0xa1, 0x86, 0xdb, 0xee,
0x33, 0x00, 0x56, 0xf6, 0x06, 0x5b, 0x9a, 0x1f, 0xf2, 0x5b, 0x9e, 0xb2, 0xde, 0x7e, 0x2a, 0xfd,
0xd3, 0x49, 0x39, 0x83, 0xc3, 0x10, 0x6a, 0x5e, 0x5b, 0x81, 0x31, 0xad, 0x87, 0xbe, 0x9f, 0x2f,
0xd9, 0x9f, 0xbe, 0x23, 0xb9, 0x7c, 0x89, 0xbc, 0xf9, 0xb2, 0xde, 0xdd, 0x59, 0xeb, 0x8d, 0x5f,
0x4a, 0x9e, 0x34, 0xaf, 0xed, 0xaa, 0x33, 0x3a, 0xc7, 0x66, 0x1a, 0x33, 0xb5, 0xac, 0x84, 0xfd,
0x0f, 0x9b, 0xd6, 0xdb, 0x65, 0xd8, 0xef, 0x55, 0x3c, 0xfb, 0xa4, 0x38, 0x15, 0x69, 0xd7, 0x47,
0x37, 0x6f, 0xcd, 0x55, 0xfc, 0x2e, 0xdf, 0x5d, 0xec, 0xce, 0xf8, 0xe0, 0x8c, 0x38, 0x8b, 0xab,
0x67, 0x95, 0xb1, 0xcc, 0xc8, 0xf5, 0xe5, 0x52, 0x29, 0x49, 0xc2, 0xa9, 0x96, 0xcb, 0x76, 0xe9,
0x79, 0xab, 0xe3, 0xb8, 0xc2, 0xca, 0x7f, 0xd6, 0x94, 0x83, 0x29, 0x86, 0x03, 0x03, 0x9a, 0x74,
0xbd, 0xd7, 0x52, 0x0a, 0xf1, 0x38, 0x00, 0x94, 0xca, 0x60, 0x0c, 0x5a, 0xc1, 0x8a, 0x61, 0x30,
0xac, 0xc0, 0x51, 0x8b, 0x9b, 0x84, 0x01, 0x02, 0x09, 0x00, 0xb6, 0x00, 0x04, 0x10, 0x82, 0x9c,
0x21, 0x79, 0xe8, 0x03, 0x01, 0xc8, 0x46, 0xa5, 0x3c, 0x5a, 0x0d, 0x2b, 0x70, 0x03, 0x66, 0x12,
0xc4, 0xe0, 0x17, 0x31, 0x94, 0x8f, 0x34, 0x5a, 0x21, 0xd7, 0xae, 0x61, 0x91, 0xcc, 0xf6, 0x94,
0x9f, 0xbe, 0xc5, 0x39, 0xf6, 0x83, 0xa9, 0xad, 0xf7, 0x8e, 0x4b, 0x7d, 0x2b, 0x93, 0x02, 0x1b,
0xf0, 0xb6, 0x3d, 0x48, 0x09, 0xa6, 0xd5, 0x70, 0xd2, 0xeb, 0x70, 0x64, 0x0c, 0x5a, 0x83, 0x0d,
0x39, 0x74, 0x25, 0x51, 0xdb, 0x9c, 0xb3, 0xa6, 0x4d, 0x06, 0xdb, 0x03, 0x06, 0x0f, 0x6a, 0x35,
0xf2, 0x29, 0x23, 0x28, 0x0d, 0xfe, 0x1a, 0xf3, 0x2b, 0x0d, 0x5d, 0x77, 0x7c, 0xaf, 0x7f, 0x01,
0x04, 0x0a, 0x5a, 0xc3, 0x14, 0x43, 0x6d, 0x80, 0x46, 0xa2, 0x3d, 0x64, 0x31, 0x55, 0xde, 0x13,
0x6c, 0x5d, 0x65, 0x4f, 0x99, 0xa7, 0xfb, 0x1f, 0x91, 0x53, 0xcf, 0x28, 0xf6, 0x05, 0xc9, 0xa9,
0xcd, 0xf6, 0xbd, 0x4c, 0x66, 0x65, 0xbe, 0x92, 0x2f, 0x3f, 0x59, 0xf6, 0xb6, 0x7a, 0x74, 0x8c,
0xd5, 0x7a, 0xca, 0x8c, 0xd4, 0xb4, 0x86, 0x18, 0x8f, 0xc1, 0xf3, 0x90, 0x1b, 0x00, 0x80, 0xd2,
0x5a, 0x08, 0x31, 0x44, 0xdd, 0x7d, 0x75, 0x40, 0xf5, 0xd1, 0x9d, 0xc1, 0xbf, 0x0d, 0x1c, 0x3f,
0xa7, 0x7c, 0xc2, 0xbc, 0xae, 0x61, 0xfb, 0x12, 0x51, 0xa1, 0x62, 0x2f, 0x3f, 0x5a, 0x7f, 0x7f,
0xa5, 0x7b, 0xc2, 0x82, 0x7e, 0xd7, 0x0a, 0x94, 0xa2, 0x95, 0x2f, 0xc5, 0xd0, 0xaa, 0x8e, 0x9b,
0x97, 0xdb, 0xdc, 0xdd, 0xb4, 0x68, 0xba, 0x3e, 0x61, 0x5e, 0xb7, 0x6b, 0x07, 0x75, 0x5f, 0x19,
0xa3, 0x92, 0xf6, 0x82, 0xc1, 0xd4, 0xfb, 0xce, 0xea, 0x7b, 0xc3, 0x31, 0xf6, 0x69, 0x9f, 0xca,
0x0c, 0x3f, 0x4c, 0xd5, 0xe7, 0xe8, 0xa5, 0x63, 0x3b, 0x68, 0xc1, 0x94, 0x9c, 0x29, 0x54, 0xc2,
0xf1, 0x0c, 0x2e, 0xeb, 0x9b, 0xcd, 0xee, 0xac, 0xfb, 0xd4, 0x73, 0xc6, 0xaf, 0xff, 0xad, 0x7f,
0xc1, 0xb4, 0xfc, 0xec, 0x56, 0xbc, 0x75, 0x79, 0xec, 0x81, 0x17, 0xac, 0x2b, 0x56, 0xc0, 0x32,
0xea, 0xef, 0x55, 0x3f, 0xca, 0xf0, 0x54, 0xe1, 0x65, 0x34, 0x03, 0xeb, 0x2b, 0xc1, 0xe2, 0x46,
0x30, 0x16, 0xf6, 0x15, 0x77, 0xdd, 0xd9, 0x69, 0xcf, 0xb7, 0x1b, 0x96, 0x35, 0xec, 0xf9, 0xed,
0x9e, 0xde, 0x07, 0x7a, 0x97, 0xfe, 0xfe, 0xc8, 0x54, 0x31, 0x96, 0xfd, 0x43, 0x98, 0x3e, 0x35,
0x99, 0xed, 0xd2, 0x89, 0x66, 0x27, 0x56, 0x7c, 0x88, 0x92, 0x33, 0xc3, 0xce, 0x35, 0x61, 0xd7,
0x0e, 0xd1, 0xc0, 0xb5, 0x0a, 0x47, 0xfc, 0xe0, 0x50, 0x05, 0x69, 0x0d, 0x0d, 0x30, 0x8e, 0x4a,
0x75, 0x38, 0x68, 0x0e, 0x00, 0x95, 0xf2, 0x28, 0xb6, 0xc8, 0x21, 0x1f, 0xa7, 0x34, 0x4a, 0x3e,
0x28, 0x00, 0x23, 0xa8, 0xfc, 0x68, 0xb6, 0x94, 0x41, 0x35, 0x5e, 0x0d, 0xd1, 0x4f, 0x03, 0xbe,
0x0f, 0xdf, 0x87, 0xe0, 0x23, 0xf6, 0xd4, 0x1a, 0x52, 0x43, 0x8c, 0x9a, 0x9b, 0x21, 0x68, 0xf0,
0x14, 0x0f, 0xb6, 0xac, 0xb4, 0x17, 0x5c, 0x62, 0x26, 0xa7, 0x8e, 0x4b, 0x7d, 0x16, 0x6f, 0x91,
0x9d, 0x4f, 0x41, 0x56, 0x35, 0x19, 0x7b, 0xbb, 0x5c, 0xc2, 0xae, 0x3e, 0xbc, 0xb8, 0x33, 0x71,
0xe6, 0x91, 0x05, 0x46, 0xf0, 0x7c, 0xfc, 0xe4, 0xd1, 0xcc, 0xa6, 0x4e, 0x01, 0x20, 0x93, 0xd0,
0xc7, 0xce, 0x29, 0xa5, 0xe3, 0xfe, 0x51, 0xb3, 0x43, 0xad, 0xb1, 0x66, 0xa3, 0x19, 0x84, 0xec,
0xd9, 0x6d, 0xf1, 0x9d, 0xbd, 0x1c, 0xc0, 0xb4, 0x46, 0x79, 0xee, 0xd1, 0x7d, 0xab, 0x5f, 0x4d,
0x5f, 0x7c, 0xe2, 0x40, 0xfd, 0xa6, 0xa7, 0x55, 0x1f, 0xbf, 0x5f, 0x9f, 0xe8, 0x1a, 0x30, 0xde,
0x79, 0x7a, 0x3f, 0x67, 0xd0, 0x1a, 0x7f, 0x78, 0xd9, 0xfc, 0xe3, 0xe6, 0xf8, 0x35, 0xe7, 0x66,
0x4d, 0x01, 0x0d, 0x6c, 0xda, 0x83, 0xaf, 0xdd, 0x99, 0x0e, 0xc2, 0xf0, 0x43, 0x6f, 0x28, 0x2e,
0x9a, 0xf1, 0x9a, 0xbe, 0x45, 0x6b, 0x00, 0xc1, 0x8e, 0xdf, 0x5a, 0xd3, 0x3e, 0x1a, 0xe4, 0x37,
0x05, 0xa9, 0x93, 0x9b, 0x3a, 0x9a, 0xe3, 0xaf, 0x18, 0xfd, 0x77, 0xf7, 0xc7, 0xde, 0xed, 0xa8,
0x94, 0x42, 0x08, 0x1d, 0xea, 0x74, 0x63, 0x52, 0x4f, 0xd1, 0xd4, 0xc8, 0x48, 0x13, 0xee, 0x7c,
0x1e, 0xd5, 0x10, 0xcb, 0xa6, 0x87, 0x5b, 0x36, 0xc2, 0xa0, 0x03, 0xe8, 0x7a, 0xc6, 0x8a, 0x70,
0x06, 0xb8, 0x7b, 0x5d, 0x62, 0xf7, 0x80, 0x3b, 0x34, 0xa0, 0x91, 0x2b, 0x16, 0x66, 0xa7, 0x35,
0x16, 0x2e, 0x7f, 0x5d, 0xf9, 0x3d, 0xb7, 0xbb, 0x9f, 0xee, 0x4d, 0x2c, 0x9c, 0xda, 0x3f, 0x50,
0xb2, 0xbf, 0xb3, 0xca, 0xba, 0xe1, 0x64, 0xaf, 0xa6, 0x7f, 0x9e, 0xdf, 0xcc, 0x7e, 0xf2, 0xd8,
0x8c, 0x9a, 0xe6, 0x96, 0x1a, 0x1d, 0xcd, 0x95, 0x53, 0x16, 0x76, 0xee, 0xff, 0xf6, 0x84, 0xf6,
0x86, 0x92, 0x1e, 0x1a, 0x68, 0xd0, 0xa0, 0xf4, 0xb7, 0xe1, 0xf3, 0x8f, 0xdc, 0x63, 0x7f, 0xe4,
0x9e, 0xa9, 0x6d, 0x96, 0xfe, 0x97, 0x93, 0xaa, 0xef, 0x3c, 0xb5, 0x3b, 0x1d, 0x1f, 0x09, 0x26,
0xf6, 0x16, 0x05, 0xa0, 0xa7, 0x37, 0x79, 0x00, 0x0c, 0x8e, 0xa5, 0xb3, 0xc2, 0xef, 0x3e, 0x6e,
0x48, 0x35, 0xfe, 0x94, 0x09, 0xb4, 0xac, 0xbc, 0x0a, 0xa6, 0xc3, 0x67, 0xd6, 0x56, 0xfa, 0x85,
0xbd, 0xbc, 0xcd, 0x34, 0x2d, 0x59, 0x91, 0x99, 0x13, 0x32, 0x73, 0xbf, 0x38, 0x37, 0x73, 0x46,
0xe6, 0x99, 0x77, 0x3c, 0xd3, 0xff, 0x60, 0xae, 0x61, 0x79, 0x1c, 0xd7, 0xa3, 0xb1, 0x2d, 0xc9,
0x8f, 0xb1, 0xf2, 0xdd, 0x05, 0xde, 0xf7, 0xb2, 0xdd, 0x76, 0x98, 0xb7, 0xfe, 0x36, 0xb2, 0xa0,
0x95, 0x1e, 0x33, 0x16, 0xb6, 0xbd, 0x07, 0x9b, 0xba, 0x70, 0xda, 0x22, 0x10, 0x43, 0xc5, 0xc7,
0x4f, 0x56, 0xa6, 0x36, 0x77, 0x19, 0x04, 0x6a, 0x4c, 0xa8, 0xa3, 0x3b, 0xca, 0xcd, 0xa9, 0xea,
0xa2, 0x19, 0x5a, 0x6b, 0x3c, 0xf9, 0xaa, 0x01, 0x60, 0xed, 0xa6, 0xe4, 0xae, 0x7e, 0x0e, 0x60,
0x46, 0xb3, 0x3c, 0xf3, 0xc8, 0xbe, 0x3f, 0x6e, 0x4a, 0xbf, 0xf9, 0xf8, 0x01, 0x51, 0xc7, 0xcd,
0x8a, 0x8f, 0x07, 0x9f, 0x4d, 0x0e, 0x94, 0xf8, 0x65, 0xcb, 0xb3, 0x65, 0x1f, 0xb7, 0x3e, 0xd0,
0xd8, 0x35, 0xc0, 0x1b, 0x13, 0xfa, 0x9a, 0x73, 0x7a, 0x5c, 0x07, 0x00, 0xc2, 0x10, 0xab, 0x5e,
0xb6, 0x1f, 0x7b, 0xc9, 0xfd, 0xe8, 0x9b, 0x7a, 0x4d, 0x3e, 0x5a, 0x40, 0x32, 0x80, 0xf9, 0xe1,
0xae, 0xdf, 0x9b, 0x1d, 0x6f, 0xde, 0x57, 0x84, 0x27, 0xdc, 0xf9, 0x28, 0x59, 0x78, 0x2d, 0xef,
0x01, 0xf4, 0x15, 0xed, 0x8d, 0x7b, 0x9c, 0x33, 0x97, 0x14, 0x88, 0x50, 0xf2, 0xf0, 0x83, 0xc7,
0xe3, 0x5f, 0xbd, 0xac, 0x3f, 0x15, 0xf3, 0x4d, 0xa1, 0x0b, 0x65, 0xe3, 0xf6, 0x87, 0x5b, 0x6e,
0x9c, 0xba, 0x5b, 0x03, 0x3f, 0x7c, 0xa4, 0xe9, 0xdc, 0xa3, 0x2a, 0x5b, 0x7a, 0x8c, 0x2b, 0x56,
0x64, 0x05, 0x57, 0x96, 0x21, 0xfd, 0xc0, 0x58, 0xbf, 0xdd, 0x7e, 0xd3, 0xf1, 0x30, 0xf9, 0x88,
0xb7, 0xc9, 0x97, 0xf1, 0xeb, 0x35, 0x09, 0x80, 0xfe, 0xe9, 0x34, 0x08, 0x60, 0x4f, 0x16, 0xdf,
0xb8, 0xb7, 0x09, 0xc0, 0xbb, 0xce, 0xc8, 0x9a, 0x02, 0x81, 0xc4, 0x4f, 0x1f, 0xcf, 0x9c, 0x7d,
0x54, 0x29, 0x93, 0xf4, 0x6e, 0x7f, 0xc8, 0xfd, 0xe2, 0xa5, 0x45, 0xc7, 0x1a, 0x43, 0x29, 0x85,
0x03, 0x2f, 0x94, 0xcb, 0x65, 0xe1, 0xb4, 0xf0, 0xb8, 0x95, 0x78, 0xd5, 0x34, 0xfe, 0x53, 0x16,
0xf2, 0x55, 0x9b, 0x7b, 0xc3, 0x52, 0x92, 0x71, 0xc6, 0x38, 0x43, 0x1e, 0x78, 0x18, 0xde, 0x4b,
0x6b, 0xc5, 0x89, 0xf3, 0xb9, 0x5d, 0x08, 0xd1, 0xcf, 0xe8, 0x4f, 0x98, 0x95, 0x1b, 0x55, 0xab,
0x55, 0xba, 0xed, 0x3e, 0x03, 0xed, 0x83, 0x64, 0x9c, 0x19, 0x57, 0xb3, 0x5a, 0xec, 0x19, 0xcd,
0xb9, 0x15, 0x0b, 0x73, 0xb0, 0xe3, 0xab, 0x5e, 0x89, 0xcf, 0x6f, 0xcf, 0xae, 0xd9, 0x9c, 0xda,
0xb5, 0x4d, 0x9c, 0x7d, 0xf5, 0x80, 0xa8, 0x49, 0x91, 0x2a, 0xfd, 0xeb, 0xbd, 0x26, 0xf8, 0xe0,
0x68, 0xec, 0xea, 0xc5, 0xfa, 0xf8, 0xb9, 0xac, 0x7e, 0xf4, 0x02, 0xa2, 0x03, 0x0c, 0xe5, 0x33,
0xae, 0x30, 0x2d, 0xbc, 0xfa, 0x88, 0xec, 0xe5, 0x27, 0x0f, 0xbc, 0xb2, 0xdb, 0x7e, 0xdf, 0xad,
0x4e, 0x53, 0xb2, 0xe9, 0x1d, 0x27, 0xef, 0x62, 0x43, 0x81, 0x3d, 0x19, 0x02, 0xd0, 0xa6, 0x50,
0xb5, 0xf7, 0x4b, 0xda, 0xaa, 0x18, 0xee, 0x2f, 0x6c, 0xa2, 0x03, 0xb4, 0xa0, 0x9a, 0xec, 0xf6,
0x56, 0xf7, 0xb0, 0xb4, 0x15, 0x6b, 0x49, 0x00, 0xe0, 0x0e, 0x37, 0x1a, 0x0d, 0x91, 0x10, 0x00,
0x64, 0x49, 0xc1, 0x02, 0xf2, 0xe0, 0xdf, 0x63, 0xae, 0xa5, 0xec, 0xf9, 0x56, 0xa9, 0xd3, 0x90,
0xa5, 0x3e, 0x9d, 0x7b, 0x9a, 0x8c, 0x71, 0xe3, 0x5d, 0x7d, 0x45, 0x6c, 0xee, 0x8c, 0x9f, 0xba,
0xa8, 0xc4, 0x80, 0x62, 0x05, 0xb7, 0xaf, 0x74, 0x6f, 0xb9, 0xb2, 0x2f, 0xe1, 0x04, 0xa6, 0xd0,
0x03, 0x45, 0xe3, 0x07, 0x0f, 0xb7, 0x7d, 0xfe, 0xd2, 0x3d, 0x4a, 0xe1, 0x07, 0x0f, 0x37, 0xbf,
0xf1, 0xd8, 0xd2, 0xee, 0xac, 0x71, 0xe9, 0x8a, 0x2c, 0x67, 0xca, 0x36, 0x64, 0xc5, 0x37, 0x5e,
0xd8, 0xe1, 0x5c, 0x78, 0xdc, 0x40, 0xbd, 0xf7, 0xcd, 0x97, 0x70, 0xe7, 0x1a, 0xd7, 0x11, 0x74,
0xe9, 0xf2, 0x6c, 0xb6, 0x48, 0xcf, 0xef, 0xb4, 0xfe, 0xf9, 0x8c, 0x5c, 0xa3, 0xeb, 0x0d, 0x0f,
0xe2, 0x4b, 0x3e, 0xee, 0x78, 0x3a, 0xf3, 0xcc, 0x76, 0x7e, 0xdd, 0x85, 0x83, 0xa4, 0xae, 0x67,
0x3f, 0x59, 0x14, 0xf6, 0xfe, 0xd1, 0x9c, 0x73, 0xc9, 0x3e, 0xa7, 0xb4, 0x8a, 0xbb, 0x48, 0x8c,
0x9f, 0xf5, 0x50, 0xeb, 0xab, 0x08, 0x00, 0xed, 0x29, 0xd1, 0xb3, 0x5b, 0x12, 0x09, 0x47, 0x36,
0x26, 0xe4, 0x31, 0x73, 0xfa, 0xab, 0x41, 0xe3, 0xee, 0xac, 0x05, 0xc0, 0x57, 0x6c, 0x56, 0xab,
0xff, 0xd3, 0x55, 0xee, 0xba, 0xad, 0x29, 0x4e, 0x7a, 0x66, 0x8b, 0xdf, 0x96, 0xae, 0x12, 0xb1,
0xc1, 0x31, 0xfc, 0x90, 0xee, 0x6f, 0x4e, 0xe1, 0x03, 0xe7, 0xe4, 0x7f, 0xf8, 0x68, 0x0a, 0x40,
0x35, 0xc0, 0xcf, 0x56, 0xb5, 0x5e, 0xb1, 0xdc, 0x7b, 0xec, 0x25, 0xb3, 0xd6, 0x2f, 0x2b, 0x85,
0x4a, 0x20, 0x5a, 0x1a, 0x54, 0xa3, 0x8b, 0x0d, 0x9d, 0x66, 0xd9, 0x87, 0x33, 0xe6, 0xaa, 0x29,
0x15, 0x04, 0xbe, 0x1f, 0x9f, 0x72, 0x5a, 0xb2, 0x9a, 0x62, 0xdf, 0xf6, 0xcb, 0x7d, 0x9e, 0xd2,
0xba, 0xd7, 0x18, 0x48, 0x86, 0xd6, 0xc8, 0x39, 0x5b, 0x80, 0xc7, 0x01, 0x13, 0xac, 0xcd, 0x85,
0xa1, 0x41, 0x6a, 0x48, 0xe7, 0xb0, 0x7d, 0x70, 0x7d, 0x5c, 0xaf, 0xec, 0xaa, 0x1f, 0xbd, 0x27,
0xbf, 0xe2, 0x88, 0x81, 0x41, 0x11, 0x42, 0x3a, 0x6e, 0x07, 0x00, 0x5a, 0xd3, 0xe5, 0x8f, 0x9c,
0xea, 0xfd, 0xec, 0x29, 0xeb, 0xfc, 0x63, 0x62, 0xff, 0xf3, 0x87, 0xf8, 0xc9, 0x4b, 0xe4, 0xbc,
0x29, 0xf9, 0xda, 0xa5, 0xe6, 0xcc, 0x93, 0x77, 0x5f, 0xbb, 0x27, 0x6e, 0x0f, 0xce, 0x8a, 0x98,
0x22, 0x74, 0xac, 0x3f, 0x33, 0x2d, 0x7c, 0x7a, 0x63, 0xee, 0xe5, 0xeb, 0x65, 0x3a, 0x5e, 0x75,
0xed, 0x60, 0xc9, 0x2c, 0xfe, 0xc2, 0xce, 0xa9, 0x0f, 0xbd, 0x60, 0x5c, 0x72, 0x22, 0x33, 0x87,
0xa6, 0x5c, 0x4c, 0x43, 0x03, 0xa8, 0x04, 0xbc, 0xa6, 0x39, 0x7b, 0x0a, 0xa2, 0xc5, 0x1a, 0xef,
0x5d, 0xea, 0xb8, 0xc1, 0xa1, 0xb9, 0xd2, 0x9e, 0x0c, 0xb6, 0x84, 0x68, 0x81, 0xd5, 0x6e, 0xf5,
0xaf, 0xee, 0xdf, 0xf0, 0xb1, 0x0d, 0x3d, 0x0f, 0xf5, 0x24, 0x16, 0x26, 0x66, 0x5f, 0xde, 0xb6,
0x76, 0xf5, 0xc6, 0x64, 0x4b, 0xac, 0x31, 0x9f, 0x30, 0xbf, 0x26, 0x70, 0xa3, 0x72, 0xe7, 0xad,
0xa8, 0xec, 0x78, 0x46, 0xf9, 0x15, 0x6e, 0xef, 0x3b, 0x3a, 0x2c, 0x86, 0x6f, 0xb5, 0xb9, 0xc4,
0x9e, 0xdd, 0x9a, 0x88, 0x5b, 0xba, 0x29, 0x29, 0x97, 0xce, 0xce, 0xe6, 0xaa, 0xac, 0x7b, 0xc0,
0xf0, 0x42, 0x46, 0x44, 0x33, 0x9a, 0x83, 0x9f, 0xaf, 0x4e, 0xae, 0xdd, 0x92, 0xe2, 0xa4, 0x3b,
0xda, 0xbc, 0x86, 0xb8, 0x37, 0x2c, 0x31, 0x87, 0x43, 0xf5, 0x2d, 0x69, 0x5c, 0x73, 0x76, 0xe1,
0xe7, 0x4f, 0x24, 0xb5, 0x46, 0xa9, 0x6a, 0x6f, 0xed, 0x13, 0x77, 0xaf, 0x49, 0x2f, 0x9e, 0xe5,
0x4f, 0x6b, 0xee, 0xa9, 0x69, 0x9e, 0x54, 0x0c, 0xef, 0x3f, 0xa7, 0xff, 0xb3, 0xbf, 0x68, 0x1e,
0xe7, 0x41, 0x48, 0x15, 0x77, 0xef, 0x2f, 0x91, 0x41, 0xcb, 0x7d, 0x65, 0x85, 0x8c, 0xd0, 0x85,
0x1b, 0x82, 0x35, 0x26, 0xb5, 0x6b, 0xe9, 0x54, 0x5c, 0xb9, 0x0e, 0xce, 0x3b, 0xda, 0x7f, 0xf8,
0xf9, 0x86, 0x50, 0xd1, 0xf9, 0x4b, 0xbd, 0x64, 0x4c, 0x39, 0x16, 0x1a, 0x5d, 0xc5, 0x08, 0x49,
0x47, 0x01, 0x7c, 0xe4, 0x8b, 0x34, 0x1c, 0xfb, 0x84, 0x10, 0x54, 0x3b, 0xfe, 0xec, 0xd6, 0x86,
0xb5, 0xdb, 0xac, 0xe3, 0xe7, 0x57, 0x7b, 0x0b, 0xb1, 0x42, 0x45, 0xa4, 0xe2, 0xa1, 0x6d, 0xe2,
0x0d, 0xcb, 0x0a, 0xb7, 0x3d, 0x98, 0x09, 0x42, 0x94, 0x83, 0x7d, 0x4f, 0x5f, 0xeb, 0x9e, 0xad,
0x6b, 0xc3, 0xc3, 0x9b, 0x9a, 0xcf, 0x69, 0x2a, 0xdf, 0x55, 0xb0, 0x76, 0xc1, 0xa9, 0xb8, 0x54,
0x8b, 0xaf, 0xd9, 0x28, 0x6b, 0xca, 0xf7, 0x84, 0x0d, 0xbb, 0x64, 0xb1, 0xbd, 0x68, 0x18, 0x05,
0x9d, 0x2f, 0x91, 0x3d, 0x15, 0x69, 0x4b, 0x17, 0x3d, 0xe2, 0xfb, 0x72, 0x86, 0xba, 0x4e, 0xb0,
0xee, 0x95, 0x29, 0x92, 0x70, 0x54, 0xc6, 0xad, 0xec, 0x6d, 0x5b, 0xae, 0x2e, 0x5a, 0x56, 0xfa,
0xda, 0x7d, 0x4d, 0x77, 0x3d, 0xdd, 0xf8, 0xcb, 0x35, 0xe2, 0x3f, 0x2e, 0x2b, 0xc6, 0xad, 0xa0,
0x76, 0x9d, 0xa4, 0x85, 0xb4, 0xeb, 0x25, 0xec, 0x60, 0x1f, 0x23, 0x7c, 0xad, 0xf7, 0xb9, 0x0f,
0xb8, 0x1e, 0x9c, 0x50, 0xe8, 0x2f, 0xc4, 0xef, 0x5f, 0x9f, 0xba, 0xf0, 0x98, 0xd0, 0xb5, 0x03,
0x83, 0x29, 0xdb, 0xa0, 0x72, 0x40, 0x5a, 0x91, 0x62, 0x14, 0x84, 0xcc, 0x32, 0x64, 0xc6, 0x0d,
0x00, 0x6c, 0xee, 0xb4, 0x17, 0x4c, 0x41, 0x25, 0xc0, 0x63, 0x1b, 0xf8, 0x61, 0xad, 0x7a, 0x9f,
0x79, 0x68, 0x96, 0xe4, 0x0a, 0x55, 0xcf, 0xf2, 0xf2, 0xe0, 0x49, 0x65, 0x70, 0xc8, 0x90, 0x2c,
0x2a, 0x6d, 0xcc, 0x17, 0x5e, 0x18, 0x88, 0xcd, 0x8d, 0x2d, 0xfd, 0xe5, 0xd1, 0xfd, 0xdb, 0xca,
0xfe, 0x2f, 0x7c, 0xb3, 0x29, 0x83, 0x3d, 0x96, 0xff, 0x31, 0x5f, 0x97, 0xf4, 0xd6, 0x1d, 0x4f,
0xa7, 0x63, 0xcc, 0xd6, 0xfb, 0xed, 0x28, 0x87, 0xe3, 0x60, 0x70, 0x0d, 0xca, 0xb8, 0x3a, 0x6e,
0xe9, 0x86, 0xb8, 0x4a, 0x38, 0x38, 0x7b, 0x49, 0xf0, 0xc8, 0x0b, 0x8d, 0xf9, 0x0a, 0xbd, 0xf1,
0x58, 0x2f, 0x6e, 0xc3, 0x31, 0x07, 0xd9, 0x92, 0xb0, 0x35, 0x88, 0x83, 0xc6, 0x60, 0x8b, 0x29,
0xa8, 0x66, 0xa3, 0xe6, 0x94, 0x7f, 0xc3, 0x45, 0xa5, 0xb9, 0x6d, 0xa5, 0x9f, 0xad, 0x6a, 0xdc,
0xd6, 0xe5, 0x1e, 0x36, 0xbd, 0x58, 0x33, 0x2b, 0xaf, 0x9d, 0x40, 0xe3, 0x93, 0x77, 0xdf, 0xd4,
0x27, 0x3b, 0x03, 0xaf, 0x73, 0xcc, 0xef, 0x72, 0xce, 0x72, 0x15, 0xb6, 0x27, 0x17, 0x33, 0xb8,
0x0e, 0x42, 0x6a, 0x77, 0x71, 0xc4, 0x8c, 0x6a, 0x63, 0xc2, 0x63, 0xa4, 0x4d, 0x8e, 0x63, 0xe7,
0x14, 0xde, 0xfb, 0xfd, 0x29, 0x55, 0x1f, 0xb7, 0xbf, 0xa7, 0x93, 0x31, 0x4c, 0x69, 0xc0, 0x92,
0x59, 0x15, 0x83, 0x2b, 0x43, 0x84, 0xd9, 0xa2, 0x95, 0xaf, 0xb2, 0xce, 0xac, 0xeb, 0x58, 0x61,
0xd2, 0xf1, 0x62, 0xd6, 0x48, 0xec, 0x1f, 0x44, 0x5a, 0xa3, 0xe4, 0xf1, 0x20, 0xa4, 0xff, 0x7e,
0x30, 0xf5, 0xab, 0x55, 0xfc, 0x1d, 0x27, 0xa5, 0x85, 0xe8, 0xb7, 0x84, 0xf2, 0x02, 0x71, 0xd5,
0xe9, 0x39, 0xa5, 0xd4, 0x5d, 0x4f, 0xc7, 0x63, 0xd6, 0xb8, 0x46, 0xe6, 0xdc, 0x28, 0xf7, 0x6e,
0xdf, 0xf8, 0xe4, 0xd3, 0xcb, 0x56, 0x2c, 0xcb, 0x50, 0xa6, 0x78, 0x63, 0x91, 0x2b, 0xa6, 0x6b,
0x7e, 0x9d, 0x40, 0x09, 0x1e, 0x3b, 0x36, 0x6e, 0x2d, 0xb2, 0x82, 0xa7, 0x03, 0xae, 0xa7, 0x4a,
0xb5, 0x9d, 0xd1, 0x4c, 0xc6, 0x66, 0x6a, 0xf9, 0x2a, 0x8c, 0x7d, 0xe7, 0x42, 0x29, 0x80, 0xee,
0x5a, 0x9b, 0xd9, 0x91, 0x6d, 0x10, 0x4c, 0x03, 0x7a, 0x6a, 0x43, 0xa9, 0xa3, 0xb5, 0x88, 0x90,
0xee, 0x7d, 0x36, 0xdd, 0x5b, 0x4c, 0x71, 0xa6, 0x01, 0x70, 0x0a, 0x3a, 0x5a, 0x0a, 0x8b, 0x67,
0x0e, 0x70, 0xa6, 0x66, 0x37, 0x17, 0x97, 0xcd, 0xcd, 0x7c, 0xf8, 0x7b, 0x4d, 0x68, 0x28, 0x9e,
0xb9, 0x24, 0xc7, 0x48, 0x2b, 0x4d, 0x9c, 0xf4, 0xda, 0x57, 0xf8, 0x2f, 0x56, 0xcf, 0x4c, 0xd8,
0x83, 0x8d, 0x2a, 0x6e, 0x55, 0x5f, 0x37, 0xbf, 0x57, 0x08, 0x0d, 0xb0, 0x5f, 0x3c, 0xd9, 0x3a,
0xad, 0xa1, 0x85, 0x08, 0x20, 0x35, 0xb7, 0x25, 0x7f, 0xe4, 0xac, 0xfe, 0x61, 0xe9, 0x32, 0x66,
0x83, 0xcc, 0x95, 0xc5, 0xb5, 0xbf, 0x8c, 0x6f, 0xd8, 0x6d, 0xbc, 0xf5, 0xc4, 0x7c, 0x57, 0xce,
0xf8, 0xea, 0xef, 0xac, 0x2f, 0xbd, 0xb9, 0x6a, 0x70, 0xf5, 0xf2, 0xae, 0xcc, 0x7f, 0x3d, 0x98,
0xfa, 0xc4, 0x45, 0x5d, 0xd3, 0x9a, 0x8a, 0x67, 0x1d, 0xd7, 0x70, 0xed, 0x2f, 0xdc, 0x1f, 0x38,
0x2d, 0x9b, 0xbb, 0xf9, 0xef, 0xd7, 0x88, 0xdb, 0x3e, 0x98, 0x17, 0x62, 0x1f, 0x7a, 0x8a, 0x78,
0xd3, 0x72, 0x68, 0x4d, 0x5a, 0x81, 0x06, 0x13, 0x16, 0xbc, 0x4e, 0xaf, 0xf5, 0xe2, 0x66, 0xad,
0x74, 0xef, 0x03, 0xbd, 0xdc, 0x61, 0x61, 0xb7, 0xc2, 0x46, 0xb0, 0x69, 0x0c, 0x57, 0x53, 0xee,
0xa8, 0xea, 0x0b, 0xab, 0x9e, 0xa1, 0x72, 0xdf, 0xcc, 0xc5, 0x33, 0xfc, 0xda, 0x1b, 0xb2, 0xb1,
0xb9, 0x46, 0x8c, 0xe5, 0x2a, 0xc6, 0x9e, 0x2c, 0x19, 0x82, 0x3c, 0x9f, 0xcf, 0x48, 0xd2, 0xe2,
0x99, 0x5e, 0x32, 0xe6, 0x1b, 0x5c, 0x99, 0x02, 0xc7, 0xcd, 0x2b, 0xbe, 0xff, 0x07, 0x6d, 0x7e,
0x88, 0xdb, 0xdf, 0x33, 0x20, 0x15, 0x4d, 0x6d, 0xc4, 0x91, 0xb3, 0x2a, 0x82, 0x2b, 0x43, 0x84,
0x3d, 0x79, 0x2b, 0x5f, 0x65, 0x5d, 0x03, 0xae, 0x65, 0xee, 0xc5, 0x96, 0xc1, 0xce, 0xb8, 0xec,
0x59, 0x5e, 0xc0, 0x1d, 0x4b, 0xc5, 0x2c, 0x54, 0x42, 0xa3, 0x6b, 0xc0, 0x8a, 0x5b, 0x81, 0xeb,
0xa8, 0x1a, 0x9d, 0xc6, 0x36, 0x9d, 0xd4, 0x3c, 0xde, 0xbc, 0x1f, 0xea, 0xf3, 0x29, 0x27, 0xf9,
0x5d, 0x2f, 0x0a, 0x6b, 0x8c, 0x76, 0xdc, 0x92, 0xf4, 0x02, 0x95, 0xba, 0xfd, 0xa1, 0x16, 0xcb,
0xd4, 0x27, 0x2d, 0x28, 0x9e, 0xbf, 0x44, 0xfd, 0x7c, 0x55, 0x83, 0xe0, 0x48, 0x39, 0xea, 0xb2,
0xe5, 0x9d, 0xad, 0xe9, 0xca, 0x05, 0x4b, 0x02, 0x0d, 0xb4, 0x67, 0x4a, 0x55, 0xdf, 0x70, 0x1d,
0xfa, 0xc1, 0x23, 0xcd, 0x8c, 0xd0, 0x94, 0x0c, 0xce, 0x39, 0x32, 0xdf, 0x92, 0xa0, 0x1f, 0x3f,
0xd6, 0x64, 0x0a, 0x7d, 0xea, 0xe1, 0xc5, 0x65, 0xf3, 0xfa, 0x6a, 0xe6, 0x4a, 0xd8, 0xf2, 0xf0,
0xa9, 0x21, 0x63, 0x58, 0xb1, 0xa8, 0xf7, 0xc4, 0x05, 0xbd, 0x65, 0x5f, 0x9c, 0x30, 0xb7, 0xe5,
0xf8, 0xf9, 0xd9, 0x35, 0x9b, 0x1a, 0x66, 0xb7, 0x94, 0xd2, 0xf1, 0xf0, 0xbb, 0x0f, 0x34, 0x48,
0xa5, 0xae, 0x3e, 0xad, 0x6b, 0xf4, 0xbc, 0x4c, 0xdd, 0xd3, 0x26, 0x67, 0x0b, 0x11, 0xd3, 0xaa,
0x87, 0xf9, 0xf6, 0xe3, 0x2b, 0x9f, 0x3e, 0xf6, 0xf0, 0x65, 0x8d, 0x6f, 0x68, 0xac, 0x94, 0x07,
0x13, 0xd0, 0xcb, 0xaf, 0x96, 0x5b, 0x7b, 0x52, 0x6e, 0x5b, 0xdc, 0x9e, 0x6e, 0xeb, 0x16, 0xcd,
0x1e, 0xed, 0x90, 0x9d, 0xdb, 0x01, 0x43, 0xe0, 0xb4, 0xc0, 0x7f, 0x15, 0x76, 0x2d, 0xc2, 0x33,
0xb6, 0xb1, 0x1a, 0xdc, 0xea, 0x65, 0xa7, 0x07, 0xdf, 0x59, 0x67, 0x35, 0xbc, 0xc8, 0x38, 0x41,
0x2a, 0x7d, 0xfe, 0xec, 0xd8, 0x67, 0x2f, 0x2e, 0x5e, 0xbf, 0xa2, 0x7a, 0xeb, 0x33, 0xce, 0xdd,
0x1b, 0xd8, 0x60, 0xf8, 0x59, 0xb1, 0x8b, 0x17, 0xd3, 0x82, 0x29, 0x79, 0xc7, 0x52, 0x89, 0x98,
0x77, 0xcd, 0x8a, 0xe2, 0xd3, 0x2f, 0xe3, 0x8b, 0x17, 0x54, 0xdb, 0xd2, 0x65, 0x00, 0x8c, 0xf4,
0xeb, 0xe6, 0x97, 0xe7, 0xcf, 0x75, 0xbe, 0xfe, 0x88, 0xa8, 0x79, 0x6e, 0x0d, 0xcc, 0x74, 0xed,
0xd9, 0x2d, 0xce, 0xdc, 0xb6, 0xf2, 0x8a, 0x63, 0x12, 0x5f, 0x7e, 0x42, 0x38, 0x04, 0x09, 0x70,
0xad, 0xdf, 0x7d, 0x74, 0xfc, 0xf0, 0xe9, 0x03, 0x96, 0x18, 0xd5, 0xeb, 0x9a, 0x86, 0x5a, 0xb6,
0x58, 0xb9, 0x76, 0x58, 0x73, 0xfb, 0xb3, 0x9a, 0xf3, 0xdf, 0xbf, 0xcc, 0xb9, 0xea, 0x17, 0xee,
0xbf, 0xff, 0xb6, 0x19, 0x86, 0xba, 0xf8, 0x75, 0xe1, 0x5b, 0x4f, 0xec, 0x63, 0x4c, 0xf7, 0x17,
0xf9, 0x73, 0xbb, 0x45, 0xd5, 0x17, 0xad, 0xe9, 0xe2, 0xe7, 0xde, 0x32, 0xf0, 0xd6, 0xdb, 0x9a,
0xcf, 0xfb, 0x7c, 0x13, 0x58, 0x78, 0xd5, 0x59, 0xd5, 0xb3, 0x8f, 0xec, 0xe6, 0x34, 0x5e, 0xd2,
0x04, 0x01, 0x20, 0x77, 0x3e, 0x76, 0xec, 0xf0, 0xba, 0x2d, 0x7e, 0xb8, 0xcb, 0x0f, 0x77, 0x01,
0xa5, 0x43, 0x6d, 0x4e, 0xb1, 0x66, 0xbc, 0x77, 0x56, 0xcf, 0x3d, 0x8f, 0x3d, 0x7b, 0xc5, 0xba,
0x63, 0x7f, 0x7b, 0x7c, 0x78, 0x96, 0x6c, 0x9d, 0xd1, 0xdc, 0x75, 0x6a, 0xcf, 0xaa, 0xc7, 0xd7,
0x34, 0xb0, 0x44, 0xd2, 0x75, 0x38, 0x63, 0x3c, 0xb1, 0x44, 0x16, 0xd7, 0x93, 0x39, 0xb6, 0x01,
0xdb, 0xd3, 0xaa, 0x54, 0xe5, 0xb7, 0x3f, 0x34, 0xd5, 0x32, 0xb1, 0x7c, 0x61, 0xf1, 0xdc, 0xc5,
0xf2, 0x67, 0x4f, 0x64, 0x18, 0x47, 0x3a, 0xae, 0x2e, 0x3b, 0xb9, 0xb3, 0xad, 0xa1, 0x7c, 0xce,
0x11, 0x61, 0xcc, 0x52, 0x6d, 0xe9, 0x4a, 0xb1, 0x6a, 0xd8, 0x06, 0xbb, 0xfd, 0x91, 0x66, 0x22,
0xb4, 0x24, 0x83, 0xb3, 0x8e, 0xcc, 0xa5, 0x62, 0xf4, 0x7f, 0x1f, 0x6d, 0x32, 0x84, 0x3e, 0x6b,
0x49, 0x61, 0xe9, 0xec, 0xda, 0xc0, 0x0c, 0xae, 0xa3, 0x0e, 0x9b, 0x2a, 0x89, 0x91, 0x6b, 0x87,
0xab, 0x37, 0xd8, 0xbf, 0x7a, 0xaa, 0xfd, 0xb0, 0x76, 0x35, 0xa7, 0xb5, 0xb8, 0xea, 0xe5, 0xcc,
0xc2, 0x69, 0x65, 0xd7, 0x29, 0xc4, 0x4c, 0x7d, 0xf4, 0x2c, 0xc5, 0x88, 0xbd, 0x36, 0x70, 0xa7,
0x7d, 0xcd, 0x1b, 0x0e, 0xdf, 0x9b, 0xd1, 0x9f, 0x79, 0xdb, 0xc8, 0x3f, 0x1f, 0xbf, 0xf1, 0x56,
0x84, 0x95, 0xca, 0xfd, 0xd7, 0x8a, 0x74, 0xbd, 0xb6, 0x01, 0x21, 0xac, 0x31, 0x24, 0x08, 0x79,
0x4d, 0x8b, 0x0b, 0xae, 0x34, 0x48, 0x2a, 0xaa, 0xc5, 0x22, 0x0c, 0x26, 0x89, 0xe0, 0x85, 0x1c,
0x40, 0xad, 0xf2, 0x42, 0xc9, 0xa4, 0xae, 0x7d, 0xaa, 0x0d, 0xa6, 0x02, 0xc5, 0xb4, 0x26, 0x68,
0x70, 0xae, 0x6a, 0xfe, 0xb2, 0x26, 0xe8, 0xfd, 0x90, 0x3b, 0xa6, 0x1c, 0xee, 0xf4, 0xfd, 0x10,
0x96, 0x81, 0x20, 0x04, 0x63, 0x20, 0x42, 0xb1, 0x02, 0xad, 0xe1, 0x3a, 0x60, 0x43, 0xba, 0x54,
0x0f, 0xcb, 0x47, 0x0e, 0x55, 0x0c, 0xad, 0xc5, 0xd7, 0x50, 0xf3, 0xc9, 0x1b, 0xb6, 0xf5, 0x59,
0x53, 0x2e, 0xda, 0xb8, 0x71, 0x43, 0xb5, 0x5a, 0x9d, 0xd3, 0x32, 0x67, 0xc6, 0x9c, 0xb9, 0xde,
0x23, 0x3d, 0xcf, 0x5c, 0xfa, 0x8c, 0xdb, 0xea, 0xd6, 0x06, 0x6a, 0x47, 0xff, 0xfe, 0x68, 0xab,
0xdd, 0xa2, 0xed, 0xa1, 0x77, 0xcf, 0xf7, 0x8c, 0x53, 0x5e, 0x2f, 0xab, 0x6b, 0xcb, 0x6b, 0x2f,
0xa2, 0x14, 0x1f, 0x6f, 0x5a, 0x82, 0x28, 0x04, 0x50, 0xf5, 0xc8, 0x97, 0x62, 0x68, 0xb6, 0x11,
0x8c, 0xeb, 0xb8, 0x15, 0xf8, 0x81, 0xa8, 0xbd, 0xe6, 0x48, 0x14, 0x92, 0xeb, 0x98, 0x15, 0x0c,
0x85, 0xad, 0xf8, 0x40, 0xd9, 0x4a, 0x39, 0x81, 0x33, 0x74, 0x44, 0x29, 0x2a, 0x79, 0xa6, 0x1a,
0x3d, 0x79, 0x19, 0xb3, 0x42, 0x46, 0xb2, 0xec, 0x99, 0x52, 0x0e, 0x26, 0x28, 0x01, 0x30, 0xb9,
0x74, 0xac, 0x70, 0xaf, 0x7c, 0x20, 0xa9, 0xa8, 0xbf, 0x64, 0x27, 0x6c, 0xdf, 0x36, 0x64, 0xcd,
0x04, 0x52, 0x51, 0x5f, 0xc1, 0xc9, 0x55, 0x1c, 0x8b, 0x87, 0x99, 0x64, 0xd9, 0xb5, 0x03, 0x00,
0x41, 0xc8, 0xca, 0x55, 0x23, 0xe1, 0x78, 0x8c, 0x29, 0xad, 0x91, 0x2d, 0xd9, 0xd9, 0x92, 0x6d,
0x09, 0xbf, 0xd1, 0x2d, 0x3b, 0xd6, 0xd0, 0xfc, 0x28, 0xa0, 0x47, 0x79, 0x3a, 0xad, 0x7d, 0x05,
0x6b, 0xae, 0xb5, 0xfc, 0x49, 0xdc, 0xf7, 0xb0, 0x48, 0xa7, 0xbb, 0x16, 0x9d, 0x48, 0x16, 0xb9,
0xfd, 0xde, 0xea, 0xe3, 0x57, 0xb7, 0x5c, 0xd2, 0x74, 0xe4, 0x8f, 0x97, 0xee, 0xf8, 0xee, 0xf6,
0x17, 0x3f, 0xf4, 0x7c, 0xdb, 0x15, 0xb3, 0x16, 0x7d, 0xf1, 0xb0, 0xbe, 0xde, 0xfe, 0x35, 0xaf,
0xae, 0xd7, 0x66, 0x75, 0xf6, 0x61, 0xf3, 0xc2, 0x6d, 0xf7, 0x2c, 0x98, 0xdd, 0x42, 0xf9, 0xf5,
0xa5, 0xc7, 0xbe, 0x22, 0x5a, 0x84, 0x96, 0xba, 0x7e, 0x4a, 0x9a, 0xf4, 0x10, 0x5b, 0x24, 0x86,
0xd8, 0x32, 0xb8, 0x09, 0x22, 0x40, 0x44, 0x30, 0x98, 0x26, 0x82, 0x17, 0x32, 0x22, 0x6d, 0x72,
0x5d, 0x9b, 0xc4, 0xd0, 0x83, 0xa1, 0x70, 0x6d, 0x30, 0x1d, 0x28, 0xa6, 0x15, 0xd5, 0x68, 0xc6,
0x46, 0xd8, 0x42, 0x41, 0xc8, 0x2c, 0x53, 0x02, 0xa8, 0x78, 0xa2, 0xe2, 0x8b, 0xb8, 0x15, 0x58,
0xa6, 0x0c, 0x43, 0xc6, 0xb8, 0xae, 0xf5, 0x40, 0x5e, 0xc0, 0x1d, 0x33, 0xc4, 0xe8, 0xf7, 0xd5,
0xa4, 0x65, 0xaf, 0x4c, 0x9c, 0xfd, 0x75, 0x32, 0xdc, 0x2f, 0x7c, 0xe2, 0xbd, 0x63, 0x7b, 0xfd,
0x42, 0xf7, 0xce, 0xd0, 0x3d, 0x2a, 0x39, 0x7d, 0x45, 0xb8, 0x73, 0x25, 0x52, 0x06, 0x00, 0x06,
0x59, 0xcf, 0x0f, 0x43, 0xa8, 0xba, 0x8a, 0xd1, 0x35, 0x25, 0x50, 0x97, 0x29, 0x3a, 0xe2, 0xb1,
0x04, 0x57, 0xf5, 0x97, 0x36, 0xb9, 0x7a, 0xad, 0xd2, 0x65, 0x0c, 0xb6, 0x29, 0x75, 0x1d, 0x27,
0x6a, 0x59, 0x52, 0xc6, 0x50, 0x07, 0x9d, 0x70, 0xc6, 0xcd, 0xd3, 0xd0, 0x65, 0x0d, 0x58, 0x76,
0xc7, 0xeb, 0xfd, 0x1d, 0x4f, 0x88, 0x19, 0x57, 0xda, 0x9c, 0xa6, 0x4d, 0x69, 0xdb, 0xb3, 0x7d,
0xe7, 0x0b, 0xeb, 0x5e, 0x76, 0xec, 0xcc, 0xb4, 0x13, 0x92, 0xb3, 0xbf, 0xb5, 0xd8, 0x69, 0x34,
0xc2, 0x3d, 0x82, 0xd9, 0x79, 0x64, 0xe0, 0x2b, 0xdf, 0x9a, 0x65, 0xb1, 0x85, 0x73, 0x83, 0x35,
0xbf, 0x37, 0x2f, 0x7c, 0x3b, 0xdb, 0x32, 0x53, 0x95, 0xb6, 0x51, 0xcc, 0xd8, 0xc7, 0x1c, 0x9b,
0x6d, 0x69, 0x67, 0x24, 0x4f, 0x7b, 0x70, 0xe0, 0x65, 0x99, 0xa1, 0x65, 0xca, 0xf1, 0xf2, 0x4b,
0x2c, 0x53, 0xb6, 0x99, 0xe5, 0xd1, 0xef, 0xa8, 0x13, 0x8e, 0x37, 0xd6, 0x6c, 0x1e, 0xc5, 0xad,
0x60, 0xfc, 0xac, 0xcb, 0xc1, 0xbf, 0x19, 0xd3, 0xcd, 0x89, 0x4a, 0xfd, 0x33, 0x70, 0xa6, 0x5b,
0x52, 0xe5, 0xda, 0x1c, 0xf0, 0xf0, 0x79, 0x06, 0x57, 0xa9, 0xc1, 0x10, 0x27, 0x11, 0xe9, 0x8c,
0x5b, 0xcd, 0xb8, 0xd5, 0x71, 0xd3, 0x3b, 0x87, 0x34, 0x95, 0x2a, 0x23, 0xd6, 0x7c, 0xae, 0x59,
0x4a, 0x07, 0xfe, 0xb3, 0xe2, 0xf4, 0x7f, 0x8b, 0x69, 0x2b, 0xd8, 0x50, 0x94, 0x53, 0x62, 0x87,
0x7d, 0xed, 0x30, 0xbe, 0x2c, 0xbd, 0xe3, 0xa9, 0x92, 0x79, 0x62, 0xf3, 0xc2, 0x5b, 0x4f, 0x8e,
0xe5, 0x8a, 0x65, 0x0a, 0x9f, 0x7b, 0x79, 0x3d, 0x3c, 0x6f, 0xda, 0xec, 0xa9, 0x36, 0x83, 0x9a,
0xf5, 0xc6, 0x6c, 0xd7, 0xff, 0xb4, 0xcd, 0x5b, 0x5e, 0x49, 0xdd, 0xa2, 0xca, 0x0a, 0x26, 0x27,
0xc8, 0xe1, 0x8b, 0x0f, 0x4b, 0x36, 0x83, 0x43, 0x63, 0x24, 0xf4, 0xae, 0x01, 0xa5, 0x34, 0xab,
0x8d, 0xef, 0x14, 0x1c, 0x53, 0x41, 0x43, 0x2a, 0x80, 0x60, 0x5b, 0xaa, 0x16, 0x9e, 0x52, 0x00,
0x67, 0xe0, 0x7c, 0xc4, 0x6d, 0x87, 0x8a, 0x04, 0xd3, 0x0c, 0xa4, 0x19, 0x4c, 0xae, 0x42, 0x4d,
0x00, 0x1c, 0x4b, 0xc6, 0x1c, 0x69, 0x12, 0x40, 0xc4, 0x58, 0xed, 0xd7, 0x9e, 0x88, 0x11, 0x1c,
0x53, 0x0e, 0x76, 0x65, 0x6c, 0xe4, 0xe5, 0x55, 0x41, 0x9b, 0xd3, 0x8e, 0xe5, 0xe9, 0xd9, 0x7b,
0x36, 0x3d, 0x45, 0x75, 0x8a, 0x68, 0x94, 0xf8, 0xf7, 0x13, 0xcb, 0xa9, 0xf0, 0x5c, 0xfc, 0xb8,
0x4f, 0xc1, 0xb0, 0x50, 0x96, 0x75, 0x69, 0x59, 0x5c, 0xeb, 0x51, 0x45, 0x8d, 0x14, 0x71, 0xe0,
0x45, 0xef, 0xb3, 0x8c, 0x71, 0x26, 0xea, 0x0a, 0x09, 0x5d, 0x17, 0x7b, 0x52, 0x39, 0xe5, 0x2e,
0xbf, 0x51, 0xfb, 0xc5, 0xce, 0xa0, 0x05, 0xce, 0x34, 0x2e, 0x58, 0x32, 0xe5, 0xb6, 0xb4, 0xb7,
0xc5, 0x1b, 0x8c, 0x35, 0xbf, 0x5e, 0xf3, 0xc2, 0xf3, 0x3b, 0x9b, 0x4f, 0x4c, 0x49, 0x93, 0xc7,
0xe7, 0xc7, 0x9d, 0x99, 0xad, 0xdd, 0x77, 0x77, 0x7b, 0x9d, 0x1e, 0x38, 0x78, 0x47, 0x47, 0x75,
0xc7, 0xe3, 0xba, 0x52, 0xb2, 0x8e, 0xb9, 0x01, 0x1a, 0xba, 0x1c, 0xee, 0x3b, 0x57, 0x6a, 0x8c,
0x0c, 0x49, 0x4d, 0xd0, 0xa0, 0xd1, 0x65, 0x30, 0x87, 0x64, 0xf8, 0xef, 0xd1, 0x6c, 0x1e, 0x3c,
0x46, 0xa4, 0x41, 0xd0, 0xc3, 0xa5, 0x2e, 0xbf, 0xa5, 0x3e, 0xb9, 0x05, 0xfb, 0x3a, 0x3e, 0x6a,
0x8e, 0x81, 0x40, 0xa4, 0xf7, 0xfd, 0x23, 0x59, 0x7a, 0x1f, 0x39, 0xa2, 0xbe, 0x26, 0x87, 0xcc,
0x13, 0x3f, 0xab, 0xb6, 0x3d, 0x08, 0x78, 0x70, 0xec, 0x54, 0x9a, 0x4a, 0xbb, 0x0b, 0xbb, 0xef,
0xdd, 0x61, 0x1d, 0x1d, 0xdb, 0xb3, 0xbe, 0xf2, 0xd8, 0xc7, 0xb6, 0x6e, 0xbc, 0xa9, 0x27, 0x79,
0x44, 0xd2, 0xb8, 0xa0, 0x61, 0xcd, 0x13, 0xab, 0x7c, 0xcf, 0x6b, 0x9a, 0x36, 0x3d, 0x9d, 0x4e,
0x5b, 0x86, 0x43, 0xce, 0xb4, 0xc0, 0x68, 0xf7, 0x8b, 0x3b, 0xe3, 0xcb, 0xff, 0x1d, 0xd9, 0x10,
0x9e, 0x1a, 0x5e, 0xc5, 0xb4, 0x57, 0x46, 0x12, 0x01, 0x52, 0x41, 0x2a, 0x84, 0x12, 0x4a, 0x02,
0x1a, 0x4a, 0xd5, 0xfd, 0x5e, 0x87, 0xae, 0x75, 0xa9, 0xa4, 0x42, 0x52, 0x21, 0x11, 0x88, 0x83,
0xa4, 0x1a, 0x55, 0x08, 0x90, 0x8a, 0x02, 0x85, 0x50, 0x21, 0xd4, 0xa3, 0x26, 0x74, 0x7d, 0x09,
0x3f, 0xac, 0xcf, 0x18, 0x1a, 0xc3, 0x6c, 0xba, 0x2a, 0xa1, 0x10, 0x3f, 0xf5, 0xcb, 0x7b, 0x76,
0x6c, 0x09, 0x92, 0x2b, 0xea, 0xf3, 0xc4, 0x04, 0xb1, 0x5a, 0x20, 0x4c, 0x02, 0x08, 0x53, 0x27,
0xf1, 0xe2, 0x33, 0x7e, 0xf5, 0x95, 0xe4, 0x79, 0xbf, 0xca, 0xdf, 0xf7, 0x16, 0xe4, 0x3c, 0xa4,
0xfe, 0xb1, 0xf6, 0x23, 0x20, 0x4e, 0xaa, 0xac, 0x54, 0x5e, 0xc5, 0x4f, 0xf9, 0x94, 0x68, 0x3c,
0x62, 0xc7, 0x0b, 0xbf, 0xab, 0xcc, 0xfe, 0x78, 0x8a, 0x4a, 0x5c, 0x08, 0x00, 0x0d, 0x4d, 0xa9,
0x30, 0x90, 0x7b, 0xb2, 0xbb, 0xd6, 0xdd, 0xbf, 0x7e, 0x73, 0x66, 0x73, 0x66, 0xcb, 0x6c, 0xf6,
0xf2, 0x80, 0x99, 0x31, 0x66, 0xb4, 0x39, 0x4a, 0x6e, 0xc3, 0xcc, 0xc5, 0x2c, 0x3d, 0x83, 0x4f,
0x99, 0x15, 0x3c, 0xf7, 0x25, 0xf3, 0xac, 0xcf, 0xfb, 0x2f, 0xfc, 0xbb, 0xec, 0x5d, 0x3f, 0x0e,
0x63, 0xc4, 0xb8, 0xec, 0xff, 0x53, 0xb3, 0x0c, 0xff, 0xe2, 0x34, 0xc5, 0x71, 0x03, 0x28, 0x7f,
0xd9, 0x5d, 0x74, 0x49, 0x3b, 0xa7, 0x7c, 0x89, 0x9c, 0x4c, 0xb8, 0xf5, 0x3f, 0xc5, 0xb4, 0x0f,
0x01, 0xa8, 0x76, 0x57, 0x8b, 0x3b, 0x4a, 0xc5, 0x9d, 0x95, 0x6d, 0xbf, 0xd9, 0xd5, 0xd7, 0x9d,
0x4c, 0xfb, 0x82, 0x40, 0x4f, 0x3e, 0xb9, 0x7a, 0xfb, 0xd6, 0x5c, 0xc3, 0x8c, 0x60, 0xc6, 0x91,
0xb3, 0x52, 0x4d, 0xae, 0x6d, 0xdb, 0x00, 0xe2, 0x94, 0x2f, 0xb7, 0xbd, 0xa5, 0x6b, 0xd3, 0x8d,
0x53, 0x0f, 0x7b, 0x5d, 0xec, 0xf5, 0x5f, 0x2d, 0xdf, 0xf3, 0x51, 0xa5, 0x89, 0xc5, 0x99, 0x56,
0x7a, 0x1f, 0xc9, 0x78, 0xfa, 0x80, 0x92, 0x4d, 0xe9, 0xaf, 0x68, 0x66, 0x55, 0x0c, 0x95, 0x87,
0xc4, 0x05, 0xff, 0xad, 0xf2, 0xdb, 0xc3, 0xc0, 0x57, 0x6d, 0x27, 0xd5, 0x5f, 0x9f, 0x9f, 0xb6,
0x98, 0x13, 0xa8, 0xb6, 0xc2, 0xe5, 0xa8, 0xb3, 0xfe, 0x55, 0x26, 0x8e, 0x29, 0x6f, 0x7d, 0xcc,
0x49, 0x7a, 0xb1, 0xf9, 0xef, 0x91, 0xa5, 0x5d, 0x61, 0xef, 0x16, 0x1d, 0x2a, 0x22, 0x45, 0x83,
0xdb, 0x50, 0x1e, 0x8c, 0xa2, 0x14, 0x94, 0xd2, 0x4a, 0xa9, 0xaa, 0xd2, 0x05, 0xcd, 0xe3, 0x1d,
0xee, 0x19, 0xdf, 0x10, 0x99, 0xf9, 0x3b, 0x37, 0x3c, 0x5c, 0x6e, 0x7f, 0x67, 0xd2, 0x8e, 0x33,
0x28, 0xc6, 0x88, 0x31, 0x46, 0x44, 0xc2, 0x10, 0x2a, 0x08, 0x03, 0xaf, 0x54, 0xcc, 0xca, 0xe4,
0x11, 0xce, 0x94, 0x29, 0x6d, 0xc9, 0x5d, 0x16, 0xf3, 0x04, 0x37, 0x7d, 0xbb, 0xa5, 0x07, 0xc4,
0xb4, 0x68, 0x41, 0xef, 0x77, 0xa9, 0x79, 0x8e, 0x79, 0xf8, 0x87, 0x83, 0x0d, 0xdf, 0xd3, 0xd5,
0x0a, 0x59, 0x0c, 0x93, 0xea, 0x57, 0x94, 0x08, 0xb2, 0x5f, 0x1a, 0xf3, 0xce, 0x89, 0x2d, 0xfb,
0x6a, 0xf0, 0x87, 0x4f, 0x90, 0x99, 0x12, 0xb3, 0xcf, 0x43, 0xd9, 0x1b, 0x78, 0x75, 0x93, 0x15,
0x2b, 0x89, 0xbe, 0x18, 0x7f, 0x7e, 0x1a, 0x77, 0xd5, 0xf4, 0x73, 0x9a, 0x0a, 0xcb, 0xbc, 0xde,
0x0d, 0x2f, 0x1a, 0x4d, 0xac, 0x71, 0x4e, 0x7b, 0xcb, 0xf4, 0x74, 0x32, 0x6d, 0x33, 0xc6, 0x84,
0x10, 0xd0, 0x52, 0x30, 0x14, 0xcd, 0x05, 0xde, 0xf6, 0x7b, 0x53, 0x53, 0x8f, 0xb0, 0x17, 0xbc,
0x21, 0xe8, 0x7c, 0x4e, 0xf6, 0xf5, 0x68, 0x09, 0x10, 0x98, 0xd6, 0x83, 0xbf, 0x6e, 0x54, 0xeb,
0xef, 0x5e, 0xfb, 0xab, 0x47, 0xfb, 0xd8, 0x1b, 0x57, 0xe9, 0xbf, 0xbc, 0xe8, 0x50, 0xab, 0xb2,
0x56, 0x45, 0x2d, 0x5a, 0x8f, 0x77, 0xcf, 0xf8, 0x06, 0x64, 0xa5, 0x6b, 0xf7, 0xa6, 0x60, 0xda,
0x07, 0x48, 0xfb, 0xeb, 0x1f, 0xbc, 0x79, 0xb8, 0x47, 0x18, 0xb5, 0x0f, 0x8f, 0x63, 0xf8, 0xbe,
0xd4, 0xa5, 0xf6, 0xcb, 0x37, 0x6c, 0xbb, 0xab, 0x3d, 0xfd, 0x52, 0xe6, 0xb8, 0x77, 0x79, 0xd9,
0x37, 0xa8, 0xae, 0x27, 0xd5, 0xc0, 0xab, 0x2a, 0xb7, 0x01, 0xfa, 0x60, 0x2d, 0xde, 0xd3, 0x00,
0xb8, 0xd3, 0x64, 0xb4, 0x2f, 0xe4, 0xcd, 0x47, 0x79, 0xd6, 0x42, 0xad, 0xb2, 0x9b, 0x5e, 0xd9,
0xe4, 0x37, 0xff, 0x93, 0x6b, 0xb7, 0x93, 0xf6, 0x19, 0xe7, 0x35, 0x01, 0xc0, 0x85, 0x19, 0x77,
0xe4, 0xdc, 0x59, 0x7e, 0xca, 0x32, 0xb7, 0x6f, 0xce, 0x67, 0xf3, 0xcf, 0x2f, 0xb8, 0xc0, 0x68,
0x5a, 0xba, 0x08, 0xb7, 0xc1, 0x97, 0x03, 0xdd, 0xc1, 0x6d, 0x08, 0x43, 0x54, 0x00, 0x00, 0x07,
0xf4, 0x49, 0x44, 0x41, 0x54, 0x8b, 0x6e, 0x31, 0x47, 0x6d, 0x29, 0x9f, 0x5d, 0x69, 0x3e, 0xf5,
0xa1, 0xd8, 0xeb, 0x57, 0x3a, 0xe7, 0xfc, 0xd6, 0xbf, 0xef, 0x94, 0x20, 0xaf, 0xc4, 0xd0, 0x66,
0x53, 0x8a, 0xf1, 0xbf, 0xa6, 0xf7, 0xfe, 0x87, 0x81, 0x52, 0x23, 0xca, 0xd6, 0x2b, 0xf8, 0xe6,
0x94, 0xe5, 0xf1, 0x53, 0x7e, 0xa8, 0xb6, 0xdd, 0x5a, 0xc9, 0x3e, 0x14, 0xcc, 0xfb, 0x76, 0x82,
0x77, 0x23, 0x80, 0x3b, 0x83, 0xe7, 0xbd, 0xce, 0xc4, 0xf3, 0xc9, 0x8c, 0xdd, 0x3c, 0xe3, 0xf2,
0x8c, 0x7f, 0xd4, 0xc0, 0xa6, 0xd5, 0x0f, 0x37, 0x2c, 0x08, 0x32, 0x8d, 0x89, 0xd8, 0xd4, 0x4c,
0x32, 0x9d, 0x32, 0x8d, 0x8a, 0x86, 0x50, 0x4a, 0x11, 0x11, 0x93, 0x81, 0xe3, 0xa4, 0x8b, 0x4d,
0x57, 0x75, 0xed, 0xbc, 0xc3, 0x31, 0xaa, 0xa9, 0x13, 0x3e, 0x56, 0x1e, 0xe8, 0x36, 0x7a, 0x57,
0xaa, 0x81, 0x4d, 0x41, 0x79, 0xcf, 0x7e, 0xec, 0xf7, 0xb7, 0xb1, 0x2b, 0x1b, 0x0a, 0xb3, 0x7a,
0xce, 0x2c, 0xd1, 0xd6, 0x61, 0xb4, 0x9f, 0xc0, 0x52, 0x33, 0x77, 0x6f, 0xdb, 0x50, 0x95, 0xa6,
0x6c, 0x7b, 0x9f, 0xcb, 0xa5, 0xe0, 0x34, 0xee, 0x3e, 0x3c, 0x44, 0x10, 0x1c, 0xb6, 0xc5, 0xca,
0xed, 0x17, 0x75, 0x66, 0x57, 0x97, 0x37, 0x3e, 0xd9, 0xd2, 0x3c, 0x55, 0x4c, 0x3f, 0x53, 0x4f,
0x5d, 0x0e, 0xe9, 0x73, 0x78, 0x7f, 0x56, 0xbf, 0xf4, 0x17, 0x13, 0xbf, 0x96, 0x96, 0x4a, 0x9c,
0xc5, 0xa7, 0xf8, 0xd5, 0x5c, 0xe7, 0x8e, 0x8d, 0x64, 0xb7, 0x05, 0xed, 0x57, 0x3a, 0x4e, 0x42,
0x90, 0x3f, 0x6a, 0xf1, 0x28, 0x63, 0x09, 0x7b, 0x80, 0xa7, 0xc1, 0x0d, 0x53, 0xc4, 0x9c, 0xce,
0x3d, 0xb9, 0x0d, 0xdb, 0x1f, 0x17, 0xf3, 0x78, 0xe3, 0xbb, 0x8f, 0xa0, 0x3f, 0x42, 0x22, 0x10,
0x4e, 0x09, 0x54, 0x35, 0x5a, 0x4e, 0x2c, 0x04, 0xeb, 0xf1, 0xbb, 0x73, 0xe2, 0xe7, 0xdd, 0xcf,
0x2e, 0x58, 0x25, 0xef, 0xbd, 0x38, 0x2c, 0x77, 0x8a, 0x43, 0x7a, 0x07, 0x62, 0x56, 0xb7, 0x99,
0xa4, 0x3d, 0xef, 0x8a, 0xc4, 0x89, 0x5f, 0x61, 0xbd, 0xbf, 0xe9, 0x59, 0xf7, 0x4d, 0x63, 0xfe,
0x97, 0x98, 0x23, 0x08, 0x1e, 0x71, 0xad, 0xb5, 0x0b, 0x29, 0x09, 0xb0, 0x2f, 0xdf, 0xd5, 0x77,
0x0e, 0xb6, 0x3e, 0xf1, 0x48, 0xcb, 0x14, 0xbf, 0xa9, 0x35, 0x93, 0x89, 0x89, 0xb2, 0x59, 0x65,
0x8c, 0x49, 0x19, 0xa3, 0xa1, 0x65, 0x28, 0xc4, 0xb9, 0x45, 0x12, 0xae, 0x9b, 0xa7, 0xb7, 0xf4,
0xec, 0x7e, 0x30, 0x93, 0xdf, 0x92, 0x69, 0x99, 0x69, 0x2e, 0x78, 0x0b, 0xa4, 0x2f, 0xbc, 0x5c,
0x1d, 0xa3, 0xe8, 0xef, 0xd8, 0x99, 0x0d, 0xde, 0xcb, 0x22, 0x11, 0xb0, 0x46, 0xed, 0x17, 0x7a,
0x76, 0x6c, 0x96, 0x66, 0x47, 0xd0, 0xbc, 0xdc, 0x75, 0x98, 0xe0, 0x23, 0x6d, 0x63, 0x9c, 0xb8,
0x3e, 0x91, 0x65, 0x70, 0x40, 0x96, 0x33, 0x27, 0x97, 0xf4, 0xd1, 0x9b, 0x06, 0x9e, 0x55, 0xc5,
0x0d, 0x00, 0xc8, 0x48, 0x70, 0x58, 0x07, 0x85, 0xfa, 0x23, 0x03, 0x19, 0xb9, 0x83, 0xb9, 0x33,
0xc2, 0x96, 0xd7, 0xc1, 0x6c, 0x4c, 0xdb, 0x92, 0x84, 0xaa, 0xdf, 0x2c, 0x40, 0x31, 0xc3, 0xd2,
0x39, 0x87, 0xf7, 0x31, 0x47, 0x58, 0xb6, 0xb0, 0x1d, 0x11, 0x8b, 0x8b, 0xed, 0xbb, 0x77, 0xed,
0xea, 0x7a, 0x0a, 0x1d, 0xd0, 0xed, 0x01, 0x00, 0x62, 0x9a, 0x73, 0x2d, 0x55, 0xaf, 0x3b, 0xef,
0x92, 0xc2, 0x06, 0xd0, 0xbd, 0xe7, 0xd0, 0x09, 0xdf, 0x73, 0x2f, 0xfa, 0x83, 0xbf, 0xee, 0xd3,
0xd5, 0x17, 0x7f, 0x04, 0x80, 0xec, 0x90, 0x04, 0x0e, 0xad, 0x3d, 0x5a, 0x34, 0x20, 0x07, 0x47,
0xd5, 0x76, 0x93, 0x79, 0xe4, 0x27, 0x8d, 0x39, 0x97, 0x87, 0x9b, 0xbe, 0x95, 0x7b, 0xe5, 0x47,
0xa5, 0x19, 0x9f, 0x48, 0xbb, 0x0b, 0x2c, 0x2b, 0xc7, 0xb9, 0x20, 0x40, 0xd6, 0x22, 0x49, 0x47,
0x75, 0x8a, 0x39, 0x99, 0xde, 0x97, 0xd7, 0x5b, 0x4e, 0x65, 0xc6, 0xac, 0x56, 0x37, 0x61, 0xbb,
0x42, 0xa4, 0xad, 0xde, 0x01, 0xd5, 0x10, 0xca, 0x18, 0x8d, 0x76, 0x94, 0x96, 0x90, 0x88, 0xc7,
0xd8, 0xb4, 0xb3, 0x4b, 0xa8, 0x14, 0x7b, 0x9e, 0x56, 0x95, 0x5d, 0x00, 0xb8, 0x93, 0xac, 0x0f,
0x27, 0xfd, 0xfd, 0x9a, 0xf7, 0x50, 0x67, 0x22, 0x64, 0x36, 0x1b, 0xf4, 0x38, 0x89, 0x39, 0x4e,
0xeb, 0x85, 0x20, 0x33, 0x6e, 0x2a, 0xd3, 0x18, 0x63, 0x6f, 0x95, 0xb1, 0x36, 0x23, 0x21, 0xb2,
0x0c, 0x6e, 0x1a, 0x94, 0xab, 0x66, 0x94, 0xbb, 0x84, 0x92, 0xcb, 0x74, 0x58, 0xd0, 0xc4, 0xaa,
0xfe, 0xc1, 0xd9, 0x86, 0x96, 0x0d, 0xfb, 0x75, 0xee, 0x0a, 0x83, 0xa5, 0xad, 0xaa, 0xe2, 0x0e,
0x48, 0x72, 0x5e, 0xb7, 0xdd, 0x12, 0x71, 0x48, 0x19, 0x17, 0x7b, 0x08, 0x8a, 0x48, 0x10, 0x21,
0x1e, 0x37, 0x19, 0x23, 0x32, 0x9a, 0x0a, 0xf9, 0x72, 0xb1, 0xfa, 0xbc, 0x6e, 0x49, 0xb7, 0x04,
0x0e, 0xe7, 0x5c, 0x08, 0x01, 0x84, 0x65, 0xa9, 0x9c, 0xd9, 0x17, 0x66, 0x77, 0xa4, 0x53, 0xab,
0xae, 0x08, 0x3b, 0x2e, 0xb1, 0x96, 0x7d, 0x5d, 0xcc, 0x79, 0x67, 0xb0, 0xe1, 0xd6, 0x60, 0xc7,
0xdd, 0xaa, 0x98, 0x47, 0x2d, 0xfb, 0x9c, 0xf4, 0x84, 0xe7, 0xfc, 0x50, 0x2a, 0x0d, 0xa5, 0xe7,
0x9a, 0x73, 0xae, 0x30, 0xe7, 0x5c, 0xa1, 0xc3, 0x52, 0x79, 0xed, 0x75, 0x5e, 0xcf, 0x33, 0xde,
0xac, 0xcf, 0xba, 0x89, 0x79, 0x08, 0xb2, 0x64, 0x83, 0x08, 0xc4, 0x95, 0x65, 0xe7, 0x1c, 0x29,
0x0a, 0x53, 0x7a, 0x77, 0xe4, 0x77, 0xd9, 0xa6, 0xdf, 0xde, 0xd2, 0x92, 0x48, 0xda, 0xae, 0x6b,
0x90, 0x07, 0xc6, 0x65, 0x9c, 0xf5, 0xe6, 0xe4, 0x8c, 0xc1, 0xc0, 0xe4, 0x68, 0xf6, 0x9b, 0x09,
0x73, 0xa0, 0x62, 0xea, 0xe6, 0x93, 0x48, 0x87, 0x00, 0xaa, 0xe5, 0x83, 0xb3, 0x7d, 0x81, 0x31,
0xd4, 0xc3, 0x94, 0x94, 0x95, 0x8a, 0x9b, 0xc4, 0x4c, 0xa9, 0x02, 0x2e, 0x1c, 0xdb, 0xf2, 0xc6,
0xec, 0x7c, 0x46, 0x0b, 0x1e, 0xa5, 0x50, 0xb7, 0xef, 0x4a, 0x3a, 0x16, 0x84, 0x56, 0x42, 0x49,
0x09, 0x9d, 0x54, 0x2a, 0xd0, 0xb6, 0x55, 0x37, 0x1d, 0xf2, 0x77, 0x6c, 0xcd, 0x7c, 0xf8, 0x0f,
0xc3, 0x34, 0x88, 0x91, 0xcb, 0x6b, 0x73, 0x5a, 0xa3, 0xe2, 0x88, 0x3c, 0xc1, 0x76, 0x19, 0xba,
0x48, 0xda, 0xac, 0xd5, 0x0d, 0x11, 0x4c, 0x93, 0x32, 0xc9, 0xa4, 0x6d, 0x5a, 0x52, 0x86, 0x5c,
0x05, 0x4e, 0xcc, 0x62, 0x42, 0x11, 0x0f, 0x19, 0x94, 0x05, 0xe9, 0x2b, 0x6d, 0xb4, 0x9f, 0x99,
0x8b, 0xcd, 0xd2, 0x9b, 0x7e, 0x95, 0xd8, 0xb1, 0xd2, 0x9c, 0x77, 0xa5, 0x58, 0xf2, 0x39, 0xeb,
0xe8, 0xeb, 0xd5, 0xc0, 0x46, 0xd9, 0xf3, 0xb4, 0xca, 0x6f, 0x96, 0x95, 0x89, 0xbd, 0xd9, 0x3a,
0x77, 0x42, 0xb2, 0x1a, 0x79, 0xf3, 0xc9, 0x2c, 0x35, 0xdf, 0x37, 0xe7, 0x68, 0xe9, 0x95, 0x5e,
0xfc, 0xaf, 0xf2, 0x8e, 0xc7, 0x83, 0xd8, 0x2c, 0x3e, 0xff, 0x46, 0xd2, 0xa6, 0x6d, 0x14, 0x4c,
0x83, 0x73, 0xce, 0x19, 0x27, 0x4d, 0x4c, 0x31, 0x69, 0x3a, 0x4e, 0x4c, 0x6b, 0xee, 0x33, 0x83,
0x27, 0x9d, 0x98, 0x65, 0x9b, 0x82, 0x14, 0x07, 0x07, 0x24, 0x6c, 0xf4, 0xf9, 0xdc, 0x2d, 0xe9,
0x46, 0x31, 0xb4, 0xe1, 0x02, 0xd1, 0xe0, 0x10, 0x0b, 0x40, 0xd2, 0x26, 0x2d, 0x6d, 0x00, 0x5a,
0x05, 0x41, 0xdd, 0x66, 0x24, 0x7f, 0x57, 0x9e, 0x0c, 0xb9, 0x2a, 0x07, 0xe4, 0x38, 0x06, 0xa0,
0x35, 0x4c, 0xa2, 0x60, 0x3c, 0xd1, 0x35, 0x8a, 0xfa, 0x12, 0x16, 0x00, 0x55, 0x97, 0x6a, 0x26,
0x0c, 0xad, 0x85, 0xfe, 0xfb, 0xbf, 0xc6, 0x78, 0x71, 0x2f, 0x4d, 0x63, 0xec, 0x3b, 0xa5, 0xc1,
0x1d, 0x1a, 0x88, 0x51, 0x0f, 0x81, 0xd7, 0xe7, 0x26, 0x08, 0x41, 0x44, 0xc2, 0x30, 0xb8, 0x52,
0x0a, 0x44, 0x82, 0x73, 0x2e, 0x58, 0x6d, 0xf2, 0x43, 0x08, 0x06, 0x68, 0xad, 0x7d, 0x95, 0x9c,
0xe3, 0xcd, 0xf9, 0x60, 0xbe, 0xef, 0x31, 0x7a, 0xf6, 0xbf, 0x12, 0xce, 0xf7, 0x9d, 0xa9, 0xc7,
0xb3, 0xcc, 0x12, 0x31, 0xe3, 0x5c, 0x16, 0x9f, 0x36, 0x7a, 0x21, 0x09, 0x4d, 0x30, 0x57, 0x0f,
0x80, 0xb4, 0x0e, 0x06, 0x10, 0x96, 0x55, 0x61, 0x93, 0xff, 0xc2, 0x4f, 0x2a, 0xbd, 0x1b, 0xa5,
0xd1, 0x5c, 0x6d, 0xbf, 0xd4, 0x6e, 0x9c, 0x67, 0x32, 0xcf, 0x34, 0xa4, 0x65, 0x09, 0xc6, 0x38,
0x67, 0xd0, 0x50, 0xd0, 0x60, 0x8c, 0x0c, 0xc1, 0x59, 0x3c, 0x1e, 0x73, 0x14, 0x11, 0x13, 0x82,
0x38, 0xe7, 0xb5, 0x1d, 0x2e, 0x48, 0x13, 0x41, 0x26, 0x68, 0x77, 0x55, 0xbb, 0x01, 0xe2, 0xc3,
0x13, 0x58, 0x23, 0xcd, 0x8c, 0x03, 0xac, 0xc6, 0x78, 0x87, 0x59, 0xff, 0x08, 0x83, 0x1b, 0x1a,
0x56, 0xff, 0xa1, 0x3e, 0x80, 0x2d, 0xa8, 0x1c, 0xf4, 0x62, 0x30, 0x73, 0x6b, 0xac, 0x4a, 0x3f,
0x68, 0x1b, 0x52, 0x8f, 0xbd, 0xd4, 0xa2, 0xbe, 0x29, 0xc6, 0xa8, 0x9f, 0xe0, 0xa3, 0x96, 0x92,
0x56, 0xf7, 0xaa, 0x9c, 0x13, 0x63, 0x04, 0x30, 0xa5, 0x34, 0x1f, 0x5a, 0x55, 0xc9, 0x98, 0x06,
0x48, 0x88, 0x9a, 0xd3, 0x0a, 0x12, 0xa6, 0xe8, 0xe5, 0x67, 0x21, 0x73, 0x62, 0xbe, 0xf8, 0xea,
0xce, 0xed, 0xeb, 0x1b, 0xb7, 0xac, 0x15, 0x0c, 0x92, 0xc7, 0xc8, 0xae, 0x13, 0x54, 0x13, 0x84,
0xfa, 0xf5, 0x61, 0x5a, 0x45, 0x9a, 0x91, 0xaf, 0x24, 0x2a, 0x25, 0x66, 0x58, 0x2d, 0x7e, 0xfb,
0x3b, 0x94, 0xd5, 0xd6, 0x9a, 0x22, 0x89, 0xc0, 0x32, 0xb9, 0x61, 0x70, 0x22, 0xe2, 0xa4, 0x51,
0x4b, 0x21, 0x04, 0x34, 0xc0, 0x19, 0x31, 0xc6, 0xa1, 0x07, 0xdd, 0xf9, 0xf0, 0xb6, 0x9b, 0x5a,
0xd7, 0x3e, 0xac, 0x24, 0xb1, 0xad, 0x8a, 0x06, 0x86, 0x10, 0x7b, 0xed, 0x76, 0x36, 0xae, 0x73,
0x60, 0x07, 0x9d, 0x27, 0xe3, 0x55, 0xdd, 0x28, 0xea, 0x27, 0xb0, 0x65, 0x6f, 0x89, 0xcb, 0xfe,
0xb4, 0xbb, 0xfc, 0x8d, 0xea, 0x73, 0x6c, 0xea, 0x53, 0xfd, 0x29, 0x34, 0xde, 0xd8, 0xb4, 0x56,
0x41, 0x9c, 0xef, 0xbd, 0xf2, 0x9b, 0x31, 0x12, 0x82, 0x33, 0x46, 0x32, 0xf0, 0x9b, 0xe2, 0x21,
0x60, 0xf5, 0xea, 0xd9, 0x8e, 0xb9, 0xc0, 0xd3, 0x41, 0xd1, 0xcf, 0x29, 0xed, 0xd7, 0xef, 0x6f,
0x35, 0x11, 0xf7, 0x5e, 0x65, 0x26, 0x63, 0x24, 0x38, 0x4f, 0x23, 0x1d, 0xaf, 0x0a, 0xa3, 0x35,
0xa9, 0x34, 0x71, 0xce, 0x94, 0x65, 0x72, 0x56, 0xf3, 0xf6, 0xe3, 0xf1, 0x64, 0x2f, 0x4a, 0x93,
0xae, 0x79, 0x19, 0xad, 0xb9, 0x89, 0x9c, 0x85, 0xec, 0x50, 0xa7, 0xf2, 0x0f, 0xed, 0x03, 0xf6,
0xcb, 0x55, 0x31, 0x66, 0x64, 0xf4, 0xe0, 0x50, 0xfc, 0x2f, 0x6a, 0xcc, 0xe3, 0x2c, 0xb4, 0xd5,
0xe3, 0xf5, 0x87, 0x0c, 0x50, 0xc4, 0xc0, 0x41, 0x4c, 0x08, 0xae, 0xb5, 0x54, 0xaa, 0x21, 0x69,
0x2b, 0x45, 0xa1, 0x24, 0xa5, 0x32, 0x52, 0xaa, 0xda, 0xd2, 0x3b, 0xa5, 0x15, 0x11, 0x41, 0x4f,
0x24, 0xc1, 0xa3, 0xa1, 0x19, 0x31, 0x02, 0x31, 0x46, 0xc4, 0x98, 0xe0, 0x8c, 0x71, 0xc6, 0x04,
0x13, 0x82, 0x71, 0x32, 0x19, 0x67, 0x8c, 0x40, 0x50, 0xba, 0x96, 0x58, 0x33, 0xd4, 0xaa, 0xc7,
0x5d, 0x2a, 0x56, 0xb7, 0xab, 0x00, 0x9f, 0x28, 0xda, 0xef, 0x00, 0x78, 0x7b, 0xc8, 0x44, 0xf1,
0xfe, 0x44, 0x17, 0xa4, 0xd5, 0x60, 0x1d, 0x32, 0x08, 0x70, 0xa5, 0x35, 0x23, 0xe2, 0x8c, 0x69,
0x48, 0xa5, 0x98, 0xd4, 0xa4, 0xf5, 0x90, 0xa3, 0xd7, 0xb5, 0x06, 0x30, 0xe1, 0x04, 0x0f, 0x81,
0x88, 0x31, 0x22, 0x80, 0x33, 0x02, 0x23, 0xc1, 0x18, 0x88, 0xf8, 0x60, 0x4e, 0xbb, 0x1a, 0x72,
0xdb, 0x87, 0xd2, 0x1e, 0xa3, 0x7f, 0x1a, 0xc4, 0x5f, 0x81, 0x46, 0x13, 0xbd, 0xa9, 0x30, 0x30,
0x80, 0x31, 0x68, 0x4d, 0x20, 0x2e, 0xa5, 0x1e, 0x1c, 0x31, 0xd4, 0xa5, 0x1a, 0x4f, 0xbc, 0x9f,
0x13, 0x1a, 0xfa, 0xb1, 0x20, 0x22, 0x30, 0x22, 0x4d, 0xf5, 0x71, 0x0e, 0x35, 0xc9, 0xea, 0xfa,
0x80, 0xa8, 0x2f, 0x27, 0xa5, 0x35, 0x46, 0x72, 0x21, 0x31, 0xb8, 0x6c, 0x12, 0x00, 0x69, 0x75,
0x48, 0xbc, 0xd5, 0x48, 0x1f, 0xa0, 0xc7, 0xa0, 0xfb, 0xe4, 0x65, 0xfe, 0x5e, 0xd4, 0x57, 0x93,
0xd3, 0x12, 0x63, 0x53, 0xe1, 0xef, 0x39, 0x09, 0xff, 0xb7, 0x79, 0xad, 0xba, 0x9d, 0x77, 0xc6,
0x58, 0x65, 0x3c, 0xd9, 0x21, 0x26, 0x9f, 0xd4, 0xf9, 0x73, 0xa8, 0x13, 0x21, 0xa2, 0x7e, 0x84,
0x08, 0x87, 0x26, 0xf5, 0x55, 0x64, 0x91, 0x08, 0x93, 0x58, 0xeb, 0xb3, 0xc8, 0x2c, 0x11, 0x26,
0xa7, 0xe0, 0x89, 0x54, 0x4f, 0x84, 0xc9, 0x47, 0xfd, 0x68, 0x78, 0x17, 0x61, 0x92, 0x52, 0x5f,
0x46, 0x16, 0x89, 0x30, 0x29, 0xa9, 0x4f, 0x91, 0xe0, 0x89, 0x30, 0x99, 0x87, 0xb9, 0x11, 0x22,
0x4c, 0x3a, 0xea, 0x0f, 0xee, 0xfe, 0x16, 0x35, 0x80, 0x08, 0x93, 0x8e, 0xfa, 0x51, 0x5c, 0x3f,
0xc2, 0x64, 0xd6, 0xfa, 0x11, 0x22, 0x4c, 0x52, 0xc1, 0x13, 0x8d, 0x73, 0x23, 0x4c, 0x3a, 0xea,
0x0f, 0x26, 0x32, 0x50, 0x64, 0x97, 0x08, 0x93, 0x8d, 0xfa, 0xf5, 0x0d, 0x20, 0x42, 0x84, 0x68,
0x98, 0x1b, 0x21, 0xc2, 0xa1, 0xee, 0xf5, 0x23, 0xad, 0x1f, 0x61, 0x32, 0x6b, 0xfd, 0x88, 0xf9,
0x11, 0x26, 0x01, 0xd8, 0x6b, 0xbc, 0x7e, 0x44, 0xfc, 0x08, 0x93, 0xd0, 0xeb, 0xab, 0x68, 0x36,
0x37, 0xc2, 0x64, 0xd6, 0xfa, 0x51, 0xd2, 0x72, 0x84, 0x49, 0xaa, 0xf5, 0x23, 0x44, 0x98, 0xa4,
0x5e, 0x3f, 0x42, 0x84, 0xc9, 0xaa, 0xf5, 0x23, 0xb3, 0x44, 0x88, 0xbc, 0x7e, 0x84, 0x08, 0x93,
0x48, 0xeb, 0x47, 0xfc, 0x8f, 0x10, 0x79, 0xfd, 0x08, 0x11, 0x22, 0xea, 0x47, 0x88, 0x70, 0x08,
0x53, 0x3f, 0x8a, 0xe8, 0x47, 0x98, 0xd4, 0x5a, 0x3f, 0x42, 0x84, 0xc8, 0xeb, 0x47, 0x88, 0x10,
0x69, 0xfd, 0x08, 0x11, 0x22, 0xea, 0x47, 0x88, 0x70, 0x68, 0x6a, 0xfd, 0x88, 0xff, 0x11, 0x22,
0xaf, 0x1f, 0x21, 0xc2, 0xe4, 0xa0, 0x7e, 0xb4, 0xf1, 0x60, 0x84, 0xc8, 0xeb, 0x47, 0x88, 0x10,
0x51, 0x3f, 0x42, 0x84, 0x49, 0x42, 0xfd, 0x88, 0xff, 0x11, 0x26, 0x9f, 0xd6, 0x57, 0x40, 0x94,
0xaf, 0x1f, 0x21, 0x12, 0x3c, 0x11, 0x22, 0x44, 0x82, 0x27, 0x42, 0x84, 0xc8, 0xeb, 0x47, 0x88,
0x70, 0xe8, 0x51, 0x3f, 0x4a, 0x5f, 0x8b, 0x10, 0x79, 0xfd, 0x08, 0x11, 0x0e, 0x6d, 0xd0, 0x67,
0xde, 0x36, 0xf2, 0x4f, 0x43, 0x43, 0x43, 0x64, 0x91, 0x08, 0x87, 0x30, 0xb2, 0xd9, 0xec, 0xd8,
0x5e, 0xbf, 0xfe, 0x83, 0x08, 0x11, 0x0e, 0x6d, 0xb0, 0xc8, 0x04, 0x11, 0x22, 0xea, 0x47, 0x88,
0x30, 0x89, 0xf0, 0xff, 0x01, 0xff, 0x06, 0x5d, 0x67, 0xc8, 0xbc, 0x24, 0x9a, 0x00, 0x00, 0x00,
0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
}

View File

@ -0,0 +1,12 @@
using UnityEngine;
namespace MU3.CustomUI;
class patch_MU3UIImageChanger: MU3UIImageChanger {
private Sprite[] _sprites;
public Sprite[] sprites {
get { return _sprites; }
set { _sprites = value; }
}
}

View File

@ -0,0 +1,18 @@
using MonoMod;
namespace MU3.DB;
[MonoModEnumReplace]
public enum patch_MusicSort1ID {
Genre = 0,
All = 1,
Character = 2,
Version = 3,
Level = 4,
Name = 5,
Attribute = 6,
InternalLevel = 7,
Begin = 0,
End = 8,
Invalid = -1
}

View File

@ -0,0 +1,40 @@
using MonoMod;
namespace MU3.DB;
[MonoModPatch("global::MU3.DB.MusicSort1IDEnum")]
public static class patch_MusicSort1IDEnum {
private static MusicSort1TableRecord[] records;
public static patch_MusicSort1ID[] List;
public static extern bool orig_loadFromFile(string filename);
public static bool loadFromFile(string filename) {
var rv = orig_loadFromFile(filename);
records = new[] {
new MusicSort1TableRecord(0, "Genre", "ジャンル", 0),
new MusicSort1TableRecord(1, "All", "全曲", 0),
new MusicSort1TableRecord(2, "Character", "キャラクター", 0),
new MusicSort1TableRecord(3, "Version", "バージョン", 0),
new MusicSort1TableRecord(4, "Level", "譜面レベル", 0),
new MusicSort1TableRecord(5, "Name", "曲名", 0),
new MusicSort1TableRecord(6, "Attribute", "属性", 0),
new MusicSort1TableRecord(7, "InternalLevel", "譜面定数", 0)
};
List = new[] {
patch_MusicSort1ID.Genre,
patch_MusicSort1ID.All,
patch_MusicSort1ID.Character,
patch_MusicSort1ID.Version,
patch_MusicSort1ID.Level,
patch_MusicSort1ID.Name,
patch_MusicSort1ID.Attribute,
patch_MusicSort1ID.InternalLevel
};
return rv;
}
// Not exactly sure why this is necessary
public static bool isValid(this patch_MusicSort1ID self) {
return self >= patch_MusicSort1ID.Genre && self < patch_MusicSort1ID.End;
}
}

View File

@ -0,0 +1,15 @@
using MonoMod;
namespace MU3.DB;
[MonoModPatch("global::MU3.DB.MusicSort2IDEnum")]
public static class patch_MusicSort2IDEnum {
private static MusicSort2TableRecord[] records;
public static extern bool orig_loadFromFile(string filename);
public static bool loadFromFile(string filename) {
var rv = orig_loadFromFile(filename);
records[4].Name = "譜面定数";
return rv;
}
}

View File

@ -0,0 +1,20 @@
using MU3.Client;
using MU3.DB;
namespace MU3.User;
class patch_UserDetail: UserDetail {
public extern void orig_copyTo(UserData userDetail);
public new void copyTo(UserData userDetail) {
orig_copyTo(userDetail);
// Attempting to use a profile with InternalLevel sorting enabled
// causes unpatched clients to crash thanks to enormous incompetence
// of Sxga's interns. So, unfortunately, this value has to be discarded.
// See:
// * MusicSelectViewDataList._sort1 set
// * UserDetail.copyFrom()
if(userDetail.tabSetting == (int)patch_MusicSort1ID.InternalLevel) {
userDetail.tabSetting = (int)patch_MusicSort1ID.Level;
}
}
}

View File

@ -0,0 +1,128 @@
using MU3.DataStudio;
using MU3.DB;
using MU3.Util;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace MU3.ViewData;
class patch_MusicSelectViewDataList: MusicSelectViewDataList {
private delegate int CompareProc(MusicSelectViewData d1, MusicSelectViewData d2, bool forSort1);
private delegate string GetCategoryNameProc(MusicSelectViewData d);
private MusicSort1ID __sort1;
private CompareProc _compareProc1;
private CompareProc _compareProc2;
private GetCategoryNameProc _getCategoryNameProc;
private PropertyInfo _reMasterPi = null;
private extern void orig_set__sort1(MusicSort1ID value);
private extern void orig_set__sort2(MusicSort2ID value);
private void set__sort1(MusicSort1ID value) {
if(value == (MusicSort1ID)patch_MusicSort1ID.InternalLevel) {
__sort1 = value;
_compareProc1 = compareByInternalLevel;
_getCategoryNameProc = getCategoryNameByInternalLevel;
} else {
orig_set__sort1(value);
}
}
private void set__sort2(MusicSort2ID value) {
orig_set__sort2(value);
if(value == MusicSort2ID.Level) {
_compareProc2 = compareByInternalLevel;
}
}
private bool isReMaster(Data.MusicData d) {
// Fall back for pre-Act3
if(_reMasterPi == null) {
return false;
}
return (bool)_reMasterPi.GetValue(d, null);
}
public extern void orig_create(GameViewData gameViewData, ChapterSelection chapterSelection, FumenDifficulty difficulty, MusicSort1ID sort1, MusicSort2ID sort2);
public new void create(GameViewData gameViewData, ChapterSelection chapterSelection, FumenDifficulty difficulty, MusicSort1ID sort1, MusicSort2ID sort2) {
_reMasterPi = typeof(Data.MusicData).GetProperty("isReMaster");
orig_create(gameViewData, chapterSelection, difficulty, sort1, sort2);
}
private string getMetaGategoryName(MusicSelectViewData d) {
var remas = isReMaster(d.musicViewData.data);
if(d.musicViewData.data.isBonusTrack) {
return "ボーナストラック";
}
if(d.musicViewData.data.isLunatic && remas && __sort1 != MusicSort1ID.Level && __sort1 != (MusicSort1ID)patch_MusicSort1ID.InternalLevel) {
return "Re:MASTER";
}
return d.musicViewData.data.isLunatic && !remas ? "LUNATIC" : null;
}
private string getCategoryNameByInternalLevel(MusicSelectViewData d) {
StringBuilder stringBuilder = Singleton<MU3.Sys.System>.instance.getStringBuilder();
Data.FumenData fumenData = ((d.musicViewData.data == null) ? null : d.musicViewData.data.fumenData[(int)d.difficulty]);
stringBuilder.Append("LEVEL ");
stringBuilder.AppendFormat("{0}", (fumenData == null) ? (-1) : (fumenData.fumenConst.ToString("0.0")));
return stringBuilder.ToString();
}
private int getSortKeyByInternalLevel(MusicSelectViewData d) {
return (int)Math.Round(d.musicViewData.data.fumenData[(int)d.difficulty].fumenConst * 10.0);
}
private int compareByInternalLevel(MusicSelectViewData d1, MusicSelectViewData d2, bool forSort1) {
return getSortKeyByInternalLevel(d1) - getSortKeyByInternalLevel(d2);
}
private extern bool orig_isDifferentMyListSet(patch_MusicSort1ID oldSort1, patch_MusicSort1ID nowSort1);
private bool isDifferentMyListSet(patch_MusicSort1ID oldSort1, patch_MusicSort1ID nowSort1) {
if(oldSort1 == patch_MusicSort1ID.InternalLevel && nowSort1 != patch_MusicSort1ID.InternalLevel) {
return true;
}
if(oldSort1 != patch_MusicSort1ID.InternalLevel && nowSort1 == patch_MusicSort1ID.InternalLevel) {
return true;
}
return orig_isDifferentMyListSet(oldSort1, nowSort1);
}
private extern int orig_createMyListMusicDataAllDifficulty(List<MusicSelectViewData> list, HashSet<int> idList, MU3.Data.MusicData musicData, MusicSort1ID sort1, int initOrder);
private int createMyListMusicDataAllDifficulty(List<MusicSelectViewData> list, HashSet<int> idList, MU3.Data.MusicData musicData, MusicSort1ID sort1, int initOrder) {
if(sort1 == (MusicSort1ID)patch_MusicSort1ID.InternalLevel) {
sort1 = MusicSort1ID.Level;
}
return orig_createMyListMusicDataAllDifficulty(list, idList, musicData, sort1, initOrder);
}
private extern int orig_getMetaSortKey(MusicSelectViewData d, bool forCategorySort);
private int getMetaSortKey(MusicSelectViewData d, bool forCategorySort) {
if(_reMasterPi == null) {
return orig_getMetaSortKey(d, forCategorySort);
}
var remas = isReMaster(d.musicViewData.data);
if(forCategorySort) {
if(d.musicViewData.data.isBonusTrack) {
return 3;
}
if(d.musicViewData.data.isLunatic && remas && __sort1 != MusicSort1ID.Level && __sort1 != (MusicSort1ID)patch_MusicSort1ID.InternalLevel) {
return 1;
}
if(d.musicViewData.data.isLunatic && !remas) {
return 2;
}
} else {
if(d.musicViewData.data.isLunatic && remas && __sort1 != MusicSort1ID.Level && __sort1 != (MusicSort1ID)patch_MusicSort1ID.InternalLevel) {
return 1;
}
if(d.musicViewData.data.isLunatic && !remas) {
return 2;
}
}
return 0;
}
}

View File

@ -0,0 +1,37 @@
using MU3.DB;
namespace MU3;
public class patch_Scene_32_PrePlayMusic_MusicSelect: Scene_32_PrePlayMusic_MusicSelect {
private static patch_MusicSort1ID[] _sort1SettingList;
private static MusicSort2ID[] _sort2SettingList;
private extern void orig_Awake();
private new void Awake() {
_sort1SettingList = new[] {
patch_MusicSort1ID.Genre,
patch_MusicSort1ID.All,
patch_MusicSort1ID.Character,
patch_MusicSort1ID.Version,
patch_MusicSort1ID.Level,
patch_MusicSort1ID.Name,
patch_MusicSort1ID.Attribute,
patch_MusicSort1ID.InternalLevel
};
_sort2SettingList = new[] {
MusicSort2ID.Recommend,
MusicSort2ID.BattlePoint,
MusicSort2ID.TechnicalScore,
MusicSort2ID.BossLevel,
MusicSort2ID.Name,
MusicSort2ID.AddDate,
MusicSort2ID.Chapter,
MusicSort2ID.Level
//, MusicSort2ID.Lamp
};
orig_Awake();
}
}

View File

@ -0,0 +1,27 @@
using MU3.CustomUI;
using UnityEngine;
namespace MU3;
class patch_UISortButton: UISortButton {
private MU3UIImageChanger _selectPreviewImageChanger;
protected override void Awake() {
base.Awake();
var changer = (patch_MU3UIImageChanger)_selectPreviewImageChanger;
var n = changer.sprites.Length;
var sprites = new Sprite[n + 1];
for(int i = 0; i < n; ++i) {
sprites[i] = changer.sprites[i];
}
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(InternalSortPreview.Bytes);
sprites[n] = Sprite.Create(tex, new Rect(0, 0, 254, 121), sprites[0].pivot);
changer.sprites = sprites;
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.SortByInternalDifficulty.mm</AssemblyName>
<Description>Makes internal levels not internal</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,24 @@
namespace MU3.DataStudio;
class patch_MusicData: MusicData {
public new int CostToUnlock {
get {
return 0;
}
private set { /* nop */ }
}
public new bool PossessingFromTheBeginning {
get {
return true;
}
private set { /* nop */ }
}
public new bool IsLockedAtTheBeginning {
get {
return false;
}
private set { /* nop */ }
}
}

View File

@ -0,0 +1,20 @@
using MU3.User;
using MU3.Util;
namespace MU3;
class patch_Scene_25_Login: Scene_25_Login {
private enum State {
GetUserRatinglog = 24
}
private Mode<Scene_25_Login, State> mode_;
private void GetUserActivityMusic_Init() {
// nop
}
private void GetUserActivityMusic_Proc() {
Singleton<UserManager>.instance.updateUserActivityInLoginEnd();
mode_.set(State.GetUserRatinglog);
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.UnlockAllMusic.mm</AssemblyName>
<Description>Unlock all music</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,17 @@
using MU3.DB;
using MU3.User;
using MU3.Util;
namespace MU3;
class patch_Scene_32_PrePlayMusic_Confirm: Scene_32_PrePlayMusic_Confirm {
private extern void orig_createSelector();
private JewelBoostID getMaxBoost() {
return JewelBoostID.Nine;
}
private void createSelector() {
Singleton<UserManager>.instance.userLocal.boost = JewelBoostID.Nine;
orig_createSelector();
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.UnlockAndSetJewelBoostNine.mm</AssemblyName>
<Description>Unlock and set the jewel boost to max</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,26 @@
using MU3.Game;
using MU3.Sys;
using MU3.Util;
namespace MU3.Notes;
class patch_NotesManager: NotesManager {
private float _frame;
private float _frameReal;
private bool _altMode;
public extern void orig_initialize(SessionInfo sessionInfo);
public new void initialize(SessionInfo sessionInfo) {
orig_initialize(sessionInfo);
var cfg = (patch_Config)Singleton<Sys.System>.instance.config;
_altMode = cfg.isVsync || (cfg.framerate != 60);
}
private extern void orig_progressFrameAndFrameReal();
private void progressFrameAndFrameReal() {
if(_altMode) {
_frame = _frameReal;
} else {
orig_progressFrameAndFrameReal();
}
}
}

View File

@ -0,0 +1,38 @@
using UnityEngine;
namespace MU3.Sys;
class patch_Config: Config {
public extern void orig_initialize();
public int framerate { get; private set; }
public bool isVsync { get; private set; }
public new void initialize() {
orig_initialize();
using IniFile iniFile = new("mu3.ini");
framerate = iniFile.getIntValue("Video", "Framerate", 60);
isVsync = iniFile.getValue("Video", "VSync", false);
if(framerate == 0) {
framerate = -1;
}
if(isVsync) {
QualitySettings.vSyncCount = 1;
framerate = -1;
Debug.Log("[UnlockFrameRate] VSync on");
} else {
Application.targetFrameRate = framerate;
QualitySettings.vSyncCount = 0;
if(framerate == 60) {
Debug.Log("[UnlockFrameRate] Framerate locked to 60 (vanilla)");
} else if(framerate == -1) {
Debug.Log("[UnlockFrameRate] Framerate unlocked");
} else {
Debug.Log("[UnlockFrameRate] Framerate locked to " + framerate);
}
}
}
}

View File

@ -0,0 +1,29 @@
using MU3.Util;
namespace MU3.Sys;
class patch_Time: Time {
private static bool _init;
private static float _deltaTime;
private static float _adjustAccumlation;
private static float _realtimeSinceStartup;
private static bool _altMode;
public extern static void orig_update();
public static new void update() {
if(!_init) {
_deltaTime = UnityEngine.Time.deltaTime;
_adjustAccumlation = 0f;
_realtimeSinceStartup = UnityEngine.Time.realtimeSinceStartup;
var cfg = (patch_Config)Singleton<Sys.System>.instance.config;
_altMode = cfg.isVsync || (cfg.framerate != 60);
_init = true;
}
if(_altMode) {
_deltaTime = UnityEngine.Time.deltaTime;
_realtimeSinceStartup = UnityEngine.Time.realtimeSinceStartup;
} else {
orig_update();
}
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.UnlockFramerate.mm</AssemblyName>
<Description>Unlock framerate</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,35 @@
using MU3.Data;
using MU3.Operation;
using MU3.Util;
using System;
using System.Linq;
namespace MU3.Client;
class patch_PacketGetGameEvent: Packet {
public Operation.GameEvent _gameEvent;
public Operation.GameEvent gameEvent => _gameEvent;
public extern State orig_proc();
public override State proc() {
State state = orig_proc();
if(state == State.Done) {
DateTime endDate = DateTime.Parse("2099-01-01 05:00:00.0");
_gameEvent ??= new Operation.GameEvent();
foreach(EventData eventData in SingletonStateMachine<DataManager, DataManager.EState>.instance.allEventData) {
IdPeriod idPeriod = Enumerable.FirstOrDefault(_gameEvent.list, (IdPeriod e) => e.id == eventData.id);
if(idPeriod != null) {
if(idPeriod.period.endDate < CustomDateTime.Now) {
idPeriod.period.endDate = endDate;
}
} else {
idPeriod = new();
idPeriod.id = eventData.id;
idPeriod.period = new Period(DateTime.MinValue.Date, endDate);
_gameEvent.list.Add(idPeriod);
_gameEvent.lastUpdate = CustomDateTime.Now;
}
}
}
return state;
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.UnlockGameEvents.mm</AssemblyName>
<Description>Unlock game events</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,13 @@
using MonoMod;
namespace MU3.ViewData;
[MonoModPatch("global::MU3.ViewData.MusicViewData")]
public class patch_MusicViewData {
public bool isMasterLock {
get {
return false;
}
set { /* nop */ }
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.UnlockMasterDifficulty.mm</AssemblyName>
<Description>Unlock master difficulty</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>

View File

@ -0,0 +1,32 @@
using MU3.Data;
using MU3.User;
using MU3.Util;
using System.Collections.Generic;
using System.Linq;
namespace MU3.Client;
class patch_PacketGetUserMemoryChapter: Packet {
private Dictionary<int, User.UserMemoryChapter> userMemoryChapter_;
public override State proc() {
switch(procImpl()) {
case State.Done: {
GetUserMemoryChapterResponse response_ = (query_ as GetUserMemoryChapter).response_;
foreach(MemoryChapterData memoryChapterData in SingletonStateMachine<DataManager, DataManager.EState>.instance.allMemoryChapterData) {
UserMemoryChapter userMemoryChapter = Enumerable.FirstOrDefault(response_.userMemoryChapterList, (UserMemoryChapter c) => c.chapterId == memoryChapterData.id);
if(userMemoryChapter != null) {
User.UserMemoryChapter userMemoryChapter2 = new User.UserMemoryChapter();
userMemoryChapter2.copyFrom(userMemoryChapter);
userMemoryChapter_[userMemoryChapter2.ChapterId] = userMemoryChapter2;
} else {
User.UserMemoryChapter userMemoryChapter3 = new User.UserMemoryChapter(memoryChapterData.id);
userMemoryChapter_[userMemoryChapter3.ChapterId] = userMemoryChapter3;
}
}
Singleton<UserManager>.instance.UserMemoryChapter = userMemoryChapter_;
break;
}
}
return state_;
}
}

View File

@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<AssemblyName>Assembly-CSharp.UnlockMemoryChapters.mm</AssemblyName>
<Description>Unlock memory chapters</Description>
</PropertyGroup>
<Import Project="..\Mu3Mods.csproj" />
</Project>