// AUTHORED SHIM (not copied). Third-party SDK surface swept into the copy closure by
// non-battle files (audio/movie/anti-cheat/analytics/spine). None is on the battle-
// resolution path. Namespaces must merely exist (anchors); the few types referenced
// by member get a minimal no-op surface. Members grow only as the compile loop demands.

// ---- CriWare audio + movie (CRI types with members live in External/CriShim.cs) ----
namespace CriWare
{
    internal class _ShimAnchor { }
}
namespace CriWare.CriMana
{
    public class CriManaMovieMaterial : UnityEngine.MonoBehaviour
    {
        public enum MaxFrameDrop { Disable, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten }
        public MaxFrameDrop maxFrameDrop;
        public Player player { get; } = new Player();
    }
    internal class _ShimAnchor { }
}

// ---- CodeStage anti-cheat obscured prefs (static k/v facade; no persistence headless) ----
namespace CodeStage.AntiCheat.ObscuredTypes
{
    public static class ObscuredPrefs
    {
        public static bool HasKey(string key) => false;
        public static void DeleteKey(string key) { }
        public static void DeleteAll() { }
        public static void Save() { }
        public static int GetInt(string key, int defaultValue = 0) => defaultValue;
        public static float GetFloat(string key, float defaultValue = 0f) => defaultValue;
        public static string GetString(string key, string defaultValue = "") => defaultValue;
        public static void SetInt(string key, int value) { }
        public static void SetFloat(string key, float value) { }
        public static void SetString(string key, string value) { }
    }
}

// ---- Spine animation ----
namespace Spine
{
    // Spine runtime — minimal hand shim (cosmetic skeletal animation, off battle path).
    public class SkeletonData { public System.Collections.Generic.List<Skin> Skins { get; } = new System.Collections.Generic.List<Skin>(); }
    public class Skin { public string Name { get; set; } }
    public class Bone
    {
        public float WorldX, WorldY, WorldRotationX;
        public Skeleton Skeleton => null;
    }
    public class Skeleton
    {
        public SkeletonData Data => null;
        public Skin Skin => null;
        public float ScaleX, ScaleY;
        public Bone FindBone(string boneName) => null;
        public void SetSkin(string skinName) { }
        public void SetSkin(Skin newSkin) { }
        public void SetSlotsToSetupPose() { }
        public void Update(float delta) { }
    }
    internal class _ShimAnchor { }
}
namespace Spine.Unity
{
    public class SkeletonMecanim : UnityEngine.MonoBehaviour
    {
        public Spine.Skeleton skeleton => null;
        public Spine.Skeleton Skeleton => null;
    }
    internal class _ShimAnchor { }
}

// ---- misc third-party namespaces (anchors) ----
namespace RedShellUnity { internal class _ShimAnchor { } }
namespace PlatformSupport.Collections.ObjectModel
{
    public class ObservableDictionary<TKey, TValue> : System.Collections.Generic.Dictionary<TKey, TValue> { }
    internal class _ShimAnchor { }
}
namespace Convention { internal class _ShimAnchor { } }
namespace com.adjust.sdk
{
    public static class Adjust
    {
        public static bool IsEditor() => true;
        public static void addSessionCallbackParameter(string key, string value) { }
    }
}
namespace BestHTTP.Decompression { internal class _ShimAnchor { } }
namespace BestHTTP.SocketIO.Transports { internal class _ShimAnchor { } }

namespace BestHTTP.Decompression.Zlib
{
    public static class GZipStream { public static byte[] UncompressBuffer(byte[] data) => data; }
}

// Native plugins (no decomp source) referenced unqualified from global scope.
public static class TimeNativePlugin { public static float GetDeviceOperatingTime() => 0f; }
public static class Packsize { public static bool Test() => true; }
public static class DllCheck { public static bool Test() => true; }

// The BCL's CollectionExtensions.GetValueOrDefault only binds to IReadOnlyDictionary;
// copied code calls it on an IDictionary<,> static type (where the only by-name match is
// the copied JsonDataExtension.GetValueOrDefault(JsonData,...) — wrong receiver). Supply the
// IDictionary form globally so the call resolves.
public static class ShimDictionaryExtensions
{
    public static TValue GetValueOrDefault<TKey, TValue>(this System.Collections.Generic.IDictionary<TKey, TValue> dict, TKey key, TValue defaultValue)
        => dict != null && dict.TryGetValue(key, out var v) ? v : defaultValue;
}
